[PATCH v4 0/6] media: rockchip: Add rkvdec2 driver

Detlev Casanova
2025-03-25T21:33:15Z

Add a rkvdec2 driver for newer video decoder found on rk3588 based SoC.

It is also found on other hardware like the RK356x, but not tested yet,
so it will be added later.

It only supports h264 format only for now, hevc will come later.
Yuv420 and yuv422 are both supported. 8 and 10 bits format are also
supported.
The NV15 and NV20 pixel formats are supported in v4l2 with the first
patch of this series. It has been picked up from [1].

The driver supports using the IOMMU through the rockchip IOMMU driver.
Because the IOMMU HW will be resetted in case of a decoding error, the
IOMMU mappings are rewritten on the HW by switching to an empty IOMMU
domain, then switching back to the default one.
This is one of the ways that has been recommended in [2].

[1]: https://lore.kernel.org/linux-media/20250225-rkvdec_h264_high10_and_422_support-v7-2-7992a68a4910@collabora.com/
[2]: https://lore.kernel.org/all/9bd56bd6-ce7d-495f-9bb3-ce7f07975f62@arm.com/

Changes since v3:
- Add IOMMU support
- Add 4:2:2 and 10 bits support
- Move cabac to v4l2 header
- Imported improvements from [1]
- Improve timeout value computation
- Improve clocks handling
- Always write scanlist buffer address in register
- Rebased on latest master

Changes since v2:
- doc: Disable resets and sram for other platforms, add maxItems for
clocks
- Fix h264 spec equation number in comment
- Remove superfluous status field in dtsi
- Add TODO item for IOMMU

Changes since v1:
- Add support for RCB in SRAM
- Move bindings to rockchip,vdec.yaml
- Add resets bindings
- Add second core and enable them from dtsi file
- Only expose one video device to userspace (but don't support multicore yet)
- Share CABAC table with rkvdec
- Fix iowrite32 call and add preliminary support for arm
- Remove unused code
- Improve registers naming and code style
- Remove DMA_ATTR_ALLOC_SINGLE_PAGES flag

Detlev Casanova (5):
media: v4l2-ctrls-core: Set frame_mbs_only_flag by default in h264 SPS
media: rockchip: Move H264 CABAC table to header file
media: rockchip: Introduce the rkvdec2 driver
media: dt-bindings: rockchip: Document RK3588 Video Decoder bindings
arm64: dts: rockchip: Add rkvdec2 Video Decoder on rk3588(s)

Jonas Karlman (1):
media: v4l2: Add NV15 and NV20 pixel formats

.../bindings/media/rockchip,vdec.yaml | 73 +-
.../media/v4l/pixfmt-yuv-planar.rst | 128 ++
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 74 +
drivers/media/platform/rockchip/Kconfig | 1 +
drivers/media/platform/rockchip/Makefile | 1 +
.../media/platform/rockchip/rkvdec2/Kconfig | 15 +
.../media/platform/rockchip/rkvdec2/Makefile | 3 +
.../platform/rockchip/rkvdec2/rkvdec2-h264.c | 778 +++++++++
.../platform/rockchip/rkvdec2/rkvdec2-regs.h | 347 ++++
.../media/platform/rockchip/rkvdec2/rkvdec2.c | 1424 +++++++++++++++++
.../media/platform/rockchip/rkvdec2/rkvdec2.h | 150 ++
drivers/media/v4l2-core/v4l2-common.c | 2 +
drivers/media/v4l2-core/v4l2-ctrls-core.c | 13 +
drivers/media/v4l2-core/v4l2-ioctl.c | 2 +
drivers/staging/media/rkvdec/rkvdec-h264.c | 500 +-----
include/media/v4l2-cabac/rkvdec-cabac.h | 509 ++++++
include/uapi/linux/videodev2.h | 2 +
17 files changed, 3522 insertions(+), 500 deletions(-)
create mode 100644 drivers/media/platform/rockchip/rkvdec2/Kconfig
create mode 100644 drivers/media/platform/rockchip/rkvdec2/Makefile
create mode 100644 drivers/media/platform/rockchip/rkvdec2/rkvdec2-h264.c
create mode 100644 drivers/media/platform/rockchip/rkvdec2/rkvdec2-regs.h
create mode 100644 drivers/media/platform/rockchip/rkvdec2/rkvdec2.c
create mode 100644 drivers/media/platform/rockchip/rkvdec2/rkvdec2.h
create mode 100644 include/media/v4l2-cabac/rkvdec-cabac.h

--
2.49.0