Linux-ARM-Kernel Archive on lore.kernel.org
 help / color / mirror / Atom feed
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: Fri, 08 May 2026 18:11:31 -0400	[thread overview]
Message-ID: <ebe5cd6689923eb1e2124e177f694895383fba54.camel@ndufresne.ca> (raw)
In-Reply-To: <20260428-spu-rga3-v5-16-eb7f5d019d86@pengutronix.de>

[-- Attachment #1: Type: text/plain, Size: 5024 bytes --]

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.

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.

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 --]

  reply	other threads:[~2026-05-08 23:15 UTC|newest]

Thread overview: 35+ 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-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-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 [this message]
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-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=ebe5cd6689923eb1e2124e177f694895383fba54.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