[meta-rockchip PATCH v2] add support for upstream RKNPU/RKNN/Rocket HW AI accelerator
Quentin Schulz <[email protected]>
| Newsgroups | org.yoctoproject.lists.yocto-patches |
|---|---|
| Message-ID | <[email protected]> |
From: Quentin Schulz <[email protected]> This adds support for the NPU (Neural Processing Unit) found on the RK3588(S). The NPU is supported by a kernel driver (CONFIG_DRM_ACCEL_ROCKET), Device Tree nodes (so not all RK3588 devices supported upstream necessarily have the NPU declared properly!) and a userspace driver in mesa (teflon delegate with rocket gallium driver). This adds a config fragment for linux-rockchip kernels such that the disabled-by-default Rocket driver is built and enables the Rocket gallium mesa driver with the teflon delegate, but only when the user requests its support. This was tested by running the following: """ wget https://gitlab.freedesktop.org/mesa/mesa/-/raw/main/src/gallium/frontends/teflon/tests/classification.py TEFLON_DEBUG=verbose python3 classification.py \ -i /usr/share/label_image/grace_hopper.bmp \ -m /usr/share/label_image/mobilenet_v1_1.0_224_quant.tflite \ -l /usr/share/label_image/labels_mobilenet_quant_v1_224.txt \ -e /usr/lib/libteflon.so """ from an image built with meta-tensorflow's tensorflow-lite, mesa's libteflon, meta-openembedded's python3-pillow and OE-Core's python3-numpy packages. Note that the Aarch64 RK35xx SoCs all have an NPU, but only RK3588's is currently supported in the kernel. Signed-off-by: Quentin Schulz <[email protected]> --- This was tested on RK3588 Jaguar with linux-yocto 6.18 + https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=843b912c7241ed0259f6234243da05e10ce67c0f Note this (lightly) depends on https://lore.kernel.org/yocto-patches/[email protected]/ being merged in meta-tensorflow. Another option is to simply add "tensorflow" to DISTRO_FEATURES to pass the (useless) check. --- Changes in v2: - switched to oe.utils.vartrue from bb.utils.to_boolean - driver now built-in instead of as module since the necessary patches have been backported to the 6.18 stable kernel version currently in OE-Core via linux-yocto_6.18, - updated commit log now that meta-tensorflow is usable without hacks, and filepaths for input files to classification.py have changed with newer tflite, - reworded README to specify libteflon needs to be installed in the image manually but the mesa rocket driver and teflon delegate are automatically built if the variable is properly set, - Link to v1: https://lore.kernel.org/yocto-patches/[email protected]/ --- README | 20 ++++++++++++++++++++ recipes-graphics/mesa/mesa.bbappend | 4 ++++ recipes-kernel/linux/linux-rockchip.inc | 1 + .../rockchip-kmeta/bsp/rockchip/rocket-npu.cfg | 2 ++ .../rockchip-kmeta/bsp/rockchip/rocket-npu.scc | 1 + 5 files changed, 28 insertions(+) diff --git a/README b/README index c2697d1..6d9db9b 100644 --- a/README +++ b/README @@ -222,6 +222,26 @@ Notes: NOTE: this variable must be set before any include/require in the machine configuration file + Neural Processing Unit (NPU) + + The Aarch64 RK35xx SoCs have a Neural Processing Unit (NPU) available. + It is typically named by Rockchip as RKNPU/RKNN but upstream has decided + to use Rocket instead. At the time of writing (Linux kernel v7.0), only + RK3588's NPU is supported upstream. + + This NPU is an AI hardware-accelerator. You can enable its support by + setting: + + ENABLE_UPSTREAM_RKNPU = "1" + + This requires a kernel driver (CONFIG_DRM_ACCEL_ROCKET, v6.18+) and + RKNN Device Tree nodes + (e.g. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=640366d644b1e282771a09c72be37162b6eda438). + The mesa userspace driver (rocket gallium driver) and teflon delegate + are automatically compiled when this option is enabled. You need to add + the libteflon package to your image to be able to use the teflon + delegate. + U-Boot Environment: ------------------ In order to configure U-Boot to be able to store its environment into the diff --git a/recipes-graphics/mesa/mesa.bbappend b/recipes-graphics/mesa/mesa.bbappend index d9e7c08..69a210f 100644 --- a/recipes-graphics/mesa/mesa.bbappend +++ b/recipes-graphics/mesa/mesa.bbappend @@ -10,5 +10,9 @@ MALI_DRIVER:rk3308 = "" PACKAGECONFIG:append:rockchip = " ${@bb.utils.filter('MALI_DRIVER', 'lima panfrost', d)}" PACKAGECONFIG:append:rockchip = "${@bb.utils.contains('MALI_DRIVER', 'panfrost', ' libclc', '', d)}" +# Enable teflon for upstream RKNPU/rocket support +# Requires CONFIG_DRM_ACCEL_ROCKET in Linux kernel to actually work +PACKAGECONFIG:append:rk3588s = "${@oe.utils.vartrue('ENABLE_UPSTREAM_RKNPU', ' teflon rocket', '', d)}" + # Mali Gen10 (Valhall, supported by Panthor) requires a firmware blob RRECOMMENDS:mesa-megadriver:append:rk3588s = " linux-firmware-mali-csffw-arch108" diff --git a/recipes-kernel/linux/linux-rockchip.inc b/recipes-kernel/linux/linux-rockchip.inc index 6c62e84..dc30327 100644 --- a/recipes-kernel/linux/linux-rockchip.inc +++ b/recipes-kernel/linux/linux-rockchip.inc @@ -36,3 +36,4 @@ SRC_URI:append:nanopi-r4s = " file://realtek-r8169.cfg" KERNEL_FEATURES:append:rockchip:arm = " bsp/rockchip/remove-non-rockchip-arch-arm.scc" KERNEL_FEATURES:append:rockchip:aarch64 = " bsp/rockchip/remove-non-rockchip-arch-arm64.scc" +KERNEL_FEATURES:append:rockchip = "${@oe.utils.vartrue('ENABLE_UPSTREAM_RKNPU', ' bsp/rockchip/rocket-npu.scc', '', d)}" diff --git a/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.cfg b/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.cfg new file mode 100644 index 0000000..9f6af63 --- /dev/null +++ b/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.cfg @@ -0,0 +1,2 @@ +CONFIG_DRM_ACCEL=y +CONFIG_DRM_ACCEL_ROCKET=y diff --git a/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.scc b/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.scc new file mode 100644 index 0000000..a8b4277 --- /dev/null +++ b/recipes-kernel/linux/linux-rockchip/rockchip-kmeta/bsp/rockchip/rocket-npu.scc @@ -0,0 +1 @@ +kconf hardware rocket-npu.cfg --- base-commit: 7bc349061e8ac3f03b5646f2ae1d3958ce53c460 change-id: 20260423-rknn-3a394fa3cb83 Best regards, -- Quentin Schulz <[email protected]>