Replace the sequential link training failure counter with an explicit
link recovery state enum.

This makes the recovery states and transitions clearer: idle, automatic
retraining pending, and automatic retraining disabled.

A follow-up change will also move the retrain_disabled flag into this
enum.

v2: (Jani)
- Convert enum intel_dp_link_recovery_state's documentation to be a
  non kernel-doc comment.
- Compare against / set enum values explicitly.

Cc: Jani Nikula <[email protected]>
Signed-off-by: Imre Deak <[email protected]>
---
 .../drm/i915/display/intel_dp_link_training.c | 72 ++++++++++++++++---
 1 file changed, 63 insertions(+), 9 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 dc1ad0fc6bd8b..a326e9803f2c8 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -62,14 +62,54 @@
                lt_dbg(_intel_dp, _dp_phy, "Sink disconnected: " _format, ## 
__VA_ARGS__); \
 } while (0)
 
-#define MAX_SEQ_TRAIN_FAILURES 2
+/*
+ * enum intel_dp_link_recovery_state - LT recovery state
+ * @INTEL_DP_LINK_RECOVERY_IDLE:
+ *   No link training failure is currently tracked and no recovery is
+ *   in progress. This is the initial state after driver initialization,
+ *   power state transitions, sink (re-)connection, or after a successful
+ *   link training.
+ *
+ * @INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING:
+ *   A first link training failure has been observed and an automatic
+ *   retraining attempt with the same link parameters is pending. Exactly
+ *   one such attempt is allowed before switching to userspace-driven
+ *   recovery.
+ *
+ * @INTEL_DP_LINK_RECOVERY_AUTORETRAIN_DISABLED:
+ *   Automatic retraining is no longer possible. At this point, a
+ *   fallback selection is made and userspace is notified to take over
+ *   recovery, performing modesets with parameters it determines are
+ *   required. The driver then selects a link configuration from the
+ *   remaining fallback configuration set. Subsequent link training
+ *   failures trigger further fallback selections and userspace
+ *   notifications.
+ *
+ * Describes the link recovery state used by the Intel DP link recovery
+ * logic.
+ *
+ * See also:
+ *   - link_recovery_autoretrain_pending()
+ *   - link_recovery_autoretrain_allowed()
+ *   - link_recovery_mark_train_failure()
+ *   - link_recovery_reset()
+ */
+enum intel_dp_link_recovery_state {
+       /*
+        * Keep the enum values ordered from least to most severe
+        * recovery state; helper logic relies on that ordering.
+        */
+       INTEL_DP_LINK_RECOVERY_IDLE,
+       INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING,
+       INTEL_DP_LINK_RECOVERY_AUTORETRAIN_DISABLED,
+};
 
 struct intel_dp_link_training {
        struct intel_dp *dp;
 
+       enum intel_dp_link_recovery_state recovery_state;
+
        bool retrain_disabled;
-       /* Sequential link training failures after a passing LT */
-       int seq_train_failures;
        int force_train_failure;
        bool force_retrain;
 };
@@ -1267,7 +1307,7 @@ intel_dp_128b132b_intra_hop(struct intel_dp *intel_dp,
 static bool
 link_recovery_autoretrain_pending(struct intel_dp_link_training *link_training)
 {
-       return link_training->seq_train_failures == 1;
+       return link_training->recovery_state == 
INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING;
 }
 
 /*
@@ -1289,7 +1329,13 @@ link_recovery_autoretrain_pending(struct 
intel_dp_link_training *link_training)
 static bool
 link_recovery_autoretrain_allowed(struct intel_dp_link_training *link_training)
 {
-       return link_training->seq_train_failures < MAX_SEQ_TRAIN_FAILURES;
+       switch (link_training->recovery_state) {
+       case INTEL_DP_LINK_RECOVERY_IDLE:
+       case INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING:
+               return true;
+       default:
+               return false;
+       }
 }
 
 /*
@@ -1307,13 +1353,21 @@ link_recovery_autoretrain_allowed(struct 
intel_dp_link_training *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++;
+       switch (link_training->recovery_state) {
+       case INTEL_DP_LINK_RECOVERY_IDLE:
+               link_training->recovery_state = 
INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING;
+               break;
+       case INTEL_DP_LINK_RECOVERY_AUTORETRAIN_PENDING:
+               link_training->recovery_state = 
INTEL_DP_LINK_RECOVERY_AUTORETRAIN_DISABLED;
+               break;
+       default:
+               break;
+       }
 
        return link_recovery_autoretrain_allowed(link_training);
 }
 
+
 /**
  * link_recovery_reset - reset the link recovery state
  * @link_training: link training state
@@ -1323,7 +1377,7 @@ link_recovery_mark_train_failure(struct 
intel_dp_link_training *link_training)
  */
 static void link_recovery_reset(struct intel_dp_link_training *link_training)
 {
-       link_training->seq_train_failures = 0;
+       link_training->recovery_state = INTEL_DP_LINK_RECOVERY_IDLE;
 }
 
 /**
-- 
2.49.1

Reply via email to