Repository navigation
v1.5.1 — NPU actually works + Brave browser
What's new in v1.5.1
NPU support is actually working now
v1.5.0 shipped a half-finished NPU stack — the module loaded, the DT overlay was on disk, librknnrt.so was in /usr/lib, but /dev/rknpu never appeared and librknnrt couldn't talk to anything. v1.5.1 fixes the chain of issues required to make the vendor rknpu driver compile, bind to a DT node, and expose a misc device that librknnrt can actually open.
What had to be fixed (in order of discovery):
-
DT overlay install path was wrong. Armbian's u-boot loads
user_overlays=from/boot/overlay-user/, not/boot/dtb/rockchip/overlay/. v1.5.0 had the file in the wrong place, so u-boot silently skipped it, the upstreamrknn_core_*nodes stayed atcompatible = rockchip,rk3588-rknn-core, and our rknpu driver's match table never hit. -
Missing dt-bindings includes. The overlay referenced
SCMI_CLK_NPUandSRST_A_RKNN_NODDR. The clock symbol exists indt-bindings/clock/rockchip,rk3588-cru.h; the reset symbol doesn't exist in mainline at all (vendor BSP only). Added the clock include, dropped the resets ref + the optionalnpu_opp_table(not in mainline either). -
IRQ + PM-domain names were wrong. Driver looks up
npu0_irq, npu1_irq, npu2_irqand PM domainsnpu0, npu1, npu2; overlay hadnpu_irq0/1/2andnputop, npu1, npu2. Fixed to match upstream rknpu_drv.c lookups exactly. -
-DCONFIG_ROCKCHIP_RKNPU_DRM_GEMmade the driver expose/dev/dri/cardNinstead of/dev/rknpu.librknnrt.soonly opens/dev/rknpu(the misc device). Switched the build to DMA_HEAP mode (mutually exclusive with DRM_GEM) by stripping the-Dfrom upstream's Kbuild, adding-DCONFIG_ROCKCHIP_RKNPU_DMA_HEAP, and force-includingrknpu_build_config.hto#undefDRM_GEM afterautoconf.hruns. -
Missing
rk-dma-heap.hheader. Rockchip BSP-only API; mainline kernels don't ship it. Added a stub atsrc/include/compat/linux/rk-dma-heap.hwith safe-ENODEVreturns so the DMA_HEAP code path compiles and degrades to "no heap" at runtime (the misc device is registered regardless). -
rknpu_devfreq.cwon't build. Armbian-current's kernel-headers package doesn't shiplinux/devfreq-governor.h. Droppedrknpu_devfreq.ofrom the Kbuild obj list and added-DRKNPU_NO_DEVFREQso the inline-stub path inrknpu_devfreq.his taken everywhere. Loses DVFS — NPU runs at fixed clock — functional inference unaffected. -
rknpu_gem.cungatedfake_devreference.rknpu_gem_sync_ioctlreferencesrknpu_dev->fake_devunconditionally, but the field is only declared underCONFIG_ROCKCHIP_RKNPU_DRM_GEM. The function is dead code in DMA_HEAP mode (never reached without a DRM device), but the compiler still type-checks it. Sed-swapped the three refs to->dev. -
Upstream
w568w/rknpu-moduleis missingrknpu_mem.centirely. The memory-allocation ioctl backendsrknpu_mem_create_ioctl,rknpu_mem_destroy_ioctl,rknpu_mem_sync_ioctlare declared in headers but never implemented. modpost failed with three "undefined symbol" errors. Vendored Talos's ~700-line from-scratch implementation (npu-patches/rknpu_mem.c, GPL-2.0) which provides them — IOVA cursor allocator,dma_alloc_noncontiguous(), graceful fallback whenrk_dma_heap_findreturns NULL.
Brave browser baked into the desktop image
Native arm64 .deb from Brave's official APT repo. Picked over Firefox because Ubuntu 26.04's snap-based Firefox is sluggish on RK3588; Brave's deb is responsive, supports VAAPI hardware video decode against the rockchip-vaapi we already build, and has a built-in ad blocker. Adds ~150 MB.
plasma-discover is also installed (came in via kubuntu-desktop's recommends — was already there in v1.5.0, just confirming).
Asset sizes
| File | Size | v1.5.0 | v1.4.3 |
|---|---|---|---|
*_desktop.img.xz |
~923 MB | 830 MB | 758 MB |
*_minimal.img.xz |
~393 MB | 421 MB | 291 MB |
Desktop grew ~93 MB — Brave browser plus the additional NPU patches (Talos's rknpu_mem.c, compat headers). Minimal shrank slightly vs v1.5.0 (better xz block alignment with the slightly different rootfs).
Verifying NPU after first boot
# Driver bound? Should show fdab0000.npu and three IRQs registered.
sudo dmesg | grep -i rknpu
# Misc device exposed?
ls /dev/rknpu
# Userspace runtime present?
ldconfig -p | grep librknnrt
# DT overlay applied?
cat /sys/firmware/devicetree/base/npu@fdab0000/compatible
# Should print: rockchip,rk3588-rknpurockchip,rknpuIf /dev/rknpu exists and compatible includes rockchip,rk3588-rknpu, the stack is functional and rknn-toolkit2 model inference will work.
Known limits (unchanged)
- OpenGL Core profile capped at 3.1 (Mesa panthor maturity).
ffmpeg-vaapi -hwaccel vaapidoesn't work withwoodyst/rockchip-vaapi0.1; browser HW decode via libva still works.- 5 Pro is community-tier (CSC) in Armbian.
- NPU runs at fixed clock (no DVFS) due to the missing
linux/devfreq-governor.hworkaround. - DT overlay drops
srst_areset (no soft-reset on probe) andnpu_opp_table(no OPP-driven DVFS); cold-reset from boot works fine. - Mainline
rocketdriver is blacklisted because it's mutually exclusive with vendorrknpu. Can be swapped if you specifically want therocket+ Mesa Teflon path (only supports MobileNet-class models today).
Boot flow (unchanged)
- Flash with balenaEtcher (Pi Imager and Rufus have produced unbootable cards on this board).
- TTY login:
armbian-firstrunwalks you through root password, user creation, locale. - Desktop image: SDDM/Plasma starts → kdialog wizard pops up → reboot lands in Plasma every time.
- Minimal image: motd shows the setup-reminder banner → run
orangepi-setupat the text prompt.