From: Leo Li <[email protected]>

[Why & How]

Immediate (tearing) flips breaks self refresh state machine assumptions,
so disable PSR/Replay for them.

Cc: [email protected]
Signed-off-by: Leo Li <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 6e5dbe0bd82e5..d4c814eeb56d6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3764,6 +3764,13 @@ VISIBLE_IF_KUNIT void 
amdgpu_dm_enable_self_refresh(struct amdgpu_display_manage
        struct amdgpu_dm_connector *aconn =
                (struct amdgpu_dm_connector 
*)acrtc_state->stream->dm_stream_context;
 
+       if (!acrtc_state->base.async_flip) {
+               amdgpu_dm_psr_set_event(dm, acrtc_state->stream, false,
+                       psr_event_immediate_flip, false);
+               amdgpu_dm_replay_set_event(dm, acrtc_state->stream, false,
+                       replay_event_immediate_flip, false);
+       }
+
        /* Decrement skip count when SR is enabled and we're doing fast 
updates. */
        if (acrtc_state->update_type == UPDATE_TYPE_FAST &&
            (psr->psr_feature_enabled || pr->replay_feature_enabled)) {
@@ -4218,6 +4225,18 @@ static void amdgpu_dm_commit_planes(struct 
drm_atomic_commit *state,
                        spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
                }
                mutex_lock(&dm->dc_lock);
+               /*
+                * Tearing (immediate) flips cannot work with panel self-refresh
+                * features. The event is cleared by
+                * amdgpu_dm_enable_self_refresh() once async flips stop.
+                */
+               if (immediate_flip) {
+                       dc_exit_ips_for_hw_access(dm->dc);
+                       amdgpu_dm_psr_set_event(dm, acrtc_state->stream, true,
+                               psr_event_immediate_flip, true);
+                       amdgpu_dm_replay_set_event(dm, acrtc_state->stream, 
true,
+                               replay_event_immediate_flip, true);
+               }
                update_planes_and_stream_adapter(dm->dc,
                                         planes_count,
                                         acrtc_state->stream,
-- 
2.55.0

Reply via email to