[PATCH v6 14/25] spl: Add generic spl_load function

Simon Glass sjg at chromium.org
Wed Nov 8 05:23:58 CET 2023


On Sun, 5 Nov 2023 at 19:26, Sean Anderson <seanga2 at gmail.com> wrote:
>
> Implementers of SPL_LOAD_IMAGE_METHOD have to correctly determine what
> type of image is being loaded and then call the appropriate image load
> function correctly. This is tricky, because some image load functions
> expect the whole image to already be loaded (CONFIG_SPL_LOAD_FIT_FULL),
> some will load the image automatically using spl_load_info.read()
> (CONFIG_SPL_LOAD_FIT/CONFIG_SPL_LOAD_IMX_CONTAINER), and some just parse
> the header and expect the caller to do the actual loading afterwards
> (legacy/raw images). Load methods often only support a subset of the
> above methods, meaning that not all image types can be used with all
> load methods. Further, the code to invoke these functions is
> duplicated between different load functions.
>
> To address this problem, this commit introduces a "spl_load" function.
> It aims to handle image detection and correct invocation of each of the
> parse/load functions.
>
> Although this function generally results in a size reduction with
> several users, it tends to bloat boards with only a single user.
> This is generally because programmers open-coding the contents of this
> function can make optimizations based on the specific loader. For
> example, NOR flash is memory-mapped, so it never bothers calling
> load->read. The compiler can't really make these optimizations across
> translation units. LTO solves this, but it is only available on some
> arches. To address this, perform "pseudo-LTO" by inlining spl_load when
> there are one or fewer users. At the moment, there are no users, so
> define SPL_LOAD_USERS to be 0.
>
> Signed-off-by: Sean Anderson <seanga2 at gmail.com>
> ---
>
> Changes in v6:
> - Use pseudo-LTO for spl_load
> - Align reads to bl_len
>
> Changes in v5:
> - Load the header in spl_load as well
> - Don't bother trying to DMA-align the buffer, since we can't really fix
>   it.
>
> Changes in v4:
> - Fix format specifiers in debug prints
> - Reword/fix some of the doc comments for spl_load
>
> Changes in v3:
> - Fix using ffs instead of fls
> - Fix using not initializing bl_len when info->filename was NULL
>
> Changes in v2:
> - Use reverse-xmas-tree style for locals in spl_simple_read. This is not
>   complete, since overhead depends on bl_mask.
>
>  common/spl/spl.c   |  10 ++++
>  include/spl_load.h | 135 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 145 insertions(+)
>  create mode 100644 include/spl_load.h
>

Reviewed-by: Simon Glass <sjg at chromium.org>

Definitely a lot of effort on code size!


More information about the U-Boot mailing list