aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 8e37fdd1fa2f..7101b8b4f8b4 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1581,7 +1581,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
1581 int i; 1581 int i;
1582 uint8_t voltage; 1582 uint8_t voltage;
1583 bool clock_recovery = false; 1583 bool clock_recovery = false;
1584 int tries; 1584 int voltage_tries, loop_tries;
1585 u32 reg; 1585 u32 reg;
1586 uint32_t DP = intel_dp->DP; 1586 uint32_t DP = intel_dp->DP;
1587 1587
@@ -1608,7 +1608,8 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
1608 DP &= ~DP_LINK_TRAIN_MASK; 1608 DP &= ~DP_LINK_TRAIN_MASK;
1609 memset(intel_dp->train_set, 0, 4); 1609 memset(intel_dp->train_set, 0, 4);
1610 voltage = 0xff; 1610 voltage = 0xff;
1611 tries = 0; 1611 voltage_tries = 0;
1612 loop_tries = 0;
1612 clock_recovery = false; 1613 clock_recovery = false;
1613 for (;;) { 1614 for (;;) {
1614 /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */ 1615 /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */
@@ -1651,16 +1652,26 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
1651 for (i = 0; i < intel_dp->lane_count; i++) 1652 for (i = 0; i < intel_dp->lane_count; i++)
1652 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) 1653 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
1653 break; 1654 break;
1654 if (i == intel_dp->lane_count) 1655 if (i == intel_dp->lane_count) {
1655 break; 1656 ++loop_tries;
1657 if (loop_tries == 5) {
1658 DRM_DEBUG_KMS("too many full retries, give up\n");
1659 break;
1660 }
1661 memset(intel_dp->train_set, 0, 4);
1662 voltage_tries = 0;
1663 continue;
1664 }
1656 1665
1657 /* Check to see if we've tried the same voltage 5 times */ 1666 /* Check to see if we've tried the same voltage 5 times */
1658 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { 1667 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
1659 ++tries; 1668 ++voltage_tries;
1660 if (tries == 5) 1669 if (voltage_tries == 5) {
1670 DRM_DEBUG_KMS("too many voltage retries, give up\n");
1661 break; 1671 break;
1672 }
1662 } else 1673 } else
1663 tries = 0; 1674 voltage_tries = 0;
1664 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; 1675 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
1665 1676
1666 /* Compute new intel_dp->train_set as requested by target */ 1677 /* Compute new intel_dp->train_set as requested by target */