drm/i915: Adjust LUT rounding rules
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 13 Oct 2023 13:14:00 +0000 (16:14 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 23 Nov 2023 13:11:47 +0000 (15:11 +0200)
drm_color_lut_extract() rounding was changed to follow the
OpenGL int<->float conversion rules. Adjust intel_color_lut_pack()
to match.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231013131402.24072-3-ville.syrjala@linux.intel.com
Reviewed-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_color.c

index 1d26be54ddfc2ad6faab3b472688edc71c0cad7e..1e734e9329170b8a5293c12cc38f5ff4ef89c763 100644 (file)
@@ -785,14 +785,12 @@ static void chv_assign_csc(struct intel_crtc_state *crtc_state)
 /* convert hw value with given bit_precision to lut property val */
 static u32 intel_color_lut_pack(u32 val, int bit_precision)
 {
-       u32 max = 0xffff >> (16 - bit_precision);
-
-       val = clamp_val(val, 0, max);
-
-       if (bit_precision < 16)
-               val <<= 16 - bit_precision;
-
-       return val;
+       if (bit_precision > 16)
+               return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(val, (1 << 16) - 1),
+                                            (1 << bit_precision) - 1);
+       else
+               return DIV_ROUND_CLOSEST(val * ((1 << 16) - 1),
+                                        (1 << bit_precision) - 1);
 }
 
 static u32 i9xx_lut_8(const struct drm_color_lut *color)