On Thu May 21 00:44:17 2026 +0200, Sven Püschel wrote:
> Avoid odd frame sizes for YUV formats, as they may cause undefined
> behavior. This is done in preparation for the RGA3, which hangs when the
> output format is set to 129x129 pixel YUV420 SP (NV12).
> 
> This requirement is documented explicitly for the RGA3 in  section 5.6.3
> of the RK3588 TRM Part 2. For the RGA2 the RK3588 TRM Part 2
> (section 6.1.2) and RK3568 TRM Part 2 (section 14.2) only mentions the
> x/y offsets and stride aligning requirements. But the vendor driver for
> the RGA2 also contains checks for the width and height to be aligned to
> 2 bytes.
> 
> Reviewed-by: Nicolas Dufresne <[email protected]>
> Signed-off-by: Sven Püschel <[email protected]>
> Signed-off-by: Nicolas Dufresne <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/platform/rockchip/rga/rga.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

---

diff --git a/drivers/media/platform/rockchip/rga/rga.c 
b/drivers/media/platform/rockchip/rga/rga.c
index f599c992829d..77b8c7ab7427 100644
--- a/drivers/media/platform/rockchip/rga/rga.c
+++ b/drivers/media/platform/rockchip/rga/rga.c
@@ -337,6 +337,19 @@ static int vidioc_try_fmt(struct file *file, void *priv, 
struct v4l2_format *f)
        struct rga_ctx *ctx = file_to_rga_ctx(file);
        const struct rga_hw *hw = ctx->rga->hw;
        struct rga_fmt *fmt;
+       struct v4l2_frmsize_stepwise frmsize = {
+               .min_width = hw->min_width,
+               .max_width = hw->max_width,
+               .min_height = hw->min_height,
+               .max_height = hw->max_height,
+               .step_width = 1,
+               .step_height = 1,
+       };
+
+       if (v4l2_is_format_yuv(v4l2_format_info(pix_fmt->pixelformat))) {
+               frmsize.step_width = 2;
+               frmsize.step_height = 2;
+       }
 
        if (V4L2_TYPE_IS_CAPTURE(f->type)) {
                const struct rga_frame *frm;
@@ -358,11 +371,7 @@ static int vidioc_try_fmt(struct file *file, void *priv, 
struct v4l2_format *f)
        if (!fmt)
                fmt = &hw->formats[0];
 
-       pix_fmt->width = clamp(pix_fmt->width,
-                              hw->min_width, hw->max_width);
-       pix_fmt->height = clamp(pix_fmt->height,
-                               hw->min_height, hw->max_height);
-
+       v4l2_apply_frmsize_constraints(&pix_fmt->width, &pix_fmt->height, 
&frmsize);
        v4l2_fill_pixfmt_mp(pix_fmt, fmt->fourcc, pix_fmt->width, 
pix_fmt->height);
        pix_fmt->field = V4L2_FIELD_NONE;
 
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to