intel_dp_short_pulse() calls intel_psr_short_pulse() before the direct intel_alpm_get_error() check. For PSR2-enabled panels, intel_psr_short_pulse() calls psr_alpm_check(), which reads and clears DP_ALPM_LOCK_TIMEOUT_ERROR via intel_alpm_get_error(). The subsequent direct call in intel_dp_short_pulse() then reads zero and skips calling intel_alpm_disable() and setting sink_alpm_error, leaving LOBF potentially enabled despite the ALPM error.
Fix this by having psr_alpm_check() also call intel_alpm_disable() and set sink_alpm_error when it handles an ALPM error. This mirrors what the direct call in intel_dp_short_pulse() would have done, ensuring correct cleanup regardless of which code path consumes the error bit first. intel_alpm_disable() is already called under psr->lock from intel_psr_disable_locked() for the Panel Replay path, so the lock ordering is established and safe. Suggested-by: sashiko AI review <[email protected]> Fixes: 2063174c22da ("drm/i915/lobf: Check for sink error and disable LOBF") Signed-off-by: Stephen J. Fuhry <[email protected]> --- drivers/gpu/drm/i915/display/intel_psr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c index 9382ad1e01d8..0701c8b94aa2 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.c +++ b/drivers/gpu/drm/i915/display/intel_psr.c @@ -3869,6 +3869,8 @@ static void psr_alpm_check(struct intel_dp *intel_dp) if (intel_alpm_get_error(intel_dp)) { intel_psr_disable_locked(intel_dp); psr->sink_not_reliable = true; + intel_alpm_disable(intel_dp); + intel_dp->alpm.sink_alpm_error = true; } } -- 2.39.5
