aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch120
1 files changed, 120 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch
new file mode 100644
index 00000000..7a67aef7
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4690-drm-amd-display-Implement-DePQ-for-DCN1.patch
@@ -0,0 +1,120 @@
+From 64560f50a8b042c94320253268f0611beee3ead8 Mon Sep 17 00:00:00 2001
+From: Reza Amini <Reza.Amini@amd.com>
+Date: Thu, 7 Nov 2019 10:10:45 -0500
+Subject: [PATCH 4690/4736] drm/amd/display: Implement DePQ for DCN1
+
+[Why]
+Need support for more color management in 10bit
+surface.
+
+[How]
+Provide support for DePQ for 10bit surface
+
+Signed-off-by: Reza Amini <Reza.Amini@amd.com>
+Reviewed-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../drm/amd/display/dc/dcn10/dcn10_dpp_cm.c | 3 ++
+ .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 5 +++
+ .../amd/display/modules/color/color_gamma.c | 39 ++++++++++++++-----
+ 3 files changed, 38 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
+index 6b7593dd0c77..935c892622a0 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
+@@ -628,6 +628,9 @@ void dpp1_set_degamma(
+ case IPP_DEGAMMA_MODE_HW_xvYCC:
+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 2);
+ break;
++ case IPP_DEGAMMA_MODE_USER_PWL:
++ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 3);
++ break;
+ default:
+ BREAK_TO_DEBUGGER();
+ break;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index 24bebec84316..0e1e3dcf4112 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -1467,6 +1467,11 @@ bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
+ dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS);
+ break;
+ case TRANSFER_FUNCTION_PQ:
++ dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_USER_PWL);
++ cm_helper_translate_curve_to_degamma_hw_format(tf, &dpp_base->degamma_params);
++ dpp_base->funcs->dpp_program_degamma_pwl(dpp_base, &dpp_base->degamma_params);
++ result = true;
++ break;
+ default:
+ result = false;
+ break;
+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 3f467c98b02f..3ab6cb3a09d6 100644
+--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+@@ -151,6 +151,7 @@ static void compute_de_pq(struct fixed31_32 in_x, struct fixed31_32 *out_y)
+
+ struct fixed31_32 l_pow_m1;
+ struct fixed31_32 base, div;
++ struct fixed31_32 base2;
+
+
+ if (dc_fixpt_lt(in_x, dc_fixpt_zero))
+@@ -160,13 +161,15 @@ static void compute_de_pq(struct fixed31_32 in_x, struct fixed31_32 *out_y)
+ dc_fixpt_div(dc_fixpt_one, m2));
+ base = dc_fixpt_sub(l_pow_m1, c1);
+
+- if (dc_fixpt_lt(base, dc_fixpt_zero))
+- base = dc_fixpt_zero;
+-
+ div = dc_fixpt_sub(c2, dc_fixpt_mul(c3, l_pow_m1));
+
+- *out_y = dc_fixpt_pow(dc_fixpt_div(base, div),
+- dc_fixpt_div(dc_fixpt_one, m1));
++ base2 = dc_fixpt_div(base, div);
++ //avoid complex numbers
++ if (dc_fixpt_lt(base2, dc_fixpt_zero))
++ base2 = dc_fixpt_sub(dc_fixpt_zero, base2);
++
++
++ *out_y = dc_fixpt_pow(base2, dc_fixpt_div(dc_fixpt_one, m1));
+
+ }
+
+@@ -1995,10 +1998,28 @@ bool mod_color_calculate_degamma_params(struct dc_transfer_func *input_tf,
+ tf_pts->x_point_at_y1_green = 1;
+ tf_pts->x_point_at_y1_blue = 1;
+
+- map_regamma_hw_to_x_user(ramp, coeff, rgb_user,
+- coordinates_x, axis_x, curve,
+- MAX_HW_POINTS, tf_pts,
+- mapUserRamp && ramp && ramp->type == GAMMA_RGB_256);
++ if (input_tf->tf == TRANSFER_FUNCTION_PQ) {
++ /* just copy current rgb_regamma into tf_pts */
++ struct pwl_float_data_ex *curvePt = curve;
++ int i = 0;
++
++ while (i <= MAX_HW_POINTS) {
++ tf_pts->red[i] = curvePt->r;
++ tf_pts->green[i] = curvePt->g;
++ tf_pts->blue[i] = curvePt->b;
++ ++curvePt;
++ ++i;
++ }
++ } else {
++ //clamps to 0-1
++ map_regamma_hw_to_x_user(ramp, coeff, rgb_user,
++ coordinates_x, axis_x, curve,
++ MAX_HW_POINTS, tf_pts,
++ mapUserRamp && ramp && ramp->type == GAMMA_RGB_256);
++ }
++
++
++
+ if (ramp->type == GAMMA_CUSTOM)
+ apply_lut_1d(ramp, MAX_HW_POINTS, tf_pts);
+
+--
+2.17.1
+