Add property to set predefined transfer function to enable delinearizing
content with or without shaper LUT. Drivers should advertize this
property acoording to HW caps.

Signed-off-by: Melissa Wen <m...@igalia.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c           |  9 +++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h              |  6 ++++++
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h     |  6 ++++++
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c   | 11 +++++++++++
 4 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index f41406ee96ad..2bf8b19feae4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -1346,6 +1346,15 @@ amdgpu_display_create_color_properties(struct 
amdgpu_device *adev)
                return -ENOMEM;
        adev->mode_info.plane_shaper_lut_size_property = prop;
 
+       prop = drm_property_create_enum(adev_to_drm(adev),
+                                       DRM_MODE_PROP_ENUM,
+                                       "AMD_PLANE_SHAPER_TF",
+                                       drm_transfer_function_enum_list,
+                                       
ARRAY_SIZE(drm_transfer_function_enum_list));
+       if (!prop)
+               return -ENOMEM;
+       adev->mode_info.plane_shaper_tf_property = prop;
+
        prop = drm_property_create(adev_to_drm(adev),
                                   DRM_MODE_PROP_BLOB,
                                   "AMD_PLANE_LUT3D", 0);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 756d5f70be0a..17c7669ad9ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -401,6 +401,12 @@ struct amdgpu_mode_info {
         * pre-blending shaper LUT as supported by the driver (read-only).
         */
        struct drm_property *plane_shaper_lut_size_property;
+       /**
+        * @plane_shaper_tf_property: Plane property to set a predefined
+        * transfer function for pre-blending shaper (before applying 3D LUT)
+        * with or without LUT.
+        */
+       struct drm_property *plane_shaper_tf_property;
        /**
         * @plane_lut3d_property: Plane property for gamma correction using a
         * 3D LUT (pre-blending).
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index d3ecc73129ff..8a425e7a7e89 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -753,6 +753,12 @@ struct dm_plane_state {
         * array of &struct drm_color_lut.
         */
        struct drm_property_blob *shaper_lut;
+       /**
+        * @shaper_tf:
+        *
+        * Predefined transfer function to delinearize color space.
+        */
+       enum drm_transfer_function shaper_tf;
        /**
         * @lut3d: 3D lookup table blob. The blob (if not NULL) is an array of
         * &struct drm_color_lut.
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
index 69e2f1f86cce..e4f28fbf6613 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
@@ -1324,6 +1324,7 @@ static void dm_drm_plane_reset(struct drm_plane *plane)
        if (amdgpu_state) {
                amdgpu_state->degamma_tf = DRM_TRANSFER_FUNCTION_DEFAULT;
                amdgpu_state->hdr_mult = AMDGPU_HDR_MULT_DEFAULT;
+               amdgpu_state->shaper_tf = DRM_TRANSFER_FUNCTION_DEFAULT;
        }
 #endif
 }
@@ -1503,6 +1504,9 @@ dm_plane_attach_color_mgmt_properties(struct 
amdgpu_display_manager *dm,
                drm_object_attach_property(&plane->base,
                                           
dm->adev->mode_info.plane_shaper_lut_size_property,
                                           MAX_COLOR_LUT_ENTRIES);
+               drm_object_attach_property(&plane->base,
+                                          
dm->adev->mode_info.plane_shaper_tf_property,
+                                          DRM_TRANSFER_FUNCTION_DEFAULT);
                drm_object_attach_property(&plane->base,
                                           
dm->adev->mode_info.plane_lut3d_property, 0);
                drm_object_attach_property(&plane->base,
@@ -1547,6 +1551,11 @@ dm_atomic_plane_set_property(struct drm_plane *plane,
                                        &replaced);
                dm_plane_state->base.color_mgmt_changed |= replaced;
                return ret;
+       } else if (property == adev->mode_info.plane_shaper_tf_property) {
+               if (dm_plane_state->shaper_tf != val) {
+                       dm_plane_state->shaper_tf = val;
+                       dm_plane_state->base.color_mgmt_changed = 1;
+               }
        } else if (property == adev->mode_info.plane_lut3d_property) {
                ret = amdgpu_dm_replace_property_blob_from_id(plane->dev,
                                        &dm_plane_state->lut3d,
@@ -1586,6 +1595,8 @@ dm_atomic_plane_get_property(struct drm_plane *plane,
        } else  if (property == adev->mode_info.plane_shaper_lut_property) {
                *val = (dm_plane_state->shaper_lut) ?
                        dm_plane_state->shaper_lut->base.id : 0;
+       } else if (property == adev->mode_info.plane_shaper_tf_property) {
+               *val = dm_plane_state->shaper_tf;
        } else  if (property == adev->mode_info.plane_lut3d_property) {
                *val = (dm_plane_state->lut3d) ?
                        dm_plane_state->lut3d->base.id : 0;
-- 
2.39.2

Reply via email to