[PATCH 08/22] drm/i915: Move link training setup code to separate functions (v2)

Ander Conselvan de Oliveira
2015-10-23T10:02:44Z

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(-)

diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c
index 8888793..b39ed51 100644
--- a/drivers/gpu/drm/i915/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
@@ -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;