[Freedreno] [PATCH v3 23/27] drm/msm/dpu: rework dpu_plane_atomic_check()

Dmitry Baryshkov dmitry.baryshkov at linaro.org
Tue Feb 7 17:59:31 UTC 2023


On 07/02/2023 19:57, Abhinav Kumar wrote:
> 
> 
> On 2/7/2023 9:51 AM, Dmitry Baryshkov wrote:
>> On 07/02/2023 19:49, Abhinav Kumar wrote:
>>>
>>>
>>> On 2/3/2023 10:21 AM, Dmitry Baryshkov wrote:
>>>> Split pipe-dependent code from dpu_plane_atomic_check() into the
>>>> separate function dpu_plane_atomic_check_pipe(). This is one of
>>>
>>> Same comment as prev patch, dpu_plane_atomic_check_pipe() ---> 
>>> dpu_plane_atomic_check_sspp()
>>
>> No, it does what it does: it checks one software pipe configuration.
> 
> The concept of software pipe is only to encapsulate the hw_sspp along 
> with its params
> 
> +struct dpu_sw_pipe {
> +    struct dpu_hw_sspp *sspp;
> +    enum dpu_sspp_multirect_index multirect_index;
> +    enum dpu_sspp_multirect_mode multirect_mode;
> +};
> 
> So its a very thin differentiation there.

SSPP is a hardware thing, while the sw_pipe is a software instance. It 
can employ an SSPP or a half of SSPP. And if it employs a half of SSPP 
(rec1) than the name dpu_plane_atomic_check_sspp() doesn't make sense: 
we are not checking the SSPP itself (or its configuration). We are 
checking the parameters of SW pipe.

> 
>>
>>>
>>>> preparational steps to add r_pipe support.
>>>>
>>>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
>>>> ---
>>>>   drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 88 
>>>> ++++++++++++++---------
>>>>   1 file changed, 53 insertions(+), 35 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
>>>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>>>> index f94e132733f3..e69499490d39 100644
>>>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>>>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>>>> @@ -903,6 +903,51 @@ 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_hw_sspp_cfg *pipe_cfg,
>>>
>>> pipe_cfg --> sspp_cfg
>>>
>>> Also, had a question. For function parameters spreading across 
>>> multiple lines do we want to align to one guideline? Is it going to 
>>> be two tabs more than the prev line or aligning it with the opening 
>>> brace of prev line?
>>>
>>> I am seeing a mix in the prev patch of the series and this one.
>>
>> I usually tend to keep the existing indent when adding new args and 
>> shifting to open brace when adding new functions. Maybe I failed a 
>> question in this patch, I'll doublecheck it.
>>
>>>
>>>> +        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)
>>>>   {
>>>> @@ -915,7 +960,7 @@ static int dpu_plane_atomic_check(struct 
>>>> drm_plane *plane,
>>>>       const struct dpu_format *fmt;
>>>>       struct dpu_hw_sspp_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;
>>>> @@ -970,46 +1015,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))
>>

-- 
With best wishes
Dmitry



More information about the Freedreno mailing list