Skip to content

configs: merged fragment stacks replace the monolithic defconfigs (DE10 provably unchanged) - #137

Merged
mcfbytes merged 23 commits into
masterfrom
feature/config-fragments
Sep 3, 2026
Merged

configs: merged fragment stacks replace the monolithic defconfigs (DE10 provably unchanged)#137
mcfbytes merged 23 commits into
masterfrom
feature/config-fragments

Conversation

@mcfbytes

@mcfbytes mcfbytes commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Summary

The Buildroot configuration moves from three monolithic defconfigs to merged fragment stacks, generated at config time exactly the way the rt variant already worked, and the monoliths are deleted (owner decision: "merge at config time and delete the monolith"). ~2,000 lines of inline rationale move to docs/buildroot-config.md; the fragments keep one-line section pointers and WARNING: lines at the known traps.

The bar was "provably no change to the DE10 build." Evidence:

  • Resolved .config for the DE10 image, the kernel-only stack, the RT stack and the DE25, old path vs new path: identical except BR2_EXTERNAL_MISTER_VERSION (git describe) and BR2_DEFCONFIG (savedefconfig now writes output/defconfig instead of clobbering a tracked file). savedefconfig outputs byte-identical, all four.
  • CI toolchain-fingerprint residue byte-identical for the main and kernel variants, so no br-host-* cache key moves.
  • Independently reproduced by a second adversarial review from the parent commit.

Layout

Stack Fragments
de10nano (output/) common + de10nano + de10nano-image
de10nano-kernel (rt / CI kernel legs) common + de10nano + kernel-only
de25nano (output-de25/) common + de25nano

common is small on purpose: the DE25 is a bare developer OS by ADR 0027/0029, so the shared package set is not shared yet. The structure is what lets it move to common later without touching the DE10 stack. The kernel-only stack now shares the board layer by construction; the mirrored copy that check-kernel-defconfig-sync.sh used to police is gone.

New checks (lint-config job, gates build-kernel and build, config-only, ~1 min)

scripts/check-config-fragments.sh: (a) no symbol defined by two fragments; (b) every fragment line survives olddefconfig verbatim, typo'd is not set lines included; (c) DE10 image vs kernel-only lockstep; (d) golden sha256 of the normalised resolved config per stack, keyed by BUILDROOT_VERSION; (e) every hard-coded fragment path in the Makefile, scripts, workflows and renovate.json exists, and the action's hashFiles() lists equal the stacks. The golden is host-independent (proved at HOSTARCH=aarch64 and host gcc 4.9/5/9/15) and bump-tolerant: kernel-pin bumps don't move it, and a Buildroot bump warns with the ready-to-paste lines while renovate-hash-sync case 8 refreshes them in the bump PR.

Two adversarial review rounds ran 30+ mutations against the checks; the table and every finding's disposition are in docs/buildroot-config.md §11 and the commit messages.

Consumers updated

Makefile (make de10nano-defconfig / de25nano-defconfig; old names are error stubs), buildroot-build action, build.yml, release.yml, renovate.json managers (validator passes), renovate-hash-sync, hash-sync scripts, lockstep check, tests, README/CONTRIBUTING/docs. ADRs and dated recon records keep their historical file names.

Not done here

No full image build was run; the config-level identity proof is the deliverable and this PR's CI run is the first exercise of lint-config on a fresh runner. Known follow-up (pre-existing): the DE25 kernel pin has no Renovate manager and shares linux.hash by symlink.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm

Copilot AI lite review requested due to automatic review settings September 2, 2026 15:43

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The new scripts/check-config-fragments.sh normalisation currently drops lowercase BR2_* symbols (e.g. BR2_arm), weakening golden-hash drift detection and resolved-level lockstep checks.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR refactors the Buildroot configuration model from monolithic defconfigs into merged fragment stacks (driven by configs/fragments/stacks.mk), updates all consumers (Makefile, CI, Renovate, scripts, docs) to use the new stacks, and adds CI linting to prove the resolved configs match expectations (including golden hashes) with the stated goal of keeping the DE10 build behavior unchanged.

