Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 824474ba authored by Bhawanpreet Lakha's avatar Bhawanpreet Lakha Committed by Alex Deucher
Browse files

drm/amd/display: Retry link training again



[Why]
Some receivers seem to fail the first link training but are good on
subsequent tries. We want to retry link training again. This fixes
HTC vive pro not lighting up after being disabled.

[How]
Check if the link training passed without fall back if this is not
the case then we retry link training.

Signed-off-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 66c28d6d
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -60,7 +60,14 @@

enum {
	LINK_RATE_REF_FREQ_IN_MHZ = 27,
	PEAK_FACTOR_X1000 = 1006
	PEAK_FACTOR_X1000 = 1006,
	/*
	* 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
};

/*******************************************************************************
@@ -760,7 +767,16 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
				 */

				/* deal with non-mst cases */
				dp_verify_link_cap(link, &link->reported_link_cap);
				for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) {
					int fail_count = 0;

					dp_verify_link_cap(link,
							  &link->reported_link_cap,
							  &fail_count);

					if (fail_count == 0)
						break;
				}
			}

			/* HDMI-DVI Dongle */
+4 −1
Original line number Diff line number Diff line
@@ -1088,7 +1088,8 @@ static struct dc_link_settings get_max_link_cap(struct dc_link *link)

bool dp_verify_link_cap(
	struct dc_link *link,
	struct dc_link_settings *known_limit_link_setting)
	struct dc_link_settings *known_limit_link_setting,
	int *fail_count)
{
	struct dc_link_settings max_link_cap = {0};
	struct dc_link_settings cur_link_setting = {0};
@@ -1160,6 +1161,8 @@ bool dp_verify_link_cap(
							skip_video_pattern);
			if (status == LINK_TRAINING_SUCCESS)
				success = true;
			else
				(*fail_count)++;
		}

		if (success)
+2 −1
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ struct dc_link_settings;

bool dp_verify_link_cap(
	struct dc_link *link,
	struct dc_link_settings *known_limit_link_setting);
	struct dc_link_settings *known_limit_link_setting,
	int *fail_count);

bool dp_validate_mode_timing(
	struct dc_link *link,