|
@@ -129,7 +129,7 @@ static bool
|
|
|
intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
|
|
|
{
|
|
|
uint8_t voltage;
|
|
|
- int voltage_tries, max_vswing_tries;
|
|
|
+ int voltage_tries, max_vswing_tries, cr_tries, max_cr_tries;
|
|
|
uint8_t link_config[2];
|
|
|
uint8_t link_bw, rate_select;
|
|
|
|
|
@@ -170,9 +170,20 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * DP 1.4 spec clock recovery retries defined but
|
|
|
+ * for devices pre-DP 1.4 we set the retry limit
|
|
|
+ * to 4 (voltage levels) x 4 (preemphasis levels) x
|
|
|
+ * x 5 (same voltage retries) = 80 (max iterations)
|
|
|
+ */
|
|
|
+ if (intel_dp->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14)
|
|
|
+ max_cr_tries = 10;
|
|
|
+ else
|
|
|
+ max_cr_tries = 80;
|
|
|
+
|
|
|
voltage_tries = 1;
|
|
|
max_vswing_tries = 0;
|
|
|
- for (;;) {
|
|
|
+ for (cr_tries = 0; cr_tries < max_cr_tries; ++cr_tries) {
|
|
|
uint8_t link_status[DP_LINK_STATUS_SIZE];
|
|
|
|
|
|
drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
|
|
@@ -216,6 +227,8 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
|
|
|
++max_vswing_tries;
|
|
|
|
|
|
}
|
|
|
+ DRM_ERROR("Failed clock recovery %d times, giving up!\n", max_cr_tries);
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
/*
|