From 1a5e170bf7d8de8a501dc71f8cb79b7af0f47e6b Mon Sep 17 00:00:00 2001 From: Imre Deak Date: Mon, 1 Jun 2026 12:38:25 +0300 Subject: [PATCH] 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 Reviewed-by: Mika Kahola Signed-off-by: Imre Deak Link: https://patch.msgid.link/20260601093836.3057345-13-imre.deak@intel.com --- .../drm/i915/display/intel_dp_link_training.c | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 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 f6a8102a300c..6c48219d770b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -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))