diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0208-drm-amd-display-Enable-regamma-25-segments-and-use-d.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0208-drm-amd-display-Enable-regamma-25-segments-and-use-d.patch | 497 |
1 files changed, 497 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0208-drm-amd-display-Enable-regamma-25-segments-and-use-d.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0208-drm-amd-display-Enable-regamma-25-segments-and-use-d.patch new file mode 100644 index 00000000..ab6d5044 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0208-drm-amd-display-Enable-regamma-25-segments-and-use-d.patch @@ -0,0 +1,497 @@ +From 31393a296b4773645cb926ff60c67571903f9f4b Mon Sep 17 00:00:00 2001 +From: Vitaly Prosyak <vitaly.prosyak@amd.com> +Date: Tue, 7 Feb 2017 10:41:37 -0600 +Subject: [PATCH 0208/4131] drm/amd/display: Enable regamma 25 segments and use + double buffer. + +Moved custom floating point calculation to the shared place +between dce's. + +Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/calcs/Makefile | 2 +- + .../gpu/drm/amd/display/dc/calcs/custom_float.c | 197 +++++++++++++++++++++ + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 171 +----------------- + .../amd/display/dc/dce110/dce110_hw_sequencer.h | 3 - + drivers/gpu/drm/amd/display/dc/inc/custom_float.h | 40 +++++ + 5 files changed, 240 insertions(+), 173 deletions(-) + create mode 100644 drivers/gpu/drm/amd/display/dc/calcs/custom_float.c + create mode 100644 drivers/gpu/drm/amd/display/dc/inc/custom_float.h + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +index 4bb08ae..2f4c8e7 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +@@ -3,7 +3,7 @@ + # It calculates Bandwidth and Watermarks values for HW programming + # + +-BW_CALCS = bandwidth_calcs.o bw_fixed.o ++BW_CALCS = bandwidth_calcs.o bw_fixed.o custom_float.o + + AMD_DAL_BW_CALCS = $(addprefix $(AMDDALPATH)/dc/calcs/,$(BW_CALCS)) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/custom_float.c b/drivers/gpu/drm/amd/display/dc/calcs/custom_float.c +new file mode 100644 +index 0000000..7243c37 +--- /dev/null ++++ b/drivers/gpu/drm/amd/display/dc/calcs/custom_float.c +@@ -0,0 +1,197 @@ ++/* ++ * Copyright 2017 Advanced Micro Devices, Inc. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * Authors: AMD ++ * ++ */ ++#include "dm_services.h" ++#include "custom_float.h" ++ ++ ++static bool build_custom_float( ++ struct fixed31_32 value, ++ const struct custom_float_format *format, ++ bool *negative, ++ uint32_t *mantissa, ++ uint32_t *exponenta) ++{ ++ uint32_t exp_offset = (1 << (format->exponenta_bits - 1)) - 1; ++ ++ const struct fixed31_32 mantissa_constant_plus_max_fraction = ++ dal_fixed31_32_from_fraction( ++ (1LL << (format->mantissa_bits + 1)) - 1, ++ 1LL << format->mantissa_bits); ++ ++ struct fixed31_32 mantiss; ++ ++ if (dal_fixed31_32_eq( ++ value, ++ dal_fixed31_32_zero)) { ++ *negative = false; ++ *mantissa = 0; ++ *exponenta = 0; ++ return true; ++ } ++ ++ if (dal_fixed31_32_lt( ++ value, ++ dal_fixed31_32_zero)) { ++ *negative = format->sign; ++ value = dal_fixed31_32_neg(value); ++ } else { ++ *negative = false; ++ } ++ ++ if (dal_fixed31_32_lt( ++ value, ++ dal_fixed31_32_one)) { ++ uint32_t i = 1; ++ ++ do { ++ value = dal_fixed31_32_shl(value, 1); ++ ++i; ++ } while (dal_fixed31_32_lt( ++ value, ++ dal_fixed31_32_one)); ++ ++ --i; ++ ++ if (exp_offset <= i) { ++ *mantissa = 0; ++ *exponenta = 0; ++ return true; ++ } ++ ++ *exponenta = exp_offset - i; ++ } else if (dal_fixed31_32_le( ++ mantissa_constant_plus_max_fraction, ++ value)) { ++ uint32_t i = 1; ++ ++ do { ++ value = dal_fixed31_32_shr(value, 1); ++ ++i; ++ } while (dal_fixed31_32_lt( ++ mantissa_constant_plus_max_fraction, ++ value)); ++ ++ *exponenta = exp_offset + i - 1; ++ } else { ++ *exponenta = exp_offset; ++ } ++ ++ mantiss = dal_fixed31_32_sub( ++ value, ++ dal_fixed31_32_one); ++ ++ if (dal_fixed31_32_lt( ++ mantiss, ++ dal_fixed31_32_zero) || ++ dal_fixed31_32_lt( ++ dal_fixed31_32_one, ++ mantiss)) ++ mantiss = dal_fixed31_32_zero; ++ else ++ mantiss = dal_fixed31_32_shl( ++ mantiss, ++ format->mantissa_bits); ++ ++ *mantissa = dal_fixed31_32_floor(mantiss); ++ ++ return true; ++} ++ ++static bool setup_custom_float( ++ const struct custom_float_format *format, ++ bool negative, ++ uint32_t mantissa, ++ uint32_t exponenta, ++ uint32_t *result) ++{ ++ uint32_t i = 0; ++ uint32_t j = 0; ++ ++ uint32_t value = 0; ++ ++ /* verification code: ++ * once calculation is ok we can remove it ++ */ ++ ++ const uint32_t mantissa_mask = ++ (1 << (format->mantissa_bits + 1)) - 1; ++ ++ const uint32_t exponenta_mask = ++ (1 << (format->exponenta_bits + 1)) - 1; ++ ++ if (mantissa & ~mantissa_mask) { ++ BREAK_TO_DEBUGGER(); ++ mantissa = mantissa_mask; ++ } ++ ++ if (exponenta & ~exponenta_mask) { ++ BREAK_TO_DEBUGGER(); ++ exponenta = exponenta_mask; ++ } ++ ++ /* end of verification code */ ++ ++ while (i < format->mantissa_bits) { ++ uint32_t mask = 1 << i; ++ ++ if (mantissa & mask) ++ value |= mask; ++ ++ ++i; ++ } ++ ++ while (j < format->exponenta_bits) { ++ uint32_t mask = 1 << j; ++ ++ if (exponenta & mask) ++ value |= mask << i; ++ ++ ++j; ++ } ++ ++ if (negative && format->sign) ++ value |= 1 << (i + j); ++ ++ *result = value; ++ ++ return true; ++} ++ ++bool convert_to_custom_float_format( ++ struct fixed31_32 value, ++ const struct custom_float_format *format, ++ uint32_t *result) ++{ ++ uint32_t mantissa; ++ uint32_t exponenta; ++ bool negative; ++ ++ return build_custom_float( ++ value, format, &negative, &mantissa, &exponenta) && ++ setup_custom_float( ++ format, negative, mantissa, exponenta, result); ++} ++ ++ +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index 6a5cec0..88a2fa9 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -49,6 +49,7 @@ + /* include DCE11 register header files */ + #include "dce/dce_11_0_d.h" + #include "dce/dce_11_0_sh_mask.h" ++#include "custom_float.h" + + struct dce110_hw_seq_reg_offsets { + uint32_t crtc; +@@ -286,174 +287,6 @@ static bool dce110_set_input_transfer_func( + return result; + } + +-static bool build_custom_float( +- struct fixed31_32 value, +- const struct custom_float_format *format, +- bool *negative, +- uint32_t *mantissa, +- uint32_t *exponenta) +-{ +- uint32_t exp_offset = (1 << (format->exponenta_bits - 1)) - 1; +- +- const struct fixed31_32 mantissa_constant_plus_max_fraction = +- dal_fixed31_32_from_fraction( +- (1LL << (format->mantissa_bits + 1)) - 1, +- 1LL << format->mantissa_bits); +- +- struct fixed31_32 mantiss; +- +- if (dal_fixed31_32_eq( +- value, +- dal_fixed31_32_zero)) { +- *negative = false; +- *mantissa = 0; +- *exponenta = 0; +- return true; +- } +- +- if (dal_fixed31_32_lt( +- value, +- dal_fixed31_32_zero)) { +- *negative = format->sign; +- value = dal_fixed31_32_neg(value); +- } else { +- *negative = false; +- } +- +- if (dal_fixed31_32_lt( +- value, +- dal_fixed31_32_one)) { +- uint32_t i = 1; +- +- do { +- value = dal_fixed31_32_shl(value, 1); +- ++i; +- } while (dal_fixed31_32_lt( +- value, +- dal_fixed31_32_one)); +- +- --i; +- +- if (exp_offset <= i) { +- *mantissa = 0; +- *exponenta = 0; +- return true; +- } +- +- *exponenta = exp_offset - i; +- } else if (dal_fixed31_32_le( +- mantissa_constant_plus_max_fraction, +- value)) { +- uint32_t i = 1; +- +- do { +- value = dal_fixed31_32_shr(value, 1); +- ++i; +- } while (dal_fixed31_32_lt( +- mantissa_constant_plus_max_fraction, +- value)); +- +- *exponenta = exp_offset + i - 1; +- } else { +- *exponenta = exp_offset; +- } +- +- mantiss = dal_fixed31_32_sub( +- value, +- dal_fixed31_32_one); +- +- if (dal_fixed31_32_lt( +- mantiss, +- dal_fixed31_32_zero) || +- dal_fixed31_32_lt( +- dal_fixed31_32_one, +- mantiss)) +- mantiss = dal_fixed31_32_zero; +- else +- mantiss = dal_fixed31_32_shl( +- mantiss, +- format->mantissa_bits); +- +- *mantissa = dal_fixed31_32_floor(mantiss); +- +- return true; +-} +- +-static bool setup_custom_float( +- const struct custom_float_format *format, +- bool negative, +- uint32_t mantissa, +- uint32_t exponenta, +- uint32_t *result) +-{ +- uint32_t i = 0; +- uint32_t j = 0; +- +- uint32_t value = 0; +- +- /* verification code: +- * once calculation is ok we can remove it +- */ +- +- const uint32_t mantissa_mask = +- (1 << (format->mantissa_bits + 1)) - 1; +- +- const uint32_t exponenta_mask = +- (1 << (format->exponenta_bits + 1)) - 1; +- +- if (mantissa & ~mantissa_mask) { +- BREAK_TO_DEBUGGER(); +- mantissa = mantissa_mask; +- } +- +- if (exponenta & ~exponenta_mask) { +- BREAK_TO_DEBUGGER(); +- exponenta = exponenta_mask; +- } +- +- /* end of verification code */ +- +- while (i < format->mantissa_bits) { +- uint32_t mask = 1 << i; +- +- if (mantissa & mask) +- value |= mask; +- +- ++i; +- } +- +- while (j < format->exponenta_bits) { +- uint32_t mask = 1 << j; +- +- if (exponenta & mask) +- value |= mask << i; +- +- ++j; +- } +- +- if (negative && format->sign) +- value |= 1 << (i + j); +- +- *result = value; +- +- return true; +-} +- +-static bool convert_to_custom_float_format( +- struct fixed31_32 value, +- const struct custom_float_format *format, +- uint32_t *result) +-{ +- uint32_t mantissa; +- uint32_t exponenta; +- bool negative; +- +- return build_custom_float( +- value, format, &negative, &mantissa, &exponenta) && +- setup_custom_float( +- format, negative, mantissa, exponenta, result); +-} +- + static bool convert_to_custom_float( + struct pwl_result_data *rgb_resulted, + struct curve_points *arr_points, +@@ -579,7 +412,7 @@ static bool convert_to_custom_float( + return true; + } + +-bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func ++static bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func + *output_tf, struct pwl_params *regamma_params) + { + struct curve_points *arr_points; +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +index 68632dd..a6b4d0d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +@@ -58,8 +58,5 @@ void dce110_power_down(struct core_dc *dc); + + void dce110_update_pending_status(struct pipe_ctx *pipe_ctx); + +-bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func +- *output_tf, struct pwl_params *regamma_params); +- + #endif /* __DC_HWSS_DCE110_H__ */ + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/custom_float.h b/drivers/gpu/drm/amd/display/dc/inc/custom_float.h +new file mode 100644 +index 0000000..f572396 +--- /dev/null ++++ b/drivers/gpu/drm/amd/display/dc/inc/custom_float.h +@@ -0,0 +1,40 @@ ++/* ++ * Copyright 2017 Advanced Micro Devices, Inc. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * Authors: AMD ++ * ++ */ ++ ++#ifndef CUSTOM_FLOAT_H_ ++#define CUSTOM_FLOAT_H_ ++ ++#include "bw_fixed.h" ++#include "hw_shared.h" ++#include "opp.h" ++ ++ ++bool convert_to_custom_float_format( ++ struct fixed31_32 value, ++ const struct custom_float_format *format, ++ uint32_t *result); ++ ++ ++#endif //CUSTOM_FLOAT_H_ +-- +2.7.4 + |