diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0076-drm-amd-display-Fix-programming-of-gamma-end-points.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0076-drm-amd-display-Fix-programming-of-gamma-end-points.patch | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0076-drm-amd-display-Fix-programming-of-gamma-end-points.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0076-drm-amd-display-Fix-programming-of-gamma-end-points.patch new file mode 100644 index 00000000..c1298db9 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0076-drm-amd-display-Fix-programming-of-gamma-end-points.patch @@ -0,0 +1,140 @@ +From 0800489d0ff1410b2b1371353871b2333bc0959d Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Fri, 16 Dec 2016 12:12:03 -0500 +Subject: [PATCH 0076/4131] drm/amd/display: Fix programming of gamma end + points + +Signed-off-by: Anthony Koo <anthony.koo@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/dc/calcs/gamma_calcs.c | 51 ++++++++++++---------- + 1 file changed, 27 insertions(+), 24 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/gamma_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/gamma_calcs.c +index 729652a..5cd408d 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/gamma_calcs.c ++++ b/drivers/gpu/drm/amd/display/dc/calcs/gamma_calcs.c +@@ -245,6 +245,8 @@ static bool build_hw_curve_configuration( + uint32_t segments = 0; + uint32_t max_number; + ++ int8_t num_regions = 0; ++ + bool result = false; + + if (!number_of_points) { +@@ -273,6 +275,7 @@ static bool build_hw_curve_configuration( + ASSERT(curve_config->segments[i] >= 0); + + segments += (1 << curve_config->segments[i]); ++ ++num_regions; + + ++i; + } +@@ -284,12 +287,14 @@ static bool build_hw_curve_configuration( + uint32_t offset = 0; + int8_t begin = curve_config->begin; + int32_t region_number = 0; ++ struct fixed31_32 magic_number = ++ dal_fixed31_32_from_fraction(249, 1000); + + i = begin; + + while ((index < max_number) && + (region_number < max_regions_number) && +- (i <= 1)) { ++ (i < (begin + num_regions))) { + int32_t j = 0; + + segments = curve_config->segments[region_number]; +@@ -345,8 +350,7 @@ static bool build_hw_curve_configuration( + divisor); + + points[index].x = region1; +- +- round_custom_float_6_12(points + index); ++ points[index].adjusted_x = region1; + + ++index; + ++region_number; +@@ -366,9 +370,10 @@ static bool build_hw_curve_configuration( + ++i; + } + +- points[index].x = region1; +- +- round_custom_float_6_12(points + index); ++ points[index].x = ++ dal_fixed31_32_add(region1, magic_number); ++ points[index].adjusted_x = ++ dal_fixed31_32_add(region1, magic_number); + + *number_of_points = index; + +@@ -1215,15 +1220,11 @@ static void rebuild_curve_configuration_magic( + const struct hw_x_point *coordinates_x, + uint32_t hw_points_num) + { +- const struct fixed31_32 magic_number = +- dal_fixed31_32_from_fraction(249, 1000); +- + struct fixed31_32 y_r; + struct fixed31_32 y_g; + struct fixed31_32 y_b; + + struct fixed31_32 y1_min; +- struct fixed31_32 y2_max; + struct fixed31_32 y3_max; + + y_r = rgb_resulted[0].red; +@@ -1238,29 +1239,31 @@ static void rebuild_curve_configuration_magic( + arr_points[0].y, + arr_points[0].x); + +- arr_points[1].x = dal_fixed31_32_add( +- coordinates_x[hw_points_num - 1].adjusted_x, +- magic_number); +- +- arr_points[2].x = arr_points[1].x; +- +- y_r = rgb_resulted[hw_points_num - 1].red; +- y_g = rgb_resulted[hw_points_num - 1].green; +- y_b = rgb_resulted[hw_points_num - 1].blue; +- +- y2_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b)); +- +- arr_points[1].y = y2_max; ++ /* this should be cleaned up as it's confusing my understanding (KK) is ++ * that REGAMMA_CNTLA_EXP_REGION_END is the X value for the region end ++ * REGAMMA_CNTLA_EXP_REGION_END_BASE is Y value for the above X ++ * REGAMMA_CNTLA_EXP_REGION_END_SLOPE is the slope beyond (X,Y) above ++ * currently when programming REGION_END = m_arrPoints[1].x, ++ * REGION_END_BASE = m_arrPoints[1].y, REGION_END_SLOPE=1 ++ * we don't use m_arrPoints[2] at all after this function, ++ * and its purpose isn't clear to me ++ */ ++ arr_points[1].x = coordinates_x[hw_points_num].adjusted_x; ++ arr_points[2].x = coordinates_x[hw_points_num].adjusted_x; + + y_r = rgb_resulted[hw_points_num].red; + y_g = rgb_resulted[hw_points_num].green; + y_b = rgb_resulted[hw_points_num].blue; + ++ /* see comment above, m_arrPoints[1].y should be the Y value for the ++ * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1) ++ */ + y3_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b)); + ++ arr_points[1].y = y3_max; + arr_points[2].y = y3_max; + +- arr_points[2].slope = dal_fixed31_32_one; ++ arr_points[2].slope = dal_fixed31_32_zero; + } + + static bool convert_to_custom_float_format( +-- +2.7.4 + |