[Freedreno] [PATCH v3 21/27] drm/msm/dpu: simplify dpu_plane_validate_src()
Abhinav Kumar
quic_abhinavk at quicinc.com
Tue Feb 7 00:42:54 UTC 2023
On 2/6/2023 4:27 PM, Dmitry Baryshkov wrote:
> 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.
>
Ah okay, yeah the commit text confused me a bit to look at the clipping
code in drm_atomic_helper_check_plane_state().
Yes, please change it to point to the helper which addresses this.
>>
>>> ---
>>> 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;
>
More information about the Freedreno
mailing list