On Mon, Jun 29, 2026 at 10:14:23PM +0800, Yongxing Mou wrote:
> From: Abhinav Kumar <[email protected]>
>
> DP controllers across different SoCs vary in the number of concurrent
> MST streams they can support. Rather than hardcoding per-platform
> values, the number of available pixel clocks in DT serves as a natural
> indicator since each stream requires a dedicated pixel clock.
>
> Introduce max_stream to capture this at initialization time and expose
> it for the MST module to use during setup.
>
> Signed-off-by: Abhinav Kumar <[email protected]>
> Signed-off-by: Yongxing Mou <[email protected]>
> ---
> drivers/gpu/drm/msm/dp/dp_ctrl.c | 13 +++++++++++++
> drivers/gpu/drm/msm/dp/dp_ctrl.h | 1 +
> drivers/gpu/drm/msm/dp/dp_display.c | 12 ++++++++++++
> drivers/gpu/drm/msm/dp/dp_display.h | 1 +
> 4 files changed, 27 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c
> b/drivers/gpu/drm/msm/dp/dp_ctrl.c
> index a475e787656e..68fb4facb056 100644
> --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
> +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
> @@ -127,6 +127,7 @@ struct msm_dp_ctrl_private {
> struct clk_bulk_data *link_clks;
>
> struct clk *pixel_clk[DP_STREAM_MAX];
> + unsigned int num_pixel_clks;
Squash num_pixel_clks to the previous patch.
>
> union phy_configure_opts phy_opts;
>
> @@ -2754,6 +2755,7 @@ static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl
> *msm_dp_ctrl)
> if (rc)
> return rc;
>
> + ctrl->num_pixel_clks = 0;
> for (i = DP_STREAM_0; i < DP_STREAM_MAX; i++) {
> ctrl->pixel_clk[i] = devm_clk_get(dev, pixel_clks[i]);
>
> @@ -2766,11 +2768,22 @@ static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl
> *msm_dp_ctrl)
> DRM_DEBUG_DP("stream %d pixel clock not found", i);
> break;
> }
> +
> + ctrl->num_pixel_clks++;
> }
>
> return 0;
> }
>
> +int msm_dp_ctrl_get_stream_cnt(struct msm_dp_ctrl *msm_dp_ctrl)
> +{
> + struct msm_dp_ctrl_private *ctrl;
> +
> + ctrl = container_of(msm_dp_ctrl, struct msm_dp_ctrl_private,
> msm_dp_ctrl);
> +
> + return ctrl->num_pixel_clks;
> +}
> +
> struct msm_dp_ctrl *msm_dp_ctrl_get(struct device *dev, struct msm_dp_link
> *link,
> struct drm_dp_aux *aux,
> struct phy *phy,
> diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h
> b/drivers/gpu/drm/msm/dp/dp_ctrl.h
> index be0d89d60914..305add3dcd93 100644
> --- a/drivers/gpu/drm/msm/dp/dp_ctrl.h
> +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h
> @@ -55,4 +55,5 @@ void msm_dp_ctrl_enable_irq(struct msm_dp_ctrl
> *msm_dp_ctrl);
> void msm_dp_ctrl_disable_irq(struct msm_dp_ctrl *msm_dp_ctrl);
>
> void msm_dp_ctrl_reinit_phy(struct msm_dp_ctrl *msm_dp_ctrl);
> +int msm_dp_ctrl_get_stream_cnt(struct msm_dp_ctrl *dp_ctrl);
> #endif /* _DP_CTRL_H_ */
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c
> b/drivers/gpu/drm/msm/dp/dp_display.c
> index bb243ab09e66..9cd243411e44 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -87,6 +87,8 @@ struct msm_dp_display_private {
>
> void __iomem *p0_base;
> size_t p0_len;
> +
> + int max_stream;
> };
>
> struct msm_dp_desc {
> @@ -578,6 +580,7 @@ static int msm_dp_init_sub_modules(struct
> msm_dp_display_private *dp)
> dp->ctrl = NULL;
> goto error_link;
> }
> + dp->max_stream = msm_dp_ctrl_get_stream_cnt(dp->ctrl);
>
> dp->audio = msm_dp_audio_get(dp->msm_dp_display.pdev, dp->link_base);
> if (IS_ERR(dp->audio)) {
> @@ -1178,6 +1181,15 @@ static int msm_dp_display_get_io(struct
> msm_dp_display_private *display)
> return 0;
> }
>
> +int msm_dp_get_mst_max_stream(struct msm_dp *msm_dp_display)
> +{
> + struct msm_dp_display_private *dp;
> +
> + dp = container_of(msm_dp_display, struct msm_dp_display_private,
> msm_dp_display);
> +
> + return dp->max_stream;
Anything stopping the driver from returning
msm_dp_ctrl_get_stream_cnt(dp->ctrl) here? Why do we need to cache it?
> +}
> +
> static int msm_dp_display_probe(struct platform_device *pdev)
> {
> int rc = 0;
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.h
> b/drivers/gpu/drm/msm/dp/dp_display.h
> index 43ed79093e24..d3d4ab98089d 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.h
> +++ b/drivers/gpu/drm/msm/dp/dp_display.h
> @@ -26,6 +26,7 @@ struct msm_dp {
> bool psr_supported;
> };
>
> +int msm_dp_get_mst_max_stream(struct msm_dp *msm_dp_display);
> int msm_dp_display_get_modes(struct msm_dp *msm_dp_display);
> bool msm_dp_display_check_video_test(struct msm_dp *msm_dp_display);
> int msm_dp_display_get_test_bpp(struct msm_dp *msm_dp_display);
>
> --
> 2.43.0
>
--
With best wishes
Dmitry