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

Reply via email to