|
From 5a4563a2394867564340c2bea873ac3f61244fd3 Mon Sep 17 00:00:00 2001 |
|
From: Tyler Baker <tyler.baker@oss.qualcomm.com> |
|
Date: Fri, 16 Oct 2026 12:05:43 -0400 |
|
Subject: [PATCH 6/6] drm/msm/dp: skip link teardown when the link was never |
|
enabled |
|
|
|
On an eDP output whose panel does not respond, .atomic_enable() fails |
|
in msm_dp_display_prepare_link() with -ENOTCONN before |
|
msm_dp_ctrl_on_link() runs, so the link clocks are never enabled. At |
|
shutdown .atomic_post_disable() still calls msm_dp_display_unprepare(), |
|
which calls msm_dp_ctrl_off_link() unconditionally, and its first read |
|
of REG_DP_MAINLINK_CTRL takes a synchronous external abort: |
|
|
|
[drm:msm_dp_display_atomic_enable] *ERROR* DP display prepare failed, rc=-107 |
|
... |
|
Internal error: synchronous external abort: 0000000096001610 [#1] SMP |
|
pc : msm_dp_ctrl_off_link+0x48/0x88 |
|
Call trace: |
|
msm_dp_ctrl_off_link+0x48/0x88 (P) |
|
msm_dp_display_atomic_post_disable+0x6c/0x174 |
|
msm_edp_bridge_atomic_post_disable+0x60/0x70 |
|
... |
|
msm_kms_shutdown+0x30/0x40 |
|
|
|
Before the link teardown moved to msm_dp_display_unprepare() it ran |
|
from msm_dp_display_disable(), which returns early when the stream was |
|
never powered on, so this path was not reached. |
|
|
|
Return from msm_dp_ctrl_off_link() when the link clocks are off: the |
|
mainlink was then never enabled and there is nothing to tear down. |
|
|
|
Fixes: 1bda647ce61b ("drm/msm/dp: move link-level teardown from display_disable to display_unprepare") |
|
Change-Id: I7618707e838bebf94081e46ee6034d7e234898ed |
|
Signed-off-by: Tyler Baker <tyler.baker@oss.qualcomm.com> |
|
--- |
|
drivers/gpu/drm/msm/dp/dp_ctrl.c | 4 ++++ |
|
1 file changed, 4 insertions(+) |
|
|
|
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c |
|
index abd3dcdad03c2..ab360eeb41e59 100644 |
|
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c |
|
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c |
|
@@ -2693,6 +2693,10 @@ 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; |
|
|
|
+ /* The link registers fault while the link clocks are off */ |
|
+ if (!ctrl->link_clks_on) |
|
+ return; |
|
+ |
|
msm_dp_ctrl_mainlink_disable(ctrl); |
|
|
|
msm_dp_ctrl_reset(&ctrl->msm_dp_ctrl, panel); |
|
-- |
|
2.47.3 |
|
|