Hotdry.
systems

RK3588/RK3576 VPU 驱动上游:无状态解码模式、固件加载与多平面支持

嵌入式系统中 Rockchip RK3588/RK3576 VPU 主线驱动的无状态解码实现、固件加载机制及 AV1/H.265/VP9 多平面支持的工程参数与监控要点。

在嵌入式系统如单板计算机(SBC)中,视频解码性能直接影响多媒体应用的用户体验。Rockchip RK3588 和 RK3576 SoC 集成的 VPU(Video Processing Unit)硬件支持 AV1、H.265(HEVC)和 VP9 等现代编解码器,通过 Collabora 等团队的努力,这些驱动已逐步上游至 Linux 主线内核。这不仅避免了下游厂商树依赖,还提供了标准化 V4L2 接口,便于 FFmpeg 和 GStreamer 等工具链集成。本文聚焦单一技术点:无状态解码模式(stateless decode)、固件加载策略以及多平面格式支持,给出可直接落地的内核配置、DTS 参数和运行时监控清单。

无状态解码模式的工程优势与实现

传统状态解码依赖硬件内部维护 DPB(Decoded Picture Buffer)和参考帧列表,用户空间仅推送比特流。而无状态模式下,所有解码状态(如参考帧索引、运动矢量)由用户空间显式管理,通过 V4L2 stateless API(VIDIOC_REQBUFS 等 ioctl)传递。这在 RK3588/RK3576 VPU 上游驱动中是核心设计,避免了固件状态同步的复杂性,提高了多实例并行和错误恢复能力。

证据显示,Collabora 在 Linux 6.12 中上游了 VDPU121 解码器,支持 VP8、MPEG-2 和 H.264;6.17 时 rkvdec 驱动脱离 staging,支持 RK3588/RK3576 的 VDPU381/383 核心,实现 H.264/HEVC 高清解码。此外,Linux 6.5 已引入 Verisilicon 框架下的 vepu981 AV1 无状态解码器,专为 RK3588 AV1 核心优化。

落地参数:

  • 内核版本阈值:最低 6.12-rc1(VDPU121),推荐 6.17+(rkvdec 生产就绪)。
  • V4L2 设备节点/dev/videoX(X 为 10-20,根据 DTS 分配),用 v4l2-ctl --list-devices 确认 VPU 实例。
  • 用户空间示例(FFmpeg):
    ffmpeg -hwaccel drm -i input.mkv -c:v h264_v4l2m2m -f null /dev/null
    
    对于 AV1:-c:v av1_v4l2m2m(需 FFmpeg 7.0+ 支持 stateless)。
  • GStreamer pipeline
    gst-launch-1.0 v4l2src device=/dev/video10 ! v4l2slvideodec codec=h264 ! videoconvert ! autovideosink
    

监控要点:用 trace-cmd 捕获 v4l2 事件,阈值 FPS < 预期 80% 时检查 IOMMU 重置日志(dmesg | grep rkvdec)。

固件加载机制与优化

VPU 驱动采用内核固件加载器(request_firmware),无需用户空间干预。固件二进制(.bin)置于 /lib/firmware/rockchip/,驱动 probe 时自动加载。RK3588 AV1 核心需 vepu981_av1.bin,rkvdec 需 rkvdec_fw.bin 等。

配置清单:

  1. 固件目录结构
    /lib/firmware/rockchip/
    ├── vpu/
    │   ├── rkvdec/
    │   │   └── rkvdec_fw.bin
    │   └── vepu/
    │       └── vepu981_av1.bin
    
  2. DTS 片段(rk3588.dtsi 示例):
    vpu: vpu@fe0a0000 {
        compatible = "rockchip,rk3588-vpu";
        reg = <0x0 0xfe0a0000 0x0 0x10000>;
        interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
        power-domains = <&power RK3588_PD_VPU>;
        iommus = <&iommu>;
        firmware-name = "rkvdec/rkvdec_fw.bin";
        memory-region = <&vpu_share_mem>;
        status = "okay";
    };
    
  3. 内核 config
    CONFIG_VIDEO_ROCKCHIP_VPU=y
    CONFIG_VIDEO_RKVDEC=m
    CONFIG_VIDEO_HANTRO=y
    CONFIG_VIDEO_VERISILICON=y
    CONFIG_V4L2_MEM2MEM_REQUEST_API=y
    

加载失败风险:固件缺失导致 probe 失败,回滚策略 - 启用 firmware_class 模块,modprobe rockchip_vpu 后检查 /sys/class/firmware/timeout 设为 10s。

多平面支持与高性能参数

多平面格式(multi-plane)针对 4:2:0 NV12_10 等高位深 / 高分辨率优化,减少带宽。RK3588 VPU 支持 NV12_4L4(4 子平面)和 P010LE,AV1/H.265/VP9 均兼容。

参数清单:

格式 分辨率上限 平面数 DMABUF 要求 示例控件
NV12 8K@60 2 PRIME width=3840,height=2160,pixelformat=NV12
NV12_10_4L4 8K@30 4 PRIME + IOMMU bit-depth=10,num-planes=4
VP9_PROFILE2 4K@60 2 scatter-gather codec=VP9,profile=2

FFmpeg 扩展:-pix_fmt p010le -vf hwupload 启用多平面上传。

性能调优:

  • 时钟阈值:VPU clk > 500MHz(cpufreq-set -g performance)。
  • 缓冲区:min_buffers=4,max DPB=16 帧。
  • 错误恢复:V4L2_EVENT_SOURCE_CHANGE 时重置队列,超时 500ms。

在实际部署中,如 Radxa ROCK 5B,结合 Panthor GPU,可实现 8K AV1 流畅播放。潜在风险:IOMMU 故障导致挂起,监控 watch -n1 cat /sys/kernel/debug/dri/0/amdgpu_vkms_error(适配 VPU),回滚至状态模式(若可用)。

资料来源:

查看归档