[WHAT]
Create DEGAMMA properties even if color pipeline is enabled, and enforce
the mutual exclusion in atomic check by rejecting any commit that
attempts to enable both COLOR_PIPELINE on the plane and DEGAMMA_LUT on
the CRTC simultaneously.

Fixes: 18a4127e9315 ("drm/amd/display: Disable CRTC degamma when color pipeline 
is enabled")
Signed-off-by: Alex Hung <[email protected]>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c   | 16 ++++++++--------
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c  |  8 ++++++++
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 130190e8a1b2..304437c2284d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -765,15 +765,15 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
        dm->adev->mode_info.crtcs[crtc_index] = acrtc;
 
        /* Don't enable DRM CRTC degamma property for
-        * 1. Degamma is replaced by color pipeline.
-        * 2. DCE since it doesn't support programmable degamma anywhere.
-        * 3. DCN401 since pre-blending degamma LUT doesn't apply to cursor.
+        * 1. DCE since it doesn't support programmable degamma anywhere.
+        * 2. DCN401 since pre-blending degamma LUT doesn't apply to cursor.
+        * Note: DEGAMMA properties are created even if the primary plane has 
the
+        * COLOR_PIPELINE property. User space can use either the DEGAMMA 
properties
+        * or the COLOR_PIPELINE property. An atomic commit which attempts to 
enable
+        * both is rejected.
         */
-       if (plane->color_pipeline_property)
-               has_degamma = false;
-       else
-               has_degamma = dm->adev->dm.dc->caps.color.dpp.dcn_arch &&
-                             dm->adev->dm.dc->ctx->dce_version != 
DCN_VERSION_4_01;
+       has_degamma = dm->adev->dm.dc->caps.color.dpp.dcn_arch &&
+                     dm->adev->dm.dc->ctx->dce_version != DCN_VERSION_4_01;
 
        drm_crtc_enable_color_mgmt(&acrtc->base, has_degamma ? 
MAX_COLOR_LUT_ENTRIES : 0,
                                   true, MAX_COLOR_LUT_ENTRIES);
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 70587e5a8d46..127207e18dcb 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
@@ -1256,6 +1256,14 @@ static int amdgpu_dm_plane_atomic_check(struct drm_plane 
*plane,
        if (ret)
                return ret;
 
+       /* Reject commits that attempt to use both COLOR_PIPELINE and CRTC 
DEGAMMA_LUT */
+       if (new_plane_state->color_pipeline && new_crtc_state->degamma_lut) {
+               drm_dbg_atomic(plane->dev,
+                              "[PLANE:%d:%s] COLOR_PIPELINE and CRTC 
DEGAMMA_LUT cannot be enabled simultaneously\n",
+                              plane->base.id, plane->name);
+               return -EINVAL;
+       }
+
        ret = amdgpu_dm_plane_fill_dc_scaling_info(adev, new_plane_state, 
&scaling_info);
        if (ret)
                return ret;
-- 
2.43.0

Reply via email to