drm/msm/dp: allow YUV420 mode for DP connector when CDM available
authorPaloma Arellano <quic_parellan@quicinc.com>
Thu, 22 Feb 2024 19:40:04 +0000 (11:40 -0800)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 4 Mar 2024 09:38:51 +0000 (11:38 +0200)
All the components of YUV420 over DP are added. Therefore, let's mark the
connector property as true for DP connector when the DP type is not eDP
and when there is a CDM block available.

Changes in v3:
- Move setting the connector's ycbcr_420_allowed parameter so
  that it is not dependent on if the dp_display is not eDP

Changes in v2:
- Check for if dp_catalog has a CDM block available instead of
  checking if VSC SDP is allowed when setting the dp connector's
  ycbcr_420_allowed parameter

Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/579628/
Link: https://lore.kernel.org/r/20240222194025.25329-20-quic_parellan@quicinc.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
drivers/gpu/drm/msm/dp/dp_display.c
drivers/gpu/drm/msm/dp/dp_drm.c
drivers/gpu/drm/msm/dp/dp_drm.h
drivers/gpu/drm/msm/msm_drv.h

index d6412395bacc7e8ca9fa931342dbb47ff672a901..8ec4f084ef5c3a2e79df5dcdc17da35d7c945ceb 100644 (file)
@@ -563,6 +563,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
 {
        struct drm_encoder *encoder = NULL;
        struct msm_display_info info;
+       bool yuv_supported;
        int rc;
        int i;
 
@@ -581,7 +582,8 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
                        return PTR_ERR(encoder);
                }
 
-               rc = msm_dp_modeset_init(priv->dp[i], dev, encoder);
+               yuv_supported = !!dpu_kms->catalog->cdm;
+               rc = msm_dp_modeset_init(priv->dp[i], dev, encoder, yuv_supported);
                if (rc) {
                        DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                        return rc;
index b088e05fd73612c2821ff978f96dd3da3195e1d8..d80f89581760db9b7978a018704aa79034810b98 100644 (file)
@@ -1426,7 +1426,7 @@ void dp_display_debugfs_init(struct msm_dp *dp_display, struct dentry *root, boo
 }
 
 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
-                       struct drm_encoder *encoder)
+                       struct drm_encoder *encoder, bool yuv_supported)
 {
        struct dp_display_private *dp_priv;
        int ret;
@@ -1442,7 +1442,7 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
                return ret;
        }
 
-       dp_display->connector = dp_drm_connector_init(dp_display, encoder);
+       dp_display->connector = dp_drm_connector_init(dp_display, encoder, yuv_supported);
        if (IS_ERR(dp_display->connector)) {
                ret = PTR_ERR(dp_display->connector);
                DRM_DEV_ERROR(dev->dev,
index 46e6889037e8881072c77b23fd1fe240f0e23e9c..a819a4ff76a9f1ecbf208663e78020feb5a5e525 100644 (file)
@@ -353,7 +353,8 @@ int dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
 }
 
 /* connector initialization */
-struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct drm_encoder *encoder)
+struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct drm_encoder *encoder,
+                                           bool yuv_supported)
 {
        struct drm_connector *connector = NULL;
 
@@ -364,6 +365,9 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr
        if (!dp_display->is_edp)
                drm_connector_attach_dp_subconnector_property(connector);
 
+       if (yuv_supported)
+               connector->ycbcr_420_allowed = true;
+
        drm_connector_attach_encoder(connector, encoder);
 
        return connector;
index b3d684db2383b9aff103699b8c06bcb9d5789168..45e57ac25a4d9fc6677521a9133f8873b3b8fd10 100644 (file)
@@ -19,7 +19,8 @@ struct msm_dp_bridge {
 
 #define to_dp_bridge(x)     container_of((x), struct msm_dp_bridge, bridge)
 
-struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct drm_encoder *encoder);
+struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct drm_encoder *encoder,
+                                           bool yuv_supported);
 int dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
                        struct drm_encoder *encoder);
 
index 632c8e883c2bb90b1745851f6dd579d8d039a642..b1757c48b0ef007a809953b7cf058a389e38d86f 100644 (file)
@@ -385,7 +385,7 @@ static inline struct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_
 int __init msm_dp_register(void);
 void __exit msm_dp_unregister(void);
 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
-                        struct drm_encoder *encoder);
+                        struct drm_encoder *encoder, bool yuv_supported);
 void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp_display);
 bool msm_dp_is_yuv_420_enabled(const struct msm_dp *dp_display,
                               const struct drm_display_mode *mode);
@@ -403,7 +403,8 @@ static inline void __exit msm_dp_unregister(void)
 }
 static inline int msm_dp_modeset_init(struct msm_dp *dp_display,
                                       struct drm_device *dev,
-                                      struct drm_encoder *encoder)
+                                      struct drm_encoder *encoder,
+                                      bool yuv_supported)
 {
        return -EINVAL;
 }