aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch154
1 files changed, 154 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch
new file mode 100644
index 00000000..48d8032e
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1145-drm-amd-display-Default-to-linear-output-gamma.patch
@@ -0,0 +1,154 @@
+From 0d8dc9b350243bea127253c039793a0b77142a8f Mon Sep 17 00:00:00 2001
+From: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
+Date: Tue, 8 Jan 2019 18:32:34 -0500
+Subject: [PATCH 1145/2940] drm/amd/display: Default to linear output gamma
+
+[Why] Our output TF calculation doesn't work if no user-specified gamma
+correction. Normally, user provides this, but driver sohuld just assume
+default (linear) gamma otherwise.
+
+[How] Remove output TF dependency on user gamma being provided.
+
+Signed-off-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
+Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Acked-by: Sivapiriyan Kumarasamy <Sivapiriyan.Kumarasamy@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../amd/display/modules/color/color_gamma.c | 73 ++++++++++---------
+ 1 file changed, 40 insertions(+), 33 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 4cee084a8e2d..eefb85928298 100644
+--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+@@ -1508,7 +1508,7 @@ static bool map_regamma_hw_to_x_user(
+ struct hw_x_point *coords = coords_x;
+ const struct pwl_float_data_ex *regamma = rgb_regamma;
+
+- if (mapUserRamp) {
++ if (ramp && mapUserRamp) {
+ copy_rgb_regamma_to_coordinates_x(coords,
+ hw_points_num,
+ rgb_regamma);
+@@ -1545,7 +1545,7 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
+
+ struct pwl_float_data *rgb_user = NULL;
+ struct pwl_float_data_ex *rgb_regamma = NULL;
+- struct gamma_pixel *axix_x = NULL;
++ struct gamma_pixel *axis_x = NULL;
+ struct pixel_gamma_point *coeff = NULL;
+ enum dc_transfer_func_predefined tf = TRANSFER_FUNCTION_SRGB;
+ bool ret = false;
+@@ -1555,47 +1555,54 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
+
+ /* we can use hardcoded curve for plain SRGB TF */
+ if (output_tf->type == TF_TYPE_PREDEFINED && canRomBeUsed == true &&
+- output_tf->tf == TRANSFER_FUNCTION_SRGB &&
+- (ramp->is_identity || (!mapUserRamp && ramp->type == GAMMA_RGB_256)))
+- return true;
++ output_tf->tf == TRANSFER_FUNCTION_SRGB) {
++ if (ramp == NULL)
++ return true;
++ if (ramp->is_identity || (!mapUserRamp && ramp->type == GAMMA_RGB_256))
++ return true;
++ }
+
+ output_tf->type = TF_TYPE_DISTRIBUTED_POINTS;
+
+- rgb_user = kvcalloc(ramp->num_entries + _EXTRA_POINTS,
++ if (ramp && (mapUserRamp || ramp->type != GAMMA_RGB_256)) {
++ rgb_user = kvcalloc(ramp->num_entries + _EXTRA_POINTS,
+ sizeof(*rgb_user),
+ GFP_KERNEL);
+- if (!rgb_user)
+- goto rgb_user_alloc_fail;
++ if (!rgb_user)
++ goto rgb_user_alloc_fail;
++
++ axis_x = kvcalloc(ramp->num_entries + 3, sizeof(*axis_x),
++ GFP_KERNEL);
++ if (!axis_x)
++ goto axis_x_alloc_fail;
++
++ dividers.divider1 = dc_fixpt_from_fraction(3, 2);
++ dividers.divider2 = dc_fixpt_from_int(2);
++ dividers.divider3 = dc_fixpt_from_fraction(5, 2);
++
++ build_evenly_distributed_points(
++ axis_x,
++ ramp->num_entries,
++ dividers);
++
++ if (ramp->type == GAMMA_RGB_256 && mapUserRamp)
++ scale_gamma(rgb_user, ramp, dividers);
++ else if (ramp->type == GAMMA_RGB_FLOAT_1024)
++ scale_gamma_dx(rgb_user, ramp, dividers);
++ }
++
+ rgb_regamma = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS,
+ sizeof(*rgb_regamma),
+ GFP_KERNEL);
+ if (!rgb_regamma)
+ goto rgb_regamma_alloc_fail;
+- axix_x = kvcalloc(ramp->num_entries + 3, sizeof(*axix_x),
+- GFP_KERNEL);
+- if (!axix_x)
+- goto axix_x_alloc_fail;
++
+ coeff = kvcalloc(MAX_HW_POINTS + _EXTRA_POINTS, sizeof(*coeff),
+ GFP_KERNEL);
+ if (!coeff)
+ goto coeff_alloc_fail;
+
+- dividers.divider1 = dc_fixpt_from_fraction(3, 2);
+- dividers.divider2 = dc_fixpt_from_int(2);
+- dividers.divider3 = dc_fixpt_from_fraction(5, 2);
+-
+ tf = output_tf->tf;
+-
+- build_evenly_distributed_points(
+- axix_x,
+- ramp->num_entries,
+- dividers);
+-
+- if (ramp->type == GAMMA_RGB_256 && mapUserRamp)
+- scale_gamma(rgb_user, ramp, dividers);
+- else if (ramp->type == GAMMA_RGB_FLOAT_1024)
+- scale_gamma_dx(rgb_user, ramp, dividers);
+-
+ if (tf == TRANSFER_FUNCTION_PQ) {
+ tf_pts->end_exponent = 7;
+ tf_pts->x_point_at_y1_red = 125;
+@@ -1623,22 +1630,22 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
+ coordinates_x, tf == TRANSFER_FUNCTION_SRGB ? true:false);
+ }
+ map_regamma_hw_to_x_user(ramp, coeff, rgb_user,
+- coordinates_x, axix_x, rgb_regamma,
++ coordinates_x, axis_x, rgb_regamma,
+ MAX_HW_POINTS, tf_pts,
+- (mapUserRamp || ramp->type != GAMMA_RGB_256) &&
+- ramp->type != GAMMA_CS_TFM_1D);
++ (mapUserRamp || (ramp && ramp->type != GAMMA_RGB_256)) &&
++ (ramp && ramp->type != GAMMA_CS_TFM_1D));
+
+- if (ramp->type == GAMMA_CS_TFM_1D)
++ if (ramp && ramp->type == GAMMA_CS_TFM_1D)
+ apply_lut_1d(ramp, MAX_HW_POINTS, tf_pts);
+
+ ret = true;
+
+ kvfree(coeff);
+ coeff_alloc_fail:
+- kvfree(axix_x);
+-axix_x_alloc_fail:
+ kvfree(rgb_regamma);
+ rgb_regamma_alloc_fail:
++ kvfree(axis_x);
++axis_x_alloc_fail:
+ kvfree(rgb_user);
+ rgb_user_alloc_fail:
+ return ret;
+--
+2.17.1
+