[WHY]
Hotplugging an HDMI FRL sink can wedge DMCUB when a poll-driven retrain
lands on a link whose PHY has just been torn down. The status polling
path can program PHY EQ on the disabled PHY, after which the sink SCDC
reads back version 0 and the display fails to light up.

[HOW]
Skip FRL status polling unless the link is actively driving a stream.
The check runs under dc_lock, so it is serialized with link detection
and modesets while the PHY is being torn down.

Signed-off-by: Fangzhi Zuo <[email protected]>
Reviewed-by: Harry Wentland <[email protected]>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c | 6 ++++--
 .../amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c  | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index 3255f5b2dde6..5c43bffd36ac 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -3125,8 +3125,10 @@ void hdmi_frl_status_polling_work(struct work_struct 
*work)
                        if (dc_link->frl_link_settings.frl_link_rate == 0)
                                continue;
 
-               link_update =
-                       dc_link_frl_poll_status_flag(dc_link);
+                       if (!dc_link->link_status.link_active)
+                               continue;
+
+                       link_update = dc_link_frl_poll_status_flag(dc_link);
                        if (link_update) {
                                link_detected =
                                        dc_link_detect(
diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
index bd55d943e4e5..94eec1da3a4e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
@@ -9026,6 +9026,7 @@ static struct dc_link *dm_test_frl_add_hdmi_link(struct 
kunit *test, struct dm_t
        KUNIT_ASSERT_NOT_NULL(test, link->local_sink);
        link->connector_signal = SIGNAL_TYPE_HDMI_TYPE_A;
        link->frl_link_settings.frl_link_rate = HDMI_FRL_LINK_RATE_3GBPS;
+       link->link_status.link_active = true;
 
        return link;
 }
-- 
2.53.0

Reply via email to