Add COLOR_ENCODING and COLOR_RANGE plane properties and use them to
control the DP CSC matrix.

Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
---
 drivers/gpu/drm/imx/ipuv3-plane.c | 44 +++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c 
b/drivers/gpu/drm/imx/ipuv3-plane.c
index d77210043fe2..7909156d3a78 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -284,6 +284,8 @@ static void ipu_plane_state_reset(struct drm_plane *plane)
                __drm_atomic_helper_plane_reset(plane, &ipu_state->base);
                ipu_state->base.zpos = zpos;
                ipu_state->base.normalized_zpos = zpos;
+               ipu_state->base.color_encoding = DRM_COLOR_YCBCR_BT601;
+               ipu_state->base.color_range = DRM_COLOR_YCBCR_LIMITED_RANGE;
        }
 }
 
@@ -589,6 +591,25 @@ static void ipu_plane_atomic_update(struct drm_plane 
*plane,
                                          fb->modifier, &eba);
        }
 
+       if (!old_state->fb ||
+           old_state->fb->format->format != fb->format->format ||
+           old_state->color_encoding != state->color_encoding ||
+           old_state->color_range != state->color_range) {
+               ics = ipu_drm_fourcc_to_colorspace(fb->format->format);
+               switch (ipu_plane->dp_flow) {
+               case IPU_DP_FLOW_SYNC_BG:
+                       ipu_dp_setup_channel(ipu_plane->dp, 
state->color_encoding,
+                                            state->color_range, ics,
+                                            IPUV3_COLORSPACE_RGB);
+                       break;
+               case IPU_DP_FLOW_SYNC_FG:
+                       ipu_dp_setup_channel(ipu_plane->dp, 
state->color_encoding,
+                                            state->color_range, ics,
+                                            IPUV3_COLORSPACE_UNKNOWN);
+                       break;
+               }
+       }
+
        if (old_state->fb && !drm_atomic_crtc_needs_modeset(crtc_state)) {
                /* nothing to do if PRE is used */
                if (ipu_state->use_pre)
@@ -605,20 +626,6 @@ static void ipu_plane_atomic_update(struct drm_plane 
*plane,
                return;
        }
 
-       ics = ipu_drm_fourcc_to_colorspace(fb->format->format);
-       switch (ipu_plane->dp_flow) {
-       case IPU_DP_FLOW_SYNC_BG:
-               ipu_dp_setup_channel(ipu_plane->dp, DRM_COLOR_YCBCR_BT601,
-                                    DRM_COLOR_YCBCR_LIMITED_RANGE, ics,
-                                    IPUV3_COLORSPACE_RGB);
-               break;
-       case IPU_DP_FLOW_SYNC_FG:
-               ipu_dp_setup_channel(ipu_plane->dp, DRM_COLOR_YCBCR_BT601,
-                                    DRM_COLOR_YCBCR_LIMITED_RANGE, ics,
-                                    IPUV3_COLORSPACE_UNKNOWN);
-               break;
-       }
-
        ipu_dmfc_config_wait4eot(ipu_plane->dmfc, drm_rect_width(dst));
 
        width = drm_rect_width(&state->src) >> 16;
@@ -859,6 +866,15 @@ struct ipu_plane *ipu_plane_init(struct drm_device *dev, 
struct ipu_soc *ipu,
        if (ret)
                return ERR_PTR(ret);
 
+       ret = drm_plane_create_color_properties(&ipu_plane->base,
+                       BIT(DRM_COLOR_YCBCR_BT601) |
+                       BIT(DRM_COLOR_YCBCR_BT709),
+                       BIT(DRM_COLOR_YCBCR_LIMITED_RANGE),
+                       DRM_COLOR_YCBCR_BT601,
+                       DRM_COLOR_YCBCR_LIMITED_RANGE);
+       if (ret)
+               return ERR_PTR(ret);
+
        ret = ipu_plane_get_resources(dev, ipu_plane);
        if (ret) {
                DRM_ERROR("failed to get %s plane resources: %pe\n",
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to