Simply initialize MST encoders for MST-capable DP controllers, and
introduce msm_dp_get_mst_max_stream to query MST streams.

Signed-off-by: Yongxing Mou <[email protected]>
Reviewed-by: Dmitry Baryshkov <[email protected]>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 14 +++++++++++++-
 drivers/gpu/drm/msm/msm_drv.h           |  7 ++++++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index da3556eb6ecc..7a00c4094d5c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -655,7 +655,7 @@ static int _dpu_kms_initialize_displayport(struct 
drm_device *dev,
        struct msm_display_info info;
        bool yuv_supported;
        int rc;
-       int i;
+       int i, stream_id, stream_cnt;
 
        for (i = 0; i < ARRAY_SIZE(priv->kms->dp); i++) {
                if (!priv->kms->dp[i])
@@ -678,6 +678,18 @@ static int _dpu_kms_initialize_displayport(struct 
drm_device *dev,
                        DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                        return rc;
                }
+
+               stream_cnt = msm_dp_get_mst_max_stream(priv->kms->dp[i]);
+
+               if (stream_cnt > 1) {
+                       for (stream_id = 0; stream_id < stream_cnt; 
stream_id++) {
+                               encoder = dpu_encoder_init(dev, 
DRM_MODE_ENCODER_DPMST, &info);
+                               if (IS_ERR(encoder)) {
+                                       DPU_ERROR("encoder init failed for dp 
mst display\n");
+                                       return PTR_ERR(encoder);
+                               }
+                       }
+               }
        }
 
        return 0;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index c3fb3205f683..5fee0b291059 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -355,7 +355,7 @@ bool msm_dp_is_yuv_420_enabled(const struct msm_dp 
*dp_display,
 bool msm_dp_needs_periph_flush(const struct msm_dp *dp_display,
                               const struct drm_display_mode *mode);
 bool msm_dp_wide_bus_available(const struct msm_dp *dp_display);
-
+int msm_dp_get_mst_max_stream(struct msm_dp *dp_display);
 #else
 static inline int __init msm_dp_register(void)
 {
@@ -372,6 +372,11 @@ static inline int msm_dp_modeset_init(struct msm_dp 
*dp_display,
        return -EINVAL;
 }
 
+static inline int msm_dp_get_mst_max_stream(struct msm_dp *dp_display)
+{
+       return -EINVAL;
+}
+
 static inline void msm_dp_snapshot(struct msm_disp_state *disp_state, struct 
msm_dp *dp_display)
 {
 }

-- 
2.43.0

Reply via email to