Add __set_dm_plane_colorop_csc_ff() which maps the CSC FF type
enum to the appropriate dc_color_space for DC programming:

  YUV601_RGB601         -> COLOR_SPACE_YCBCR601
  YUV601_LIMITED_RGB601 -> COLOR_SPACE_YCBCR601_LIMITED
  YUV709_RGB709         -> COLOR_SPACE_YCBCR709
  YUV709_LIMITED_RGB709 -> COLOR_SPACE_YCBCR709_LIMITED
  YUV2020_RGB2020       -> COLOR_SPACE_2020_YCBCR_FULL
  YUV2020_LIMITED_RGB2020 -> COLOR_SPACE_2020_YCBCR_LIMITED

When CSC FF is bypassed, color_space is set to COLOR_SPACE_UNKNOWN.

Update amdgpu_dm_plane_set_colorop_properties() to process the
CSC FF colorop first (before DEGAM), matching the new pipeline
order.

Assisted-by Claude:claude-opus-4.6

Signed-off-by: Harry Wentland <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_color.c   | 68 ++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index cd1e58b8defc..d5b4190e635c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -1492,6 +1492,61 @@ __set_colorop_in_tf_1d_curve(struct dc_plane_state 
*dc_plane_state,
        return 0;
 }
 
+static int
+__set_dm_plane_colorop_csc_ff(struct drm_plane_state *plane_state,
+                             struct dc_plane_state *dc_plane_state,
+                             struct drm_colorop *colorop)
+{
+       struct drm_colorop *old_colorop;
+       struct drm_colorop_state *colorop_state = NULL, *new_colorop_state;
+       struct drm_atomic_state *state = plane_state->state;
+       int i = 0;
+
+       old_colorop = colorop;
+
+       for_each_new_colorop_in_state(state, colorop, new_colorop_state, i) {
+               if (new_colorop_state->colorop == old_colorop) {
+                       colorop_state = new_colorop_state;
+                       break;
+               }
+       }
+
+       if (!colorop_state)
+               return -EINVAL;
+
+       if (colorop_state->bypass) {
+               dc_plane_state->color_space = COLOR_SPACE_UNKNOWN;
+               return 0;
+       }
+
+       switch (colorop_state->csc_ff_type) {
+       case DRM_COLOROP_CSC_FF_YUV601_RGB601:
+               dc_plane_state->color_space = COLOR_SPACE_YCBCR601;
+               break;
+       case DRM_COLOROP_CSC_FF_YUV601_LIMITED_RGB601:
+               dc_plane_state->color_space = COLOR_SPACE_YCBCR601_LIMITED;
+               break;
+       case DRM_COLOROP_CSC_FF_YUV709_RGB709:
+               dc_plane_state->color_space = COLOR_SPACE_YCBCR709;
+               break;
+       case DRM_COLOROP_CSC_FF_YUV709_LIMITED_RGB709:
+               dc_plane_state->color_space = COLOR_SPACE_YCBCR709_LIMITED;
+               break;
+       case DRM_COLOROP_CSC_FF_YUV2020_RGB2020:
+               dc_plane_state->color_space = COLOR_SPACE_2020_YCBCR_FULL;
+               break;
+       case DRM_COLOROP_CSC_FF_YUV2020_LIMITED_RGB2020:
+               dc_plane_state->color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       dc_plane_state->update_flags.bits.full_update = 1;
+
+       return 0;
+}
+
 static int
 __set_dm_plane_colorop_degamma(struct drm_plane_state *plane_state,
                               struct dc_plane_state *dc_plane_state,
@@ -1879,10 +1934,21 @@ amdgpu_dm_plane_set_colorop_properties(struct 
drm_plane_state *plane_state,
        bool has_3dlut = adev->dm.dc->caps.color.dpp.hw_3d_lut || 
adev->dm.dc->caps.color.mpc.preblend;
        int ret;
 
-       /* 1D Curve - DEGAM TF */
+       /* CSC Fixed-Function (YUV to RGB) */
        if (!colorop)
                return -EINVAL;
 
+       ret = __set_dm_plane_colorop_csc_ff(plane_state, dc_plane_state, 
colorop);
+       if (ret)
+               return ret;
+
+       /* 1D Curve - DEGAM TF */
+       colorop = colorop->next;
+       if (!colorop) {
+               drm_dbg(dev, "no degamma colorop found\n");
+               return -EINVAL;
+       }
+
        ret = __set_dm_plane_colorop_degamma(plane_state, dc_plane_state, 
colorop);
        if (ret)
                return ret;
-- 
2.53.0

Reply via email to