Re: [PATCH 5/9] boot: add imagemap on-demand loading from storage

Tom Rini <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <20260824225509.GN523975@bill-the-cat>
On Sun, Aug 23, 2026 at 08:13:55PM +0100, Daniel Golle wrote:
> Introduce imagemap, a small layer that reads image data from a storage
> device on demand and keeps a translation table of the byte ranges
> already loaded into RAM, instead of copying the whole image up front.
> 
> An imagemap device (UCLASS_IMAGEMAP) is created over a partition of a
> block device with imagemap_create(); imagemap_map() then returns a RAM
> pointer for any byte range, reading it in on first access and reusing
> it on later accesses -- so a header probe, verification and the final
> load of the same range share a single read. Block devices cover 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 needs no storage-specific code of its own.
> 
> The read path is built on the SPL struct spl_load_info abstraction and
> a new spl_load_region() helper (added to spl.h): the block reader
> reports the device block length and spl_load_region() performs the
> native sector alignment. imagemap_map_to() keeps a payload byte-exact
> at a caller's load address, reading the aligned middle straight to the
> destination and bouncing only the partial head/tail block.
> 
> Regions that are not placed at a caller-supplied address are allocated
> through the LMB allocator and released on cleanup; the translation
> table doubles as the registry of those allocations. imagemap is gated
> to the full-U-Boot phase, so SPL and TPL carry no new cost.
> 
> Signed-off-by: Daniel Golle <[email protected]>
> ---
[snip]
> diff --git a/include/spl.h b/include/spl.h
> index 5078d7525ab..24df44d23e1 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -350,10 +350,21 @@ typedef ulong (*spl_load_reader)(struct spl_load_info *load, ulong sector,
>   * @phase: Image phase to load
>   * @no_fdt_update: true to update the FDT with any loadables that are loaded
>   */
> +/*
> + * struct spl_load_info carries a device block length for the SPL block
> + * loaders (CONFIG_SPL_LOAD_BLOCK) and, in full U-Boot, for the imagemap
> + * on-demand loader (CONFIG_IMAGEMAP);

This part should be made clear in updates to the existing comment block.

> imagemap is gated out of the xpl
> + * phases so SPL and TPL carry no new cost.

This doesn't need to be noted I think because..

> + */
> +#if IS_ENABLED(CONFIG_SPL_LOAD_BLOCK) || \
> +	(IS_ENABLED(CONFIG_IMAGEMAP) && !defined(CONFIG_XPL_BUILD))
> +#define SPL_LOAD_INFO_HAS_BL_LEN
> +#endif
> +
>  struct spl_load_info {
>  	spl_load_reader read;
>  	void *priv;
> -#if IS_ENABLED(CONFIG_SPL_LOAD_BLOCK)
> +#ifdef SPL_LOAD_INFO_HAS_BL_LEN

Why not just:
#if IS_ENABLED(CONFIG_SPL_LOAD_BLOCK) || CONFIG_IS_ENABLED(IMAGEMAP)

? Then for when someone says "Ah, I want to do all of this right in SPL"
there's less changes.

-- 
Tom
signature.asc (application/pgp-signature, 228 B)
-----BEGIN PGP SIGNATURE-----

iHUEABYKAB0WIQTzzqh0PWDgGS+bTHor4qD1Cr/kCgUCaozLyQAKCRAr4qD1Cr/k
CokTAP9Ea1Gn/wH0kP2wWqTYAz2p/jwFvrOF7TvewP5ItNTJeQD/XZFinbhSoz2r
/zW8BWmrp/NACnitD2IpKJKmtd051QQ=
=gKL3
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.