On Mon, Aug 25, 2025 at 10:16:20PM +0800, Yongxing Mou wrote: > From: Abhinav Kumar <quic_abhin...@quicinc.com> > > Initialize a DPMST encoder for each MST capable DP controller > and the number of encoders it supports depends on the number > of streams it supports. > > Signed-off-by: Abhinav Kumar <quic_abhin...@quicinc.com> > Signed-off-by: Yongxing Mou <yongxing....@oss.qualcomm.com> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 2 ++ > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 23 ++++++++++++++++++++++- > drivers/gpu/drm/msm/dp/dp_mst_drm.h | 2 -- > drivers/gpu/drm/msm/msm_drv.h | 13 +++++++++++++ > 4 files changed, 37 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > index > ca1ca2e51d7ead0eb34b27f3168e6bb06a71a11a..2eb4c39b111c1d8622e09e78ffafef017e28bbf6 > 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > @@ -28,6 +28,7 @@ > * @h_tile_instance: Controller instance used per tile. Number of > elements is > * based on num_of_h_tiles > * @is_cmd_mode Boolean to indicate if the CMD mode is requested > + * @stream_id stream id for which the interface needs to be > acquired > * @vsync_source: Source of the TE signal for DSI CMD devices > */ > struct msm_display_info { > @@ -35,6 +36,7 @@ struct msm_display_info { > uint32_t num_of_h_tiles; > uint32_t h_tile_instance[MAX_H_TILES_PER_DISPLAY]; > bool is_cmd_mode; > + int stream_id; > enum dpu_vsync_source vsync_source; > }; > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index > 12dcb32b472497f9e59619db4e810abfbf610c7c..0b9d9207f4f69e0d0725ff265c624828b5816a8b > 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -653,7 +653,8 @@ 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; > + int stream_cnt; > > for (i = 0; i < ARRAY_SIZE(priv->kms->dp); i++) { > if (!priv->kms->dp[i]) > @@ -676,6 +677,26 @@ 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++) { > + info.stream_id = 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); > + } > + > + rc = > msm_dp_mst_drm_bridge_init(priv->kms->dp[i], encoder);
This is an implementation detail. We should be asking to init MST, which might or might not be a bridge. > + if (rc) { > + DPU_ERROR("dp mst bridge %d init > failed, %d\n", DP, MST, no 'bridge'. > + stream_id, rc); > + continue; > + } > + } > + } > } > > return 0; > diff --git a/drivers/gpu/drm/msm/dp/dp_mst_drm.h > b/drivers/gpu/drm/msm/dp/dp_mst_drm.h > index > 8fe6cbbe741da4abb232256b3a15ba6b16ca4f3e..d73e3f908439094532e88945ed4d41ed092051c9 > 100644 > --- a/drivers/gpu/drm/msm/dp/dp_mst_drm.h > +++ b/drivers/gpu/drm/msm/dp/dp_mst_drm.h > @@ -82,8 +82,6 @@ struct msm_dp_mst_connector { > struct msm_dp_panel *dp_panel; > }; > > -int msm_dp_mst_drm_bridge_init(struct msm_dp *dp, struct drm_encoder > *encoder); > - Squash this and the next chunks to the corresponding patches. > int msm_dp_mst_init(struct msm_dp *dp_display, u32 max_streams, struct > drm_dp_aux *drm_aux); > > void msm_dp_mst_display_hpd_irq(struct msm_dp *dp_display); > diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h > index > 985db9febd98e35dfed51d39dac1a522abe5a351..3e64ec7b7dbe1d1107e85def9aa80277131f40bf > 100644 > --- a/drivers/gpu/drm/msm/msm_drv.h > +++ b/drivers/gpu/drm/msm/msm_drv.h > @@ -363,6 +363,9 @@ 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); > +int msm_dp_mst_drm_bridge_init(struct msm_dp *dp_display, struct drm_encoder > *encoder); > + > #else > static inline int __init msm_dp_register(void) > { > @@ -379,6 +382,16 @@ 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 int msm_dp_mst_drm_bridge_init(struct msm_dp *dp_display, > struct drm_encoder *encoder) > +{ > + return -EINVAL; > +} > + > static inline void msm_dp_snapshot(struct msm_disp_state *disp_state, struct > msm_dp *dp_display) > { > } > > -- > 2.34.1 > -- With best wishes Dmitry