Move the check of whether the voltage changed into the function that
parses the sink adjust request, simplifying the voltage loop a bit.

Signed-off-by: Ander Conselvan de Oliveira 
<ander.conselvan.de.olive...@intel.com>
---
 drivers/gpu/drm/i915/intel_dp_link_training.c | 32 ++++++++++++++-------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c 
b/drivers/gpu/drm/i915/intel_dp_link_training.c
index 0da2133..fb449f5 100644
--- a/drivers/gpu/drm/i915/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
@@ -23,7 +23,8 @@
 
 #include "intel_drv.h"
 
-static void
+/* Returns true if the voltage swing changed */
+static bool
 intel_get_adjust_train(struct intel_dp *intel_dp,
                       const uint8_t link_status[DP_LINK_STATUS_SIZE])
 {
@@ -32,6 +33,8 @@ intel_get_adjust_train(struct intel_dp *intel_dp,
        int lane;
        uint8_t voltage_max;
        uint8_t preemph_max;
+       uint8_t mask;
+       bool voltage_changed = false;
 
        for (lane = 0; lane < intel_dp->lane_count; lane++) {
                uint8_t this_v = drm_dp_get_adjust_request_voltage(link_status, 
lane);
@@ -51,8 +54,16 @@ intel_get_adjust_train(struct intel_dp *intel_dp,
        if (p >= preemph_max)
                p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
 
-       for (lane = 0; lane < 4; lane++)
+       mask = DP_TRAIN_VOLTAGE_SWING_MASK | DP_TRAIN_MAX_SWING_REACHED;
+
+       for (lane = 0; lane < 4; lane++) {
+               if ((intel_dp->train_set[lane] & mask) != v)
+                       voltage_changed = true;
+
                intel_dp->train_set[lane] = v | p;
+       }
+
+       return voltage_changed;
 }
 
 static bool
@@ -147,17 +158,10 @@ max_voltage_reached_on_all_lanes(struct intel_dp 
*intel_dp)
        return true;
 }
 
-static uint8_t
-intel_dp_get_train_voltage(struct intel_dp *intel_dp)
-{
-       return intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
-}
-
 static bool
 clock_recovery_voltage_step(struct intel_dp *intel_dp)
 {
        int voltage_tries = 0;
-       uint8_t voltage = 0xff;
 
        for (;;) {
                uint8_t link_status[DP_LINK_STATUS_SIZE];
@@ -186,18 +190,16 @@ clock_recovery_voltage_step(struct intel_dp *intel_dp)
                if (max_voltage_reached_on_all_lanes(intel_dp))
                        break;
 
-               /* Check to see if we've tried the same voltage 5 times */
-               if (intel_dp_get_train_voltage(intel_dp) != voltage) {
+               /* Update training set and check to see if we've tried the same
+                *  voltage 5 times */
+               if (intel_get_adjust_train(intel_dp, link_status)) {
                        voltage_tries = 0;
                } else if (++voltage_tries == 5) {
                        DRM_ERROR("too many voltage retries, give up\n");
                        break;
                }
 
-               voltage = intel_dp_get_train_voltage(intel_dp);
-
-               /* Update training set as requested by target */
-               intel_get_adjust_train(intel_dp, link_status);
+               /* Make the new training set effective */
                if (!intel_dp_update_link_train(intel_dp)) {
                        DRM_ERROR("failed to update link training\n");
                        break;
-- 
2.4.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to