Take into account the plane rotation and flipping when calculating src
positions for the wide plane parts.

Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 27 ++++++++++++++---------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 2e63eb0a2f3f..d43e04fc4578 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -887,16 +887,6 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
                return -EINVAL;
        }
 
-       pipe_cfg->src_rect = new_plane_state->src;
-
-       /* state->src is 16.16, src_rect is not */
-       pipe_cfg->src_rect.x1 >>= 16;
-       pipe_cfg->src_rect.x2 >>= 16;
-       pipe_cfg->src_rect.y1 >>= 16;
-       pipe_cfg->src_rect.y2 >>= 16;
-
-       pipe_cfg->dst_rect = new_plane_state->dst;
-
        fb_rect.x2 = new_plane_state->fb->width;
        fb_rect.y2 = new_plane_state->fb->height;
 
@@ -912,6 +902,15 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
 
        max_linewidth = pdpu->catalog->caps->max_linewidth;
 
+       /* state->src is 16.16, src_rect is not */
+       drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src);
+
+       pipe_cfg->dst_rect = new_plane_state->dst;
+
+       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) {
                /*
                 * In parallel multirect case only the half of the usual width
@@ -959,6 +958,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);
        if (ret)
                return ret;
-- 
2.30.2

Reply via email to