> -----Original Message----- > From: Intel-xe <[email protected]> On Behalf Of Jouni > Högander > Sent: Friday, June 12, 2026 11:03 AM > To: [email protected]; [email protected] > Cc: Hogander, Jouni <[email protected]> > Subject: [PATCH 3/3] drm/i915/psr: Perform Panel Replay exit/activate on > errors reported by sink > > DP2.1 specification says: > > "The DP Source device shall retransmit an active video image after > detecting any PR error status bits set in the PANEL REPLAY ERROR STATUS > register (DPCD 02020h) unless the DP Source device is already updating an > entire active video image." > > Implement Panel Replay exit and then activation on errors. Exit is enabling > active video stream and activation is re-triggering PR entry and sink > capturing full frame into its remote frame buffer (RFB). Also remove > disabling Panel Replay and setting psr->sink_not_reliable for Panel Replay.
Just a thought: Though it is not very clear from spec if we get the error multiple times should we keep trying for reactivation or can we introduce some error-count-threshold and after that mark sink_not_reliable as true. Good to know your view on this. Regards, Animesh > > Signed-off-by: Jouni Högander <[email protected]> > --- > drivers/gpu/drm/i915/display/intel_psr.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c > b/drivers/gpu/drm/i915/display/intel_psr.c > index a848c57e4ce5d..f51539ed1e939 100644 > --- a/drivers/gpu/drm/i915/display/intel_psr.c > +++ b/drivers/gpu/drm/i915/display/intel_psr.c > @@ -3903,7 +3903,6 @@ static void psr_capability_changed_check(struct > intel_dp *intel_dp) > static void _panel_replay_short_pulse(struct intel_dp *intel_dp) > { > struct intel_display *display = to_intel_display(intel_dp); > - struct intel_psr *psr = &intel_dp->psr; > int ret; > u8 error_status; > const u8 errors = DP_PANEL_REPLAY_LINK_CRC_ERROR | > @@ -3915,11 +3914,6 @@ static void _panel_replay_short_pulse(struct > intel_dp *intel_dp) > if (ret < 0) > return; > > - if (error_status & errors) { > - intel_psr_disable_locked(intel_dp); > - psr->sink_not_reliable = true; > - } > - > if (error_status & DP_PANEL_REPLAY_RFB_STORAGE_ERROR) > drm_dbg_kms(display->drm, > "Panel Replay RFB storage error\n"); > @@ -3938,6 +3932,11 @@ static void _panel_replay_short_pulse(struct > intel_dp *intel_dp) > /* clear status register */ > drm_dp_dpcd_write_byte(&intel_dp->aux, > DP_PANEL_REPLAY_ERROR_STATUS, > error_status); > + > + if (error_status & errors) { > + intel_psr_exit(intel_dp); > + queue_work(display->wq.unordered, &intel_dp->psr.work); > + } > } > > static void _psr_short_pulse(struct intel_dp *intel_dp) > -- > 2.43.0
