Appendix · reference

RK3399 eFuse

Read-only on-die fuses: CPU ID, leakage cal, secure-boot key hashes

Identity

PartRK3399 eFuse block
RoleRead-only NVRAM exposing CPU ID, A72/A53 leakage calibration, TSADC trim values, and (optionally) secure-boot key hashes
Bus / addressMMIO 0xff690000 (window 0x80)
GPIO / IRQnone
DatasheetRK3399 TRM Part 1 chapter 22 (eFuse)
Pine64 wikiPinePhone Pro main page
Schematicon-SoC (no external schematic)

Status — ● working

A minimal rk_efuse driver is in tree at src/sys/arm64/rockchip/rk_efuse.c. It matches rockchip,rk3399-efuse, allocates the MMIO window, runs the RK3399 strobe sequence (LOAD | PGENB | STROBSFTSEL | RSB, then per-word STROBE with the byte address shifted into bits [25:16]), caches the first 128 bytes of fuse contents, and exposes the useful cells via sysctl:

Verified live on 2026-05-03: this PinePhone Pro returns cpu_id=5442524d37322e303000000000061000, cpub_leakage=29, cpul_leakage=17, gpu_leakage=23, center_leakage=27, logic_leakage=21, wafer_info=8. All cells read non-zero, the strobe sequence works, the cached buffer survives.

What remains for userspace integration

The driver does what it’s supposed to do; the question is what other drivers should consume the values it exposes:

Driver

The Linux driver is a textbook nvmem provider: read fuses, hand out cells via the nvmem framework. The FreeBSD port reads the whole 128-byte window into a softc-resident buffer at attach and serves cell-shaped sysctls, which is enough for kernel-side and userland calibration consumers.

Parity verification

A working attach should print on dmesg:

rk_efuse0: <Rockchip RK3399 eFuse> mem 0xff690000-0xff69007f on simplebus0
rk_efuse0: fuses loaded (cpub=N cpul=N gpu=N wafer=N)

…with small (typically 0–31) integers in place of the Ns.

Then from userland:

# sysctl dev.rk_efuse.0.cpu_id
dev.rk_efuse.0.cpu_id: 1f7c4b...   (16 hex bytes, 32 chars total)

# sysctl dev.rk_efuse.0
dev.rk_efuse.0.wafer_info: 12
dev.rk_efuse.0.logic_leakage: 7
dev.rk_efuse.0.center_leakage: 6
dev.rk_efuse.0.gpu_leakage: 9
dev.rk_efuse.0.cpul_leakage: 5
dev.rk_efuse.0.cpub_leakage: 8
dev.rk_efuse.0.cpu_id: ...

mise run debug:sensors:phone includes the same eFuse fields in its combined PinePhone Pro sensor receipt and checks that cpu_id is a 32-character hex string.

Cross-check the same fields from a Linux PinePhone Pro image:

# /sys/bus/nvmem/devices/rockchip-efuse0/nvmem | xxd | head
00000000: ... ... ... ...

The byte at offset 0x07 (and the 16 bytes following) should match dev.rk_efuse.0.cpu_id. Bytes 0x17–0x1c should match the leakage / wafer-info sysctls.

Falsifiers

Open work