Re: [PATCH v6 2/5] media: v4l2-common: Add v4l2_fill_pixfmt_aligned() helper
Sven Püschel <[email protected]>
| Newsgroups | org.kernel.vger.linux-media,org.kernel.vger.linux-kernel,org.kernel.vger.linux-renesas-soc |
|---|---|
| Message-ID | <[email protected]> |
Hi Tommaso, On 8/19/26 12:28, Tommaso Merciai wrote: > Add v4l2_fill_pixfmt_aligned(), a variant of v4l2_fill_pixfmt() > that accepts a stride_alignment parameter, mirroring the existing > v4l2_fill_pixfmt_mp() / v4l2_fill_pixfmt_mp_aligned() pair. > > v4l2_fill_pixfmt() is refactored to call v4l2_fill_pixfmt_aligned() > with stride_alignment=1, preserving its existing behaviour. > > The new helper is needed by drivers whose DMA engine requires the > line stride to be a multiple of a specific value, such as the > Renesas RZ/G3E CRU which requires 128-byte alignment. > > Reviewed-by: Jacopo Mondi <[email protected]> > Signed-off-by: Tommaso Merciai <[email protected]> > --- > v5->v6: > - No changes. > > v4->v5: > - No changes. > > v3->v4: > - Collected tag. > - Removed "." at the end of the function's brief description > - Removed "component" from @pixfmt->sizeimage line > - Removed wrong tab > - Fixed example (e.g NV12) -> (e.g. YUV420) into function description > > v2->v3: > - No changes, just moved to from PATCH 3/4 to PATCH 2/4 > > v1->v2: > - Move v4l2_fill_pixfmt() into v4l2-common.h as inline wrapper > - Add v4l2_fill_pixfmt_aligned() helper documentation. > > drivers/media/v4l2-core/v4l2-common.c | 12 +++++---- > include/media/v4l2-common.h | 38 +++++++++++++++++++++++++-- > 2 files changed, 43 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c > index 54995ba8c20d..2ce4f1c20fbc 100644 > --- a/drivers/media/v4l2-core/v4l2-common.c > +++ b/drivers/media/v4l2-core/v4l2-common.c > @@ -537,8 +537,8 @@ int v4l2_fill_pixfmt_mp_aligned(struct v4l2_pix_format_mplane *pixfmt, > } > EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt_mp_aligned); > > -int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > - u32 width, u32 height) > +int v4l2_fill_pixfmt_aligned(struct v4l2_pix_format *pixfmt, u32 pixelformat, > + u32 width, u32 height, u8 stride_alignment) > { > const struct v4l2_format_info *info; > int i; > @@ -554,15 +554,17 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > pixfmt->width = width; > pixfmt->height = height; > pixfmt->pixelformat = pixelformat; > - pixfmt->bytesperline = v4l2_format_plane_stride(info, 0, width, 1); > + pixfmt->bytesperline = v4l2_format_plane_stride(info, 0, width, > + stride_alignment); > pixfmt->sizeimage = 0; > > for (i = 0; i < info->comp_planes; i++) > pixfmt->sizeimage += > - v4l2_format_plane_size(info, i, width, height, 1); > + v4l2_format_plane_size(info, i, width, height, > + stride_alignment); > return 0; > } > -EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt); > +EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt_aligned); > > #ifdef CONFIG_MEDIA_CONTROLLER > static s64 v4l2_get_link_freq_ctrl(struct v4l2_ctrl_handler *handler, > diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h > index 749fe38c134e..4e5c5ffaf651 100644 > --- a/include/media/v4l2-common.h > +++ b/include/media/v4l2-common.h > @@ -554,8 +554,42 @@ static inline bool v4l2_is_format_bayer(const struct v4l2_format_info *f) > const struct v4l2_format_info *v4l2_format_info(u32 format); > void v4l2_apply_frmsize_constraints(u32 *width, u32 *height, > const struct v4l2_frmsize_stepwise *frmsize); > -int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > - u32 width, u32 height); > + > +/** > + * v4l2_fill_pixfmt_aligned - Fill in a &struct v4l2_pix_format with stride > + * alignment requirements > + * > + * @pixfmt: pointer to the &struct v4l2_pix_format to be filled > + * @pixelformat: the V4L2 pixel format (V4L2_PIX_FMT_*) > + * @width: image width in pixels > + * @height: image height in pixels > + * @stride_alignment: stride alignment in bytes, must be a power of 2 > + * > + * Fills all fields of @pixfmt for the given pixel format, dimensions, and > + * stride alignment. Only formats stored in a single memory plane are > + * supported; returns -EINVAL for multi-memory-plane formats. > + * > + * @pixfmt->bytesperline is set to the stride of the primary (plane 0) plane, > + * rounded up to a multiple of @stride_alignment. For formats that store > + * multiple component planes in a single memory buffer (e.g. YUV420), the > + * alignment applied to each component plane's stride is scaled relative to > + * @stride_alignment so that the chroma stride remains consistently derivable > + * from the luma stride. @pixfmt->bytesperline therefore reflects only the > + * primary plane stride. > + * > + * @pixfmt->sizeimage is set to the total size in bytes of all planes. Out of interest: Why is this description different from the _mp description for a single memory plane (e.g. not equal with the exception of pixfmt->bytesperline vs plane_fmt[0].bytesperline)? Just had to look, if both describe the same behavior. Personally I also prefer the _mp description, as it's a bit shorter and better conveys the intention of only using a multiple of the stride_alignment to fulfill the luma stride derivation. Also on my first reading I've thought of "rounded up to a multiple of @stride_alignment" just meaning "rounded up to @stride_alignment", as rounding up means setting the bytesperline to the next multiple of stride_alignment. But given that both descriptions describe the same behavior (and I think I've also partially wrote the mp description, therefore being biased towards it), feel free to keep it as is and add my Reviewed-by: Sven Püschel <[email protected]> > + * > + * Return: 0 on success, -EINVAL if @pixelformat is unknown or uses multiple > + * memory planes. > + */ > +int v4l2_fill_pixfmt_aligned(struct v4l2_pix_format *pixfmt, u32 pixelformat, > + u32 width, u32 height, u8 stride_alignment); > + > +static inline int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, > + u32 pixelformat, u32 width, u32 height) > +{ > + return v4l2_fill_pixfmt_aligned(pixfmt, pixelformat, width, height, 1); > +} > > /* @stride_alignment is a power of 2 value in bytes */ > int v4l2_fill_pixfmt_mp_aligned(struct v4l2_pix_format_mplane *pixfmt,