drm/vc4: Force trigger of dlist update on margins change (#4970)
author6by9 <6by9@users.noreply.github.com>
Fri, 1 Apr 2022 10:31:38 +0000 (11:31 +0100)
committerGitHub <noreply@github.com>
Fri, 1 Apr 2022 10:31:38 +0000 (11:31 +0100)
When the margins are changed, the dlist needs to be regenerated
with the changed updated dest regions for each of the planes.

Setting the zpos_changed flag is sufficient to trigger that
without doing a full modeset, therefore set it should the
margins be changed.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_drv.h

index da264e2..80195b7 100644 (file)
@@ -728,10 +728,16 @@ static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
                if (conn_state->crtc != crtc)
                        continue;
 
-               vc4_state->margins.left = conn_state->tv.margins.left;
-               vc4_state->margins.right = conn_state->tv.margins.right;
-               vc4_state->margins.top = conn_state->tv.margins.top;
-               vc4_state->margins.bottom = conn_state->tv.margins.bottom;
+               if (memcmp(&vc4_state->margins, &conn_state->tv.margins,
+                          sizeof(vc4_state->margins))) {
+                       memcpy(&vc4_state->margins, &conn_state->tv.margins,
+                              sizeof(vc4_state->margins));
+
+                       /* Need to force the dlist entries for all planes to be
+                        * updated so that the dest rectangles are changed.
+                        */
+                       crtc_state->zpos_changed = true;
+               }
                break;
        }
 
index 7164017..918dbf8 100644 (file)
@@ -589,12 +589,7 @@ struct vc4_crtc_state {
        bool txp_armed;
        unsigned int assigned_channel;
 
-       struct {
-               unsigned int left;
-               unsigned int right;
-               unsigned int top;
-               unsigned int bottom;
-       } margins;
+       struct drm_connector_tv_margins margins;
 
        unsigned long hvs_load;