Wide bus is not supported when the mode is YUV420 in DP. In preparation
for changing the DPU programming to reflect this, the value and
assignment location of wide_bus_en for the DP submodules must be
changed. Move it from boot time in dp_init_sub_modules() to run time in
dp_display_mode_set.

Signed-off-by: Paloma Arellano <quic_parel...@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
---
 drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++++----
 drivers/gpu/drm/msm/dp/dp_panel.h   |  1 +
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 792191f67717f..1a84f68e2b59a 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -785,10 +785,6 @@ static int dp_init_sub_modules(struct dp_display_private 
*dp)
                goto error_ctrl;
        }
 
-       /* populate wide_bus_supported to different layers */
-       dp->ctrl->wide_bus_en = dp->wide_bus_supported;
-       dp->catalog->wide_bus_en = dp->wide_bus_supported;
-
        return rc;
 
 error_ctrl:
@@ -809,6 +805,7 @@ static int dp_display_set_mode(struct msm_dp *dp_display,
        drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode);
        dp->panel->dp_mode.bpp = mode->bpp;
        dp->panel->dp_mode.capabilities = mode->capabilities;
+       dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420;
        dp_panel_init_panel_info(dp->panel);
        return 0;
 }
@@ -1403,6 +1400,9 @@ bool msm_dp_wide_bus_available(const struct msm_dp 
*dp_display)
 
        dp = container_of(dp_display, struct dp_display_private, dp_display);
 
+       if (dp->dp_mode.out_fmt_is_yuv_420)
+               return false;
+
        return dp->wide_bus_supported;
 }
 
@@ -1616,6 +1616,15 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
 
        dp_display->dp_mode.h_active_low =
                !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
+
+       dp_display->dp_mode.out_fmt_is_yuv_420 =
+               drm_mode_is_420_only(&dp->connector->display_info, 
adjusted_mode);
+
+       /* populate wide_bus_support to different layers */
+       dp_display->ctrl->wide_bus_en =
+               dp_display->dp_mode.out_fmt_is_yuv_420 ? false : 
dp_display->wide_bus_supported;
+       dp_display->catalog->wide_bus_en =
+               dp_display->dp_mode.out_fmt_is_yuv_420 ? false : 
dp_display->wide_bus_supported;
 }
 
 void dp_bridge_hpd_enable(struct drm_bridge *bridge)
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h 
b/drivers/gpu/drm/msm/dp/dp_panel.h
index a0dfc579c5f9f..6ec68be9f2366 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.h
+++ b/drivers/gpu/drm/msm/dp/dp_panel.h
@@ -19,6 +19,7 @@ struct dp_display_mode {
        u32 bpp;
        u32 h_active_low;
        u32 v_active_low;
+       bool out_fmt_is_yuv_420;
 };
 
 struct dp_panel_in {
-- 
2.39.2

Reply via email to