monotux.tech

A few years ago I won (!) a SBC and have been trying to figure out what to do with it ever since. The board is called LibreComputer Alta AML-A311D-CC and this post will outline how I got it’s NPU working, even though I still don’t know what to do with it1.

Table of Contents

Hardware & compatibility

LibreComputer is a fairly niche SBC manufacturer, at least for a hobbyist like me. I was initially hesitant to test this board as niche SBCs typically have issues with software support and compatibility, requiring downloading OS images from strangers google drives, never receiving any updates and so forth.

The Alta AML-A311D-CC uses standard UEFI. That means you can download and run standard ARM64 ISOs and boot it, at least in theory. It’s devicetree seems to be upstreamed and embedded in the Linux kernel – at least for Debian. This is potentially really nice!

Another interesting hardware detail is it’s NPU. I suspect this chipset is more geared towards sitting in a CCTV camera doing object detection, but we might use this capability for other things as well – if we can get it running. There is an open-source driver for said NPU and it is upstreamed, so no proprietary drivers. As of yesterday (2026-08-22) said driver also supports YOLOX (whatever that is), so development is ongoing which is nice.

Aside from that, this is a 6 core machine with 4 GB of RAM, plus an 16 GB eMMC drive I bought. I missed the chance to buy a PoE HAT which is unfortunate.

Getting the NPU to work

I thought this project was going to be tricky & complicated – but it really wasn’t! I just needed a modern kernel and have the kernel load the correct devicetree.

Backports

To get a newer kernel in Debian we can rely on Debian backports.

Add below to /etc/apt/sources.list.d/debian-backports.sources:

Types: deb deb-src
URIs: http://deb.debian.org/debian
Suites: trixie-backports
Components: main
Enabled: yes
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Then install a newer kernel:

apt install -t trixie-backports linux-image-arm64 linux-headers-arm64

devicetree

This proved to be the “trickiest” part of the project. I had to read a shell script and add one (1) line of configuration!!

At the end of the function linux_entry () in /etc/grub.d/10_linux I added this line:

  sed "s/^/$submenu_indentation/" << EOF
        devicetree /usr/lib/modules/$version/dtb/amlogic/meson-g12b-a311d-libretech-cc.dtb
}
EOF

This will make the kernel load the device tree on boot. Reboot, and see if you can see any devices under /dev/dri like card0 and renderD128.2

Testing the NPU

Test if the etnaviv driver was loaded on boot:

# sudo dmesg | grep -i etnaviv
[    8.908502] etnaviv etnaviv: bound ff100000.npu (ops gpu_ops [etnaviv])
[    8.909718] etnaviv-gpu ff100000.npu: model: GC8000, revision: 7120
[    8.915861] etnaviv-gpu ff100000.npu: etnaviv has been instantiated on a NPU, for which the UAPI is still experimental
[    8.952415] [drm] Initialized etnaviv 1.4.0 for etnaviv on minor 0

There is a github repository which seems to contain a test suite for these drivers – but I couldn’t make it run. I found another github repository (rpardini/mesa-teflon-etnaviv-rocket-docker) which builds the mesa with the necessary components and runs tests on it:

podman run -it --device=/dev/dri/card0 --device=/dev/dri/renderD128 ghcr.io/rpardini/mesa-teflon-etnaviv-rocket-docker:latest

See the repository for expected output on a successful test!

Conclusion

Now I just have to figure out what to do with this NPU. :)


  1. It is running pihole for now, as with most other SBCs people have bought and tried to put to use. :) ↩︎

  2. On my system I had card0, card1, card2, renderD128 and renderD129↩︎