From fa0758869eb00cfbe31058880581bbcdfd0b6195 Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Wed, 16 Mar 2016 15:29:35 -0400 Subject: [PATCH 0975/1110] drm/amd/dal: Add retry mechanism for link training. On some displays the training sequence succeedes only after several consecutive tries. Signed-off-by: Andrey Grodzovsky Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 6 +++- drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c | 51 +++++++++++++++++----------- drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h | 5 +-- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c index fd406f9..97d6f93 100644 --- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c @@ -1178,7 +1178,11 @@ static enum dc_status enable_link_dp(struct pipe_ctx *pipe_ctx) if (link_settings.link_rate == LINK_RATE_LOW) skip_video_pattern = false; - if (perform_link_training(link, &link_settings, skip_video_pattern)) { + if (perform_link_training_with_retries( + link, + &link_settings, + skip_video_pattern, + 3)) { link->public.cur_link_settings = link_settings; status = DC_OK; } diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c index 282a56b..8fe0314 100644 --- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c +++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c @@ -1040,6 +1040,31 @@ bool perform_link_training( return status; } + +bool perform_link_training_with_retries( + struct core_link *link, + const struct dc_link_settings *link_setting, + bool skip_video_pattern, + unsigned int retires) +{ + uint8_t j; + uint8_t delay_between_retries = 10; + + for (j = 0; j < retires; ++j) { + + if (perform_link_training( + link, + link_setting, + skip_video_pattern)) + return true; + + msleep(delay_between_retries); + delay_between_retries += 10; + } + + return false; +} + /*TODO add more check to see if link support request link configuration */ static bool is_link_setting_supported( const struct dc_link_settings *link_setting, @@ -1150,23 +1175,11 @@ bool dp_hbr_verify_link_cap( if (skip_link_training) success = true; else { - uint8_t num_retries = 3; - uint8_t j; - uint8_t delay_between_retries = 10; - - for (j = 0; j < num_retries; ++j) { - success = perform_link_training( - link, - cur, - skip_video_pattern); - - if (success) - break; - - msleep(delay_between_retries); - - delay_between_retries += 10; - } + success = perform_link_training_with_retries( + link, + cur, + skip_video_pattern, + 3); } if (success) @@ -1527,8 +1540,8 @@ bool dc_link_handle_hpd_rx_irq(const struct dc_link *dc_link) if (hpd_rx_irq_check_link_loss_status( link, &hpd_irq_dpcd_data)) { - perform_link_training(link, - &link->public.cur_link_settings, true); + perform_link_training_with_retries(link, + &link->public.cur_link_settings, true, 3); status = false; } diff --git a/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h index a0ab6b3..b9fb8b9 100644 --- a/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h +++ b/drivers/gpu/drm/amd/dal/dc/inc/dc_link_dp.h @@ -42,10 +42,11 @@ void decide_link_settings( struct core_stream *stream, struct dc_link_settings *link_setting); -bool perform_link_training( +bool perform_link_training_with_retries( struct core_link *link, const struct dc_link_settings *link_setting, - bool skip_video_pattern); + bool skip_video_pattern, + unsigned int retires); bool is_mst_supported(struct core_link *link); -- 2.7.4