[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
