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>,
Jessica Zhang <jessica.zhang@oss.qualcomm.com>,
Sean Paul <sean@poorly.run>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
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 v3 13/38] drm/msm/dp: introduce stream_id for each DP panel
Date: Mon, 25 Aug 2025 22:15:59 +0800 [thread overview]
Message-ID: <20250825-msm-dp-mst-v3-13-01faacfcdedd@oss.qualcomm.com> (raw)
In-Reply-To: <20250825-msm-dp-mst-v3-0-01faacfcdedd@oss.qualcomm.com>
From: Abhinav Kumar <quic_abhinavk@quicinc.com>
With MST, each DP controller can handle multiple streams.
There shall be one dp_panel for each stream but the dp_display
object shall be shared among them. To represent this abstraction,
create a stream_id for each DP panel which shall be set by the
MST stream. For SST, default this to stream 0.
Use the stream ID to control the pixel clock of that respective
stream by extending the clock handles and state tracking of the
DP pixel clock to an array of max supported streams. The maximum
streams currently is 4.
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_ctrl.c | 58 ++++++++++++++++++++++---------------
drivers/gpu/drm/msm/dp/dp_ctrl.h | 3 +-
drivers/gpu/drm/msm/dp/dp_display.c | 27 +++++++++++++++--
drivers/gpu/drm/msm/dp/dp_display.h | 2 ++
drivers/gpu/drm/msm/dp/dp_panel.h | 11 +++++++
5 files changed, 73 insertions(+), 28 deletions(-)
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index b25eb2fa2835f660073b5109496ac9f2f4e038d2..d4a74c6b70fb182ad8a0a786f85a0f50982d3858 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -127,7 +127,7 @@ struct msm_dp_ctrl_private {
unsigned int num_link_clks;
struct clk_bulk_data *link_clks;
- struct clk *pixel_clk;
+ struct clk *pixel_clk[DP_STREAM_MAX];
union phy_configure_opts phy_opts;
@@ -139,7 +139,7 @@ struct msm_dp_ctrl_private {
bool core_clks_on;
bool link_clks_on;
- bool stream_clks_on;
+ bool stream_clks_on[DP_STREAM_MAX];
};
static inline u32 msm_dp_read_ahb(const struct msm_dp_ctrl_private *ctrl, u32 offset)
@@ -2162,39 +2162,40 @@ static bool msm_dp_ctrl_send_phy_test_pattern(struct msm_dp_ctrl_private *ctrl)
return success;
}
-static int msm_dp_ctrl_on_pixel_clk(struct msm_dp_ctrl_private *ctrl, unsigned long pixel_rate)
+static int msm_dp_ctrl_on_pixel_clk(struct msm_dp_ctrl_private *ctrl, unsigned long pixel_rate,
+ enum msm_dp_stream_id stream_id)
{
int ret;
- ret = clk_set_rate(ctrl->pixel_clk, pixel_rate * 1000);
+ ret = clk_set_rate(ctrl->pixel_clk[stream_id], pixel_rate * 1000);
if (ret) {
DRM_ERROR("Failed to set pixel clock rate. ret=%d\n", ret);
return ret;
}
- if (ctrl->stream_clks_on) {
+ if (ctrl->stream_clks_on[stream_id]) {
drm_dbg_dp(ctrl->drm_dev, "pixel clks already enabled\n");
} else {
- ret = clk_prepare_enable(ctrl->pixel_clk);
+ ret = clk_prepare_enable(ctrl->pixel_clk[stream_id]);
if (ret) {
DRM_ERROR("Failed to start pixel clocks. ret=%d\n", ret);
return ret;
}
- ctrl->stream_clks_on = true;
+ ctrl->stream_clks_on[stream_id] = true;
}
return ret;
}
-void msm_dp_ctrl_off_pixel_clk(struct msm_dp_ctrl *msm_dp_ctrl)
+void msm_dp_ctrl_off_pixel_clk(struct msm_dp_ctrl *msm_dp_ctrl, enum msm_dp_stream_id stream_id)
{
struct msm_dp_ctrl_private *ctrl;
ctrl = container_of(msm_dp_ctrl, struct msm_dp_ctrl_private, msm_dp_ctrl);
- if (ctrl->stream_clks_on) {
- clk_disable_unprepare(ctrl->pixel_clk);
- ctrl->stream_clks_on = false;
+ if (ctrl->stream_clks_on[stream_id]) {
+ clk_disable_unprepare(ctrl->pixel_clk[stream_id]);
+ ctrl->stream_clks_on[stream_id] = false;
}
}
@@ -2214,7 +2215,7 @@ static int msm_dp_ctrl_process_phy_test_request(struct msm_dp_ctrl_private *ctrl
* running. Add the global reset just before disabling the
* link clocks and core clocks.
*/
- msm_dp_ctrl_off_pixel_clk(&ctrl->msm_dp_ctrl);
+ msm_dp_ctrl_off_pixel_clk(&ctrl->msm_dp_ctrl, ctrl->panel->stream_id);
msm_dp_ctrl_off_link(&ctrl->msm_dp_ctrl);
ret = msm_dp_ctrl_on_link(&ctrl->msm_dp_ctrl);
@@ -2224,7 +2225,7 @@ static int msm_dp_ctrl_process_phy_test_request(struct msm_dp_ctrl_private *ctrl
}
pixel_rate = ctrl->panel->msm_dp_mode.drm_mode.clock;
- ret = msm_dp_ctrl_on_pixel_clk(ctrl, pixel_rate);
+ ret = msm_dp_ctrl_on_pixel_clk(ctrl, pixel_rate, ctrl->panel->stream_id);
msm_dp_ctrl_send_phy_test_pattern(ctrl);
@@ -2499,9 +2500,8 @@ int msm_dp_ctrl_prepare_stream_on(struct msm_dp_ctrl *msm_dp_ctrl, bool force_li
ctrl->link->link_params.rate,
ctrl->link->link_params.num_lanes);
- drm_dbg_dp(ctrl->drm_dev,
- "core_clk_on=%d link_clk_on=%d stream_clk_on=%d\n",
- ctrl->core_clks_on, ctrl->link_clks_on, ctrl->stream_clks_on);
+ drm_dbg_dp(ctrl->drm_dev, "core_clk_on=%d link_clk_on=%d\n",
+ ctrl->core_clks_on, ctrl->link_clks_on);
if (!ctrl->link_clks_on) { /* link clk is off */
ret = msm_dp_ctrl_enable_mainlink_clocks(ctrl);
@@ -2540,7 +2540,7 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, struct msm_dp_panel *
drm_dbg_dp(ctrl->drm_dev, "pixel_rate=%lu\n", pixel_rate);
- ret = msm_dp_ctrl_on_pixel_clk(ctrl, pixel_rate);
+ ret = msm_dp_ctrl_on_pixel_clk(ctrl, pixel_rate, msm_dp_panel->stream_id);
if (ret) {
DRM_ERROR("failed to enable pixel clk\n");
return ret;
@@ -2604,8 +2604,6 @@ void msm_dp_ctrl_off_link(struct msm_dp_ctrl *msm_dp_ctrl)
ctrl = container_of(msm_dp_ctrl, struct msm_dp_ctrl_private, msm_dp_ctrl);
phy = ctrl->phy;
- msm_dp_panel_disable_vsc_sdp(ctrl->panel);
-
msm_dp_ctrl_mainlink_disable(ctrl);
msm_dp_ctrl_reset(&ctrl->msm_dp_ctrl);
@@ -2677,10 +2675,11 @@ static const char *ctrl_clks[] = {
"ctrl_link_iface",
};
-static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl *msm_dp_ctrl)
+static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl *msm_dp_ctrl, int max_stream)
{
struct msm_dp_ctrl_private *ctrl;
struct device *dev;
+ char stream_id_str[15];
int i, rc;
ctrl = container_of(msm_dp_ctrl, struct msm_dp_ctrl_private, msm_dp_ctrl);
@@ -2710,9 +2709,19 @@ static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl *msm_dp_ctrl)
if (rc)
return rc;
- ctrl->pixel_clk = devm_clk_get(dev, "stream_pixel");
- if (IS_ERR(ctrl->pixel_clk))
- return PTR_ERR(ctrl->pixel_clk);
+ ctrl->pixel_clk[DP_STREAM_0] = devm_clk_get(dev, "stream_pixel");
+ if (IS_ERR(ctrl->pixel_clk[DP_STREAM_0]))
+ return PTR_ERR(ctrl->pixel_clk[DP_STREAM_0]);
+
+ for (i = DP_STREAM_1; i < max_stream; i++) {
+ sprintf(stream_id_str, "stream_%d_pixel", i);
+ ctrl->pixel_clk[i] = devm_clk_get(dev, stream_id_str);
+
+ if (IS_ERR(ctrl->pixel_clk[i])) {
+ DRM_DEBUG_DP("failed to get stream %d pixel clock", i);
+ break;
+ }
+ }
return 0;
}
@@ -2720,6 +2729,7 @@ static int msm_dp_ctrl_clk_init(struct msm_dp_ctrl *msm_dp_ctrl)
struct msm_dp_ctrl *msm_dp_ctrl_get(struct device *dev, struct msm_dp_link *link,
struct msm_dp_panel *panel, struct drm_dp_aux *aux,
struct phy *phy,
+ int max_stream,
void __iomem *ahb_base,
void __iomem *link_base)
{
@@ -2762,7 +2772,7 @@ struct msm_dp_ctrl *msm_dp_ctrl_get(struct device *dev, struct msm_dp_link *link
ctrl->ahb_base = ahb_base;
ctrl->link_base = link_base;
- ret = msm_dp_ctrl_clk_init(&ctrl->msm_dp_ctrl);
+ ret = msm_dp_ctrl_clk_init(&ctrl->msm_dp_ctrl, max_stream);
if (ret) {
dev_err(dev, "failed to init clocks\n");
return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h b/drivers/gpu/drm/msm/dp/dp_ctrl.h
index 6ff3e9d9fa6ff0afa325a7a6f72a15009635f340..32ff1455caf0e7fcb1bd74b1f3192c6c3c03ee74 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.h
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h
@@ -20,7 +20,7 @@ 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, 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_link(struct msm_dp_ctrl *msm_dp_ctrl);
-void msm_dp_ctrl_off_pixel_clk(struct msm_dp_ctrl *msm_dp_ctrl);
+void msm_dp_ctrl_off_pixel_clk(struct msm_dp_ctrl *msm_dp_ctrl, enum msm_dp_stream_id stream_id);
void msm_dp_ctrl_push_idle(struct msm_dp_ctrl *msm_dp_ctrl);
irqreturn_t msm_dp_ctrl_isr(struct msm_dp_ctrl *msm_dp_ctrl);
void msm_dp_ctrl_handle_sink_request(struct msm_dp_ctrl *msm_dp_ctrl);
@@ -29,6 +29,7 @@ struct msm_dp_ctrl *msm_dp_ctrl_get(struct device *dev,
struct msm_dp_panel *panel,
struct drm_dp_aux *aux,
struct phy *phy,
+ int max_stream,
void __iomem *ahb_base,
void __iomem *link_base);
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index a8477a0a180137f15cbb1401c3964636aa32626c..3422f18bdec71a99407edfe943d31957d0e8847a 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -628,7 +628,7 @@ static int msm_dp_init_sub_modules(struct msm_dp_display_private *dp)
}
dp->ctrl = msm_dp_ctrl_get(dev, dp->link, dp->panel, dp->aux,
- phy, dp->ahb_base, dp->link_base);
+ phy, dp->max_stream, dp->ahb_base, dp->link_base);
if (IS_ERR(dp->ctrl)) {
rc = PTR_ERR(dp->ctrl);
DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc);
@@ -789,7 +789,7 @@ static int msm_dp_display_disable(struct msm_dp_display_private *dp)
/* set dongle to D3 (power off) mode */
msm_dp_link_psm_config(dp->link, &dp->panel->link_info, true);
- msm_dp_ctrl_off_pixel_clk(dp->ctrl);
+ msm_dp_ctrl_off_pixel_clk(dp->ctrl, dp->panel->stream_id);
msm_dp_ctrl_off_link(dp->ctrl);
/* re-init the PHY so that we can listen to Dongle disconnect */
msm_dp_ctrl_reinit_phy(dp->ctrl);
@@ -798,7 +798,7 @@ static int msm_dp_display_disable(struct msm_dp_display_private *dp)
* unplugged interrupt
* dongle unplugged out of DUT
*/
- msm_dp_ctrl_off_pixel_clk(dp->ctrl);
+ msm_dp_ctrl_off_pixel_clk(dp->ctrl, dp->panel->stream_id);
msm_dp_ctrl_off_link(dp->ctrl);
msm_dp_display_host_phy_exit(dp);
}
@@ -809,6 +809,25 @@ static int msm_dp_display_disable(struct msm_dp_display_private *dp)
return 0;
}
+int msm_dp_display_set_stream_id(struct msm_dp *dp,
+ struct msm_dp_panel *panel, enum msm_dp_stream_id stream_id)
+{
+ int rc = 0;
+ struct msm_dp_display_private *msm_dp_display;
+
+ msm_dp_display = container_of(dp, struct msm_dp_display_private, msm_dp_display);
+
+ if (!msm_dp_display) {
+ DRM_ERROR("invalid input\n");
+ return -EINVAL;
+ }
+
+ if (panel)
+ panel->stream_id = stream_id;
+
+ return rc;
+}
+
/**
* msm_dp_bridge_mode_valid - callback to determine if specified mode is valid
* @dp: Pointer to dp display structure
@@ -1483,6 +1502,8 @@ void msm_dp_display_atomic_enable(struct msm_dp *msm_dp_display)
dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
+ msm_dp_display_set_stream_id(msm_dp_display, dp->panel, 0);
+
if (msm_dp_display->prepared) {
rc = msm_dp_display_enable(dp);
if (rc)
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
index 7727cf325a89b4892d2370a5616c4fa76fc88485..a839d0a3941eac3e277185e42fddea15ca05a17f 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -47,5 +47,7 @@ void msm_dp_display_mode_set(struct msm_dp *dp,
enum drm_mode_status msm_dp_display_mode_valid(struct msm_dp *dp,
const struct drm_display_info *info,
const struct drm_display_mode *mode);
+int msm_dp_display_set_stream_id(struct msm_dp *dp,
+ struct msm_dp_panel *panel, enum msm_dp_stream_id stream_id);
#endif /* _DP_DISPLAY_H_ */
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h
index 618d0253b525308b392b9282098e8ca78bf32f1c..23b3e78e40479d133893a8afe1a69cfe8c16abdf 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.h
+++ b/drivers/gpu/drm/msm/dp/dp_panel.h
@@ -27,6 +27,15 @@ struct msm_dp_panel_psr {
u8 capabilities;
};
+/* stream id */
+enum msm_dp_stream_id {
+ DP_STREAM_0,
+ DP_STREAM_1,
+ DP_STREAM_2,
+ DP_STREAM_3,
+ DP_STREAM_MAX,
+};
+
struct msm_dp_panel {
/* dpcd raw data */
u8 dpcd[DP_RECEIVER_CAP_SIZE];
@@ -40,6 +49,8 @@ struct msm_dp_panel {
bool vsc_sdp_supported;
u32 hw_revision;
+ enum msm_dp_stream_id stream_id;
+
u32 max_dp_lanes;
u32 max_dp_link_rate;
--
2.34.1
next prev parent reply other threads:[~2025-08-25 14:18 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-25 14:15 [PATCH v3 00/38] drm/msm/dp: Add MST support for MSM chipsets Yongxing Mou
2025-08-25 14:15 ` [PATCH v3 01/38] drm/msm/dp: remove cached drm_edid from panel Yongxing Mou
2025-08-25 16:41 ` Dmitry Baryshkov
2025-09-02 8:42 ` Yongxing Mou
2025-09-02 9:36 ` Dmitry Baryshkov
2025-09-02 10:19 ` Yongxing Mou
2025-09-02 12:34 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 02/38] drm/msm/dp: remove dp_display's dp_mode and use dp_panel's instead Yongxing Mou
2025-08-25 16:50 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 03/38] drm/msm/dp: break up dp_display_enable into two parts Yongxing Mou
2025-08-25 17:13 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 04/38] drm/msm/dp: re-arrange dp_display_disable() into functional parts Yongxing Mou
2025-08-25 17:25 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 05/38] drm/msm/dp: splite msm_dp_ctrl_config_ctrl() into link parts and stream parts Yongxing Mou
2025-08-25 17:28 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 06/38] drm/msm/dp: extract MISC1_MISC0 configuration into a separate function Yongxing Mou
2025-08-25 17:30 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 07/38] drm/msm/dp: allow dp_ctrl stream APIs to use any panel passed to it Yongxing Mou
2025-08-25 17:32 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 08/38] drm/msm/dp: move the pixel clock control to its own API Yongxing Mou
2025-08-25 17:34 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 09/38] drm/msm/dp: split dp_ctrl_off() into stream and link parts Yongxing Mou
2025-08-25 17:35 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 10/38] drm/msm/dp: make bridge helpers use dp_display to allow re-use Yongxing Mou
2025-08-25 14:15 ` [PATCH v3 11/38] drm/msm/dp: separate dp_display_prepare() into its own API Yongxing Mou
2025-08-25 17:39 ` Dmitry Baryshkov
2025-08-25 14:15 ` [PATCH v3 12/38] drm/msm/dp: introduce max_streams for DP controller MST support Yongxing Mou
2025-08-25 17:42 ` Dmitry Baryshkov
2025-09-02 9:41 ` Dmitry Baryshkov
2025-08-25 14:15 ` Yongxing Mou [this message]
2025-08-25 17:56 ` [PATCH v3 13/38] drm/msm/dp: introduce stream_id for each DP panel Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 14/38] drm/msm/dp: Add support for programming p1/p2/p3 register blocks Yongxing Mou
2025-08-25 17:59 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 15/38] drm/msm/dp: use stream_id to change offsets in dp_catalog Yongxing Mou
2025-08-25 18:01 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 16/38] drm/msm/dp: Add catalog support for 3rd/4th stream MST Yongxing Mou
2025-08-25 20:35 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 17/38] drm/msm/dp: add support to send ACT packets for MST Yongxing Mou
2025-08-25 21:10 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 18/38] drm/msm/dp: Add support to enable MST in mainlink control Yongxing Mou
2025-08-25 21:24 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 19/38] drm/msm/dp: no need to update tu calculation for mst Yongxing Mou
2025-08-25 21:25 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 20/38] drm/msm/dp: Add support for MST channel slot allocation Yongxing Mou
2025-08-25 21:52 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 21/38] drm/msm/dp: Add support for sending VCPF packets in DP controller Yongxing Mou
2025-08-26 21:28 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 22/38] drm/msm/dp: Always program MST_FIFO_CONSTANT_FILL for MST use cases Yongxing Mou
2025-08-25 21:55 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 23/38] drm/msm/dp: abstract out the dp_display stream helpers to accept a panel Yongxing Mou
2025-08-25 22:18 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 24/38] drm/msm/dp: replace power_on with active_stream_cnt for dp_display Yongxing Mou
2025-08-25 22:22 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 25/38] drm/msm/dp: Mark the SST bridge disconnected when mst is active Yongxing Mou
2025-08-25 22:23 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 26/38] drm/msm/dp: add an API to initialize MST on sink side Yongxing Mou
2025-08-26 9:26 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 27/38] drm/msm/dp: add dp_display_get_panel() to initialize DP panel Yongxing Mou
2025-08-26 16:33 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 28/38] drm/msm/dp: add dp_mst_drm to manage DP MST bridge operations Yongxing Mou
2025-08-26 17:36 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 29/38] drm/msm/dp: add MST atomic check to msm_atomic_check() Yongxing Mou
2025-08-26 17:44 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 30/38] drm/msm/dp: add connector abstraction for DP MST Yongxing Mou
2025-08-26 18:31 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 31/38] drm/msm/dp: add HPD callback for dp MST Yongxing Mou
2025-08-26 18:40 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 32/38] drm/msm/dp: propagate MST state changes to dp mst module Yongxing Mou
2025-08-26 18:43 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 33/38] drm/msm: add support for MST non-blocking commits Yongxing Mou
2025-08-26 18:47 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 34/38] drm/msm: initialize DRM MST encoders for DP controllers Yongxing Mou
2025-08-26 18:55 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 35/38] drm/msm/dp: initialize dp_mst module for each DP MST controller Yongxing Mou
2025-08-26 21:27 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 36/38] drm/msm/dpu: use msm_dp_get_mst_intf_id() to get the intf id Yongxing Mou
2025-08-26 23:42 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 37/38] drm/msm/dp: fix the intf_type of MST interfaces Yongxing Mou
2025-08-27 1:18 ` Dmitry Baryshkov
2025-08-25 14:16 ` [PATCH v3 38/38] drm/msm/dp: Add MST stream support for SA8775P DP controller 0 and 1 Yongxing Mou
2025-08-27 1:19 ` Dmitry Baryshkov
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=20250825-msm-dp-mst-v3-13-01faacfcdedd@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=jessica.zhang@oss.qualcomm.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;
as well as URLs for NNTP newsgroup(s).