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  | 12 ++++++++++++
 4 files changed, 33 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 258dfc66c2ac..d52bed00bbdb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -1318,6 +1318,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 44306557a905..a41c3a39c367 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -379,6 +379,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 fa0bb6a5c598..663ffc7d648e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -749,6 +749,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 abc5b9a353a0..61e47bdecde4 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
@@ -1323,6 +1323,7 @@ static void dm_drm_plane_reset(struct drm_plane *plane)
        __drm_atomic_helper_plane_reset(plane, &amdgpu_state->base);
        amdgpu_state->degamma_tf = DRM_TRANSFER_FUNCTION_DEFAULT;
        amdgpu_state->hdr_mult = AMDGPU_HDR_MULT_DEFAULT;
+       amdgpu_state->shaper_tf = DRM_TRANSFER_FUNCTION_DEFAULT;
 }
 
 static struct drm_plane_state *
@@ -1351,6 +1352,7 @@ dm_drm_plane_duplicate_state(struct drm_plane *plane)
 
        dm_plane_state->degamma_tf = old_dm_plane_state->degamma_tf;
        dm_plane_state->hdr_mult = old_dm_plane_state->hdr_mult;
+       dm_plane_state->shaper_tf = old_dm_plane_state->shaper_tf;
 
        return &dm_plane_state->base;
 }
@@ -1471,6 +1473,9 @@ dm_atomic_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,
@@ -1516,6 +1521,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 = drm_property_replace_blob_from_id(plane->dev,
                                                        &dm_plane_state->lut3d,
@@ -1554,6 +1564,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