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.oliveira@xxxxxxxxx> --- 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 ba640b7..5f7c229 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; uint8_t link_status[DP_LINK_STATUS_SIZE]; for (;;) { @@ -185,18 +189,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@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx