EBBR-style firmware owns the devicetree: the OS is booted via UEFI and
receives the devicetree from the firmware through the EFI configuration
table instead of shipping its own. U-Boot has the handoff mechanism
(efi_install_fdt()), but no generic way to describe and load the
firmware-owned source. As a result, platforms carry downstream commands
to provide it.

This series adds a firmware-FDT uclass with storage-specific source
drivers and common FIT selection, verification, overlay assembly and
caching:

- one FIT ("fdt.itb" by default) carries the base devicetree and its
  overlays. FIT configurations describe valid combinations, so a signed
  configuration authenticates the base, overlay set and ordering;

- the first backend, selected by a standalone
  'u-boot,firmware-fdt-block' control-DT node, reads the FIT from a
  filesystem on a GPT partition. The compatible suffix leaves room for
  drivers which obtain the same FIT from other firmware storage;

- 'fw_fdt_part' can override the partition for A/B firmware selection,
  while 'fw_fdt_config' can select the configuration for the current boot
  policy. Otherwise compatible best-match against the control devicetree
  is used, falling back to the FIT default;

- the source device caches the assembled result by those two selectors,
  avoiding repeated reads and verification while the EFI bootmeth scans
  bootflow candidates;

- once a source is configured, any failure to assemble the devicetree is
  fatal rather than silently falling back to an unverified source. Every
  image is verified up front so a corrupt overlay cannot be silently
  skipped.

The loader does not depend on standard boot. EFI is its first consumer,
but the source drivers, FIT handling and staging interface are generic.
Both the EFI bootmeth and EFI boot manager use the same staging helper.

Patch 1 makes an FDT passed to efi_bootmgr_run() outrank a Boot#### FDT,
as an independent behaviour fix. Patch 2 adds the uclass, block backend,
documentation and staging interface. Patches 3 and 4 integrate the EFI
bootmeth and boot manager. Patch 5 adds sandbox coverage.

Signed-off-by: Carlo Caione <[email protected]>
---
Changes in v3:
- Model firmware-FDT sources as a uclass with storage backend drivers;
  split out the block backend and reject multiple enabled sources.
- Cache the verified, assembled devicetree by the partition and
  configuration runtime selectors.
- Rename efi_stage_firmware_fdt() to the generic firmware_fdt_stage().
- Add separate configurable size limits for the input FIT and assembled
  devicetree.
- Validate the assembled devicetree before publishing it and avoid
  duplicating the internal FIT filename.
- Keep EFI and firmware-FDT sizes separate in the boot manager and retain
  the FIT filename for failure diagnostics.
- Extend sandbox coverage for caching and selector invalidation, a missing
  FIT and multiple configured sources.
- Use the current SystemReady DeviceTree name.
- Clarify fw_fdt_part as the A/B partition override and fw_fdt_config as
  the per-boot-target configuration override accepted in the v2 review.
- Add Reviewed-by tags from Ilias Apalodimas and Simon Glass to patch 1.
- Link to v2: 
https://patch.msgid.link/[email protected]

Changes in v2:
- Make the loader independent of bootstd and describe EFI as its first
  consumer.
- Describe the source with a standalone compatible node which points to
  the backing media through a phandle.
- Rename 'boot_dtb' to 'fw_fdt_part' and document both environment
  variables in doc/usage/environment.rst.
- Factor EFI staging and fail-closed policy into one helper used by all
  three call sites.
- Track the assembled FDT's ownership explicitly and own the FIT filename.
- Select FIT_BEST_MATCH and add explicit compatible-selection coverage.
- Split the passed-FDT precedence change into its own first patch.
- Build the entire sandbox source topology at runtime, store mmc11.img in
  persistent_data_dir and add staging, configuration-chaining and corrupt
  base/overlay fail-closed coverage.
- Link to v1: 
https://patch.msgid.link/[email protected]

---
Carlo Caione (5):
      efi_loader: bootmgr: preserve a passed devicetree
      boot: add a firmware-owned devicetree source
      bootmeth: efi: use the firmware-owned devicetree
      efi_loader: bootmgr: install the firmware-owned devicetree
      test: boot: add firmware-FDT source tests

 MAINTAINERS                               |   3 +
 boot/Kconfig                              |  49 +++
 boot/Makefile                             |   2 +
 boot/bootmeth_efi.c                       |  45 ++-
 boot/firmware_fdt.c                       | 303 ++++++++++++++++++
 boot/firmware_fdt_block.c                 | 143 +++++++++
 boot/image-fdt.c                          |   3 +-
 boot/image-fit.c                          |   9 +-
 configs/sandbox_defconfig                 |   1 +
 doc/develop/uefi/firmware_fdt.rst         | 118 +++++++
 doc/develop/uefi/index.rst                |   1 +
 doc/device-tree-bindings/firmware-fdt.txt | 160 ++++++++++
 doc/usage/environment.rst                 |  13 +
 include/dm/uclass-id.h                    |   1 +
 include/firmware_fdt.h                    | 106 +++++++
 include/image.h                           |   5 +-
 lib/efi_loader/efi_bootmgr.c              |  45 ++-
 test/boot/Makefile                        |   1 +
 test/boot/firmware_fdt.c                  | 498 ++++++++++++++++++++++++++++++
 test/py/tests/test_ut.py                  | 183 +++++++++++
 20 files changed, 1670 insertions(+), 19 deletions(-)
---
base-commit: 3f19667468fb93bcb5702d23aa057b72639e3ac8
change-id: 20260706-ccaione-upstream-ebbr-206c30be3a3a

Best regards,
--  
Carlo Caione <[email protected]>

Reply via email to