From: Harry Wentland <harry.wentl...@amd.com>

The shaper LUT requires a 10-bit value of the delta between
segments. We were using dc_fixpt_clamp_u0d10() to do that
but it doesn't do what we want it to do. It will preserve
10-bit precision after the decimal point, but that's not
quite what we want. We want 14-bit precision and discard
the 4 most-significant bytes.

To do that we'll do dc_fixpt_clamp_u0d14() & 0x3ff instead.

Signed-off-by: Harry Wentland <harry.wentl...@amd.com>
---
 .../gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
index f27413e94280..efa6cee649d0 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
@@ -539,10 +539,18 @@ bool cm_helper_translate_curve_to_hw_format(
                rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
                rgb->delta_blue  = dc_fixpt_sub(rgb_plus_1->blue,  rgb->blue);
 
+
                if (fixpoint == true) {
-                       rgb->delta_red_reg   = 
dc_fixpt_clamp_u0d10(rgb->delta_red);
-                       rgb->delta_green_reg = 
dc_fixpt_clamp_u0d10(rgb->delta_green);
-                       rgb->delta_blue_reg  = 
dc_fixpt_clamp_u0d10(rgb->delta_blue);
+                       uint32_t red_clamp = 
dc_fixpt_clamp_u0d14(rgb->delta_red);
+                       uint32_t green_clamp = 
dc_fixpt_clamp_u0d14(rgb->delta_green);
+                       uint32_t blue_clamp = 
dc_fixpt_clamp_u0d14(rgb->delta_blue);
+
+                       if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp 
>> 10)
+                               DC_LOG_WARNING("Losing delta precision while 
programming shaper LUT.");
+
+                       rgb->delta_red_reg   = red_clamp & 0x3ff;
+                       rgb->delta_green_reg = green_clamp & 0x3ff;
+                       rgb->delta_blue_reg  = blue_clamp & 0x3ff;
                        rgb->red_reg         = dc_fixpt_clamp_u0d14(rgb->red);
                        rgb->green_reg       = dc_fixpt_clamp_u0d14(rgb->green);
                        rgb->blue_reg        = dc_fixpt_clamp_u0d14(rgb->blue);
-- 
2.39.2

Reply via email to