On 7/9/25 14:49, Borah, Chaitanya Kumar wrote:
Hi Alex,

-----Original Message-----
From: Alex Hung <alex.h...@amd.com>
Sent: Tuesday, June 17, 2025 9:47 AM
To: dri-de...@lists.freedesktop.org; amd-...@lists.freedesktop.org
Cc: wayland-devel@lists.freedesktop.org; harry.wentl...@amd.com;
alex.h...@amd.com; leo....@amd.com; ville.syrj...@linux.intel.com;
pekka.paala...@collabora.com; cont...@emersion.fr; m...@igalia.com;
jad...@redhat.com; sebastian.w...@redhat.com;
shashank.sha...@amd.com; ago...@nvidia.com; jos...@froggi.es;
mdaen...@redhat.com; aleix...@kde.org; xaver.h...@gmail.com;
victo...@system76.com; dan...@ffwll.ch; Shankar, Uma
<uma.shan...@intel.com>; quic_nas...@quicinc.com;
quic_cbr...@quicinc.com; quic_abhin...@quicinc.com; mar...@marcan.st;
liviu.du...@arm.com; sashamcint...@google.com; Borah, Chaitanya
Kumar <chaitanya.kumar.bo...@intel.com>; louis.chau...@bootlin.com;
arthurgri...@riseup.net
Subject: [PATCH V10 33/46] drm: Add Enhanced LUT precision structure

From: Uma Shankar <uma.shan...@intel.com>

Existing LUT precision structure drm_color_lut has only 16 bit precision. This
is not enough for upcoming enhanced hardwares and advance usecases like
HDR processing. Hence added a new structure with 32 bit precision values.

Signed-off-by: Alex Hung <alex.h...@amd.com>
Signed-off-by: Uma Shankar <uma.shan...@intel.com>
Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.bo...@intel.com>
---
V10:
  - Include drm_color_lut_32 from Intel to support 32BIT RGB in 1D & 3D
    LUTs (Uma Shankar)

  drivers/gpu/drm/drm_color_mgmt.c | 43
++++++++++++++++++++++++++++++++
  include/drm/drm_color_mgmt.h     | 13 ++++++++++
  include/uapi/drm/drm_mode.h      | 11 ++++++++
  3 files changed, 67 insertions(+)

diff --git a/drivers/gpu/drm/drm_color_mgmt.c
b/drivers/gpu/drm/drm_color_mgmt.c
index 3969dc548cff..83dc850d3b54 100644
--- a/drivers/gpu/drm/drm_color_mgmt.c
+++ b/drivers/gpu/drm/drm_color_mgmt.c
@@ -630,3 +630,46 @@ int drm_color_lut_check(const struct
drm_property_blob *lut, u32 tests)
        return 0;
  }
  EXPORT_SYMBOL(drm_color_lut_check);
+
+/**
+ * drm_color_lut_32_check - check validity of extended lookup table
+ * @lut: property blob containing extended LUT to check
+ * @tests: bitmask of tests to run
+ *
+ * Helper to check whether a userspace-provided extended lookup table
+is valid and
+ * satisfies hardware requirements.  Drivers pass a bitmask indicating
+which of
+ * the tests in &drm_color_lut_tests should be performed.
+ *
+ * Returns 0 on success, -EINVAL on failure.
+ */
+int drm_color_lut_32_check(const struct drm_property_blob *lut, u32
+tests) {
+       const struct drm_color_lut_32 *entry;
+       int i;
+
+       if (!lut || !tests)
+               return 0;
+
+       entry = lut->data;
+       for (i = 0; i < drm_color_lut_32_size(lut); i++) {
+               if (tests & DRM_COLOR_LUT_EQUAL_CHANNELS) {
+                       if (entry[i].red != entry[i].blue ||
+                           entry[i].red != entry[i].green) {
+                               DRM_DEBUG_KMS("All LUT entries must have
equal r/g/b\n");
+                               return -EINVAL;
+                       }
+               }
+
+               if (i > 0 && tests & DRM_COLOR_LUT_NON_DECREASING) {
+                       if (entry[i].red < entry[i - 1].red ||
+                           entry[i].green < entry[i - 1].green ||
+                           entry[i].blue < entry[i - 1].blue) {
+                               DRM_DEBUG_KMS("LUT entries must never
decrease.\n");
+                               return -EINVAL;
+                       }
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_color_lut_32_check);
diff --git a/include/drm/drm_color_mgmt.h
b/include/drm/drm_color_mgmt.h index ed81741036d7..882253a82bf1
100644
--- a/include/drm/drm_color_mgmt.h
+++ b/include/drm/drm_color_mgmt.h
@@ -72,6 +72,18 @@ static inline int drm_color_lut_size(const struct
drm_property_blob *blob)
        return blob->length / sizeof(struct drm_color_lut);  }

+/**
+ * drm_color_lut_32_size - calculate the number of entries in the
+extended LUT
+ * @blob: blob containing the LUT
+ *
+ * Returns:
+ * The number of entries in the color LUT stored in @blob.
+ */
+static inline int drm_color_lut_32_size(const struct drm_property_blob
+*blob) {
+       return blob->length / sizeof(struct drm_color_lut_32); }
+
  enum drm_color_encoding {
        DRM_COLOR_YCBCR_BT601,
        DRM_COLOR_YCBCR_BT709,
@@ -118,4 +130,5 @@ enum drm_color_lut_tests {  };

  int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests);
+int drm_color_lut_32_check(const struct drm_property_blob *lut, u32
+tests);
  #endif
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 651bdf48b766..21bd96f437e0 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -872,6 +872,16 @@ struct drm_color_lut {
        __u16 reserved;
  };

+struct drm_color_lut_32 {
+       /*
+        * Similar to drm_color_lut but for high precision LUTs
+        */
+       __u32 red;
+       __u32 green;
+       __u32 blue;
+       __u32 reserved;
+};
+

Since currently there is no way for the kernel to communicate the precision of 
HW to user-space, I am guessing that we assume the precision of the LUT as U0.32
and driver is responsible for converting it to whatever the precision the HW 
needs.

In that case, do we also need a function to extract that similar to 
drm_color_lut_extract(). Something on the line of [1].

[1] 
https://lore.kernel.org/intel-gfx/20250702091936.3004854-7-uma.shan...@intel.com/

Yes it is also needed. I will include it in V11.


Regards

Chaitanya

  /**
   * enum drm_colorop_type - Type of color operation
   *
@@ -879,6 +889,7 @@ struct drm_color_lut {
   * and defines a different set of properties. This enum defines all types and
   * gives a high-level description.
   */
+
  enum drm_colorop_type {
        /**
         * @DRM_COLOROP_1D_CURVE:
--
2.43.0


Reply via email to