Some receivers seem to fail the first link training but are on good on subsequent tries. Set a limit of 2 retries for each level before falling back. Signed-off-by: Harry Wentland <harry.wentland at amd.com> CC: Wenjing Liu <Wenjing.Liu at amd.com> --- .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c index 72a8a55565c8..037d3bcfc2cc 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c @@ -31,7 +31,14 @@ enum { /* to avoid infinite loop where-in the receiver * switches between different VS */ - LINK_TRAINING_MAX_CR_RETRY = 100 + LINK_TRAINING_MAX_CR_RETRY = 100, + /* + * Some receivers fail to train on first try and are good + * on subsequent tries. 2 retries should be plenty. If we + * don't have a successful training then we don't expect to + * ever get one. + */ + LINK_TRAINING_MAX_VERIFY_RETRY = 2 }; static bool decide_fallback_link_setting( @@ -1142,15 +1149,20 @@ bool dp_hbr_verify_link_cap( cur); - if (skip_link_training) + if (skip_link_training) { success = true; - else { - status = dc_link_dp_perform_link_training( - link, - cur, + } else { + int i; + + for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) { + status = dc_link_dp_perform_link_training( + link, cur, skip_video_pattern); - if (status == LINK_TRAINING_SUCCESS) - success = true; + if (status == LINK_TRAINING_SUCCESS) { + success = true; + break; + } + } } if (success) -- 2.17.1