]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm/dpu: take plane rotation into account for wide planes
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Wed, 26 Jun 2024 21:45:57 +0000 (00:45 +0300)
committerAbhinav Kumar <quic_abhinavk@quicinc.com>
Mon, 5 Aug 2024 20:56:02 +0000 (13:56 -0700)
Take into account the plane rotation and flipping when calculating src
positions for the wide plane parts.

This is not an issue yet, because rotation is only supported for the
UBWC planes and wide UBWC planes are rejected anyway because in parallel
multirect case only the half of the usual width is supported for tiled
formats. However it's better to fix this now rather than stumbling upon
it later.

Fixes: 80e8ae3b38ab ("drm/msm/dpu: add support for wide planes")
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/601059/
Link: https://lore.kernel.org/r/20240627-dpu-virtual-wide-v5-3-5efb90cbb8be@linaro.org
Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c

index dc1fd95e767bb5fcf3298f4d8ebcdedea9e52f2b..29298e0661635923d9ba22357b7d09a309ef7fba 100644 (file)
@@ -866,6 +866,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
 
        max_linewidth = pdpu->catalog->caps->max_linewidth;
 
+       drm_rect_rotate(&pipe_cfg->src_rect,
+                       new_plane_state->fb->width, new_plane_state->fb->height,
+                       new_plane_state->rotation);
+
        if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) ||
             _dpu_plane_calc_clk(&crtc_state->adjusted_mode, pipe_cfg) > max_mdp_clk_rate) {
                /*
@@ -915,6 +919,14 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
                r_pipe_cfg->dst_rect.x1 = pipe_cfg->dst_rect.x2;
        }
 
+       drm_rect_rotate_inv(&pipe_cfg->src_rect,
+                           new_plane_state->fb->width, new_plane_state->fb->height,
+                           new_plane_state->rotation);
+       if (r_pipe->sspp)
+               drm_rect_rotate_inv(&r_pipe_cfg->src_rect,
+                                   new_plane_state->fb->width, new_plane_state->fb->height,
+                                   new_plane_state->rotation);
+
        ret = dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg, fmt, &crtc_state->adjusted_mode);
        if (ret)
                return ret;