]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: qcom: camss: Use proper BPL alignment helper and non-power-of-two rounding
authorLoic Poulain <loic.poulain@oss.qualcomm.com>
Fri, 13 Mar 2026 19:51:51 +0000 (20:51 +0100)
committerBryan O'Donoghue <bod@kernel.org>
Fri, 8 May 2026 23:22:59 +0000 (00:22 +0100)
Bytes-per-line (BPL) alignment in CAMSS currently uses ALIGN(), which
only works correctly for power-of-two values. Some RAW Bayer packing
formats (e.g. RAW10/12/14) require non-power-of-two alignment such as
3, 5, or 7-byte multiples, so ALIGN() produces incorrect results.

Introduce the use of roundup() with the per-format alignment returned by
camss_format_get_bpl_alignment() when no hardware alignment is enforced
(video->bpl_alignment).

Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
drivers/media/platform/qcom/camss/camss-video.c

index f52d8e84f970d2ea5550a3a9160e90c58da49e01..0852eb6f13154cfae7147ce39d22de64d14a5cba 100644 (file)
@@ -47,6 +47,9 @@ static int video_mbus_to_pix_mp(const struct v4l2_mbus_framefmt *mbus,
        unsigned int i;
        u32 bytesperline;
 
+       if (!alignment)
+               alignment = camss_format_get_bpl_alignment(f);
+
        memset(pix, 0, sizeof(*pix));
        v4l2_fill_pix_format_mplane(pix, mbus);
        pix->pixelformat = f->pixelformat;
@@ -54,7 +57,7 @@ static int video_mbus_to_pix_mp(const struct v4l2_mbus_framefmt *mbus,
        for (i = 0; i < pix->num_planes; i++) {
                bytesperline = pix->width / f->hsub[i].numerator *
                        f->hsub[i].denominator * f->bpp[i] / 8;
-               bytesperline = ALIGN(bytesperline, alignment);
+               bytesperline = roundup(bytesperline, alignment);
                pix->plane_fmt[i].bytesperline = bytesperline;
                pix->plane_fmt[i].sizeimage = pix->height /
                                f->vsub[i].numerator * f->vsub[i].denominator *
@@ -459,6 +462,7 @@ static int video_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
 
 static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
 {
+       unsigned int alignment = video->bpl_alignment;
        struct v4l2_pix_format_mplane *pix_mp;
        const struct camss_format_info *fi;
        struct v4l2_plane_pix_format *p;
@@ -491,6 +495,9 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
        width = pix_mp->width;
        height = pix_mp->height;
 
+       if (!alignment)
+               alignment = camss_format_get_bpl_alignment(fi);
+
        memset(pix_mp, 0, sizeof(*pix_mp));
 
        pix_mp->pixelformat = fi->pixelformat;
@@ -500,7 +507,7 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
        for (i = 0; i < pix_mp->num_planes; i++) {
                bpl = pix_mp->width / fi->hsub[i].numerator *
                        fi->hsub[i].denominator * fi->bpp[i] / 8;
-               bpl = ALIGN(bpl, video->bpl_alignment);
+               bpl = roundup(bpl, alignment);
                pix_mp->plane_fmt[i].bytesperline = bpl;
                pix_mp->plane_fmt[i].sizeimage = pix_mp->height /
                        fi->vsub[i].numerator * fi->vsub[i].denominator * bpl;
@@ -525,7 +532,7 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
                        lines = p->sizeimage / p->bytesperline;
 
                        if (p->bytesperline < bytesperline[i])
-                               p->bytesperline = ALIGN(bytesperline[i], 8);
+                               p->bytesperline = roundup(bytesperline[i], alignment);
 
                        if (p->sizeimage < p->bytesperline * lines)
                                p->sizeimage = p->bytesperline * lines;