[PATCH 2/2] drm/amd/display: Retry link training at verify_link_cap stage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux