]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/vc4: plane: Fix margin calculations for the right/bottom edges
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Mon, 13 Jun 2022 14:47:32 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:40:54 +0000 (14:40 +0200)
[ Upstream commit b7c3d6821627861f4ea3e1f2b595d0ed9e80aac8 ]

The current plane margin calculation code clips the right and bottom
edges of the range based using the left and top margins.

This is obviously wrong, so let's fix it.

Fixes: 666e73587f90 ("drm/vc4: Take margin setup into account when updating planes")
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://lore.kernel.org/r/20220613144800.326124-6-maxime@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/vc4/vc4_plane.c

index c2c33f20041639aaee0644780f309fc07341b44d..a82a0b1190ebb419405d5fca5e146a2db35cf3b9 100644 (file)
@@ -310,16 +310,16 @@ static int vc4_plane_margins_adj(struct drm_plane_state *pstate)
                                               adjhdisplay,
                                               crtc_state->mode.hdisplay);
        vc4_pstate->crtc_x += left;
-       if (vc4_pstate->crtc_x > crtc_state->mode.hdisplay - left)
-               vc4_pstate->crtc_x = crtc_state->mode.hdisplay - left;
+       if (vc4_pstate->crtc_x > crtc_state->mode.hdisplay - right)
+               vc4_pstate->crtc_x = crtc_state->mode.hdisplay - right;
 
        adjvdisplay = crtc_state->mode.vdisplay - (top + bottom);
        vc4_pstate->crtc_y = DIV_ROUND_CLOSEST(vc4_pstate->crtc_y *
                                               adjvdisplay,
                                               crtc_state->mode.vdisplay);
        vc4_pstate->crtc_y += top;
-       if (vc4_pstate->crtc_y > crtc_state->mode.vdisplay - top)
-               vc4_pstate->crtc_y = crtc_state->mode.vdisplay - top;
+       if (vc4_pstate->crtc_y > crtc_state->mode.vdisplay - bottom)
+               vc4_pstate->crtc_y = crtc_state->mode.vdisplay - bottom;
 
        vc4_pstate->crtc_w = DIV_ROUND_CLOSEST(vc4_pstate->crtc_w *
                                               adjhdisplay,