[PATCH V10 33/46] drm: Add Enhanced LUT precision structure

Alex Hung alex.hung at amd.com
Fri Jul 11 16:25:09 UTC 2025



On 7/9/25 14:49, Borah, Chaitanya Kumar wrote:
> Hi Alex,
> 
>> -----Original Message-----
>> From: Alex Hung <alex.hung at amd.com>
>> Sent: Tuesday, June 17, 2025 9:47 AM
>> To: dri-devel at lists.freedesktop.org; amd-gfx at lists.freedesktop.org
>> Cc: wayland-devel at lists.freedesktop.org; harry.wentland at amd.com;
>> alex.hung at amd.com; leo.liu at amd.com; ville.syrjala at linux.intel.com;
>> pekka.paalanen at collabora.com; contact at emersion.fr; mwen at igalia.com;
>> jadahl at redhat.com; sebastian.wick at redhat.com;
>> shashank.sharma at amd.com; agoins at nvidia.com; joshua at froggi.es;
>> mdaenzer at redhat.com; aleixpol at kde.org; xaver.hugl at gmail.com;
>> victoria at system76.com; daniel at ffwll.ch; Shankar, Uma
>> <uma.shankar at intel.com>; quic_naseer at quicinc.com;
>> quic_cbraga at quicinc.com; quic_abhinavk at quicinc.com; marcan at marcan.st;
>> Liviu.Dudau at arm.com; sashamcintosh at google.com; Borah, Chaitanya
>> Kumar <chaitanya.kumar.borah at intel.com>; louis.chauvet at bootlin.com;
>> arthurgrillo at riseup.net
>> Subject: [PATCH V10 33/46] drm: Add Enhanced LUT precision structure
>>
>> From: Uma Shankar <uma.shankar at 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.hung at amd.com>
>> Signed-off-by: Uma Shankar <uma.shankar at intel.com>
>> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah at 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.shankar@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
> 



More information about the dri-devel mailing list