From c396c883a9a8e3bda361d6463a9805427e3b170d Mon Sep 17 00:00:00 2001 From: Fangzhi Zuo Date: Tue, 15 Sep 2026 10:36:03 -0400 Subject: [PATCH] drm/amd/display: Skip HDMI FRL status polling while link is down [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 Reviewed-by: Harry Wentland Tested-by: Dan Wheeler Signed-off-by: Alex Deucher --- 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 61017fea5cb3..9f1500a5b854 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 @@ -3194,8 +3194,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 c539ad4e3f9a..576d84be2363 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 @@ -8747,6 +8747,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; }