From: "Heiko Stübner" <heiko@sntech.de>
To: mchehab@kernel.org, robh@kernel.org, krzk+dt@kernel.org,
conor+dt@kernel.org, nicolas.dufresne@collabora.com,
Jiaxing Hu <gahing@gahingwoo.com>
Cc: ezequiel@vanguardiasur.com.ar, linux-media@vger.kernel.org,
devicetree@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Jiaxing Hu <gahing@gahingwoo.com>
Subject: Re: [RFC PATCH 2/3] media: rockchip: add VEPU510 H.264 encoder driver for RK3576
Date: Wed, 22 Jul 2026 12:00:16 +0200 [thread overview]
Message-ID: <3096814.BaHzMo0RvP@diego> (raw)
In-Reply-To: <20260722073417.2064667-3-gahing@gahingwoo.com>
Am Mittwoch, 22. Juli 2026, 09:34:16 Mitteleuropäische Sommerzeit schrieb Jiaxing Hu:
> Add a from-scratch stateful V4L2 mem2mem driver for the Rockchip RK3576
> VEPU510 H.264 hardware video encoder (raw NV12 in, H.264 Annex-B out),
> modelled on the verisilicon/hantro device_run()/codec_ops split rather
> than the downstream MPP-service/task-queue model.
>
> The two encoder cores (rkvenc0/rkvenc1) are exposed as two independent
> V4L2 M2M device nodes, each driving one physical core standalone; the
> downstream vendor CCU cross-core load-balancing is not implemented.
>
> Register field semantics were worked out by trial-and-error against
> Rockchip's own open-source userspace codec library (rockchip-linux/mpp)
> and cross-checked against a real register-write trace of the downstream
> vendor stack running the same encode.
>
> Intra (I-frame) encoding is confirmed working on real hardware (Radxa
> ROCK 4D): it produces valid H.264 that the reference decoders accept.
> Inter (P-frame) encoding still hits a hardware-watchdog stall in the
> reference-read datapath -- this is the main open question for this RFC;
> see the cover letter for the full symptom analysis.
>
> Signed-off-by: Jiaxing Hu <gahing@gahingwoo.com>
[...]
> diff --git a/drivers/media/platform/rockchip/rkvenc/rkvenc.c b/drivers/media/platform/rockchip/rkvenc/rkvenc.c
> new file mode 100644
> index 000000000..d70bcc5fb
> --- /dev/null
> +++ b/drivers/media/platform/rockchip/rkvenc/rkvenc.c
> @@ -0,0 +1,892 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Rockchip VEPU510 (RK3576) hardware video encoder driver.
> + *
> + * Copyright (C) 2026 Jiaxing Hu <gahing@gahingwoo.com>
> + *
> + * Architecture notes (see also rkvenc-regs.h):
> + *
> + * - This is a *stateful* V4L2 mem2mem encoder (raw NV12 in on OUTPUT,
> + * H.264 Annex-B out on CAPTURE) modelled on
> + * drivers/media/platform/verisilicon's hantro_drv.c device_run()/
> + * codec_ops{run,done} split, NOT on rkvdec's stateless request-API
> + * decoder pattern — an encoder has no per-frame bitstream to parse,
> + * so there is nothing analogous to rkvdec_run_preamble/postamble here.
> + *
> + * - The vendor downstream driver (rockchip-linux/kernel,
> + * drivers/video/rockchip/mpp/mpp_rkvenc2.c) groups rkvenc0/rkvenc1
> + * under a "CCU" (rockchip,rkv-encoder-rk3576-ccu) that does pure
> + * software task-queue load balancing across both cores, plus an
> + * optional DCHS (dual-core-handshake) register protocol used only
> + * when *deliberately* splitting one frame's rows across both cores.
> + * There is no hardware descriptor/link-list engine behind it (unlike
> + * the decoder's CCU). v1 of this driver does not implement either:
> + * rkvenc0 and rkvenc1 are exposed as two independent V4L2 M2M device
> + * nodes, each driving one physical core standalone — the same
> + * simplification rkvdec itself makes for multi-core VDPU hardware
> + * (see rkvdec_disable_multicore()).
At least the comment and from a casual look also the code get this
backwards. The idea is to explicitly _not_ expose multiple video devices.
See
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/platform/rockchip/rkvdec/rkvdec.c#n1613
Any (future) scheduling should happen inside the driver, and not get
offloaded onto _every_ userspace application individually.
Heiko
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: "Heiko Stübner" <heiko@sntech.de>
To: mchehab@kernel.org, robh@kernel.org, krzk+dt@kernel.org,
conor+dt@kernel.org, nicolas.dufresne@collabora.com,
Jiaxing Hu <gahing@gahingwoo.com>
Cc: ezequiel@vanguardiasur.com.ar, linux-media@vger.kernel.org,
devicetree@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Jiaxing Hu <gahing@gahingwoo.com>
Subject: Re: [RFC PATCH 2/3] media: rockchip: add VEPU510 H.264 encoder driver for RK3576
Date: Wed, 22 Jul 2026 12:00:16 +0200 [thread overview]
Message-ID: <3096814.BaHzMo0RvP@diego> (raw)
In-Reply-To: <20260722073417.2064667-3-gahing@gahingwoo.com>
Am Mittwoch, 22. Juli 2026, 09:34:16 Mitteleuropäische Sommerzeit schrieb Jiaxing Hu:
> Add a from-scratch stateful V4L2 mem2mem driver for the Rockchip RK3576
> VEPU510 H.264 hardware video encoder (raw NV12 in, H.264 Annex-B out),
> modelled on the verisilicon/hantro device_run()/codec_ops split rather
> than the downstream MPP-service/task-queue model.
>
> The two encoder cores (rkvenc0/rkvenc1) are exposed as two independent
> V4L2 M2M device nodes, each driving one physical core standalone; the
> downstream vendor CCU cross-core load-balancing is not implemented.
>
> Register field semantics were worked out by trial-and-error against
> Rockchip's own open-source userspace codec library (rockchip-linux/mpp)
> and cross-checked against a real register-write trace of the downstream
> vendor stack running the same encode.
>
> Intra (I-frame) encoding is confirmed working on real hardware (Radxa
> ROCK 4D): it produces valid H.264 that the reference decoders accept.
> Inter (P-frame) encoding still hits a hardware-watchdog stall in the
> reference-read datapath -- this is the main open question for this RFC;
> see the cover letter for the full symptom analysis.
>
> Signed-off-by: Jiaxing Hu <gahing@gahingwoo.com>
[...]
> diff --git a/drivers/media/platform/rockchip/rkvenc/rkvenc.c b/drivers/media/platform/rockchip/rkvenc/rkvenc.c
> new file mode 100644
> index 000000000..d70bcc5fb
> --- /dev/null
> +++ b/drivers/media/platform/rockchip/rkvenc/rkvenc.c
> @@ -0,0 +1,892 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Rockchip VEPU510 (RK3576) hardware video encoder driver.
> + *
> + * Copyright (C) 2026 Jiaxing Hu <gahing@gahingwoo.com>
> + *
> + * Architecture notes (see also rkvenc-regs.h):
> + *
> + * - This is a *stateful* V4L2 mem2mem encoder (raw NV12 in on OUTPUT,
> + * H.264 Annex-B out on CAPTURE) modelled on
> + * drivers/media/platform/verisilicon's hantro_drv.c device_run()/
> + * codec_ops{run,done} split, NOT on rkvdec's stateless request-API
> + * decoder pattern — an encoder has no per-frame bitstream to parse,
> + * so there is nothing analogous to rkvdec_run_preamble/postamble here.
> + *
> + * - The vendor downstream driver (rockchip-linux/kernel,
> + * drivers/video/rockchip/mpp/mpp_rkvenc2.c) groups rkvenc0/rkvenc1
> + * under a "CCU" (rockchip,rkv-encoder-rk3576-ccu) that does pure
> + * software task-queue load balancing across both cores, plus an
> + * optional DCHS (dual-core-handshake) register protocol used only
> + * when *deliberately* splitting one frame's rows across both cores.
> + * There is no hardware descriptor/link-list engine behind it (unlike
> + * the decoder's CCU). v1 of this driver does not implement either:
> + * rkvenc0 and rkvenc1 are exposed as two independent V4L2 M2M device
> + * nodes, each driving one physical core standalone — the same
> + * simplification rkvdec itself makes for multi-core VDPU hardware
> + * (see rkvdec_disable_multicore()).
At least the comment and from a casual look also the code get this
backwards. The idea is to explicitly _not_ expose multiple video devices.
See
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/platform/rockchip/rkvdec/rkvdec.c#n1613
Any (future) scheduling should happen inside the driver, and not get
offloaded onto _every_ userspace application individually.
Heiko
next prev parent reply other threads:[~2026-07-22 10:00 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 7:34 [RFC PATCH 0/3] media: rockchip: VEPU510 H.264 encoder for RK3576 Jiaxing Hu
2026-07-22 7:34 ` Jiaxing Hu
2026-07-22 7:34 ` [RFC PATCH 1/3] dt-bindings: media: add Rockchip RK3576 VEPU H.264 encoder Jiaxing Hu
2026-07-22 7:34 ` Jiaxing Hu
2026-07-22 7:34 ` [RFC PATCH 2/3] media: rockchip: add VEPU510 H.264 encoder driver for RK3576 Jiaxing Hu
2026-07-22 7:34 ` Jiaxing Hu
2026-07-22 7:47 ` sashiko-bot
2026-07-22 10:00 ` Heiko Stübner [this message]
2026-07-22 10:00 ` Heiko Stübner
2026-07-22 7:34 ` [RFC PATCH 3/3] arm64: dts: rockchip: rk3576: add VEPU H.264 encoder nodes Jiaxing Hu
2026-07-22 7:34 ` Jiaxing Hu
2026-07-22 7:43 ` sashiko-bot
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=3096814.BaHzMo0RvP@diego \
--to=heiko@sntech.de \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=ezequiel@vanguardiasur.com.ar \
--cc=gahing@gahingwoo.com \
--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=nicolas.dufresne@collabora.com \
--cc=robh@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.