aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch363
1 files changed, 363 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch
new file mode 100644
index 00000000..0a784114
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0028-drm-amd-display-Update-rgb-limited-range-csc-matrix-.patch
@@ -0,0 +1,363 @@
+From 5244ef563b21717a742df33be094e4804821c222 Mon Sep 17 00:00:00 2001
+From: Wenjing Liu <Wenjing.Liu@amd.com>
+Date: Wed, 30 Nov 2016 12:10:35 -0500
+Subject: [PATCH 0028/4131] drm/amd/display: Update rgb limited range csc
+ matrix calculation
+
+The issue causes hue adjustment for rgb
+limited range color space programmed wrong.
+Update calculation formula for rgb limited range
+
+Signed-off-by: Wenjing Liu <Wenjing.Liu@amd.com>
+Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/modules/color/color.c | 300 ++++++++++++++++------
+ 1 file changed, 216 insertions(+), 84 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/modules/color/color.c b/drivers/gpu/drm/amd/display/modules/color/color.c
+index cf030b1..30d09d3 100644
+--- a/drivers/gpu/drm/amd/display/modules/color/color.c
++++ b/drivers/gpu/drm/amd/display/modules/color/color.c
+@@ -854,26 +854,60 @@ static void calculate_rgb_matrix_legacy(struct core_color *core_color,
+ rgb_matrix[11] = grph_bright;
+ }
+
+-static void calculate_rgb_limited_range_matrix(struct core_color *core_color,
+- unsigned int sink_index, struct fixed31_32 *rgb_matrix)
++static void calculate_rgb_limited_range_matrix_legacy(
++ struct core_color *core_color, unsigned int sink_index,
++ struct fixed31_32 *rgb_matrix)
+ {
+- struct fixed31_32 ideal[12];
+-
+- static const int32_t matrix_[] = {
+- 85546875, 0, 0, 6250000,
+- 0, 85546875, 0, 6250000,
+- 0, 0, 85546875, 6250000
+- };
+-
+- uint32_t i = 0;
++ const struct fixed31_32 k1 =
++ dal_fixed31_32_from_fraction(701000, 1000000);
++ const struct fixed31_32 k2 =
++ dal_fixed31_32_from_fraction(236568, 1000000);
++ const struct fixed31_32 k3 =
++ dal_fixed31_32_from_fraction(-587000, 1000000);
++ const struct fixed31_32 k4 =
++ dal_fixed31_32_from_fraction(464432, 1000000);
++ const struct fixed31_32 k5 =
++ dal_fixed31_32_from_fraction(-114000, 1000000);
++ const struct fixed31_32 k6 =
++ dal_fixed31_32_from_fraction(-701000, 1000000);
++ const struct fixed31_32 k7 =
++ dal_fixed31_32_from_fraction(-299000, 1000000);
++ const struct fixed31_32 k8 =
++ dal_fixed31_32_from_fraction(-292569, 1000000);
++ const struct fixed31_32 k9 =
++ dal_fixed31_32_from_fraction(413000, 1000000);
++ const struct fixed31_32 k10 =
++ dal_fixed31_32_from_fraction(-92482, 1000000);
++ const struct fixed31_32 k11 =
++ dal_fixed31_32_from_fraction(-114000, 1000000);
++ const struct fixed31_32 k12 =
++ dal_fixed31_32_from_fraction(385051, 1000000);
++ const struct fixed31_32 k13 =
++ dal_fixed31_32_from_fraction(-299000, 1000000);
++ const struct fixed31_32 k14 =
++ dal_fixed31_32_from_fraction(886000, 1000000);
++ const struct fixed31_32 k15 =
++ dal_fixed31_32_from_fraction(-587000, 1000000);
++ const struct fixed31_32 k16 =
++ dal_fixed31_32_from_fraction(-741914, 1000000);
++ const struct fixed31_32 k17 =
++ dal_fixed31_32_from_fraction(886000, 1000000);
++ const struct fixed31_32 k18 =
++ dal_fixed31_32_from_fraction(-144086, 1000000);
+
+- do {
+- ideal[i] = dal_fixed31_32_from_fraction(
+- matrix_[i],
+- 100000000);
+- ++i;
+- } while (i != ARRAY_SIZE(matrix_));
++ const struct fixed31_32 luma_r =
++ dal_fixed31_32_from_fraction(299, 1000);
++ const struct fixed31_32 luma_g =
++ dal_fixed31_32_from_fraction(587, 1000);
++ const struct fixed31_32 luma_b =
++ dal_fixed31_32_from_fraction(114, 1000);
++ const struct fixed31_32 luma_scale =
++ dal_fixed31_32_from_fraction(875855, 1000000);
+
++ const struct fixed31_32 rgb_scale =
++ dal_fixed31_32_from_fraction(85546875, 100000000);
++ const struct fixed31_32 rgb_bias =
++ dal_fixed31_32_from_fraction(625, 10000);
+
+ struct fixed31_32 grph_cont;
+ struct fixed31_32 grph_sat;
+@@ -885,84 +919,182 @@ static void calculate_rgb_limited_range_matrix(struct core_color *core_color,
+ core_color, sink_index, &grph_cont, &grph_sat,
+ &grph_bright, &sin_grph_hue, &cos_grph_hue);
+
+- const struct fixed31_32 multiplier =
+- dal_fixed31_32_mul(grph_cont, grph_sat);
+-
+- rgb_matrix[8] = dal_fixed31_32_mul(ideal[0], grph_cont);
++ /* COEF_1_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 +*/
++ /* Sin(GrphHue) * K2))*/
++ /* (Cos(GrphHue) * K1 + Sin(GrphHue) * K2)*/
++ rgb_matrix[0] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k1),
++ dal_fixed31_32_mul(sin_grph_hue, k2));
++ /* GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2 */
++ rgb_matrix[0] = dal_fixed31_32_mul(grph_sat, rgb_matrix[0]);
++ /* (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2))*/
++ rgb_matrix[0] = dal_fixed31_32_add(luma_r, rgb_matrix[0]);
++ /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue)**/
++ /* K2))*/
++ rgb_matrix[0] = dal_fixed31_32_mul(grph_cont, rgb_matrix[0]);
++ /* LumaScale * GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + */
++ /* Sin(GrphHue) * K2))*/
++ rgb_matrix[0] = dal_fixed31_32_mul(luma_scale, rgb_matrix[0]);
+
+- rgb_matrix[9] = dal_fixed31_32_mul(ideal[1], grph_cont);
++ /* COEF_1_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 +*/
++ /* Sin(GrphHue) * K4))*/
++ /* (Cos(GrphHue) * K3 + Sin(GrphHue) * K4)*/
++ rgb_matrix[1] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k3),
++ dal_fixed31_32_mul(sin_grph_hue, k4));
++ /* GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4)*/
++ rgb_matrix[1] = dal_fixed31_32_mul(grph_sat, rgb_matrix[1]);
++ /* (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4))*/
++ rgb_matrix[1] = dal_fixed31_32_add(luma_g, rgb_matrix[1]);
++ /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue)**/
++ /* K4))*/
++ rgb_matrix[1] = dal_fixed31_32_mul(grph_cont, rgb_matrix[1]);
++ /* LumaScale * GrphCont * (LumaG + GrphSat *(Cos(GrphHue) * K3 + */
++ /* Sin(GrphHue) * K4))*/
++ rgb_matrix[1] = dal_fixed31_32_mul(luma_scale, rgb_matrix[1]);
+
+- rgb_matrix[10] = dal_fixed31_32_mul(ideal[2], grph_cont);
++ /* COEF_1_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 +*/
++ /* Sin(GrphHue) * K6))*/
++ /* (Cos(GrphHue) * K5 + Sin(GrphHue) * K6)*/
++ rgb_matrix[2] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k5),
++ dal_fixed31_32_mul(sin_grph_hue, k6));
++ /* GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6)*/
++ rgb_matrix[2] = dal_fixed31_32_mul(grph_sat, rgb_matrix[2]);
++ /* LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6)*/
++ rgb_matrix[2] = dal_fixed31_32_add(luma_b, rgb_matrix[2]);
++ /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue)**/
++ /* K6))*/
++ rgb_matrix[2] = dal_fixed31_32_mul(grph_cont, rgb_matrix[2]);
++ /* LumaScale * GrphCont * (LumaB + GrphSat *(Cos(GrphHue) * K5 + */
++ /* Sin(GrphHue) * K6))*/
++ rgb_matrix[2] = dal_fixed31_32_mul(luma_scale, rgb_matrix[2]);
+
+- rgb_matrix[11] = dal_fixed31_32_add(
+- ideal[3],
+- dal_fixed31_32_mul(
+- grph_bright,
+- dal_fixed31_32_from_fraction(86, 100)));
++ /* COEF_1_4 = RGBBias + RGBScale * GrphBright*/
++ rgb_matrix[3] = dal_fixed31_32_add(
++ rgb_bias,
++ dal_fixed31_32_mul(rgb_scale, grph_bright));
+
+- rgb_matrix[0] = dal_fixed31_32_mul(
+- multiplier,
++ /* COEF_2_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 +*/
++ /* Sin(GrphHue) * K8))*/
++ /* (Cos(GrphHue) * K7 + Sin(GrphHue) * K8)*/
++ rgb_matrix[4] =
+ dal_fixed31_32_add(
+- dal_fixed31_32_mul(
+- ideal[8],
+- sin_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[4],
+- cos_grph_hue)));
++ dal_fixed31_32_mul(cos_grph_hue, k7),
++ dal_fixed31_32_mul(sin_grph_hue, k8));
++ /* GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8)*/
++ rgb_matrix[4] = dal_fixed31_32_mul(grph_sat, rgb_matrix[4]);
++ /* (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8))*/
++ rgb_matrix[4] = dal_fixed31_32_add(luma_r, rgb_matrix[4]);
++ /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue)**/
++ /* K8))*/
++ rgb_matrix[4] = dal_fixed31_32_mul(grph_cont, rgb_matrix[4]);
++ /* LumaScale * GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + */
++ /* Sin(GrphHue) * K8))*/
++ rgb_matrix[4] = dal_fixed31_32_mul(luma_scale, rgb_matrix[4]);
+
+- rgb_matrix[1] = dal_fixed31_32_mul(
+- multiplier,
++ /* COEF_2_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 +*/
++ /* Sin(GrphHue) * K10))*/
++ /* (Cos(GrphHue) * K9 + Sin(GrphHue) * K10))*/
++ rgb_matrix[5] =
+ dal_fixed31_32_add(
+- dal_fixed31_32_mul(
+- ideal[9],
+- sin_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[5],
+- cos_grph_hue)));
++ dal_fixed31_32_mul(cos_grph_hue, k9),
++ dal_fixed31_32_mul(sin_grph_hue, k10));
++ /* GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10))*/
++ rgb_matrix[5] = dal_fixed31_32_mul(grph_sat, rgb_matrix[5]);
++ /* (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10))*/
++ rgb_matrix[5] = dal_fixed31_32_add(luma_g, rgb_matrix[5]);
++ /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue)**/
++ /* K10))*/
++ rgb_matrix[5] = dal_fixed31_32_mul(grph_cont, rgb_matrix[5]);
++ /* LumaScale * GrphCont * (LumaG + GrphSat *(Cos(GrphHue) * K9 + */
++ /* Sin(GrphHue) * K10))*/
++ rgb_matrix[5] = dal_fixed31_32_mul(luma_scale, rgb_matrix[5]);
+
+- rgb_matrix[2] = dal_fixed31_32_mul(
+- multiplier,
++ /* COEF_2_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 +*/
++ /* Sin(GrphHue) * K12))*/
++ /* (Cos(GrphHue) * K11 + Sin(GrphHue) * K12))*/
++ rgb_matrix[6] =
+ dal_fixed31_32_add(
+- dal_fixed31_32_mul(
+- ideal[10],
+- sin_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[6],
+- cos_grph_hue)));
++ dal_fixed31_32_mul(cos_grph_hue, k11),
++ dal_fixed31_32_mul(sin_grph_hue, k12));
++ /* GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12))*/
++ rgb_matrix[6] = dal_fixed31_32_mul(grph_sat, rgb_matrix[6]);
++ /* (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12))*/
++ rgb_matrix[6] = dal_fixed31_32_add(luma_b, rgb_matrix[6]);
++ /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue)**/
++ /* K12))*/
++ rgb_matrix[6] = dal_fixed31_32_mul(grph_cont, rgb_matrix[6]);
++ /* LumaScale * GrphCont * (LumaB + GrphSat *(Cos(GrphHue) * K11 +*/
++ /* Sin(GrphHue) * K12)) */
++ rgb_matrix[6] = dal_fixed31_32_mul(luma_scale, rgb_matrix[6]);
+
+- rgb_matrix[3] = ideal[7];
++ /* COEF_2_4 = RGBBias + RGBScale * GrphBright*/
++ rgb_matrix[7] = dal_fixed31_32_add(
++ rgb_bias,
++ dal_fixed31_32_mul(rgb_scale, grph_bright));
+
+- rgb_matrix[4] = dal_fixed31_32_mul(
+- multiplier,
+- dal_fixed31_32_sub(
+- dal_fixed31_32_mul(
+- ideal[8],
+- cos_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[4],
+- sin_grph_hue)));
++ /* COEF_3_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 +*/
++ /* Sin(GrphHue) * K14))*/
++ /* (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */
++ rgb_matrix[8] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k13),
++ dal_fixed31_32_mul(sin_grph_hue, k14));
++ /* GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */
++ rgb_matrix[8] = dal_fixed31_32_mul(grph_sat, rgb_matrix[8]);
++ /* (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */
++ rgb_matrix[8] = dal_fixed31_32_add(luma_r, rgb_matrix[8]);
++ /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue)**/
++ /* K14)) */
++ rgb_matrix[8] = dal_fixed31_32_mul(grph_cont, rgb_matrix[8]);
++ /* LumaScale * GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 +*/
++ /* Sin(GrphHue) * K14))*/
++ rgb_matrix[8] = dal_fixed31_32_mul(luma_scale, rgb_matrix[8]);
+
+- rgb_matrix[5] = dal_fixed31_32_mul(
+- multiplier,
+- dal_fixed31_32_sub(
+- dal_fixed31_32_mul(
+- ideal[9],
+- cos_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[5],
+- sin_grph_hue)));
++ /* COEF_3_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 +*/
++ /* Sin(GrphHue) * K16)) */
++ /* GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16) */
++ rgb_matrix[9] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k15),
++ dal_fixed31_32_mul(sin_grph_hue, k16));
++ /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */
++ rgb_matrix[9] = dal_fixed31_32_mul(grph_sat, rgb_matrix[9]);
++ /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */
++ rgb_matrix[9] = dal_fixed31_32_add(luma_g, rgb_matrix[9]);
++ /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue)**/
++ /* K16)) */
++ rgb_matrix[9] = dal_fixed31_32_mul(grph_cont, rgb_matrix[9]);
++ /* LumaScale * GrphCont * (LumaG + GrphSat *(Cos(GrphHue) * K15 + */
++ /* Sin(GrphHue) * K16))*/
++ rgb_matrix[9] = dal_fixed31_32_mul(luma_scale, rgb_matrix[9]);
+
+- rgb_matrix[6] = dal_fixed31_32_mul(
+- multiplier,
+- dal_fixed31_32_sub(
+- dal_fixed31_32_mul(
+- ideal[10],
+- cos_grph_hue),
+- dal_fixed31_32_mul(
+- ideal[6],
+- sin_grph_hue)));
++ /* COEF_3_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 +*/
++ /* Sin(GrphHue) * K18)) */
++ /* (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */
++ rgb_matrix[10] =
++ dal_fixed31_32_add(
++ dal_fixed31_32_mul(cos_grph_hue, k17),
++ dal_fixed31_32_mul(sin_grph_hue, k18));
++ /* GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */
++ rgb_matrix[10] = dal_fixed31_32_mul(grph_sat, rgb_matrix[10]);
++ /* (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */
++ rgb_matrix[10] = dal_fixed31_32_add(luma_b, rgb_matrix[10]);
++ /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue)**/
++ /* K18)) */
++ rgb_matrix[10] = dal_fixed31_32_mul(grph_cont, rgb_matrix[10]);
++ /* LumaScale * GrphCont * (LumaB + GrphSat *(Cos(GrphHue) * */
++ /* K17 + Sin(GrphHue) * K18))*/
++ rgb_matrix[10] = dal_fixed31_32_mul(luma_scale, rgb_matrix[10]);
+
+- rgb_matrix[7] = ideal[11];
++ /* COEF_3_4 = RGBBias + RGBScale * GrphBright */
++ rgb_matrix[11] = dal_fixed31_32_add(
++ rgb_bias,
++ dal_fixed31_32_mul(rgb_scale, grph_bright));
+ }
+
+ static void calculate_yuv_matrix(struct core_color *core_color,
+@@ -1110,9 +1242,9 @@ static void calculate_csc_matrix(struct core_color *core_color,
+ (csc_matrix, fixed_csc_matrix, 12);
+ break;
+ case COLOR_SPACE_SRGB_LIMITED:
+- calculate_rgb_limited_range_matrix(core_color, sink_index,
+- fixed_csc_matrix);
+- convert_float_matrix(csc_matrix, fixed_csc_matrix, 12);
++ calculate_rgb_limited_range_matrix_legacy(
++ core_color, sink_index, fixed_csc_matrix);
++ convert_float_matrix_legacy(csc_matrix, fixed_csc_matrix, 12);
+ break;
+ case COLOR_SPACE_YCBCR601:
+ case COLOR_SPACE_YCBCR709:
+--
+2.7.4
+