Changes:

  • Replace monolithic DE10/DE25 defconfigs with fragment stacks and update all references/consumers accordingly.
  • Add configuration linting scripts + CI job (lint-config) to validate fragment composition, lockstep, and golden resolved-config hashes.
  • Update Renovate + renovate-hash-sync to track the new fragment layout (including a new “golden” hash-sync case).
File summaries
File Description
TASKS.md Update historical references to fragments
scripts/test-sdcard-install.sh Read kernel pin from DE10 fragment
scripts/test-initramfs.sh Read kernel pin from DE10 fragment
scripts/list-kernel-variants.sh Clarify exclusions with fragments layout
scripts/lint-kernel-patches.sh Point default config source at fragment
scripts/lib/config-stacks.sh New: parse stacks.mk + strip fragments
scripts/lib/board-expectations.sh Update references to fragment files
scripts/hash-sync-kernel.sh Read stable kernel pin from fragment
scripts/hash-sync-golden.sh New: record golden resolved-config hashes
scripts/export-kernel-tree.sh Read kernel pin from DE10 fragment
scripts/ci-tests.sh Read kernel pin from DE10 fragment
scripts/check-linux-img.sh Update contract reference to fragment
scripts/check-kernel-defconfig-sync.sh Compare merged stacks vs old defconfigs
scripts/check-config-fragments.sh New: fragment-stack regeneration + assertions
renovate.json Update managers to fragment paths
README.md Document fragment stacks + new make targets
PLAN.md Update tree layout docs for fragments
package/linux-firmware-extra/linux-firmware-extra.mk Comment updates for new layout
package/azcopy/Config.in Reference de10nano-image fragment
package/azcopy/azcopy.mk Reference de10nano-image fragment
package/azcopy/azcopy.hash Update example make target
package/azcopy/azcopy-profile.sh Reference de10nano-image fragment
MISTER-KERNEL-PATCH-RECON.md Update pin references to fragment paths
Makefile Generate configs from fragment stacks
external.mk Update comments to fragment-based config
docs/wifi-parity.md Update defconfig references to fragments
docs/version-delta.md Update kernel pin reference to fragment
docs/util-linux-parity.md Update examples to new make target
docs/user/faq.md Update kernel pin reference to fragment
docs/usb-automount-parity.md Update examples to new make target
docs/uboot-mainline-port.md Update defconfig reference to fragment
docs/stock-reconciliation.md Update defconfig references to fragments
docs/ssh-ftp-parity.md Update defconfig references to fragments
docs/size-budget.md Update defconfig reference to fragment
docs/samba-parity.md Update defconfig reference to fragment
docs/rtc-parity.md Update defconfig reference to fragment
docs/rt-beta-kernel.md Update RT/base description to stacks
docs/reproducibility.md Update defconfig reference to fragment
docs/renovate.md Document new pin locations + golden case
docs/python-compat.md Update defconfig references to fragments
docs/package-manifest.md Update examples to new make target
docs/midi-mt32-parity.md Update defconfig references to fragments
docs/main-shared-libs.md Update defconfig reference to fragment
docs/logitech-pairing.md Update example make target
docs/kernel-recon/worker-instructions.md Update kernel pin reference to fragment
docs/init-parity.md Update examples + overlay reference
docs/firmware-parity.md Update defconfig references to fragments
docs/decisions/0029-de25-implementation-path.md Add fragment-split addendum
docs/decisions/0024-mainline-uboot-capability-artifact.md Update defconfig reference to fragment
docs/debug-tooling.md Update references + strace note
docs/de25-readiness-ledger.md Add status note re: fragment split
docs/db-json-versioning.md Update defconfig reference to fragment
docs/ci.md Document new lint-config + stack fingerprinting
docs/azcopy.md Update defconfig references to fragments
docs/abi-contract.md Update defconfig reference to fragment
CONTRIBUTING.md Update kernel pin reference to fragment
configs/mister_rt.fragment Reduce header; reference stacks + docs
configs/mister_kernel_defconfig Delete monolithic kernel-only defconfig
configs/mister_installer_defconfig Header cleanup; reference docs
configs/mister_initramfs_defconfig Header cleanup; reference docs
configs/mister_de25nano_defconfig Delete monolithic DE25 defconfig
configs/fragments/stacks.mk New: stack-to-fragment registry
configs/fragments/kernel-only.fragment New: kernel-only delta fragment
configs/fragments/golden.sha256 New: golden resolved-config hashes
configs/fragments/de25nano.fragment New: DE25 config fragment
configs/fragments/de10nano.fragment New: DE10 board/toolchain/kernel fragment
configs/fragments/de10nano-image.fragment New: DE10 image fragment (packages/system)
configs/fragments/common.fragment New: shared policy fragment
board/mister/de25nano/linux.fragment Update doc references to fragment
board/mister/de10nano/rootfs-overlay/etc/wifi-hotplug.sh Comment reference updated
board/mister/de10nano/rootfs-overlay/etc/udev/rules.d/70-persistent-net.rules Comment reference updated
board/mister/de10nano/post-image.sh Update defconfig references to fragments
board/mister/de10nano/linux.config Update comment reference to fragment/stacks
board/mister/de10nano/initramfs-post-build.sh Comment reference updated
.github/workflows/renovate-hash-sync.yml Add golden case + update paths
.github/workflows/release.yml Use de10nano-defconfig in azcopy job
.github/workflows/build.yml Add lint-config job; adjust dependencies
.github/actions/buildroot-build/action.yml Fingerprint stacks + update cache keys
Review details
  • Files reviewed: 78/80 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread scripts/check-config-fragments.sh
mcfbytes and others added 6 commits September 2, 2026 10:59
Replace configs/mister_de10nano_defconfig, configs/mister_kernel_defconfig
and configs/mister_de25nano_defconfig with configs/fragments/:

  common.fragment         policy shared by every board and variant (8 symbols)
  de10nano.fragment       DE10 arch/ABI, headers series, kernel stanza (16)
  de10nano-image.fragment DE10 board hooks, ext4 contract, packages, system
                          configuration (257 symbols + 10 explicit not-set)
  kernel-only.fragment    no init/shell/BusyBox, rootfs-tar (4)
  de25nano.fragment       DE25 developer OS, layered on common only (18)
  stacks.mk               which fragments form which configuration, in order

The Makefile now generates every .config the way `rt` always did:
merge_config.sh -m over the stack, then olddefconfig. `make
de10nano-defconfig` / `make de25nano-defconfig` replace the old
`make mister_*_defconfig`; the old names print a pointer and fail.

The kernel-only base is no longer a mirrored COPY of the main defconfig's
toolchain/kernel stanzas: the de10nano and de10nano-kernel stacks share
common + de10nano by construction.

Proved config-identical before deleting the monoliths: for all four stacks
(DE10 image, kernel-only, kernel-only + rt, DE25) the resolved .config
differs from the old path only in BR2_DEFCONFIG (savedefconfig's output
path, now output/defconfig) and BR2_EXTERNAL_MISTER_VERSION (git-describe
of a dirty worktree); `savedefconfig` output is byte-identical.

Long rationale comments move to docs/buildroot-config.md in a follow-up
commit; the fragments carry one-line section pointers plus WARNING lines
next to the trap symbols.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…den)

scripts/check-kernel-defconfig-sync.sh now compares the MERGED TEXT of the
de10nano and de10nano-kernel stacks (configs/fragments/stacks.mk) instead
of two files, keeping all three of its asserts (shared-value agreement,
sentinels, choice-family name sets) and adding a structural one: every
toolchain/kernel family symbol must live in a fragment BOTH stacks use.
No Buildroot tree needed; still runs before any cache restore.

New scripts/check-config-fragments.sh (needs the pinned Buildroot tree;
config-only, no compile; ~4 s warm) regenerates every stack -- de10nano,
de10nano-kernel, de25nano and de10nano-kernel + each configs/mister_*.fragment
kernel variant -- and asserts:
  (a) no symbol is defined by two fragments of one stack (merge_config.sh's
      own "redefined" warnings are captured too); the rt fragment's kernel
      version + patch-dir overrides are the one allowlisted exception;
  (b) every fragment symbol survives olddefconfig verbatim;
  (c) the resolved de10nano and de10nano-kernel configs agree outside a
      named list of designed divergences;
  (d) the sha256 of each NORMALISED resolved .config equals
      configs/fragments/golden.sha256 for the pinned Buildroot version.
