Replace every em dash with real punctuation (rewrites, not hyphen swaps) in docs, code comments, scripts, configs, and the port records; convert en dashes, curly quotes, ellipsis glyphs, arrows, and section signs to ASCII; drop machine-writing tell phrases from living docs. ADR titles now use a colon. The M2 bring-up DTS model string carried an em dash into the patch series and its record echoes; fixed at both, and the full series re-verified to apply cleanly onto pristine 6.18.46. One comment in freshness.h deliberately names the em dash glyph the UI renders as the unknown mark; that is data, kept as prose naming it. Verified: cargo tests (sim, config-lint, rs485-bridge), shellcheck, both driver MC/DC harnesses, patches-apply.
44 lines
2.3 KiB
Markdown
44 lines
2.3 KiB
Markdown
# NPU (rknpu) open kernel driver: VERIFIED on warden-c8a3 (2026-08-25)
|
|
|
|
The open GPL rknpu kernel driver runs on our self-built Linux 6.18.46. This is the
|
|
achievable open end state (Tier A in `OPEN-NPU-PLAN.md`); open *compute* remains a
|
|
from-scratch RE project (see the ceiling note below).
|
|
|
|
## Evidence (serial, _b slot = our 6.18)
|
|
```
|
|
[drm] Initialized rknpu 0.9.2 for ff660000.npu on minor 1
|
|
/dev/dri/ -> card0 (VOP display) card1 (rknpu) renderD128
|
|
$ rknpu_version_test
|
|
/dev/dri/card0: not an rknpu node (version ioctl: Invalid argument)
|
|
opened /dev/dri/card1 (fd=3)
|
|
driver version: 0.9.2 (raw code 902)
|
|
hw version: 0x54524548 (raw)
|
|
PASS: /dev/dri/card1 answered both version-query ioctls -- probe,
|
|
power-get/put, and clock/reset all exercised.
|
|
```
|
|
The `RKNPU_GET_DRV_VERSION`/`RKNPU_GET_HW_VERSION` ioctls exercise the full
|
|
dispatch -> power-domain get/put -> clock/reset path, so a clean answer confirms the
|
|
whole driver bring-up, not just registration.
|
|
|
|
## The fix that took it from probe-fail to PASS
|
|
The base dtsi `npu@ff660000` node declares its interrupt but has **no
|
|
`interrupt-names`**; the rknpu driver requests its IRQ by name (`"npu_irq"`), so
|
|
probe bailed `error -ENXIO: IRQ npu_irq not found` and never registered its DRM
|
|
device. Board DTS override adds `interrupt-names = "npu_irq";` (+ `status="okay"`).
|
|
(The rest of the port (GPL source, 4 compat-shim headers for dead-code vendor
|
|
headers, 10 mechanical 6.18 API deltas) is in `PORT-PROGRESS.md`.)
|
|
|
|
Also: the version test must iterate DRM cards and keep the one that ANSWERS the
|
|
ioctl. The display card (card0) opens fine but returns EINVAL. Fixed in
|
|
`rknpu_version_test.c`.
|
|
|
|
## The honest ceiling (why "100% open NPU" stops at the driver)
|
|
The kernel driver only DMAs an opaque userspace-authored `regcmd` blob into the PC
|
|
registers and pulses go. It never inspects the compute stream. The compute-engine
|
|
register map (TRM Part 2) is not public for RV1106, there is **zero open RE prior
|
|
art** for this NPU generation, and only the closed RKNN-Toolkit2 compiler emits
|
|
valid regcmd. Mainline `accel/rocket` + Mesa Teflon are RK3588-only (64-bit). So an
|
|
open compiler/runtime is a from-scratch, ~person-year register-RE project, scoped
|
|
(not staffed) in `OPEN-NPU-PLAN.md` (M-NPU-2 spike / M-NPU-3). We ship the open
|
|
driver; we do NOT ship any closed blob.
|