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.steven...@raspberrypi.com>
---
 drivers/gpu/drm/vc4/vc4_crtc.c | 15 +++++++++++----
 drivers/gpu/drm/vc4/vc4_drv.h  |  7 +------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
index 8b5a7e5eb146..1d54176cf811 100644
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
@@ -735,10 +735,17 @@ 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;
        }
 
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 697e9b7c9d0e..717fd1140561 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -598,12 +598,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;
 
-- 
2.34.1

Reply via email to