diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index c995dbd..c05fe0b 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -4355,9 +4355,13 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))) { DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", intel_encoder->base.name); - intel_dp->train_set_valid = false; - intel_dp_start_link_train(intel_dp); - intel_dp_stop_link_train(intel_dp); + if (intel_dp->retraining_cnt < 5) { + intel_dp->train_set_valid = false; + intel_dp_start_link_train(intel_dp); + intel_dp_stop_link_train(intel_dp); + intel_dp->retraining_cnt++; + } else + DRM_DEBUG_KMS("DP link retraining count exceeds 5. no retraining\n"); } } diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c index bcf2801..bda6543 100644 --- a/drivers/gpu/drm/i915/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/intel_dp_link_training.c @@ -287,6 +287,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp) /* Make sure clock is still ok */ if (!drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) { + DRM_DEBUG_KMS("clock recovery not ok, re-running. CR tries: %d, tries: %d\n", cr_tries, tries); intel_dp->train_set_valid = false; intel_dp_link_training_clock_recovery(intel_dp); intel_dp_set_link_train(intel_dp, @@ -311,6 +312,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp) DP_LINK_SCRAMBLING_DISABLE); tries = 0; cr_tries++; + DRM_DEBUG_KMS("tried 5 times. Re-running clock recovery\n"); continue; } diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index e48d0fc..f468dfd 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -835,6 +835,8 @@ struct intel_dp { unsigned long compliance_test_type; unsigned long compliance_test_data; bool compliance_test_active; + + int retraining_cnt; }; struct intel_digital_port {