mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 15:22:21 -04:00
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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user