Am Freitag, 21. Juli 2023, 00:25:43 CEST schrieb Fabio Estevam: > From: Fabio Estevam <festevam@xxxxxxx> > > v4l_bound_align_image() aligns to a multiple power of 2 of walign, but the > result only needs to be a multiple of walign. > > This causes a 640x480 sensor that used to report: > > Width/Height : 640/480 > > to incorrectly report: > > Width/Height : 768/480 > > Fix this problem by doing the correct alignment via clamp_roundup(). > > Reported-by: Tim Harvey <tharvey@xxxxxxxxxxxxx> > Fixes: 6f482c4729d9 ("media: imx: imx7-media-csi: Get rid of superfluous > call to imx7_csi_mbus_fmt_to_pix_fmt") Co-developed-by: Alexander Stein > <alexander.stein@xxxxxxxxxxxxxxx> Signed-off-by: Alexander Stein > <alexander.stein@xxxxxxxxxxxxxxx> > Signed-off-by: Fabio Estevam <festevam@xxxxxxx> > --- > Changes since v1: > - Export clamp_roundup(). > > drivers/media/platform/nxp/imx7-media-csi.c | 4 ++-- > drivers/media/v4l2-core/v4l2-common.c | 5 +++-- > include/media/v4l2-common.h | 2 ++ > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/platform/nxp/imx7-media-csi.c > b/drivers/media/platform/nxp/imx7-media-csi.c index > 0bd2613b9320..f3c506fc19c4 100644 > --- a/drivers/media/platform/nxp/imx7-media-csi.c > +++ b/drivers/media/platform/nxp/imx7-media-csi.c > @@ -1137,8 +1137,8 @@ __imx7_csi_video_try_fmt(struct v4l2_pix_format > *pixfmt, * TODO: Implement configurable stride support. > */ > walign = 8 * 8 / cc->bpp; > - v4l_bound_align_image(&pixfmt->width, 1, 0xffff, walign, > - &pixfmt->height, 1, 0xffff, 1, 0); > + pixfmt->width = clamp_roundup(pixfmt->width, 1, 0xffff, walign); > + pixfmt->height = clamp_roundup(pixfmt->height, 1, 0xffff, 1); > > pixfmt->bytesperline = pixfmt->width * cc->bpp / 8; > pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height; > diff --git a/drivers/media/v4l2-core/v4l2-common.c > b/drivers/media/v4l2-core/v4l2-common.c index bee1535b04d3..3e8c16bcb0f6 > 100644 > --- a/drivers/media/v4l2-core/v4l2-common.c > +++ b/drivers/media/v4l2-core/v4l2-common.c > @@ -106,8 +106,8 @@ static unsigned int clamp_align(unsigned int x, unsigned > int min, return x; > } > > -static unsigned int clamp_roundup(unsigned int x, unsigned int min, > - unsigned int max, unsigned int alignment) > +unsigned int clamp_roundup(unsigned int x, unsigned int min, > + unsigned int max, unsigned int alignment) > { > x = clamp(x, min, max); > if (alignment) > @@ -115,6 +115,7 @@ static unsigned int clamp_roundup(unsigned int x, > unsigned int min, > > return x; > } > +EXPORT_SYMBOL(clamp_roundup); > > void v4l_bound_align_image(u32 *w, unsigned int wmin, unsigned int wmax, > unsigned int walign, > diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h > index d278836fd9cb..7059b99f4afa 100644 > --- a/include/media/v4l2-common.h > +++ b/include/media/v4l2-common.h > @@ -521,6 +521,8 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 > pixelformat, u32 width, u32 height); > int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 > pixelformat, u32 width, u32 height); > +unsigned int clamp_roundup(unsigned int x, unsigned int min, > + unsigned int max, unsigned int alignment); > > /** > * v4l2_get_link_freq - Get link rate from transmitter I expect this to work, but I'm not so sure about exporting clamp_roundup(). I would rather use v4l2_apply_frmsize_constraints() instead, but this requires additional work, refer to the TODO in imx7_csi_video_enum_framesizes(). See also my first (broken) try in [1]. As a short term fix, using clamp_roundup() is okay to me. But I'm thinking about using a copy of clamp_roundup() as in v1 instead,so to avoid an eventual unexport of clamp_roundup in the future. Maybe this concern doesn't matter, I guess the maintainers can tell. Best regards, Alexander [1] https://lore.kernel.org/linux-media/202307210050.s7hfCvwG-lkp@xxxxxxxxx/T/ #ma88811098cb96f3698a8248d903f0c3455febec7 -- TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany Amtsgericht München, HRB 105018 Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider http://www.tq-group.com/