From: Yongxing Mou <yongxing.mou@oss.qualcomm.com>
To: Rob Clark <robin.clark@oss.qualcomm.com>,
Dmitry Baryshkov <lumag@kernel.org>,
Abhinav Kumar <abhinav.kumar@linux.dev>,
Sean Paul <sean@poorly.run>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Jessica Zhang <jesszhan0024@gmail.com>
Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org,
freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Yongxing Mou <yongxing.mou@oss.qualcomm.com>,
Abhinav Kumar <quic_abhinavk@quicinc.com>
Subject: [PATCH v4 26/39] drm/msm/dp: abstract out the dp_display stream helpers to accept a panel
Date: Fri, 10 Apr 2026 17:34:01 +0800 [thread overview]
Message-ID: <20260410-msm-dp-mst-v4-26-b20518dea8de@oss.qualcomm.com> (raw)
In-Reply-To: <20260410-msm-dp-mst-v4-0-b20518dea8de@oss.qualcomm.com>
From: Abhinav Kumar <quic_abhinavk@quicinc.com>
Currently the dp_display bridge helpers, in particular the
dp_display_enable()/dp_display_disable() use the cached panel.
To be able to re-use these helpers for MST use-case abstract the
helpers to use the panel which is passed in to them.
Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com>
---
drivers/gpu/drm/msm/dp/dp_display.c | 117 ++++++++++++++++++++++++------------
drivers/gpu/drm/msm/dp/dp_display.h | 12 ++++
2 files changed, 91 insertions(+), 38 deletions(-)
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 88a078e53dc1..33d8539afee7 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -635,12 +635,14 @@ static int msm_dp_display_set_mode(struct msm_dp *msm_dp_display,
return 0;
}
-static int msm_dp_display_prepare(struct msm_dp_display_private *dp)
+int msm_dp_display_prepare(struct msm_dp *msm_dp_display)
{
- struct msm_dp *msm_dp_display = &dp->msm_dp_display;
+ struct msm_dp_display_private *dp;
int rc = 0;
bool force_link_train = false;
+ dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
+
drm_dbg_dp(dp->drm_dev, "sink_count=%d\n", dp->link->sink_count);
if (msm_dp_display->is_edp)
@@ -680,7 +682,7 @@ static int msm_dp_display_enable(struct msm_dp_display_private *dp,
return 0;
}
- rc = msm_dp_ctrl_on_stream(dp->ctrl, dp->panel);
+ rc = msm_dp_ctrl_on_stream(dp->ctrl, msm_dp_panel);
if (!rc)
msm_dp_display->power_on = true;
@@ -738,18 +740,6 @@ static int msm_dp_display_disable(struct msm_dp_display_private *dp,
msm_dp_ctrl_off_pixel_clk(dp->ctrl, msm_dp_panel->stream_id);
- /* dongle is still connected but sinks are disconnected */
- if (dp->link->sink_count == 0)
- msm_dp_link_psm_config(dp->link, &msm_dp_panel->link_info, true);
-
- msm_dp_ctrl_off_link(dp->ctrl);
-
- if (dp->link->sink_count == 0)
- /* re-init the PHY so that we can listen to Dongle disconnect */
- msm_dp_ctrl_reinit_phy(dp->ctrl);
- else
- msm_dp_display_host_phy_exit(dp);
-
msm_dp_display->power_on = false;
drm_dbg_dp(dp->drm_dev, "sink count: %d\n", dp->link->sink_count);
@@ -1495,76 +1485,116 @@ int msm_dp_modeset_init(struct msm_dp *msm_dp_display, struct drm_device *dev,
return 0;
}
-void msm_dp_display_atomic_prepare(struct msm_dp *msm_dp_display,
- struct drm_atomic_state *state)
+int msm_dp_display_set_mode_helper(struct msm_dp *msm_dp_display,
+ struct drm_atomic_state *state,
+ struct drm_encoder *drm_encoder,
+ struct msm_dp_panel *msm_dp_panel)
{
struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state;
+
+ crtc = drm_atomic_get_new_crtc_for_encoder(state, drm_encoder);
+ if (!crtc)
+ return 0;
+ crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+
+ return msm_dp_display_set_mode(msm_dp_display, &crtc_state->adjusted_mode, msm_dp_panel);
+}
+
+void msm_dp_display_atomic_prepare(struct msm_dp *msm_dp_display,
+ struct drm_atomic_state *state)
+{
int rc = 0;
struct msm_dp_display_private *dp;
dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
- crtc = drm_atomic_get_new_crtc_for_encoder(state,
- msm_dp_display->bridge->encoder);
- if (!crtc)
- return;
- crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
-
- rc = msm_dp_display_set_mode(msm_dp_display, &crtc_state->adjusted_mode, dp->panel);
+ rc = msm_dp_display_set_mode_helper(msm_dp_display, state,
+ msm_dp_display->bridge->encoder, dp->panel);
if (rc) {
DRM_ERROR("Failed to perform a mode set, rc=%d\n", rc);
return;
}
- rc = msm_dp_display_prepare(dp);
+ rc = msm_dp_display_prepare(msm_dp_display);
if (rc)
DRM_ERROR("DP display prepare failed, rc=%d\n", rc);
}
-void msm_dp_display_atomic_enable(struct msm_dp *msm_dp_display)
+void msm_dp_display_enable_helper(struct msm_dp *msm_dp_display, struct msm_dp_panel *msm_dp_panel)
{
struct msm_dp_display_private *dp;
int rc = 0;
dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
- msm_dp_display_set_stream_info(msm_dp_display, dp->panel, 0, 0, 0, 0);
-
- rc = msm_dp_display_enable(dp, dp->panel);
+ rc = msm_dp_display_enable(dp, msm_dp_panel);
if (rc)
DRM_ERROR("DP display enable failed, rc=%d\n", rc);
rc = msm_dp_display_post_enable(msm_dp_display);
if (rc) {
DRM_ERROR("DP display post enable failed, rc=%d\n", rc);
- msm_dp_display_disable(dp, dp->panel);
+ msm_dp_display_disable(dp, msm_dp_panel);
}
drm_dbg_dp(msm_dp_display->drm_dev, "type=%d Done\n", msm_dp_display->connector_type);
}
-void msm_dp_display_atomic_disable(struct msm_dp *msm_dp_display)
+void msm_dp_display_atomic_enable(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);
- msm_dp_ctrl_push_idle(dp->ctrl, dp->panel);
+ msm_dp_display_set_stream_info(msm_dp_display, dp->panel, 0, 0, 0, 0);
+
+ msm_dp_display_enable_helper(msm_dp_display, dp->panel);
+}
+
+void msm_dp_display_disable_helper(struct msm_dp *msm_dp_display,
+ struct msm_dp_panel *msm_dp_panel)
+{
+ struct msm_dp_display_private *dp;
+
+ dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
+
+ msm_dp_ctrl_push_idle(dp->ctrl, msm_dp_panel);
msm_dp_ctrl_mst_stream_channel_slot_setup(dp->ctrl);
msm_dp_ctrl_mst_send_act(dp->ctrl);
}
-static void msm_dp_display_unprepare(struct msm_dp_display_private *dp)
+void msm_dp_display_atomic_disable(struct msm_dp *msm_dp_display)
{
- struct msm_dp *msm_dp_display = &dp->msm_dp_display;
+ struct msm_dp_display_private *dp;
- pm_runtime_put_sync(&msm_dp_display->pdev->dev);
+ dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
+
+ msm_dp_display_disable_helper(msm_dp_display, dp->panel);
+}
+
+void msm_dp_display_unprepare(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);
- drm_dbg_dp(dp->drm_dev, "type=%d Done\n", msm_dp_display->connector_type);
+ /* dongle is still connected but sinks are disconnected */
+ if (dp->link->sink_count == 0)
+ msm_dp_link_psm_config(dp->link, &dp->panel->link_info, true);
+
+ msm_dp_ctrl_off_link(dp->ctrl);
+
+ /* re-init the PHY so that we can listen to Dongle disconnect */
+ if (dp->link->sink_count == 0)
+ msm_dp_ctrl_reinit_phy(dp->ctrl);
+ else
+ msm_dp_display_host_phy_exit(dp);
+
+ pm_runtime_put_sync(&msm_dp_display->pdev->dev);
}
-void msm_dp_display_atomic_post_disable(struct msm_dp *dp)
+void msm_dp_display_atomic_post_disable_helper(struct msm_dp *dp, struct msm_dp_panel *msm_dp_panel)
{
struct msm_dp_display_private *msm_dp_display;
@@ -1575,7 +1605,18 @@ void msm_dp_display_atomic_post_disable(struct msm_dp *dp)
msm_dp_display_audio_notify_disable(msm_dp_display);
- msm_dp_display_disable(msm_dp_display, msm_dp_display->panel);
+ msm_dp_display_disable(msm_dp_display, msm_dp_panel);
+
+ drm_dbg_dp(dp->drm_dev, "type=%d Done\n", dp->connector_type);
+}
+
+void msm_dp_display_atomic_post_disable(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);
+
+ msm_dp_display_atomic_post_disable_helper(msm_dp_display, dp->panel);
msm_dp_display_unprepare(msm_dp_display);
}
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
index 0ccdddb223c8..0ede5505be58 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -46,5 +46,17 @@ enum drm_mode_status msm_dp_display_mode_valid(struct msm_dp *dp,
int msm_dp_display_set_stream_info(struct msm_dp *msm_dp_display, struct msm_dp_panel *panel,
enum msm_dp_stream_id stream_id,
u32 start_slot, u32 num_slots, u32 pbn);
+void msm_dp_display_enable_helper(struct msm_dp *msm_dp_display,
+ struct msm_dp_panel *msm_dp_panel);
+void msm_dp_display_disable_helper(struct msm_dp *msm_dp_display,
+ struct msm_dp_panel *msm_dp_panel);
+void msm_dp_display_atomic_post_disable_helper(struct msm_dp *msm_dp_display,
+ struct msm_dp_panel *msm_dp_panel);
+int msm_dp_display_set_mode_helper(struct msm_dp *msm_dp_display,
+ struct drm_atomic_state *state,
+ struct drm_encoder *drm_encoder,
+ struct msm_dp_panel *msm_dp_panel);
+int msm_dp_display_prepare(struct msm_dp *msm_dp_display);
+void msm_dp_display_unprepare(struct msm_dp *dp);
#endif /* _DP_DISPLAY_H_ */
--
2.43.0
next prev parent reply other threads:[~2026-04-10 9:36 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-10 9:33 [PATCH v4 00/39] drm/msm/dp: Add MST support for MSM chipsets Yongxing Mou
2026-04-10 9:33 ` [PATCH v4 01/39] drm/msm/dp: remove cached drm_edid from panel Yongxing Mou
2026-04-10 13:52 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 02/39] drm/msm/dp: drop deprecated .mode_set() and use .atomic_enable Yongxing Mou
2026-04-11 17:23 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 03/39] drm/msm/dp: break up dp_display_enable into two parts Yongxing Mou
2026-04-11 17:33 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 04/39] drm/msm/dp: re-arrange dp_display_disable() into functional parts Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 05/39] drm/msm/dp: splite msm_dp_ctrl_config_ctrl() into link parts and stream parts Yongxing Mou
2026-04-11 17:34 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 06/39] drm/msm/dp: extract MISC1_MISC0 configuration into a separate function Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 07/39] drm/msm/dp: split link setup from source params Yongxing Mou
2026-04-11 17:36 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 08/39] drm/msm/dp: allow dp_ctrl stream APIs to use any panel passed to it Yongxing Mou
2026-04-11 17:38 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 09/39] drm/msm/dp: move the pixel clock control to its own API Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 10/39] drm/msm/dp: split dp_ctrl_off() into stream and link parts Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 11/39] drm/msm/dp: make bridge helpers use dp_display to allow re-use Yongxing Mou
2026-04-11 17:41 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 12/39] drm/msm/dp: separate dp_display_prepare() into its own API Yongxing Mou
2026-04-11 17:42 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 13/39] drm/msm/dp: introduce stream_id for each DP panel Yongxing Mou
2026-04-11 17:55 ` Dmitry Baryshkov
2026-04-11 18:04 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 14/39] drm/msm/dp: introduce max_streams for DP controller MST support Yongxing Mou
2026-04-11 17:59 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 15/39] drm/msm/dp: Add support for programming p1/p2/p3 register blocks Yongxing Mou
2026-04-11 18:07 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 16/39] drm/msm/dp: use stream_id to change offsets in dp_catalog Yongxing Mou
2026-04-11 18:12 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 17/39] drm/msm/dp: Add catalog support for 3rd/4th stream MST Yongxing Mou
2026-04-11 18:24 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 18/39] drm/msm/dp: add support to send ACT packets for MST Yongxing Mou
2026-04-11 18:57 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 19/39] drm/msm/dp: Add support to enable MST in mainlink control Yongxing Mou
2026-04-11 18:59 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 20/39] drm/msm/dp: no need to update tu calculation for mst Yongxing Mou
2026-04-11 19:00 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 21/39] drm/msm/dp: Add support for MST channel slot allocation Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 22/39] drm/msm/dp: Add support for sending VCPF packets in DP controller Yongxing Mou
2026-04-11 19:24 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 23/39] drm/msm/dp: Always program MST_FIFO_CONSTANT_FILL for MST use cases Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:33 ` [PATCH v4 24/39] drm/msm/dp: simplify link and clock disable sequence Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 25/39] drm/msm/dp: pass panel to display enable/disable helpers Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` Yongxing Mou [this message]
2026-04-12 0:16 ` Claude review: drm/msm/dp: abstract out the dp_display stream helpers to accept a panel Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 27/39] drm/msm/dp: replace power_on with active_stream_cnt for dp_display Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 28/39] drm/msm/dp: Mark the SST bridge disconnected when mst is active Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 29/39] drm/msm/dp: add an API to initialize MST on sink side Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 30/39] drm/msm/dp: add dp_display_get_panel() to initialize DP panel Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 31/39] drm/msm/dp: add prepared to manage link-level operations Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 32/39] drm/msm/dpu: initialize encoders per stream for DP MST Yongxing Mou
2026-04-11 19:31 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 33/39] drm/msm/dp: initialize dp_mst module for each DP MST controller Yongxing Mou
2026-04-11 23:36 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 34/39] drm/msm/dp: add dp_mst_drm to manage DP MST bridge operations Yongxing Mou
2026-04-11 23:51 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 35/39] drm/msm/dp: wire MST helpers into atomic check and commit paths Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 36/39] drm/msm/dp: add connector abstraction for DP MST Yongxing Mou
2026-04-11 23:30 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 37/39] drm/msm/dp: add HPD callback for dp MST Yongxing Mou
2026-04-11 22:00 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 38/39] drm/msm/dpu: use msm_dp_get_mst_intf_id() to get the intf id Yongxing Mou
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 9:34 ` [PATCH v4 39/39] drm/msm/dp: Add MST stream support for supported DP controllers Yongxing Mou
2026-04-10 10:23 ` Konrad Dybcio
2026-04-11 19:26 ` Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
2026-04-10 13:53 ` [PATCH v4 00/39] drm/msm/dp: Add MST support for MSM chipsets Dmitry Baryshkov
2026-04-12 0:16 ` Claude review: " Claude Code Review Bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260410-msm-dp-mst-v4-26-b20518dea8de@oss.qualcomm.com \
--to=yongxing.mou@oss.qualcomm.com \
--cc=abhinav.kumar@linux.dev \
--cc=airlied@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=jesszhan0024@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lumag@kernel.org \
--cc=marijn.suijten@somainline.org \
--cc=quic_abhinavk@quicinc.com \
--cc=robin.clark@oss.qualcomm.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox