FABRIC-3.md: aarch64 boot-chain decision -- native boot flow, not UEFI
Researched both options before deciding. The UEFI path (rpi5-uefi, TF-A+EDK2, SBBR-compliant) is real but archived since 2025-02-04 -- support ended when newer Pi EEPROM firmware broke compatibility, and its own README says ACPI support is limited/incomplete. Decided: native boot flow instead (config.txt/kernel_2712.img/DTB, x0=DTB pointer at entry, no ACPI at all). Named the real scope rather than estimating it small: a new, non-UEFI aarch64 entry path, a DTB-driven BootInfo equivalent, and a new mailbox-property-interface framebuffer driver (no precedent in this codebase). The one genuine piece of reusable groundwork: starkernel/hal/fdt.c's minimal FDT reader, already built for riscv64's timebase-frequency lookup, extends directly to Pi 5 peripheral discovery. Also documents the peripheral-RNG research: BCM2712 has no brcm,bcm2712-rng200 (or equivalent) entry anywhere in current mainline Linux, and RP1's own published peripheral list doesn't mention an RNG -- genuinely unresolved, not just under-researched. Not yet turned into a punch list -- the boot-chain fork's own shape needs thinking through first. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019YcT3H2PQeyujrzjqS3Var
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
e5e28d5198
commit
a66af477ac
+63
-6
@@ -210,15 +210,72 @@ is **not yet built** — today's `rng_get_bytes()` (`src/starkernel/rng/rng.c`)
|
|||||||
`virtio-rng` path, real on QEMU, meaningless on real Pi 5 hardware (no virtio device there).
|
`virtio-rng` path, real on QEMU, meaningless on real Pi 5 hardware (no virtio device there).
|
||||||
|
|
||||||
**Genuinely open, not yet decided:**
|
**Genuinely open, not yet decided:**
|
||||||
- Raspberry Pi 5's own boot chain — UEFI (e.g. via the community EDK2 port) or the Pi's native
|
|
||||||
boot flow? This determines whether the existing UEFI-targeted boot code needs a different
|
|
||||||
entry path for this board at all, or just different ACPI/DTB-provided data.
|
|
||||||
- Which peripheral RNG the Pi 5 actually exposes, and how to read it (memory-mapped peripheral
|
|
||||||
vs. a firmware call) — not yet researched.
|
|
||||||
- Same observation-method question as amd64 (no QEMU serial socket on real hardware) —
|
- Same observation-method question as amd64 (no QEMU serial socket on real hardware) —
|
||||||
possibly shared tooling/approach across both boards once decided once.
|
possibly shared tooling/approach across both boards once decided once.
|
||||||
|
|
||||||
## V. riscv64 — Milk-V Mars
|
### IV.1 — Boot-chain decision: UEFI vs. native, researched 2026-09-04
|
||||||
|
|
||||||
|
**Researched, not assumed** (web search, current as of this session):
|
||||||
|
|
||||||
|
**UEFI option investigated and found weak.** A real UEFI+ACPI firmware for Pi 5 exists —
|
||||||
|
[`rpi5-uefi`](https://github.com/worproject/rpi5-uefi) (TF-A + EDK2, SBBR-compliant). But:
|
||||||
|
it's **archived as of 2025-02-04**, support ended because newer Pi EEPROM firmware broke
|
||||||
|
compatibility with it; its own README says ACPI support is "under development and limited to
|
||||||
|
a few devices"; RP1 Ethernet/GPIO/PWM/EEPROM don't work under it. This kernel's whole
|
||||||
|
aarch64 boot path (`boot/uefi_loader.c`, `BootInfo->acpi_table`) assumes UEFI+ACPI the same
|
||||||
|
way amd64 and the QEMU aarch64 target do — but that assumption may not hold on a real,
|
||||||
|
current-firmware Pi 5 at all.
|
||||||
|
|
||||||
|
**Native boot flow — the real alternative, researched concretely:**
|
||||||
|
- Boot partition needs `bcm2712-rpi-5-b.dtb`, `config.txt`, and the kernel image itself —
|
||||||
|
Pi 5 firmware defaults to loading `kernel_2712.img`, falling back to `kernel8.img` if that's
|
||||||
|
absent.
|
||||||
|
- `config.txt` needs `os_check=0` for a non-Linux image, or the firmware assumes Linux and
|
||||||
|
loads from `0x200000` instead of the classic Pi bare-metal load address `0x80000`.
|
||||||
|
- Entry protocol: `x0` = 32-bit DTB pointer (upper 32 bits of the 64-bit register
|
||||||
|
unspecified — must mask before use), `x1`–`x3` reserved/zero. **No UEFI PE loader, no ACPI
|
||||||
|
at all** — a completely different entry shape from `boot/uefi_loader.c`.
|
||||||
|
- Framebuffer: the VideoCore **mailbox property interface** (channel 8) — a real, different
|
||||||
|
mechanism from UEFI GOP, no precedent anywhere in this codebase today.
|
||||||
|
|
||||||
|
**Decision, per direct instruction 2026-09-04: native boot flow.** Not UEFI. The archived,
|
||||||
|
partially-working UEFI project is too fragile a foundation to build a real-hardware release
|
||||||
|
on top of.
|
||||||
|
|
||||||
|
**What this actually means for the codebase, named honestly rather than estimated small:**
|
||||||
|
- A **new, non-UEFI entry path** for aarch64 real hardware — this kernel's boot sequence
|
||||||
|
currently assumes `uefi_loader.c`'s PE-loader shape unconditionally on aarch64; a Pi 5
|
||||||
|
native boot needs its own entry point (linked at `0x80000`, receiving `x0` = DTB pointer
|
||||||
|
directly, no `BootInfo` from UEFI at all).
|
||||||
|
- A **DTB-driven `BootInfo` equivalent** replacing ACPI-sourced data for this path — memory
|
||||||
|
map, peripheral addresses (UART, etc.) all come from the devicetree instead.
|
||||||
|
- **One real, genuine piece of reusable groundwork**: `starkernel/hal/fdt.c`/`fdt.h`, the
|
||||||
|
minimal FDT reader already built for riscv64's `timebase-frequency` lookup
|
||||||
|
(`arch/riscv64/timer.c`), is directly extensible for this — parsing `bcm2712-rpi-5-b.dtb`
|
||||||
|
for peripheral addresses is the same kind of lookup, not a new mechanism.
|
||||||
|
- A **new mailbox-property-interface framebuffer driver** — genuinely new code, no existing
|
||||||
|
precedent in this codebase, needed before the VT100 console framework
|
||||||
|
(`console.c`/`vt100.c`/`framebuffer.c`) has anything to draw onto for this board.
|
||||||
|
- This is a real architectural fork for aarch64, not a small per-board addition — QEMU
|
||||||
|
aarch64 keeps its existing UEFI+ACPI path unchanged; Pi 5 real hardware gets a second,
|
||||||
|
parallel entry path. **Not yet scoped into a punch list** — that's the next step, once this
|
||||||
|
fork's own shape (how much of `kernel_main.c`'s post-entry sequence can stay shared between
|
||||||
|
the two paths vs. needs its own branch) is thought through.
|
||||||
|
|
||||||
|
### IV.2 — Peripheral RNG: unresolved, not just under-researched
|
||||||
|
|
||||||
|
`ROADMAP.md` names an "aarch64 peripheral-RNG backend" as part of `v2.4.0`'s gate. Researched
|
||||||
|
directly rather than assumed still-TODO: Broadcom's `iproc-rng200` block (real, on Pi 4/BCM2711
|
||||||
|
as `brcm,bcm2711-rng200`) has **no `bcm2712` compatible-string entry anywhere in current
|
||||||
|
mainline Linux** (checked the actual driver's `of_device_id` table directly). The RP1
|
||||||
|
companion chip's own published peripheral list (GPIO/USB/Ethernet/DMA/ADC/PLLs/SRAM/
|
||||||
|
UARTs/SPIs) doesn't mention an RNG either. Two real possibilities, not yet distinguished:
|
||||||
|
BCM2712 still has the RNG200 block but Linux hasn't wired it into a devicetree binding yet, or
|
||||||
|
it genuinely isn't exposed to the ARM cores this generation. No public register address exists
|
||||||
|
to target right now — this needs either a Broadcom datasheet (if one becomes available) or
|
||||||
|
direct hardware probing once the board is in hand (scan the known BCM2711 RNG200 offset region
|
||||||
|
on the BCM2712 memory map and see if anything responds — risky without a datasheet confirming
|
||||||
|
it's safe to touch, so likely a "board in hand, careful probe" task, not a today task).
|
||||||
|
|
||||||
**Already true:** `ROADMAP.md` names this (generically, "Milk-V") as part of `v2.5.0`'s gate:
|
**Already true:** `ROADMAP.md` names this (generically, "Milk-V") as part of `v2.5.0`'s gate:
|
||||||
boots on the real board, the Zkr (RNDR) entropy backend live. Same gap as aarch64:
|
boots on the real board, the Zkr (RNDR) entropy backend live. Same gap as aarch64:
|
||||||
|
|||||||
Reference in New Issue
Block a user