aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-16 03:50:25 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-16 04:01:56 -0400
commitb06fbda328490ec471e72659a9bf69f16a1c8dc9 (patch)
tree9b2ef1f28f476c9ddef8b654a9e22b4f2974e033 /drivers/gpu
parente751823da27d37d25e5543abef2dc031f8813bc8 (diff)
Revert "drm/i915: Try harder to complete DP training pattern 1"
This reverts commit 2477367083b3eaa97f87993ab26627a02f350551. If (for whatever reason) the DP sink device never asks for the maximal voltage level, we never don't hit the check that should bail us out after 5 retries of the same voltage. Which leads to an endless loop in the DP link training code, which hangs the driver. Now some more DP link training experiments on eDP panels seem to indicate that our training algorithm isn't robust enough anyway and needs more work. Hence for 3.7-fixes, let's just revert the regressing commit instead of trying to apply more duct-tape. Reported-by: Oleksij Rempel <bug-track@fisher-privat.net> Acked-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index bd2c34a0aa9a..e37ca2cd4f99 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1798,7 +1798,8 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
1798 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) 1798 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
1799 break; 1799 break;
1800 if (i == intel_dp->lane_count && voltage_tries == 5) { 1800 if (i == intel_dp->lane_count && voltage_tries == 5) {
1801 if (++loop_tries == 5) { 1801 ++loop_tries;
1802 if (loop_tries == 5) {
1802 DRM_DEBUG_KMS("too many full retries, give up\n"); 1803 DRM_DEBUG_KMS("too many full retries, give up\n");
1803 break; 1804 break;
1804 } 1805 }
@@ -1808,11 +1809,15 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
1808 } 1809 }
1809 1810
1810 /* Check to see if we've tried the same voltage 5 times */ 1811 /* Check to see if we've tried the same voltage 5 times */
1811 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) != voltage) { 1812 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
1812 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
1813 voltage_tries = 0;
1814 } else
1815 ++voltage_tries; 1813 ++voltage_tries;
1814 if (voltage_tries == 5) {
1815 DRM_DEBUG_KMS("too many voltage retries, give up\n");
1816 break;
1817 }
1818 } else
1819 voltage_tries = 0;
1820 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
1816 1821
1817 /* Compute new intel_dp->train_set as requested by target */ 1822 /* Compute new intel_dp->train_set as requested by target */
1818 intel_get_adjust_train(intel_dp, link_status); 1823 intel_get_adjust_train(intel_dp, link_status);