The four recorded goldens are byte-equal to the normalised hashes of the
configs the OLD monolithic path produced (measured before the split).

Also: drop the duplicate BR2_PACKAGE_STRACE=y from the debug-tooling block
(T5 made strace permanent; the duplicate was a redefinition (a) rejects and
a kconfig "override: reassigning" warning) and keep
BR2_TARGET_GENERIC_ROOT_PASSWD per image fragment rather than in common, so
both CI toolchain-fingerprints stay byte-identical to the pre-split ones
(no cache bust). Neither changes any resolved .config.

Other scripts that read the kernel pin / patch dir / mkfs contract by
filename now read configs/fragments/de10nano.fragment or
de10nano-image.fragment; scripts/lib/config-stacks.sh is the shared
stacks.mk parser.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
.github/actions/buildroot-build: the toolchain fingerprint reads the
variant's fragment stack through scripts/lib/config-stacks.sh (main =
de10nano stack, kernel variants = de10nano-kernel stack) -- the
concatenated, stripped, sorted residue is byte-identical to what the old
single defconfig produced, so neither host-toolchain cache key moves. The
dl/ cache keys hash the stack's files explicitly. The main configure step
is `make de10nano-defconfig`; release.yml's azcopy configure likewise.

build.yml: new `lint-config` job (needs gate; build-kernel and build need
it) running lint-kernel-patches.sh, check-kernel-defconfig-sync.sh and the
new check-config-fragments.sh -- so a bad fragment fails in about a minute
before any kernel leg or the 3h image build starts. Config-only: it unpacks
the pinned Buildroot tarball and runs kconfig, no compile. `status` reports
it and treats the downstream skips as the needs-cascade.

renovate.json: the 6.18 kernel manager now matches the ONE file carrying
the pin, configs/fragments/de10nano.fragment (the kernel-only stack shares
it, so the "bumps half the repo" hazard is gone by construction); the
fileCount/depCount note is re-derived (22/22, derived not measured).
renovate-hash-sync.yml's path filter follows.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… consumers

docs/buildroot-config.md (new) carries the complete rationale that used to
live as inline comments in the three monolithic defconfigs, the rt
fragment and the initramfs/installer defconfigs -- every fact, measurement
and citation, organised by fragment and section (§1 mechanism, §2-§9 one
section per file, §10 the per-symbol placement decisions, §11 the checks,
golden hashes and the identity proof). The fragments and the two standalone
defconfigs keep one-line section pointers plus WARNING lines next to the
trap symbols. Their symbol lines are untouched: the resolved .config of
each (initramfs, installer, rt) was re-diffed against the pre-change
baseline -- identical.

