All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Golle <daniel@makrotopia.org>
To: Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>,
	Daniel Golle <daniel@makrotopia.org>,
	Dario Binacchi <dario.binacchi@amarulasolutions.com>,
	Michael Trimarchi <michael@amarulasolutions.com>,
	Frieder Schrempf <frieder.schrempf@kontron.de>,
	Quentin Schulz <quentin.schulz@cherry.de>,
	Marek Vasut <marek.vasut+renesas@mailbox.org>,
	"Lucien.Jheng" <lucienzx159@gmail.com>,
	Casey Connolly <casey.connolly@linaro.org>,
	Michal Simek <michal.simek@amd.com>,
	Johan Jonker <jbx6244@gmail.com>,
	Aristo Chen <aristo.chen@canonical.com>,
	Nora Schiffer <nora.schiffer@ew.tq-group.com>,
	Rasmus Villemoes <rv@rasmusvillemoes.dk>,
	Weijie Gao <weijie.gao@mediatek.com>, Peng Fan <peng.fan@nxp.com>,
	Vincent Jardin <vjardin@free.fr>,
	Neil Armstrong <neil.armstrong@linaro.org>,
	Randolph Sapp <rs@ti.com>,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	Richard Genoud <richard.genoud@bootlin.com>,
	u-boot@lists.u-boot-project.org, openwrt-devel@lists.openwrt.org
Subject: [PATCH 0/9] boot: add imagemap on-demand image loading from storage
Date: Sun, 23 Aug 2026 20:12:43 +0100	[thread overview]
Message-ID: <cover.1787272661.git.daniel@makrotopia.org> (raw)

This series adds "imagemap", a small layer for reading FIT images
directly from storage on demand instead of copying the whole image
into RAM first. It keeps a translation table of the byte ranges
already loaded, so a header probe, signature verification and the
final load can reuse a single read, and it hooks transparently into
fit_image_load() so all existing verification and decompression paths
run unchanged for both RAM- and storage-backed images.

An imagemap device is created over a partition of a block device. That
covers more than raw disks: an MTD partition is reached through
mtdblock and a UBI volume through ubiblock, each exposed as a named
block-device partition, so imagemap carries no storage-specific code
of its own. NAND bad-block handling and wear-levelling stay with UBI,
as they do elsewhere in U-Boot; on NOR a partition is read linearly
with end-to-end integrity guaranteed by the FIT hash or signature.

To make those two paths reachable and testable, the first patches fill
in the missing block devices: a non-NAND MTD master now gets an
mtd_blk device automatically (patch 1), and attaching UBI now binds a
ubi_blk device on any flash (patch 3, which makes the SPI-NAND-only
eager binding redundant, dropped in patch 4).

The read path is built on the SPL struct spl_load_info abstraction and
a new spl_load_region() helper. imagemap is full-U-Boot only; the SPL
FIT loader is unaffected.

Testing (sandbox): "ut imagemap" (13 tests) covers the
translation-table core plus real end-to-end reads of a NOR partition
through mtd_blk and a UBI volume through ubiblock; a CONFIG_IMAGEMAP=n
build is unaffected.

On hardware it has been tested end-to-end on a BananaPi R3 (mt7986),
booting a dm-verity-protected rootfs from every storage path the board
exposes: eMMC and SD (block partition), SPI-NAND (UBI volume via
ubiblock) and SPI-NOR (raw MTD partition via mtdblock). The first
in-tree consumer, a bootmeth for OpenWrt-style FIT firmware, will
follow as a separate series.

This series began as part of a combined RFC that also carried the
OpenWrt boot method and its bootdevs [1]. Following the review there
it has been reworked substantially:

  - Build on U-Boot's existing SPL external-data loading path rather
    than a new abstraction: imagemap now uses struct spl_load_info and
    a new spl_load_region() helper (suggested by Marek Vasut).

  - Do not extend the bootm command with a storage source; on-demand
    loading hooks into fit_image_load() transparently, and the in-tree
    consumer is a bootstd boot method reached through
    bootflow/bootdev/bootmeth rather than new bootm syntax (per Tom
    Rini).

  - Move the storage-backed path out of the long fit_image_load() into
    its own helper, gated with if()/tools_build() instead of an inline
    #if (per Simon Glass).

  - Collapse the three storage-specific backends (block, MTD and UBI)
    into a single block backend: NOR is read through mtd_blk and
    SPI-NAND through UBI/ubiblock, so imagemap holds no
    storage-specific code.

  - Send the on-demand loading core on its own; the OpenWrt boot
    method, the MTD/UBI bootdevs and board enablement follow as
    separate series once this lands.

In order to test imagemap end-to-end with the intended bootmeth user
I'm still relying on the downstream install-uuid mechanism of [2],
which [3] could supersede. Both have stalled right now.

