On 4/12/2026 1:38 AM, Dmitry Baryshkov wrote:
On Fri, Apr 10, 2026 at 05:33:43PM +0800, Yongxing Mou wrote:
From: Abhinav Kumar <[email protected]>

Currently, the dp_ctrl stream APIs operate on their own dp_panel
which is stored inside the dp_ctrl's private struct. However with MST,
the stored panel represents the fixed link and not the sinks which
are hotplugged. Allow the stream related APIs to work on the panel
which is passed to them rather than the stored one. For SST cases,
this shall continue to use the stored dp_panel.

Hmm. Why? Can't we get rid of it (in the followup patch)?

In MST, the stream panel is bound to the connector, but in SST the panel is still stored in msm_dp_display_private and msm_dp_ctrl_private, so dropping it does not seem necessary at this point. The purpose of these changes is to allow the functions to operate on the MST panel data passed in per stream.

Signed-off-by: Abhinav Kumar <[email protected]>
Signed-off-by: Yongxing Mou <[email protected]>
---
  drivers/gpu/drm/msm/dp/dp_ctrl.c    | 21 +++++++++++----------
  drivers/gpu/drm/msm/dp/dp_ctrl.h    |  2 +-
  drivers/gpu/drm/msm/dp/dp_display.c |  2 +-
  3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index cd58968d4e14..d0eed8c7df45 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -477,13 +477,14 @@ static void msm_dp_ctrl_config_misc1_misc0(struct 
msm_dp_ctrl_private *ctrl,
        msm_dp_write_link(ctrl, REG_DP_MISC1_MISC0, misc_val);
  }
-static void msm_dp_ctrl_configure_source_params(struct msm_dp_ctrl_private *ctrl)
+static void msm_dp_ctrl_configure_source_params(struct msm_dp_ctrl_private 
*ctrl,
+                                               struct msm_dp_panel 
*msm_dp_panel)
  {
-       msm_dp_ctrl_config_ctrl_streams(ctrl, ctrl->panel);
+       msm_dp_ctrl_config_ctrl_streams(ctrl, msm_dp_panel);
- msm_dp_ctrl_config_misc1_misc0(ctrl, ctrl->panel);
+       msm_dp_ctrl_config_misc1_misc0(ctrl, msm_dp_panel);
- msm_dp_panel_timing_cfg(ctrl->panel, ctrl->msm_dp_ctrl.wide_bus_en);
+       msm_dp_panel_timing_cfg(msm_dp_panel, ctrl->msm_dp_ctrl.wide_bus_en);
  }
/*
@@ -2523,7 +2524,7 @@ int msm_dp_ctrl_prepare_stream_on(struct msm_dp_ctrl 
*msm_dp_ctrl, bool force_li
        return ret;
  }
-int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl)
+int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, struct msm_dp_panel 
*msm_dp_panel)
  {
        int ret = 0;
        bool mainlink_ready = false;
@@ -2536,10 +2537,10 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl 
*msm_dp_ctrl)
ctrl = container_of(msm_dp_ctrl, struct msm_dp_ctrl_private, msm_dp_ctrl); - pixel_rate_orig = ctrl->panel->msm_dp_mode.drm_mode.clock;
+       pixel_rate_orig = msm_dp_panel->msm_dp_mode.drm_mode.clock;
        pixel_rate = pixel_rate_orig;
- if (msm_dp_ctrl->wide_bus_en || ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420)
+       if (msm_dp_ctrl->wide_bus_en || 
msm_dp_panel->msm_dp_mode.out_fmt_is_yuv_420)
                pixel_rate >>= 1;
drm_dbg_dp(ctrl->drm_dev, "pixel_rate=%lu\n", pixel_rate);
@@ -2571,14 +2572,14 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl 
*msm_dp_ctrl)
        msm_dp_setup_peripheral_flush(ctrl);
        msm_dp_ctrl_config_ctrl_link(ctrl);
- msm_dp_ctrl_configure_source_params(ctrl);
+       msm_dp_ctrl_configure_source_params(ctrl, msm_dp_panel);
msm_dp_ctrl_config_msa(ctrl,
                ctrl->link->link_params.rate,
                pixel_rate_orig,
-               ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420);
+               msm_dp_panel->msm_dp_mode.out_fmt_is_yuv_420);
- msm_dp_panel_clear_dsc_dto(ctrl->panel);
+       msm_dp_panel_clear_dsc_dto(msm_dp_panel);
msm_dp_ctrl_setup_tr_unit(ctrl); diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h b/drivers/gpu/drm/msm/dp/dp_ctrl.h
index 5d615f50d13b..32196e97cbe9 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.h
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h
@@ -17,7 +17,7 @@ struct msm_dp_ctrl {
  struct phy;
int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl);
-int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl);
+int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, struct msm_dp_panel 
*msm_dp_panel);
  int msm_dp_ctrl_prepare_stream_on(struct msm_dp_ctrl *msm_dp_ctrl, bool 
force_link_train);
  void msm_dp_ctrl_off(struct msm_dp_ctrl *msm_dp_ctrl);
  void msm_dp_ctrl_push_idle(struct msm_dp_ctrl *msm_dp_ctrl);
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 58c46d5ab4d8..1bf1335712bc 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -666,7 +666,7 @@ static int msm_dp_display_enable(struct 
msm_dp_display_private *dp)
                return 0;
        }
- rc = msm_dp_ctrl_on_stream(dp->ctrl);
+       rc = msm_dp_ctrl_on_stream(dp->ctrl, dp->panel);
        if (!rc)
                msm_dp_display->power_on = true;
--
2.43.0



Reply via email to