Independent developer project · not affiliated with, endorsed by, or sponsored by BrainChip Holdings Ltd. Akida and AKD1500 are their trademarks.

05 — Akida PCIe driver and the cards

The public driver refuses kernel 6.12. Two patches, one script, and a verification you can trust.

OUR OBSERVATIONEvent 2026-09-06Published 2026-09-27SE Inspect build 1.9.37

OFFICIAL BASELINE: the driver repository Brainchip-Inc/akida_dw_edma and its install.sh. OUR OBSERVATION: on the Pi 5 kernel 6.12 the unpatched installer stops with Kernel 6.12 not supported. The two patches below were found by hand on 2026-09-06 and are reproduced by setup_akida_treiber.sh.

Before you start

Cards seated, carrier powered, Pi booted. Prove the bus sees them:

lspci | grep -i brainchip

Expected: one line per card. On our carrier they sit behind a switch on bus 0001, e.g. 0001:03:00.0 … 0001:06:00.0. No line = power or seating, not software.

The two patches

  1. dkms.conf: remove the BUILD_EXCLUSIVE_KERNEL line (the version gate).
  2. Makefile: replace the $(error Kernel … not supported) branch for kernels > 6.9 with the 6.9 build branch (the dw-edma core, v0 core, debugfs and hdma objects, with the 5.16 include path).

Then sudo ./install.sh (DKMS build), register the module for boot in /etc/modules-load.d/akida-pcie.conf (without this, cards that are already present at boot were sometimes not bound by udev), and modprobe akida-pcie.

All of that is one command:

bash ~/vorsa-m3/setup_akida_treiber.sh

Expected: Makefile gepatcht (or "evtl. schon gepatcht" on a second run), a DKMS build without errors, and the final hint to check the cards.

Verify — four layers must agree

lspci | grep -i -c brainchip
lsmod | grep akida
ls -l /dev/akd1500_*
dmesg | grep akida-pcie | tail

Expected: the card count; akida_pcie loaded; one device node per card (/dev/akd1500_0 … _3); in dmesg for each card Host ddr area: 16777216 bytes and probed (akd1500_N).

The Python check comes in chapter 06 once the runtime environment exists.

Map slots to addresses

Write the table now; you need it for the reset button and for swapping cards during fault-finding:

Slot (your label) PCIe address Device node
1 0001:03:00.0 akd1500_0
… … …

The software assumes that the order of akida.devices() matches the order of the PCIe addresses. That held on our bench; after a card swap, verify it.

Kernel updates are hardware events

apt full-upgrade with a new kernel triggers a DKMS rebuild. After every kernel change: reboot, repeat the four-layer check, and repeat chapter 06's akida.devices() test before trusting the application again.

When a card hangs (seen 2026-09-20)

dmesg fills with akida-pcie 0001:06:00.0: DMA wait completion timed out every few seconds while the link stays up, and the runtime reports Error reading at 0x... errno(110). The card is stuck, not gone. Recovery without a reboot:

sudo systemctl stop vorsa
echo 1 | sudo tee /sys/bus/pci/devices/0001:06:00.0/remove
sleep 2
echo 1 | sudo tee /sys/bus/pci/rescan
dmesg | tail -5
sudo systemctl start vorsa

Expected: enabling device, Host ddr area, probed (akd1500_3) — the card is back. Since build 1.9.36 the UI does this for you (Status → Hardware → "Reset card") and the card watchdog keeps the line running on the remaining cards meanwhile.

If the same address hangs repeatedly, swap two cards: if the fault moves with the card, it is the card; if it stays with the address, it is the slot or the carrier.

Checkpoint: four layers agree, the slot/address table is written, and you know the recovery command.