[1] https://lore.kernel.org/u-boot/cover.1771275704.git.daniel@makrotopia.org/
[2] https://github.com/open-source-firmware/flat-image-tree/pull/40
[3] https://github.com/open-source-firmware/flat-image-tree/pull/44

Based on u-boot/next.
Daniel Golle (9):
  mtd: bind an mtd_blk device for non-NAND MTD masters
  mtd: nand: sandbox: forbid sub-page writes
  cmd: ubi: create a ubi_blk device when attaching UBI
  mtd: nand: spi: drop the eager ubi_blk binding
  boot: add imagemap on-demand loading from storage
  boot: fit: support on-demand loading in fit_image_load()
  configs: sandbox: enable imagemap and its storage backends
  test: boot: add imagemap unit tests
  doc: imagemap: document on-demand loading framework

 MAINTAINERS                      |   9 +
 arch/sandbox/dts/test.dts        |  29 ++
 boot/Kconfig                     |  16 +
 boot/Makefile                    |   2 +
 boot/bootm.c                     |  70 +++-
 boot/image-fit.c                 | 109 +++++-
 boot/imagemap.c                  | 451 +++++++++++++++++++++
 cmd/ubi.c                        |  27 ++
 configs/sandbox_defconfig        |   6 +
 doc/develop/imagemap.rst         | 100 +++++
 doc/develop/index.rst            |   1 +
 drivers/mtd/mtdcore.c            |  24 ++
 drivers/mtd/nand/raw/sand_nand.c |   2 +
 drivers/mtd/nand/spi/core.c      |   3 -
 include/bootm.h                  |   2 +
 include/dm/uclass-id.h           |   1 +
 include/image.h                  |   2 +
 include/imagemap.h               | 136 +++++++
 include/spl.h                    |  47 ++-
 test/boot/Makefile               |   2 +
 test/boot/imagemap.c             | 645 +++++++++++++++++++++++++++++++
 test/cmd_ut.c                    |   2 +
 22 files changed, 1671 insertions(+), 15 deletions(-)
 create mode 100644 boot/imagemap.c
 create mode 100644 doc/develop/imagemap.rst
 create mode 100644 include/imagemap.h
 create mode 100644 test/boot/imagemap.c


base-commit: 8841b7b292c74864acf4ed0bd8ce05839252c1f2
-- 
2.55.0

             reply	other threads:[~2026-08-23 19:13 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-23 19:12 Daniel Golle [this message]
2026-08-23 19:13 ` [PATCH 1/9] mtd: bind an mtd_blk device for non-NAND MTD masters Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:13 ` [PATCH 2/9] mtd: nand: sandbox: forbid sub-page writes Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:13 ` [PATCH 3/9] cmd: ubi: create a ubi_blk device when attaching UBI Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:13 ` [PATCH 4/9] mtd: nand: spi: drop the eager ubi_blk binding Daniel Golle
2026-08-23 19:13 ` [PATCH 5/9] boot: add imagemap on-demand loading from storage Daniel Golle
2026-08-24 22:55   ` Tom Rini
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:14 ` [PATCH 6/9] boot: fit: support on-demand loading in fit_image_load() Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:14 ` [PATCH 7/9] configs: sandbox: enable imagemap and its storage backends Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:16 ` [PATCH 8/9] test: boot: add imagemap unit tests Daniel Golle
2026-09-28 15:12   ` Simon Glass
2026-08-23 19:16 ` [PATCH 9/9] doc: imagemap: document on-demand loading framework Daniel Golle
2026-09-28 15:17   ` Simon Glass
2026-08-24 22:59 ` [PATCH 0/9] boot: add imagemap on-demand image loading from storage Tom Rini
2026-09-28 15:13 ` [0/9] " Simon Glass
2026-09-29  0:32   ` Daniel Golle
2026-10-01 17:23     ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1787272661.git.daniel@makrotopia.org \
    --to=daniel@makrotopia.org \
    --cc=aristo.chen@canonical.com \
    --cc=casey.connolly@linaro.org \
    --cc=dario.binacchi@amarulasolutions.com \
    --cc=frieder.schrempf@kontron.de \
    --cc=jbx6244@gmail.com \
    --cc=lucienzx159@gmail.com \
    --cc=marek.vasut+renesas@mailbox.org \
    --cc=michael@amarulasolutions.com \
    --cc=michal.simek@amd.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=neil.armstrong@linaro.org \
    --cc=nora.schiffer@ew.tq-group.com \
    --cc=openwrt-devel@lists.openwrt.org \
    --cc=peng.fan@nxp.com \
    --cc=quentin.schulz@cherry.de \
    --cc=richard.genoud@bootlin.com \
    --cc=rs@ti.com \
    --cc=rv@rasmusvillemoes.dk \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.u-boot-project.org \
    --cc=vjardin@free.fr \
    --cc=weijie.gao@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.