Consumer sweep: README, docs/ci.md (variants, fingerprint, lockstep, new
docs/rt-beta-kernel.md, docs/debug-tooling.md, the parity docs' line-number
citations (now symbol-based), CONTRIBUTING.md, PLAN.md's layout tree,
external.mk, board/* and package/* comments, board-expectations.sh.
docs/de25-readiness-ledger.md §3/§4 get a dated status note (the file-path
axis is wired; the tables stay as the verified record) and ADR 0029's
"left open" item 2 an addendum. Dated records (kernel-recon records,
TASKS.md, MISTER-KERNEL-PATCH-RECON.md, earlier ADR bodies) are left as
history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…not-set typo

Adversarial-review fixes to scripts/check-config-fragments.sh:

- Normalisation keeps only SET symbols (`BR2_X=`; `is not set` lines are
  dropped, losslessly for drift) and strips kconfig's derived
  BR2_LINUX_KERNEL_VERSION alongside CUSTOM_VERSION_VALUE, so a Renovate
  kernel bump of ANY pin (6.18.y, rt 7.2.y, DE25) no longer moves the
  golden. olddefconfig now runs with HOSTARCH/HOSTCC_VERSION pinned on the
  make command line (x86_64 / 14), and the host-derived set symbols
  (HOST_GCC_AT_LEAST_*, *_ARCH_SUPPORTS, HOST_GO_BIN_HOST_ARCH,
  PROVIDES_HOST_RUSTC, the gcc>=8-gated gobject-introspection/host-qemu/
  python-gobject family) are excluded belt-and-braces. Measured: the
  de10nano hash is identical for the real host (gcc 15), HOSTARCH=aarch64
  and HOSTCC_VERSION 9/5/4.9.
- (d): a pinned Buildroot version with NO golden lines is a ::warning (the
  new lines are printed ready to paste) so an automated Buildroot-bump PR
  still builds; a mismatch against a recorded line, or a single missing
  stack line for a recorded version, stays a failure.
- (b): a `# X is not set` fragment line must come back as exactly that line
  (a typo'd symbol is absent in both forms and was invisible before).
- (e) path consumers: every configs/fragments/<file> named in Makefile,
  scripts/, .github/ and renovate.json must exist, and action.yml's two
  hashFiles() lists must equal the DE10NANO / DE10NANO_KERNEL stacks -- a
  fragment rename with stacks.mk updated now fails instead of silently
  staling the dl-cache keys, Renovate managers and pin-reading scripts.

New renovate-hash-sync case 8 (scripts/hash-sync-golden.sh): on a Buildroot
bump, run the target branch's check-config-fragments.sh --update-golden
against the freshly unpacked, hash-verified tree and commit the new golden
lines in the same PR; never rewrites lines that already exist.

Docs: rt fragment's TOFU caution restored to its original meaning; missing
WARNING lines added (GLOBAL_PATCH_DIR, DE25 LINUX_KERNEL_PATCH, rt 0047 hunk,
REPRODUCIBLE); the headers-series mis-cite fixed; stale prose in
rt-beta-kernel.md, TASKS.md, MISTER-KERNEL-PATCH-RECON.md; DE25-pin/linux.hash
symlink follow-up recorded in docs/buildroot-config.md §4.

Golden file regenerated under the new normalisation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
mcfbytes and others added 14 commits September 2, 2026 11:18
Copilot review on #137: the first normalisation stage matched only
^BR2_[A-Z0-9_]+=, silently dropping the arch/CPU choice symbols
(BR2_arm, BR2_cortex_a9, BR2_aarch64, BR2_cortex_a76_a55) from both the
golden hash and the resolved-level lockstep diff. Now [A-Za-z0-9_].
Goldens regenerated for all four stacks; still host-independent.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
board/mister/de25nano/genimage-sdcard.cfg: MBR, p1 FAT32 'DE25BOOT'
(u-boot.itb, Image, dtb, extlinux/extlinux.conf), p2 = rootfs.ext4
verbatim, no 0xA2 partition (that is the Cyclone V BootROM contract).
MBR chosen fail-closed: the only observed DE25 boot is from an MBR
card; the factory SPL contract names no partition-table symbol.
post-image.sh generates extlinux.conf, runs genimage, fails without
u-boot.itb unless DE25_ALLOW_NO_UBOOT=1. scripts/check-sdcard-de25.sh
asserts table type, partition types/sizes/labels, the four p1 files,
extlinux directives and kernel args, ext4 label/features/fsck, and the
absence of any QSPI reference; dry run passes, the DE10 card is
rejected with nine failures. docs/de25-sdcard.md records the interim
p2 decision (ext4 rootfs directly), write procedure and first-boot
checklist. lint.yml's shipped-script lists gain post-image.sh (covers
the DE10's too, which was unlisted).

Defconfig/Makefile wiring lands with the U-Boot track, which owns
those files.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
board/mister/common/linux-mister.fragment (409 lines): the arch-neutral
MiSTer driver/feature set lifted from the DE10's resolved config — HID
and gamepads, USB, Bluetooth, the Wi-Fi driver set, sound, filesystems,
netfilter, loop/overlay. Proven a NO-OP on the DE10 6.18.48 tree
(zero redefinitions, resolved config identical) by the new
scripts/check-kernel-fragment-noop.sh, which also passes on the 7.2.2
DE25 tree. board/mister/de25nano/linux.config (51 lines): minimal
arm64 + Agilex 5 base in the DE10 style. Base and fragment share no
symbol; all 460 lines survive olddefconfig.

Measured on a kernel-only build in a scratch output dir:
=m symbols 1,481 -> 92 (DE10: 92); installed modules 90 MB -> 2.4 MiB;
Image 41.9 MB -> 20.7 MB. The two boards' installed module name sets
are identical. The wave-1 arm64-defconfig kernel had joydev, uinput,
hidraw, HID_NINTENDO/PLAYSTATION, xpad and HZ_1000 all OFF — invisible
in a green build.

docs/de25-kernel-config.md: per-subsystem rationale, what is
deliberately off, the symbols not shared and why (FB_MISTER, audio,
CMA, cpufreq...), the per-bump re-check list, and two obligations:
openssh needs BR2_PACKAGE_OPENSSH_SANDBOX off once added (SECCOMP is
off as on the DE10), and the DE25 selects no linux-firmware yet.

The defconfig switch (custom config + fragment, delete
de25nano/linux.fragment) lands with the U-Boot track's defconfig edit.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… wired; kernel diet switched in

u-boot.itb built by binman from mainline, shape-verified with dumpimage
against the factory SPL contract: uboot @0x80200000, atf (BL31)
@0x80000000 = entry, fdt-0, config board-0 default, crc32 only — no
rsa, no required keys, addresses disjoint from the 0x82000000 FIT
staging area. Reproducible: two runs byte-identical.

QSPI cannot be written from this U-Boot: ENV_IS_IN_UBI, CMD_SF, CMD_MTD,
DM_SPI_FLASH, MTD_UBI, ENV_IS_IN_SPI_FLASH/NAND are absent from the
resolved config (deps unmet); CADENCE_QSPI, MTD, CMD_UBI, HANDOFF off;
ENV_IS_IN_FAT 0:1 is the only env location. Notably stock's
BOOTENV_DEV_QSPI contains 'saveenv && ubi part root' inside the
default boot command — gated on CMD_SF, which is off, so the target
and the string are gone; boot_targets=mmc0 only. HANDOFF off because
dram_init would otherwise require a bloblist from OUR SPL at OUR
BLOBLIST_ADDR, but the factory SPL runs; /memory declared 1 GiB.

Board DTS for U-Boot (uboot-dts/): socdk aliases serial0 to uart0 and
the DE25 console is uart1, so a minimal board dts + -u-boot.dtsi;
mmc0 alias pinned; conservative mmc (4-bit, 50 MHz, no UHS). One
carried, upstreamable patch guards CFG_EXTRA_ENV_SETTINGS's
mtdids/mtdparts reference for MTD-less configs. §8 Q6 closes negative:
'# CONFIG_SPL is not set' removes BINMAN and the FIT; SPL is compiled
but nothing of it ships. Hashes: U-Boot tarball .sig verified (Tom
Rini); TF-A tag anchored TOFU on its commit from two clones.

Defconfig: also switches the kernel to board/mister/de25nano/
linux.config + board/mister/common/linux-mister.fragment (c2ab0c9) and
deletes de25nano/linux.fragment; wires the card image (host genimage/
mtools/dosfstools, post-image.sh). make de25 asserts Image, dtb,
rootfs.ext4, bl31.bin, u-boot.itb and sdcard-de25.img; stat follows
symlinks. Verified: make de25 green, check-sdcard-de25.sh all
assertions passed on the real artefacts. docs/de25-uboot.md has the
fragment rationale, dumpimage listing, QSPI audit table, boot flow and
first-boot serial expectations.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…k one is not

Compile-verified: 0100 applied to pristine 6.18.48, ARCH=arm64 with the
DE25 toolchain, init/do_mounts.o and drivers/block/loop.o build clean.
It does not apply to 7.2.2 (one context hunk: load_ramdisk= removed),
which is version drift, not an architecture problem.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…ct, bloblist off

Fable boot-path review: with no cdns,phy-* values, U-Boot proper drove
the SD PHY with sdhci-cadence6.c's built-in defaults, which no Agilex 5
board has been validated with, at 50 MHz high-speed — the factory SPL
reads u-boot.itb with vendor timing and our driver then re-inits the
PHY. Now: the socdk-u-boot.dtsi sd-ds/sd-hs PHY delays (SoC-level, not
the board vqmmc fact) copied verbatim, cap-sd-highspeed dropped,
max-frequency 25 MHz. de25-uboot.md §5.1 gives the symptoms, the
diagnosis order and the one-line lift once dd of the card is clean.

CONFIG_BLOBLIST off: its fixed 0x7e000+0x1000 window overlapped TF-A's
secondary-CPU handshake words at 0x7EFF0/0x7EFF8; unused with HANDOFF
off; build verified, u-boot.itb still produced (728,176 B, crc32-only,
addresses unchanged). Docs: linux_qspi_enable IS run by
board_prep_linux() — the argument is the CADENCE_QSPI gate; card ships
no uboot.env; BL31 prints on UART0, so no NOTICE: BL31 lines are
expected on the header UART.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Fable boot-path review: a FIT recompiled with sha256,rsa2048 + required
keys passed the checker, as did 4 KiB of urandom named u-boot.itb, and
a stray boot.scr (which distro boot executes the moment extlinux
fails) or uboot.env was merely 'informational'. Now: p1's u-boot.itb
must be byte-identical to images/u-boot.itb, dumpimage must show
uboot @0x80200000, atf @0x80000000, fdt-0, a default config and a
crc32 signature algo, and the decompiled FIT must contain no
rsa/required/sha<n>; p1 may hold nothing beyond the four expected
entries. dumpimage/dtc resolved from the Buildroot host dir, exit 2 if
absent. Real card passes; m1 (uboot.env), m2 (rsa FIT), m3 (garbage
FIT) and m5 (boot.scr with sf erase) all fail. docs/de25-sdcard.md:
extlinux search path settled [V], BL31 silence on uart1 expected,
uboot.env question settled: no.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… the diet

Renovate's rt bump moved board/mister/de10nano/patches/linux/linux.hash from
7.2.2 to 7.2.3. That file is the DE25's hash registry too (the board's
patches/linux/linux.hash is a relative symlink into it), and the sync script
REPLACES the 7.2.y line rather than adding one -- so the hazard
docs/buildroot-config.md filed as a "known follow-up" stopped being
hypothetical. configs/fragments/de25nano.fragment already carries 7.2.3 from
the rebase base; this commit makes the rest of the tree say so and, more to the
point, re-runs the evidence at the new pin instead of assuming it carried over.

Re-verified on a linux-dirclean rebuild against a freshly downloaded,
hash-verified linux-7.2.3.tar.xz (make de25, green, card checker included):

  - carried patch series: 34/34 applied at Buildroot's patch -F0, zero fuzz,
    zero rejects. 79 hunks relocated by line OFFSET only, which -F0 permits
    (-F caps context fuzz, not displacement).
  - kernel diet: 460 asked-for symbols (51 base + 409 shared fragment), ZERO
    dropped from the resolved config; zero merge_config redefinitions.
  - 92 =m symbols / 91 installed .ko.xz / 2,565,868 B of modules -- unchanged,
    and the installed module NAME SET is still exactly the DE10's (91 vs 91,
    empty diff both directions against output/build/linux-6.18.48).
  - check-kernel-fragment-noop.sh still PASSes on the DE10 tree.
  - u-boot.itb and bl31.bin are byte-identical to the 7.2.2 build, as they must
    be: nothing in the bootloader half depends on the kernel version. The board
    .dtb is byte-identical too, so mainline's socfpga_agilex5.dtsi did not move
    in the point release. Image differs (a stable-tree release changes code)
    while coincidentally keeping the same length.

All four golden hashes are unchanged: the normalisation deliberately drops the
two kernel-version symbols, so a pin bump must not move them, and does not.

Doc changes are the pin statements only. Dated measurements keep their 7.2.2
provenance and say so; the dtbs_check warning count was NOT re-run at 7.2.3 and
is labelled accordingly. Nothing here has been on hardware at 7.2.3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
The shared kernel fragment sets MODULE_COMPRESS_XZ but the DE25 stack
did not set BR2_PACKAGE_HOST_KMOD_XZ, so build-time depmod silently
produced a 0-line modules.dep and a 1-line modules.alias — the exact
trap docs/buildroot-config.md §3.5 records for the DE10. Found by the
rebase pass. After host-kmod-dirclean + make de25: modules.dep 91
lines, modules.alias 1,204, card checker passes. Golden refreshed for
the de25nano stack only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… exists

Copilot review on #138: the bl31.bin/u-boot.itb assertions ran
unconditionally, so the documented kernel/rootfs-only escape hatch
could never succeed, and the card branch reported 'no u-boot.itb'
whenever the variable was set even if a FIT had been built. Now the
env var only matters when u-boot.itb is absent: with a FIT present the
recipe behaves exactly as without the variable. check-kernel-fragment-
noop.sh: comment explaining that exported srctree is what lets conf
find Kconfig from the scratch dirs (the check runs and passes).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
The previous commit's if-block began with a literal '@' inside a
continued shell chain, which make passed through as a command (exit 2).
Verified: make -n de25 | bash -n clean for both variants, make de25
green end to end. Adds the srctree comment the previous message
described.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
echo "" \ + fi parsed as one command; now echo ""; \ then fi.
Proven: make -n de25 | bash -n clean for both variants, make de25 green
end to end (bl31, FIT, card all reported; checker passes).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
DE25-Nano wave 2: U-Boot/TF-A, bootable card image, kernel diet, 7.2.3 (stacked on #137)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The DE25 skip path can expose a stale bootable-card artifact, and several new script and documentation paths are currently incorrect.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 96/98 changed files
  • Comments generated: 4
  • Review effort level: Balanced

Comment thread board/mister/de25nano/post-image.sh
Comment thread scripts/check-kernel-fragment-noop.sh
Comment thread docs/buildroot-config.md Outdated
Comment thread docs/rt-beta-kernel.md Outdated
mcfbytes and others added 2 commits September 2, 2026 11:40
- post-image.sh: the DE25_ALLOW_NO_UBOOT skip path now removes any
  stale sdcard-de25.img / boot-de25.vfat so the de25 recipe cannot
  report a card this run did not produce (tested: stale file removed).
- check-kernel-fragment-noop.sh: canonicalise --fragment before the
  cd into the scratch dir (tested with a relative path).
- buildroot-config.md §10: BR2_PACKAGE_HOST_KMOD_XZ is set by both
  board fragments, each for its own depmod of the shared fragment's
  .ko.xz; not in common for the rule-4 reason.
- rt-beta-kernel.md: rt row names the 7.2.3 pin and the
  de10nano-kernel fragment stack instead of the deleted defconfig.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…-goal

Owner decision 2026-09-02: SMMU-off is the intended configuration, for
DE10 parity (Cyclone V has no SMMU) and because it is the precondition
for mainline stratix10-svc to program the fabric at all — mainline hands
the SDM physical addresses. Records the iommu.passthrough=1 runtime
equivalent for the hardware session, that SMMU-off is unproven not
disproven (U10), and the re-open triggers. implementation-path §3.1
carries a superseded note (smmu okay; svc override); the DTS rationale
§4 links the decision.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Clean-tree rebuild is byte-identical to itself (uboot-dirclean rerun),
but differs from the wave-2 tree's FIT by 8 bytes inside the uboot
payload with the same resolved config; cause not identified, boot
contract unaffected. Sizes/hashes updated; D2.8 should verify with two
clean CI builds before publishing attested hashes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
@mcfbytes
mcfbytes merged commit 93e407d into master Sep 3, 2026
8 checks passed
@mcfbytes
mcfbytes deleted the feature/config-fragments branch September 3, 2026 02:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants