]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/komeda: Add drm_lut_to_fgamma_coeffs()
authorjames qian wang (Arm Technology China) <james.qian.wang@arm.com>
Tue, 12 Nov 2019 11:10:09 +0000 (11:10 +0000)
committerjames qian wang (Arm Technology China) <james.qian.wang@arm.com>
Thu, 14 Nov 2019 02:29:51 +0000 (10:29 +0800)
This function is used to convert drm color lut to komeda HW required curve
coeffs values.

Signed-off-by: james qian wang (Arm Technology China) <james.qian.wang@arm.com>
Reviewed-by: Mihail Atanassov <mihail.atanassov@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191112110927.20931-3-james.qian.wang@arm.com
drivers/gpu/drm/arm/display/komeda/komeda_color_mgmt.c
drivers/gpu/drm/arm/display/komeda/komeda_color_mgmt.h

index 9d14a92dbb17a3a84c9ed8d57b830a8f5a603e77..c180ce70c26c9d679ebbeb5c322f784b47a8001c 100644 (file)
@@ -65,3 +65,55 @@ const s32 *komeda_select_yuv2rgb_coeffs(u32 color_encoding, u32 color_range)
 
        return coeffs;
 }
+
+struct gamma_curve_sector {
+       u32 boundary_start;
+       u32 num_of_segments;
+       u32 segment_width;
+};
+
+struct gamma_curve_segment {
+       u32 start;
+       u32 end;
+};
+
+static struct gamma_curve_sector sector_tbl[] = {
+       { 0,    4,  4   },
+       { 16,   4,  4   },
+       { 32,   4,  8   },
+       { 64,   4,  16  },
+       { 128,  4,  32  },
+       { 256,  4,  64  },
+       { 512,  16, 32  },
+       { 1024, 24, 128 },
+};
+
+static void
+drm_lut_to_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs,
+                 struct gamma_curve_sector *sector_tbl, u32 num_sectors)
+{
+       struct drm_color_lut *lut;
+       u32 i, j, in, num = 0;
+
+       if (!lut_blob)
+               return;
+
+       lut = lut_blob->data;
+
+       for (i = 0; i < num_sectors; i++) {
+               for (j = 0; j < sector_tbl[i].num_of_segments; j++) {
+                       in = sector_tbl[i].boundary_start +
+                            j * sector_tbl[i].segment_width;
+
+                       coeffs[num++] = drm_color_lut_extract(lut[in].red,
+                                               KOMEDA_COLOR_PRECISION);
+               }
+       }
+
+       coeffs[num] = BIT(KOMEDA_COLOR_PRECISION);
+}
+
+void drm_lut_to_fgamma_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs)
+{
+       drm_lut_to_coeffs(lut_blob, coeffs, sector_tbl, ARRAY_SIZE(sector_tbl));
+}
index a2df218f58e79c8b4045e6d8e6f59aa144e12a27..08ab69281648d8975034721e89f7d197b2b7144f 100644 (file)
 #include <drm/drm_color_mgmt.h>
 
 #define KOMEDA_N_YUV2RGB_COEFFS                12
+#define KOMEDA_N_RGB2YUV_COEFFS                12
+#define KOMEDA_COLOR_PRECISION         12
+#define KOMEDA_N_GAMMA_COEFFS          65
+#define KOMEDA_COLOR_LUT_SIZE          BIT(KOMEDA_COLOR_PRECISION)
+#define KOMEDA_N_CTM_COEFFS            9
+
+void drm_lut_to_fgamma_coeffs(struct drm_property_blob *lut_blob, u32 *coeffs);
 
 const s32 *komeda_select_yuv2rgb_coeffs(u32 color_encoding, u32 color_range);
 
-#endif
+#endif /*_KOMEDA_COLOR_MGMT_H_*/