@@ -104,13 +104,9 @@ intel_dp_update_link_train(struct intel_dp *intel_dp)
return ret == intel_dp->lane_count;
}
-/* Enable corresponding port and start training pattern 1 */
-static void
-intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
+static bool
+setup_clock_recovery(struct intel_dp *intel_dp)
{
- int i;
- uint8_t voltage;
- int voltage_tries, loop_tries;
uint8_t link_config[2];
uint8_t link_bw, rate_select;
@@ -141,9 +137,23 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
DP_TRAINING_PATTERN_1 |
DP_LINK_SCRAMBLING_DISABLE)) {
DRM_ERROR("failed to enable link training\n");
- return;
+ return false;
}
+ return true;
+}
+
+/* Enable corresponding port and start training pattern 1 */
+static void
+intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
+{
+ int i;
+ uint8_t voltage;
+ int voltage_tries, loop_tries;
+
+ if (!setup_clock_recovery(intel_dp))
+ return;
+
voltage = 0xff;
voltage_tries = 0;
loop_tries = 0;
@@ -215,11 +225,9 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
}
}
-static void
-intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
+static bool
+setup_channel_equalization(struct intel_dp *intel_dp)
{
- bool channel_eq = false;
- int tries, cr_tries;
uint32_t training_pattern = DP_TRAINING_PATTERN_2;
/*
@@ -242,9 +250,21 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
training_pattern |
DP_LINK_SCRAMBLING_DISABLE)) {
DRM_ERROR("failed to start channel equalization\n");
- return;
+ return false;
}
+ return true;
+}
+
+static void
+intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
+{
+ bool channel_eq = false;
+ int tries, cr_tries;
+
+ if (!setup_channel_equalization(intel_dp))
+ return;
+
tries = 0;
cr_tries = 0;
channel_eq = false;
@@ -267,9 +287,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
intel_dp->lane_count)) {
intel_dp->train_set_valid = false;
intel_dp_link_training_clock_recovery(intel_dp);
- intel_dp_set_link_train(intel_dp,
- training_pattern |
- DP_LINK_SCRAMBLING_DISABLE);
+ setup_channel_equalization(intel_dp);
cr_tries++;
continue;
}
@@ -284,9 +302,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
if (tries > 5) {
intel_dp->train_set_valid = false;
intel_dp_link_training_clock_recovery(intel_dp);
- intel_dp_set_link_train(intel_dp,
- training_pattern |
- DP_LINK_SCRAMBLING_DISABLE);
+ setup_channel_equalization(intel_dp);
tries = 0;
cr_tries++;
continue;
Move the setup code for the different phases of link training into functions separate from the training loop. This shouldn't cause any change in behavior, but make the code slightly less hard to read. Note that the extra checks performed by calling setup_channel_eq() instead of intel_dp_set_link_train() in the fallback to clock recovery path shouldn't cause any problems, since the link rate doesn't change during the link training. v2: Rebase Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> --- drivers/gpu/drm/i915/intel_dp_link_training.c | 52 +++++++++++++++++---------- 1 file changed, 34 insertions(+), 18 deletions(-)