drm/i915/dp_link_training: Add helper to query allowed autoretrain

Add link_recovery_autoretrain_allowed() to make it clearer what the
condition is about at its callers: queuing work for and starting an
autoretrain is allowed.

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

v2: Convert link_recovery_autoretrain_allowed()'s documentation to be a
    non kernel-doc comment and detail what an allowed autoretrain is.
    (Jani)

Cc: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20260601093836.3057345-13-imre.deak@intel.com
This commit is contained in:
Imre Deak
2026-06-01 12:38:25 +03:00
parent a45b203d54
commit 1a5e170bf7

View File

@@ -1270,6 +1270,28 @@ link_recovery_autoretrain_pending(struct intel_dp_link_training *link_training)
return link_training->seq_train_failures == 1;
}
/*
* Automatic retraining is a driver-driven link recovery mechanism that
* retrains the link with the current userspace provided modeset
* configuration and link parameters.
*
* Autoretrain is allowed while the link configurations available for
* retraining, i.e. those not disabled yet via fallback selection, still
* make it possible to retrain the link for the current userspace provided
* modeset configuration.
*
* Once automatic retraining is no longer allowed, userspace driven link
* recovery via userspace notifications and userspace modesets takes over.
*
* See also:
* - DOC: DisplayPort 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;
}
/**
* intel_dp_stop_link_train - stop link training
* @intel_dp: DP struct
@@ -1310,7 +1332,7 @@ void intel_dp_stop_link_train(struct intel_dp *intel_dp,
intel_hpd_unblock(encoder);
if (!display->hotplug.ignore_long_hpd &&
link_training->seq_train_failures < MAX_SEQ_TRAIN_FAILURES) {
link_recovery_autoretrain_allowed(link_training)) {
int delay_ms = link_recovery_autoretrain_pending(link_training) ? 0 : 2000;
intel_encoder_link_check_queue_work(encoder, delay_ms);
@@ -1837,7 +1859,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
return;
}
if (link_training->seq_train_failures < MAX_SEQ_TRAIN_FAILURES)
if (link_recovery_autoretrain_allowed(link_training))
link_training->seq_train_failures++;
/*
@@ -1857,7 +1879,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
return;
}
if (link_training->seq_train_failures < MAX_SEQ_TRAIN_FAILURES)
if (link_recovery_autoretrain_allowed(link_training))
return;
if (intel_dp_schedule_fallback_link_training(state, intel_dp, crtc_state))
@@ -2009,7 +2031,7 @@ intel_dp_needs_link_retrain(struct intel_dp *intel_dp)
intel_dp->lane_count))
return false;
if (link_training->seq_train_failures >= MAX_SEQ_TRAIN_FAILURES)
if (!link_recovery_autoretrain_allowed(link_training))
return false;
if (link_recovery_autoretrain_pending(link_training))