drm/msm/dpu: rework dpu_plane_atomic_check()
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Thu, 16 Mar 2023 16:16:44 +0000 (19:16 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Thu, 6 Apr 2023 17:29:42 +0000 (20:29 +0300)
Split pipe-dependent code from dpu_plane_atomic_check() into the
separate function dpu_plane_atomic_check_pipe(). This is one of
preparational steps to add r_pipe support.

Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Tested-by: Abhinav Kumar <quic_abhinavk@quicinc.com> # sc7280
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/527336/
Link: https://lore.kernel.org/r/20230316161653.4106395-24-dmitry.baryshkov@linaro.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c

index a151774..8e34018 100644 (file)
@@ -904,6 +904,53 @@ static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,
        return 0;
 }
 
+static int dpu_plane_atomic_check_pipe(struct dpu_plane *pdpu,
+               struct dpu_sw_pipe *pipe,
+               struct dpu_sw_pipe_cfg *pipe_cfg,
+               const struct dpu_format *fmt)
+{
+       uint32_t min_src_size;
+
+       min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1;
+
+       if (DPU_FORMAT_IS_YUV(fmt) &&
+           (!(pipe->sspp->cap->features & DPU_SSPP_SCALER) ||
+            !(pipe->sspp->cap->features & DPU_SSPP_CSC_ANY))) {
+               DPU_DEBUG_PLANE(pdpu,
+                               "plane doesn't have scaler/csc for yuv\n");
+               return -EINVAL;
+       }
+
+       /* check src bounds */
+       if (drm_rect_width(&pipe_cfg->src_rect) < min_src_size ||
+           drm_rect_height(&pipe_cfg->src_rect) < min_src_size) {
+               DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n",
+                               DRM_RECT_ARG(&pipe_cfg->src_rect));
+               return -E2BIG;
+       }
+
+       /* valid yuv image */
+       if (DPU_FORMAT_IS_YUV(fmt) &&
+           (pipe_cfg->src_rect.x1 & 0x1 ||
+            pipe_cfg->src_rect.y1 & 0x1 ||
+            drm_rect_width(&pipe_cfg->src_rect) & 0x1 ||
+            drm_rect_height(&pipe_cfg->src_rect) & 0x1)) {
+               DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n",
+                               DRM_RECT_ARG(&pipe_cfg->src_rect));
+               return -EINVAL;
+       }
+
+       /* min dst support */
+       if (drm_rect_width(&pipe_cfg->dst_rect) < 0x1 ||
+           drm_rect_height(&pipe_cfg->dst_rect) < 0x1) {
+               DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n",
+                               DRM_RECT_ARG(&pipe_cfg->dst_rect));
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int dpu_plane_atomic_check(struct drm_plane *plane,
                                  struct drm_atomic_state *state)
 {
@@ -916,7 +963,7 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
        const struct dpu_format *fmt;
        struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg;
        struct drm_rect fb_rect = { 0 };
-       uint32_t min_src_size, max_linewidth;
+       uint32_t max_linewidth;
        unsigned int rotation;
        uint32_t supported_rotations;
        const struct dpu_sspp_cfg *pipe_hw_caps = pstate->pipe.sspp->cap;
@@ -971,47 +1018,19 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
 
        max_linewidth = pdpu->catalog->caps->max_linewidth;
 
-       fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb));
-
-       min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1;
-
-       if (DPU_FORMAT_IS_YUV(fmt) &&
-               (!(pipe_hw_caps->features & DPU_SSPP_SCALER) ||
-                !(pipe_hw_caps->features & DPU_SSPP_CSC_ANY))) {
-               DPU_DEBUG_PLANE(pdpu,
-                               "plane doesn't have scaler/csc for yuv\n");
-               return -EINVAL;
-
-       /* check src bounds */
-       } else if (drm_rect_width(&pipe_cfg->src_rect) < min_src_size ||
-                  drm_rect_height(&pipe_cfg->src_rect) < min_src_size) {
-               DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n",
-                               DRM_RECT_ARG(&pipe_cfg->src_rect));
-               return -E2BIG;
-
-       /* valid yuv image */
-       } else if (DPU_FORMAT_IS_YUV(fmt) &&
-                  (pipe_cfg->src_rect.x1 & 0x1 || pipe_cfg->src_rect.y1 & 0x1 ||
-                   drm_rect_width(&pipe_cfg->src_rect) & 0x1 ||
-                   drm_rect_height(&pipe_cfg->src_rect) & 0x1)) {
-               DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n",
-                               DRM_RECT_ARG(&pipe_cfg->src_rect));
-               return -EINVAL;
-
-       /* min dst support */
-       } else if (drm_rect_width(&pipe_cfg->dst_rect) < 0x1 ||
-                  drm_rect_height(&pipe_cfg->dst_rect) < 0x1) {
-               DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n",
-                               DRM_RECT_ARG(&pipe_cfg->dst_rect));
-               return -EINVAL;
-
        /* check decimated source width */
-       } else if (drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) {
+       if (drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) {
                DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n",
                                DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth);
                return -E2BIG;
        }
 
+       fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb));
+
+       ret = dpu_plane_atomic_check_pipe(pdpu, &pstate->pipe, pipe_cfg, fmt);
+       if (ret)
+               return ret;
+
        supported_rotations = DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0;
 
        if (pipe_hw_caps->features & BIT(DPU_SSPP_INLINE_ROTATION))