Add link_recovery_mark_train_failure() to record the failure and make
the link recovery state transition explicit after a link training
failure: recovery can continue with an autoretrain, or must be handed
over to userspace after fallback selection.

This also prepares for replacing the sequential link training failure
counter with an enum in a follow-up change.

v2: (Jani)
- Convert link_recovery_mark_train_failure()'s documentation to be a
  non kernel-doc comment.
- Rename can_autoretrain flag to autoretrain_allowed.

Cc: Jani Nikula <[email protected]>
Signed-off-by: Imre Deak <[email protected]>
---
 .../drm/i915/display/intel_dp_link_training.c | 28 +++++++++++++++++--
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c 
b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 6c48219d770bd..e0bb9f45b0c8e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1292,6 +1292,28 @@ link_recovery_autoretrain_allowed(struct 
intel_dp_link_training *link_training)
        return link_training->seq_train_failures < MAX_SEQ_TRAIN_FAILURES;
 }
 
+/*
+ * Record a link training failure and advance the recovery state to
+ * indicate the next required recovery step.
+ *
+ * The caller must proceed with recovery as instructed by the return
+ * value, either via automatic retraining or, once automatic retraining
+ * is no longer possible, via userspace modesets after fallback
+ * selection.
+ *
+ * See also:
+ *   - DOC: DisplayPort link training
+ */
+static bool
+link_recovery_mark_train_failure(struct intel_dp_link_training *link_training)
+{
+       if (link_recovery_autoretrain_allowed(link_training))
+               /* Move to autoretrain pending or autoretrain disabled state. */
+               link_training->seq_train_failures++;
+
+       return link_recovery_autoretrain_allowed(link_training);
+}
+
 /**
  * intel_dp_stop_link_train - stop link training
  * @intel_dp: DP struct
@@ -1828,6 +1850,7 @@ void intel_dp_start_link_train(struct intel_atomic_state 
*state,
        struct intel_encoder *encoder = &dig_port->base;
        struct intel_dp_link_training *link_training =
                intel_dp->link.training;
+       bool autoretrain_allowed;
        bool passed;
        /*
         * Reinit the LTTPRs here to ensure that they are switched to
@@ -1859,8 +1882,7 @@ void intel_dp_start_link_train(struct intel_atomic_state 
*state,
                return;
        }
 
-       if (link_recovery_autoretrain_allowed(link_training))
-               link_training->seq_train_failures++;
+       autoretrain_allowed = link_recovery_mark_train_failure(link_training);
 
        /*
         * Ignore the link failure in CI
@@ -1879,7 +1901,7 @@ void intel_dp_start_link_train(struct intel_atomic_state 
*state,
                return;
        }
 
-       if (link_recovery_autoretrain_allowed(link_training))
+       if (autoretrain_allowed)
                return;
 
        if (intel_dp_schedule_fallback_link_training(state, intel_dp, 
crtc_state))
-- 
2.49.1

Reply via email to