drm/msm/dpu: rework dpu_plane_atomic_check()
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>
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user