Am 20.04.23 um 18:00 schrieb Hamza Mahfooz:
Currently, on a handful of ASICs. We allow the framebuffer for a given
plane to exist in either VRAM or GTT. However, if the plane's new
framebuffer is in a different memory domain than it's previous
framebuffer, flipping between them can cause the screen to flicker. So,
to fix this, don't perform an immediate flip in the aforementioned case.

Cc: sta...@vger.kernel.org
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2354
Reviewed-by: Roman Li <roman...@amd.com>
Fixes: 81d0bcf99009 ("drm/amdgpu: make display pinning more flexible (v2)")
Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>

Reviewed-by: Christian König <christian.koe...@amd.com>

---
v2: make a number of clarifications to the commit message and drop
     locking.
v3: use a stronger check
v4: drop mem_type
---
  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 13 +++++++++++--
  1 file changed, 11 insertions(+), 2 deletions(-)

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 dfcb9815b5a8..76a776fd8437 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7900,6 +7900,13 @@ static void amdgpu_dm_commit_cursors(struct 
drm_atomic_state *state)
                        amdgpu_dm_plane_handle_cursor_update(plane, 
old_plane_state);
  }
+static inline uint32_t get_mem_type(struct drm_framebuffer *fb)
+{
+       struct amdgpu_bo *abo = gem_to_amdgpu_bo(fb->obj[0]);
+
+       return abo->tbo.resource ? abo->tbo.resource->mem_type : 0;
+}
+
  static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                                    struct dc_state *dc_state,
                                    struct drm_device *dev,
@@ -8042,11 +8049,13 @@ static void amdgpu_dm_commit_planes(struct 
drm_atomic_state *state,
/*
                 * Only allow immediate flips for fast updates that don't
-                * change FB pitch, DCC state, rotation or mirroing.
+                * change memory domain, FB pitch, DCC state, rotation or
+                * mirroring.
                 */
                bundle->flip_addrs[planes_count].flip_immediate =
                        crtc->state->async_flip &&
-                       acrtc_state->update_type == UPDATE_TYPE_FAST;
+                       acrtc_state->update_type == UPDATE_TYPE_FAST &&
+                       get_mem_type(old_plane_state->fb) == get_mem_type(fb);
timestamp_ns = ktime_get_ns();
                bundle->flip_addrs[planes_count].flip_timestamp_in_us = 
div_u64(timestamp_ns, 1000);

Reply via email to