diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1965-drm-amd-display-Reuse-MPC-OGRAM-for-1D-blender.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1965-drm-amd-display-Reuse-MPC-OGRAM-for-1D-blender.patch | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1965-drm-amd-display-Reuse-MPC-OGRAM-for-1D-blender.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1965-drm-amd-display-Reuse-MPC-OGRAM-for-1D-blender.patch new file mode 100644 index 00000000..d5c96cc0 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1965-drm-amd-display-Reuse-MPC-OGRAM-for-1D-blender.patch @@ -0,0 +1,173 @@ +From 332348235065c74f11efdec674c62322ee9bf1b2 Mon Sep 17 00:00:00 2001 +From: Vitaly Prosyak <vitaly.prosyak@amd.com> +Date: Thu, 18 Apr 2019 09:51:12 -0500 +Subject: [PATCH 1965/2940] drm/amd/display: Reuse MPC OGRAM for 1D blender + +[Why & How] +Reuse existent code path and in order to do that apply de gamma +in 1D blender LUT and re use MPC OGAM. +Follow up is required. + +Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Acked-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com> +Acked-by: Vitaly Prosyak <Vitaly.Prosyak@amd.com> +--- + .../amd/display/modules/color/color_gamma.c | 56 +++++++++++++------ + .../amd/display/modules/color/color_gamma.h | 1 + + 2 files changed, 40 insertions(+), 17 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +index a1055413bade..8601d371776e 100644 +--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c ++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +@@ -240,16 +240,27 @@ struct dividers { + struct fixed31_32 divider3; + }; + +-static void build_coefficients(struct gamma_coefficients *coefficients, bool is_2_4) ++enum gamma_type_index { ++ gamma_type_index_2_4, ++ gamma_type_index_2_2, ++ gamma_type_index_2_2_flat ++}; ++ ++static void build_coefficients(struct gamma_coefficients *coefficients, enum gamma_type_index type) + { +- static const int32_t numerator01[] = { 31308, 180000}; +- static const int32_t numerator02[] = { 12920, 4500}; +- static const int32_t numerator03[] = { 55, 99}; +- static const int32_t numerator04[] = { 55, 99}; +- static const int32_t numerator05[] = { 2400, 2200}; ++ static const int32_t numerator01[] = { 31308, 180000, 0}; ++ static const int32_t numerator02[] = { 12920, 4500, 0}; ++ static const int32_t numerator03[] = { 55, 99, 0}; ++ static const int32_t numerator04[] = { 55, 99, 0}; ++ static const int32_t numerator05[] = { 2400, 2200, 2200}; + + uint32_t i = 0; +- uint32_t index = is_2_4 == true ? 0:1; ++ uint32_t index = 0; ++ ++ if (type == gamma_type_index_2_2) ++ index = 1; ++ else if (type == gamma_type_index_2_2_flat) ++ index = 2; + + do { + coefficients->a0[i] = dc_fixpt_from_fraction( +@@ -697,7 +708,7 @@ static void build_de_pq(struct pwl_float_data_ex *de_pq, + + static void build_regamma(struct pwl_float_data_ex *rgb_regamma, + uint32_t hw_points_num, +- const struct hw_x_point *coordinate_x, bool is_2_4) ++ const struct hw_x_point *coordinate_x, enum gamma_type_index type) + { + uint32_t i; + +@@ -705,7 +716,7 @@ static void build_regamma(struct pwl_float_data_ex *rgb_regamma, + struct pwl_float_data_ex *rgb = rgb_regamma; + const struct hw_x_point *coord_x = coordinate_x; + +- build_coefficients(&coeff, is_2_4); ++ build_coefficients(&coeff, type); + + i = 0; + +@@ -892,13 +903,13 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma, + + static void build_degamma(struct pwl_float_data_ex *curve, + uint32_t hw_points_num, +- const struct hw_x_point *coordinate_x, bool is_2_4) ++ const struct hw_x_point *coordinate_x, enum gamma_type_index type) + { + uint32_t i; + struct gamma_coefficients coeff; + uint32_t begin_index, end_index; + +- build_coefficients(&coeff, is_2_4); ++ build_coefficients(&coeff, type); + i = 0; + + /* X points is 2^-25 to 2^7 +@@ -1614,7 +1625,7 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, + coordinates_x, + output_tf->sdr_ref_white_level); + } else if (tf == TRANSFER_FUNCTION_GAMMA22 && +- fs_params != NULL) { ++ fs_params != NULL && fs_params->skip_tm == 0) { + build_freesync_hdr(rgb_regamma, + MAX_HW_POINTS, + coordinates_x, +@@ -1627,7 +1638,9 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, + + build_regamma(rgb_regamma, + MAX_HW_POINTS, +- coordinates_x, tf == TRANSFER_FUNCTION_SRGB ? true:false); ++ coordinates_x, tf == TRANSFER_FUNCTION_SRGB ? gamma_type_index_2_4 : ++ tf == TRANSFER_FUNCTION_GAMMA22 ? ++ gamma_type_index_2_2_flat : gamma_type_index_2_2); + } + map_regamma_hw_to_x_user(ramp, coeff, rgb_user, + coordinates_x, axis_x, rgb_regamma, +@@ -1832,7 +1845,9 @@ bool mod_color_calculate_degamma_params(struct dc_transfer_func *input_tf, + build_degamma(curve, + MAX_HW_POINTS, + coordinates_x, +- tf == TRANSFER_FUNCTION_SRGB ? true : false); ++ tf == TRANSFER_FUNCTION_SRGB ? ++ gamma_type_index_2_4 : tf == TRANSFER_FUNCTION_GAMMA22 ? ++ gamma_type_index_2_2_flat : gamma_type_index_2_2); + else if (tf == TRANSFER_FUNCTION_LINEAR) { + // just copy coordinates_x into curve + i = 0; +@@ -1932,7 +1947,10 @@ bool mod_color_calculate_curve(enum dc_transfer_func_predefined trans, + + build_regamma(rgb_regamma, + MAX_HW_POINTS, +- coordinates_x, trans == TRANSFER_FUNCTION_SRGB ? true:false); ++ coordinates_x, ++ trans == TRANSFER_FUNCTION_SRGB ? ++ gamma_type_index_2_4 : trans == TRANSFER_FUNCTION_GAMMA22 ? ++ gamma_type_index_2_2_flat : gamma_type_index_2_2); + for (i = 0; i <= MAX_HW_POINTS ; i++) { + points->red[i] = rgb_regamma[i].r; + points->green[i] = rgb_regamma[i].g; +@@ -2002,7 +2020,8 @@ bool mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans, + + kvfree(rgb_degamma); + } else if (trans == TRANSFER_FUNCTION_SRGB || +- trans == TRANSFER_FUNCTION_BT709) { ++ trans == TRANSFER_FUNCTION_BT709 || ++ trans == TRANSFER_FUNCTION_GAMMA22) { + rgb_degamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS, + sizeof(*rgb_degamma), + GFP_KERNEL); +@@ -2011,7 +2030,10 @@ bool mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans, + + build_degamma(rgb_degamma, + MAX_HW_POINTS, +- coordinates_x, trans == TRANSFER_FUNCTION_SRGB ? true:false); ++ coordinates_x, ++ trans == TRANSFER_FUNCTION_SRGB ? ++ gamma_type_index_2_4 : trans == TRANSFER_FUNCTION_GAMMA22 ? ++ gamma_type_index_2_2_flat : gamma_type_index_2_2); + for (i = 0; i <= MAX_HW_POINTS ; i++) { + points->red[i] = rgb_degamma[i].r; + points->green[i] = rgb_degamma[i].g; +diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.h b/drivers/gpu/drm/amd/display/modules/color/color_gamma.h +index a6e164df090a..369953fafadf 100644 +--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.h ++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.h +@@ -79,6 +79,7 @@ struct freesync_hdr_tf_params { + unsigned int max_content; // luminance in nits + unsigned int min_display; // luminance in 1/10000 nits + unsigned int max_display; // luminance in nits ++ unsigned int skip_tm; // skip tm + }; + + void setup_x_points_distribution(void); +-- +2.17.1 + |