From: Nicolas Dufresne <nicolas@ndufresne.ca>
To: "Sven Püschel" <s.pueschel@pengutronix.de>,
"Jacob Chen" <jacob-chen@iotwrt.com>,
"Ezequiel Garcia" <ezequiel@vanguardiasur.com.ar>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Heiko Stuebner" <heiko@sntech.de>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Hans Verkuil" <hverkuil@kernel.org>
Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
kernel@pengutronix.de, sebastian.reichel@collabora.com
Subject: Re: [PATCH v5 16/29] media: rockchip: rga: split flip and rotate into separate function
Date: Tue, 12 May 2026 10:15:30 -0400 [thread overview]
Message-ID: <30f56a0ac9f724b5ec1b936eec7b5b7c5e751c75.camel@ndufresne.ca> (raw)
In-Reply-To: <1f447423-8c63-4545-a4f7-d8d5ef821255@pengutronix.de>
[-- Attachment #1: Type: text/plain, Size: 7379 bytes --]
Le mardi 12 mai 2026 à 16:08 +0200, Sven Püschel a écrit :
> Hi Nicolas,
>
> On 5/9/26 12:11 AM, Nicolas Dufresne wrote:
> > Le mardi 28 avril 2026 à 11:00 +0200, Sven Püschel a écrit :
> > > Split the flip and rotate command configuration into a separate
> > > function in preparation of filling the command stream at streamon.
> > > As the userspace can change the flipping and rotation controls while
> > > streaming, we have to update them with each new frame to prevent the
> > > user being unable to change them while streaming.
> > >
> > > Signed-off-by: Sven Püschel <s.pueschel@pengutronix.de>
> > For code point of view, everything seems fine, but the commit message leave me a
> > bit wondering. Any rotation that isn't 180 degree will cause the width and
> > height to be reversed, and a new stride is needed to present the buffer
> > correctly. Meaning the capture format can be affected by this change.
>
> Sorry for missing to properly communicate my intention with this patch.
>
> I've stumbled over the RGA pulling a spin lock on the controls, when
> starting the next job [1]. This made me realize that the driver allows
> changing the controls while streaming, which my change to move the
> command buffer setup to streamon breaks (as a potential rotation isn't
> updated until the next streamon).
>
> This commit is the result of trying to not break the old behavior by
> moving the relevant code parts to be run on every frame instead of being
> only run at streamon. I didn't think about the 90 degree rotation
> problems, which are also present in the current RGA state.
>
> sashiko.dev also pointed out that my simple code move didn't work for
> the mirroring case [2], as the relevant command buffer is ore'd with the
> mirroring flags. Also I've noticed that the rotation mode affects the
> scaling factor. To avoid these footguns, I've got the idea to set a flag
> to raise when the controls change. Then I can fully re-initialize the
> command buffer on the next frame and fully avoid these kind of problems.
Thanks for the update, thanks for looking into that.
>
>
> [1]
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/platform/rockchip/rga/rga.c?id=50897c955902c93ae71c38698abb910525ebdc89#n41
>
> [2]
> https://sashiko.dev/#/patchset/20260428-spu-rga3-v5-0-eb7f5d019d86%40pengutronix.de?part=16
>
> >
> > To stick with the spec, the capture format needs to be updated, and it needs to
> > happen in a way user can be able to read it back for the correct frame if
> > userspace make use of the queues. I see 3 options, let me know what you think,
> > or what is later implemented if you already thought about that.
> >
> > 1. Synchronously update the capture format width/height, document in the
> > respective control this behaviour, leaving to userspace to remember which frames
> > the change will apply to.
> >
> > This works nicely for this type of HW, but would be a bit complicated for a
> > deinterlacer, since the buffering might be HW specific. It also make usage of
> > queues harder, less independent.
> >
> > 2. Force a drain/stop/start for any 90 degree rotation
> >
> > This might impose a longer idle time for the converter core, and is kind of
> > opposite of your commit message. But requires no spec work.
> >
> > 3. Emit SRC_CH, implement the drain procedure typical to decoder resolution
> > change.
> >
> > Typically it means userspace can keep buffering on the OUTPUT queue, and once
> > the LAST buffer is met, it can simply read the new format (and new stride, since
> > due to alignment, this might be hardware specific) and toggle streamoff/on only
> > on capture queue to reactivate the processing.
> >
> > The 3. is more complex for the driver, but its a proven race-free method for
> > decoders already. 2 would be statusquo to get this series in, and we could post-
> > poned more advance work for seamless 90degree rorations. 1., I don't really like
> > that solution, it not quite generic enough.
>
> I'll go with option 2 for now to keep it simple and improve the status
> quo a bit.
Works for me.
Nicolas
>
> Sincerely
> Sven
>
> > feedback welcome,
> > Nicolas
> >
> > > ---
> > > drivers/media/platform/rockchip/rga/rga-hw.c | 57 +++++++++++++++++-----------
> > > 1 file changed, 34 insertions(+), 23 deletions(-)
> > >
> > > diff --git a/drivers/media/platform/rockchip/rga/rga-hw.c b/drivers/media/platform/rockchip/rga/rga-hw.c
> > > index dac3cb6aa17d3..6c1956b04f6ba 100644
> > > --- a/drivers/media/platform/rockchip/rga/rga-hw.c
> > > +++ b/drivers/media/platform/rockchip/rga/rga-hw.c
> > > @@ -156,7 +156,38 @@ static void rga_cmd_set_dst_addr(struct rga_ctx *ctx, dma_addr_t dma_addr)
> > > dest[reg >> 2] |= 0x7 << 8;
> > > }
> > >
> > > -static void rga_cmd_set_trans_info(struct rga_ctx *ctx)
> > > +static void rga_cmd_set_flip_rotate_info(struct rga_ctx *ctx)
> > > +{
> > > + u32 *dest = ctx->cmdbuf_virt;
> > > + union rga_src_info src_info;
> > > +
> > > + src_info.val = dest[(RGA_SRC_INFO - RGA_MODE_BASE_REG) >> 2];
> > > +
> > > + if (ctx->vflip)
> > > + src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_X;
> > > +
> > > + if (ctx->hflip)
> > > + src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_Y;
> > > +
> > > + switch (ctx->rotate) {
> > > + case 90:
> > > + src_info.data.rot_mode = RGA_SRC_ROT_MODE_90_DEGREE;
> > > + break;
> > > + case 180:
> > > + src_info.data.rot_mode = RGA_SRC_ROT_MODE_180_DEGREE;
> > > + break;
> > > + case 270:
> > > + src_info.data.rot_mode = RGA_SRC_ROT_MODE_270_DEGREE;
> > > + break;
> > > + default:
> > > + src_info.data.rot_mode = RGA_SRC_ROT_MODE_0_DEGREE;
> > > + break;
> > > + }
> > > +
> > > + dest[(RGA_SRC_INFO - RGA_MODE_BASE_REG) >> 2] = src_info.val;
> > > +}
> > > +
> > > +static void rga_cmd_set_format_scale_info(struct rga_ctx *ctx)
> > > {
> > > struct rockchip_rga *rga = ctx->rga;
> > > u32 *dest = ctx->cmdbuf_virt;
> > > @@ -219,27 +250,6 @@ static void rga_cmd_set_trans_info(struct rga_ctx *ctx)
> > > }
> > > }
> > >
> > > - if (ctx->vflip)
> > > - src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_X;
> > > -
> > > - if (ctx->hflip)
> > > - src_info.data.mir_mode |= RGA_SRC_MIRR_MODE_Y;
> > > -
> > > - switch (ctx->rotate) {
> > > - case 90:
> > > - src_info.data.rot_mode = RGA_SRC_ROT_MODE_90_DEGREE;
> > > - break;
> > > - case 180:
> > > - src_info.data.rot_mode = RGA_SRC_ROT_MODE_180_DEGREE;
> > > - break;
> > > - case 270:
> > > - src_info.data.rot_mode = RGA_SRC_ROT_MODE_270_DEGREE;
> > > - break;
> > > - default:
> > > - src_info.data.rot_mode = RGA_SRC_ROT_MODE_0_DEGREE;
> > > - break;
> > > - }
> > > -
> > > /*
> > > * Calculate the up/down scaling mode/factor.
> > > *
> > > @@ -431,7 +441,8 @@ static void rga_cmd_set(struct rga_ctx *ctx,
> > >
> > > rga_cmd_set_src_info(ctx, &src->offset);
> > > rga_cmd_set_dst_info(ctx, &dst->offset);
> > > - rga_cmd_set_trans_info(ctx);
> > > + rga_cmd_set_format_scale_info(ctx);
> > > + rga_cmd_set_flip_rotate_info(ctx);
> > >
> > > rga_write(rga, RGA_CMD_BASE, ctx->cmdbuf_phy);
> > >
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2026-05-12 14:15 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-28 9:00 [PATCH v5 00/29] media: platform: rga: Add RGA3 support Sven Püschel
2026-04-28 9:00 ` [PATCH v5 01/29] media: dt-bindings: media: rockchip-rga: add rockchip,rk3588-rga3 Sven Püschel
2026-04-28 9:00 ` [PATCH v5 02/29] media: v4l2-common: sort RGB formats in v4l2_format_info Sven Püschel
2026-04-28 9:00 ` [PATCH v5 03/29] media: v4l2-common: add missing 1 and 2 byte RGB formats to v4l2_format_info Sven Püschel
2026-04-28 9:00 ` [PATCH v5 04/29] media: v4l2-common: add has_alpha " Sven Püschel
2026-04-28 9:00 ` [PATCH v5 05/29] media: v4l2-common: add v4l2_fill_pixfmt_mp_aligned helper Sven Püschel
2026-05-08 21:09 ` Nicolas Dufresne
2026-04-28 9:00 ` [PATCH v5 06/29] media: rockchip: rga: fix too small buffer size Sven Püschel
2026-05-08 21:11 ` Nicolas Dufresne
2026-05-12 14:14 ` Sven Püschel
2026-04-28 9:00 ` [PATCH v5 07/29] media: rockchip: rga: use clk_bulk api Sven Püschel
2026-04-28 9:00 ` [PATCH v5 08/29] media: rockchip: rga: use stride for offset calculation Sven Püschel
2026-04-28 9:00 ` [PATCH v5 09/29] media: rockchip: rga: remove redundant rga_frame variables Sven Püschel
2026-04-28 9:00 ` [PATCH v5 10/29] media: rockchip: rga: announce and sync colorimetry Sven Püschel
2026-04-28 9:00 ` [PATCH v5 11/29] media: rockchip: rga: move hw specific parts to a dedicated struct Sven Püschel
2026-04-28 9:00 ` [PATCH v5 12/29] media: rockchip: rga: avoid odd frame sizes for YUV formats Sven Püschel
2026-05-08 21:18 ` Nicolas Dufresne
2026-05-12 14:56 ` Sven Püschel
2026-05-12 15:09 ` Nicolas Dufresne
2026-04-28 9:00 ` [PATCH v5 13/29] media: rockchip: rga: calculate x_div/y_div using v4l2_format_info Sven Püschel
2026-04-28 9:00 ` [PATCH v5 14/29] media: rockchip: rga: move cmdbuf to rga_ctx Sven Püschel
2026-04-28 9:00 ` [PATCH v5 15/29] media: rockchip: rga: align stride to 4 bytes Sven Püschel
2026-04-28 9:00 ` [PATCH v5 16/29] media: rockchip: rga: split flip and rotate into separate function Sven Püschel
2026-05-08 22:11 ` Nicolas Dufresne
2026-05-12 14:08 ` Sven Püschel
2026-05-12 14:15 ` Nicolas Dufresne [this message]
2026-05-13 14:29 ` Sven Püschel
2026-04-28 9:00 ` [PATCH v5 17/29] media: rockchip: rga: prepare cmdbuf on streamon Sven Püschel
2026-04-28 9:00 ` [PATCH v5 18/29] media: rockchip: rga: check scaling factor Sven Püschel
2026-05-08 23:11 ` Nicolas Dufresne
2026-05-13 9:09 ` Sven Püschel
2026-04-28 9:00 ` [PATCH v5 19/29] media: rockchip: rga: use card type to specify rga type Sven Püschel
2026-04-28 9:00 ` [PATCH v5 20/29] media: rockchip: rga: change offset to dma_addresses Sven Püschel
2026-04-28 9:00 ` [PATCH v5 21/29] media: rockchip: rga: support external iommus Sven Püschel
2026-04-28 9:00 ` [PATCH v5 22/29] media: rockchip: rga: share the interrupt when an external iommu is used Sven Püschel
2026-04-28 9:00 ` [PATCH v5 23/29] media: rockchip: rga: remove size from rga_frame Sven Püschel
2026-04-28 9:00 ` [PATCH v5 24/29] media: rockchip: rga: remove stride " Sven Püschel
2026-04-28 9:01 ` [PATCH v5 25/29] media: rockchip: rga: move rga_fmt to rga-hw.h Sven Püschel
2026-04-28 9:01 ` [PATCH v5 26/29] media: rockchip: rga: add feature flags Sven Püschel
2026-04-28 9:01 ` [PATCH v5 27/29] media: rockchip: rga: disable multi-core support Sven Püschel
2026-04-28 9:01 ` [PATCH v5 28/29] media: rockchip: rga: add rga3 support Sven Püschel
2026-04-28 9:01 ` [PATCH v5 29/29] arm64: dts: rockchip: add rga3 dt nodes Sven Püschel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=30f56a0ac9f724b5ec1b936eec7b5b7c5e751c75.camel@ndufresne.ca \
--to=nicolas@ndufresne.ca \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=ezequiel@vanguardiasur.com.ar \
--cc=heiko@sntech.de \
--cc=hverkuil@kernel.org \
--cc=jacob-chen@iotwrt.com \
--cc=kernel@pengutronix.de \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=mchehab@kernel.org \
--cc=robh@kernel.org \
--cc=s.pueschel@pengutronix.de \
--cc=sebastian.reichel@collabora.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox