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