The current logic checks whether the cursor plane blending
properties match the primary plane's. However that's wrong,
because the cursor uses the topmost pipe.

Instead, grab the topmost enabled plane, and check that the
cursor plane blending properties matches it.

Fixes: 12f4849a1cfd ("drm/amd/display: check cursor scaling")
Signed-off-by: Simon Ser <cont...@emersion.fr>
Cc: Alex Deucher <alexander.deuc...@amd.com>
Cc: Harry Wentland <hwent...@amd.com>
Cc: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 +++++++++++--------
 1 file changed, 19 insertions(+), 13 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 f736c1fa1fb4..b54ed708e114 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9458,33 +9458,39 @@ static int dm_check_crtc_cursor(struct drm_atomic_state 
*state,
                                struct drm_crtc *crtc,
                                struct drm_crtc_state *new_crtc_state)
 {
-       struct drm_plane_state *new_cursor_state, *new_primary_state;
-       int cursor_scale_w, cursor_scale_h, primary_scale_w, primary_scale_h;
+       int i;
+       struct drm_plane *plane;
+       struct drm_plane_state *new_cursor_state, *new_underlying_state, 
*new_plane_state;
+       int cursor_scale_w, cursor_scale_h, underlying_scale_w, 
underlying_scale_h;
 
        /* On DCE and DCN there is no dedicated hardware cursor plane. We get a
         * cursor per pipe but it's going to inherit the scaling and
         * positioning from the underlying pipe. Check the cursor plane's
-        * blending properties match the primary plane's. */
+        * blending properties match the underlying plane's. */
+
+       new_underlying_state = NULL;
+       for_each_new_plane_in_state(state, plane, new_plane_state, i) {
+               if (new_plane_state->crtc == crtc && plane != crtc->cursor)
+                       new_underlying_state = new_plane_state;
+       }
 
        new_cursor_state = drm_atomic_get_new_plane_state(state, crtc->cursor);
-       new_primary_state = drm_atomic_get_new_plane_state(state, 
crtc->primary);
-       if (!new_cursor_state || !new_primary_state || !new_cursor_state->fb) {
+       if (!new_cursor_state || !new_underlying_state || !new_cursor_state->fb)
                return 0;
-       }
 
        cursor_scale_w = new_cursor_state->crtc_w * 1000 /
                         (new_cursor_state->src_w >> 16);
        cursor_scale_h = new_cursor_state->crtc_h * 1000 /
                         (new_cursor_state->src_h >> 16);
 
-       primary_scale_w = new_primary_state->crtc_w * 1000 /
-                        (new_primary_state->src_w >> 16);
-       primary_scale_h = new_primary_state->crtc_h * 1000 /
-                        (new_primary_state->src_h >> 16);
+       underlying_scale_w = new_underlying_state->crtc_w * 1000 /
+                        (new_underlying_state->src_w >> 16);
+       underlying_scale_h = new_underlying_state->crtc_h * 1000 /
+                        (new_underlying_state->src_h >> 16);
 
-       if (cursor_scale_w != primary_scale_w ||
-           cursor_scale_h != primary_scale_h) {
-               drm_dbg_atomic(crtc->dev, "Cursor plane scaling doesn't match 
primary plane\n");
+       if (cursor_scale_w != underlying_scale_w ||
+           cursor_scale_h != underlying_scale_h) {
+               drm_dbg_atomic(crtc->dev, "Cursor plane scaling doesn't match 
underlying plane\n");
                return -EINVAL;
        }
 
-- 
2.30.2

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to