[Freedreno] [PATCH v3 21/27] drm/msm/dpu: simplify dpu_plane_validate_src()
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Tue Feb 7 00:27:42 UTC 2023
On 07/02/2023 00:40, Abhinav Kumar wrote:
>
>
> On 2/3/2023 10:21 AM, Dmitry Baryshkov wrote:
>> Since the driver uses clipped src coordinates, there is no need to check
>> against the fb coordinates. Remove corresponding checks and inline
>> dpu_plane_validate_src().
>>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
>
> Can you please explain how the clipping in
> drm_atomic_helper_check_plane_state() can allow us to remove checking
> the fb co-ordinates?
>
> The clipping is done using the mode parameters.
>
> So lets say the FB being used is smaller than the source buffer by an
> incorrect usermode setting.
>
> Then the src sspp shall try to fetch the full image of src rectangle
> size from a FB which isnt that big leading to a fault.
This case is checked by the drm_atomic_plane_check().
>
> How does the clipping avoid such a case?
clipping itself does not. However using clipped coordinates from
plane_state->src ensures that they already were validated against the FB
dimensions. I'll see if I can change the commit message to make it more
obvious.
>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 30 ++++++++---------------
>> 1 file changed, 10 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> index ecf5402ab61a..0986e740b978 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> @@ -894,25 +894,6 @@ static void dpu_plane_cleanup_fb(struct drm_plane
>> *plane,
>> old_pstate->needs_dirtyfb);
>> }
>> -static bool dpu_plane_validate_src(struct drm_rect *src,
>> - struct drm_rect *fb_rect,
>> - uint32_t min_src_size)
>> -{
>> - /* Ensure fb size is supported */
>> - if (drm_rect_width(fb_rect) > MAX_IMG_WIDTH ||
>> - drm_rect_height(fb_rect) > MAX_IMG_HEIGHT)
>> - return false;
>> -
>> - /* Ensure src rect is above the minimum size */
>> - if (drm_rect_width(src) < min_src_size ||
>> - drm_rect_height(src) < min_src_size)
>> - return false;
>> -
>> - /* Ensure src is fully encapsulated in fb */
>> - return drm_rect_intersect(fb_rect, src) &&
>> - drm_rect_equals(fb_rect, src);
>> -}
>> -
>> static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,
>> const struct dpu_sspp_sub_blks *sblk,
>> struct drm_rect src, const struct dpu_format
>> *fmt)
>> @@ -998,6 +979,14 @@ static int dpu_plane_atomic_check(struct
>> drm_plane *plane,
>> fb_rect.x2 = new_plane_state->fb->width;
>> fb_rect.y2 = new_plane_state->fb->height;
>> + /* Ensure fb size is supported */
>> + if (drm_rect_width(&fb_rect) > MAX_IMG_WIDTH ||
>> + drm_rect_height(&fb_rect) > MAX_IMG_HEIGHT) {
>> + DPU_DEBUG_PLANE(pdpu, "invalid framebuffer " DRM_RECT_FMT "\n",
>> + DRM_RECT_ARG(&fb_rect));
>> + return -E2BIG;
>> + }
>> +
>> max_linewidth = pdpu->catalog->caps->max_linewidth;
>> fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb));
>> @@ -1012,7 +1001,8 @@ static int dpu_plane_atomic_check(struct
>> drm_plane *plane,
>> return -EINVAL;
>> /* check src bounds */
>> - } else if (!dpu_plane_validate_src(&pipe_cfg->src_rect, &fb_rect,
>> min_src_size)) {
>> + } 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;
--
With best wishes
Dmitry
More information about the Freedreno
mailing list