> -----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

Reply via email to