[PATCH v2 19/19] drm/msm/dp: allow YUV420 mode for DP connector when CDM available
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Sat Feb 10 11:33:31 UTC 2024
On Sat, 10 Feb 2024 at 03:52, Paloma Arellano <quic_parellan at quicinc.com> wrote:
>
> 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 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 at quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 +++-
> drivers/gpu/drm/msm/dp/dp_display.c | 4 ++--
> drivers/gpu/drm/msm/dp/dp_drm.c | 8 ++++++--
> drivers/gpu/drm/msm/dp/dp_drm.h | 3 ++-
> drivers/gpu/drm/msm/msm_drv.h | 5 +++--
> 5 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 723cc1d821431..beeaabe499abf 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -565,6 +565,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;
>
> @@ -583,7 +584,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);
Drop parentheses please.
> + 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;
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
> index ebcc76ef1d590..9b9f5f2921903 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -1471,7 +1471,7 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
> }
>
> 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;
> @@ -1487,7 +1487,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,
> diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
> index 46e6889037e88..ab0d0d13b5e2c 100644
> --- a/drivers/gpu/drm/msm/dp/dp_drm.c
> +++ b/drivers/gpu/drm/msm/dp/dp_drm.c
> @@ -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;
>
> @@ -361,8 +362,11 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr
> if (IS_ERR(connector))
> return connector;
>
> - if (!dp_display->is_edp)
> + if (!dp_display->is_edp) {
> drm_connector_attach_dp_subconnector_property(connector);
> + if (yuv_supported)
> + connector->ycbcr_420_allowed = true;
Is there any reason to disallow YUV420 for eDP connectors?
> + }
>
> drm_connector_attach_encoder(connector, encoder);
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
> index b3d684db2383b..45e57ac25a4d9 100644
> --- a/drivers/gpu/drm/msm/dp/dp_drm.h
> +++ b/drivers/gpu/drm/msm/dp/dp_drm.h
> @@ -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);
>
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index b876ebd48effe..37335777f5c09 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -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;
> }
> --
> 2.39.2
>
--
With best wishes
Dmitry
More information about the dri-devel
mailing list