From d250f65cf6394adcfdf0d10262374be0dd1e7bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Wed, 17 Jun 2026 19:10:42 +0200 Subject: [PATCH] configs/aarch64_efi: support net boot with devicetree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UEFI platforms with a Devicetree have recently gained support for some form of network booting. [1][2] On those platforms, the UEFI firmware downloads the disk image over the network and presents it to UEFI applications using the simple filesystem protocol. This is sufficient for OS loaders such as e.g. GRUB to find their configuration and load the kernel image. The firmware must also describe the ramdisk to the OS, so that it finds its root filesystem. On ACPI based platforms this is done with an NVDIMM Firmware Interface Table (NFIT). On Devicetree based platforms, this can be done with a pmem node. [3] Add a kernel config fragment to add pmem support, which enables network boot on UEFI platforms with Devicetree. Also, briefly mention that we support this scenario in the readme. This can be tested on Qemu, with the following procedure: Build aarch64_efi_defconfig in a folder, to obtain output/images/disk.img, and serve the image over HTTP with python: $ python -m http.server -d output/images/ In another terminal and another folder, configure a U-Boot based firmware starting from qemu_aarch64_ebbr_defconfig, and with the following additional configurations: BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2026.04" BR2_TARGET_UBOOT_NEEDS_DTC=y Add the following U-Boot configurations to board/qemu/aarch64-ebbr/u-boot.fragment: CONFIG_EFI_HTTP_BOOT=y CONFIG_NET_LWIP=y Build everything; you should obtain output/images/flash.bin. Start Qemu as per board/qemu/aarch64-ebbr/readme.txt, but omitting the hd0 -device and -drive stanzas. U-Boot should start; interrupt it with enter. At U-Boot prompt, type the following commands: => setenv loadaddr 0x43000000 => efidebug boot rm 0 => efidebug boot add -u 0 net http://10.0.2.2:8000/disk.img => efidebug boot order 0 => bootefi bootmgr U-Boot should download the disk image over HTTP and boot Linux with UEFI. Look for the following message in Linux boot log, to confirm that it did indeed mount its rootfs from the downloaded image: EXT4-fs (pmem0p2): mounted filesystem ... Link: https://www.linaro.org/blog/installing-fedora-with-uefi-http-boot/ [1] Link: https://docs.u-boot-project.org/en/latest/develop/uefi/uefi.html#uefi-http-boot-using-the-legacy-tcp-stack [2] Link: https://github.com/ARM-software/edge-iot-arch-guide/blob/main/source/http-boot/pmem_node.md [3] Signed-off-by: Vincent Stehlé Cc: Dick Olsson Signed-off-by: Julien Olivain --- board/aarch64-efi/linux-pmem-netboot.fragment | 3 +++ board/aarch64-efi/readme.txt | 11 +++++++++++ configs/aarch64_efi_defconfig | 1 + 3 files changed, 15 insertions(+) create mode 100644 board/aarch64-efi/linux-pmem-netboot.fragment diff --git a/board/aarch64-efi/linux-pmem-netboot.fragment b/board/aarch64-efi/linux-pmem-netboot.fragment new file mode 100644 index 0000000000..8c3e910919 --- /dev/null +++ b/board/aarch64-efi/linux-pmem-netboot.fragment @@ -0,0 +1,3 @@ +CONFIG_BLK_DEV_PMEM=y +CONFIG_LIBNVDIMM=y +CONFIG_OF_PMEM=y diff --git a/board/aarch64-efi/readme.txt b/board/aarch64-efi/readme.txt index 0e7ea0b5dd..259eb5b8c9 100644 --- a/board/aarch64-efi/readme.txt +++ b/board/aarch64-efi/readme.txt @@ -48,6 +48,17 @@ alternative to QEMU_EFI.fd. You will also need to change the machine specification to "-M virt,secure=on" on qemu command line, to enable TrustZone support, and you will need to increase the memory with "-m 1024". +HTTP boot +--------- + +Some U-Boot and Devicetree based firmwares are capable of booting with UEFI from +HTTP(s). [4] + +The aarch64_efi_defconfig has appropriate persistent memory support compiled in +the Linux kernel to support this scenario. [5] + [1]: https://github.com/ARM-software/ebbr [2]: https://developer.arm.com/architectures/system-architectures/arm-systemready [3]: https://github.com/glikely/u-boot-tfa-build +[4]: https://docs.u-boot-project.org/en/latest/develop/uefi/uefi.html#uefi-http-boot-using-the-legacy-tcp-stack +[5]: https://github.com/ARM-software/edge-iot-arch-guide/blob/main/source/http-boot/pmem_node.md diff --git a/configs/aarch64_efi_defconfig b/configs/aarch64_efi_defconfig index 390f3fc6ac..78292c0cc4 100644 --- a/configs/aarch64_efi_defconfig +++ b/configs/aarch64_efi_defconfig @@ -11,6 +11,7 @@ BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_VERSION=y BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.18.14" BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y +BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="board/aarch64-efi/linux-pmem-netboot.fragment" BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y BR2_LINUX_KERNEL_NEEDS_HOST_PYTHON3=y BR2_TARGET_ROOTFS_EXT2=y