From: sashiko-bot@kernel.org
To: "Yongxing Mou" <yongxing.mou@oss.qualcomm.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v9 08/14] drm/msm/dp: break up dp_display_enable into two parts
Date: Tue, 28 Jul 2026 10:34:39 +0000 [thread overview]
Message-ID: <20260728103439.9E5051F00A3E@smtp.kernel.org> (raw)
In-Reply-To: <20260728-dp_mstclean-v9-8-f7779fce10f4@oss.qualcomm.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
New issues:
- [High] Silent inversion of hardware initialization sequence (pixel clock and link retraining)
- [Medium] API split fails to support inserting MST payload programming as claimed
Pre-existing issues:
- [High] Unpowered hardware register access causes kernel panic on error path
--
--- Patch [8]: [PATCH v9 08/14] drm/msm/dp: break up dp_display_enable into two parts ---
commit 722ccac6521827b0527a34404c0521cf56234857
Author: Abhinav Kumar <quic_abhinavk@quicinc.com>
drm/msm/dp: break up dp_display_enable into two parts
Split dp_display_enable into prepare and enable APIs. This aims to
support MST bridges_enable inserting MST payload functions between
enabling stream clocks and programming registers.
> dp_display_enable() currently re-trains the link if needed and then
> enables the pixel clock, programs the controller to start sending the
> pixel stream. Split these two parts into prepare/enable APIs, to support
> MST bridges_enable insert the MST payloads funcs between enable
> stream_clks and program register.
[Severity: Medium]
Does this split actually allow inserting MST payload functions between
enabling stream clocks and programming the registers?
Looking at the implementation of msm_dp_ctrl_on_stream() below, the call to
msm_dp_ctrl_on_pixel_clk() and the subsequent register programming are still
tightly coupled in the same function. It doesn't seem possible for an
external caller to inject payload programming between them.
> diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
> index 068d4f8b673f6..43094dda34349 100644
> --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
> +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
[ ... ]
> -int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train)
> +int msm_dp_ctrl_prepare_stream_on(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train)
> {
> int ret = 0;
[ ... ]
> - ret = msm_dp_ctrl_on_pixel_clk(ctrl, pixel_rate);
> - if (ret)
> - return ret;
> -
> if (force_link_train || !msm_dp_ctrl_channel_eq_ok(ctrl))
> msm_dp_ctrl_link_retrain(ctrl);
[Severity: High]
Does this change invert the hardware initialization sequence?
Before this patch, msm_dp_ctrl_on_stream() called msm_dp_ctrl_on_pixel_clk()
to enable the pixel clock before performing the link retraining.
With the new split, msm_dp_ctrl_prepare_stream_on() performs link retraining,
but the pixel clock isn't enabled until msm_dp_ctrl_on_stream() is called
later. Could this cause link training failures or black screens by retraining
before the pixel clock is ready?
[ ... ]
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
> index 2a84a6ffedbb5..d094d484474cd 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
[ ... ]
> -static int msm_dp_display_enable(struct msm_dp_display_private *dp, bool force_link_train)
> +static int msm_dp_display_prepare_link(struct msm_dp_display_private *dp)
> +{
> + struct msm_dp *msm_dp_display = &dp->msm_dp_display;
> + int rc = 0;
> + bool force_link_train = false;
> +
> + drm_dbg_dp(dp->drm_dev, "sink_count=%d\n", dp->link->sink_count);
> +
> + if (msm_dp_display->is_edp)
> + msm_dp_hpd_plug_handle(dp);
> +
> + rc = pm_runtime_resume_and_get(&msm_dp_display->pdev->dev);
> + if (rc) {
> + DRM_ERROR("failed to pm_runtime_resume\n");
> + return rc;
> + }
[Severity: High]
This is a pre-existing issue, but if pm_runtime_resume_and_get() fails here,
the device is left unpowered while the DRM state considers it enabled.
Since msm_dp_bridge_atomic_enable() returns void and cannot abort the overall
atomic commit if this fails, msm_dp_bridge_atomic_disable() will
unconditionally be called later during teardown.
That disable path eventually calls msm_dp_ctrl_push_idle() which accesses
unclocked and unpowered DP hardware registers, leading to a synchronous
external abort (kernel panic).
Should there be a way to prevent hardware access during disable if the
device never successfully resumed?
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260728-dp_mstclean-v9-0-f7779fce10f4@oss.qualcomm.com?part=8
next prev parent reply other threads:[~2026-07-28 10:34 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-28 10:21 [PATCH v9 00/14] drm/msm/dp: Prerequisite cleanup for upcoming MST support Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 01/14] drm/msm/dp: remove cached drm_edid from panel Yongxing Mou
2026-07-28 10:37 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 02/14] drm/msm/dp: drop deprecated .mode_set() and use .atomic_pre_enable Yongxing Mou
2026-07-28 10:34 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 03/14] drm/msm/dp: move mode setup into msm_dp_panel_init_panel_info() Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 04/14] drm/msm/dp: split msm_dp_ctrl_config_ctrl() into link parts and stream parts Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 05/14] drm/msm/dp: extract MISC1_MISC0 configuration into a separate function Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 06/14] drm/msm/dp: split link setup from source params Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 07/14] drm/msm/dp: move the pixel clock control to its own API Yongxing Mou
2026-07-28 10:35 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 08/14] drm/msm/dp: break up dp_display_enable into two parts Yongxing Mou
2026-07-28 10:34 ` sashiko-bot [this message]
2026-07-28 10:21 ` [PATCH v9 09/14] drm/msm/dp: re-arrange dp_display_disable() into functional parts Yongxing Mou
2026-07-28 10:39 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 10/14] drm/msm/dp: allow dp_ctrl stream APIs to use any panel passed to it Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 11/14] drm/msm/dp: split dp_ctrl_off() into stream and link parts Yongxing Mou
2026-07-28 10:21 ` [PATCH v9 12/14] drm/msm/dp: simplify link and clock disable sequence Yongxing Mou
2026-07-28 10:41 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 13/14] drm/msm/dp: make bridge helpers use dp_display to allow re-use Yongxing Mou
2026-07-28 10:38 ` sashiko-bot
2026-07-28 10:21 ` [PATCH v9 14/14] drm/msm/dp: pass panel to display enable/disable helpers Yongxing Mou
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=20260728103439.9E5051F00A3E@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=yongxing.mou@oss.qualcomm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.