[PATCH v2 20/21] sandbox: Add an SPL loader for UPL

Simon Glass sjg at chromium.org
Sat Jul 20 14:36:10 CEST 2024


Hi Sean,

On Thu, 18 Jul 2024 at 15:12, Sean Anderson <seanga2 at gmail.com> wrote:
>
> On 7/13/24 03:00, Simon Glass wrote:
> > Add support for loading a UPL image from SPL. This uses the simple FIT
> > implementation, but also loads the full FIT just to permit more testing.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > (no changes since v1)
> >
> >   arch/sandbox/cpu/spl.c         | 49 +++++++++++++++++++++++++++++++++-
> >   arch/sandbox/include/asm/spl.h |  1 +
> >   2 files changed, 49 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/sandbox/cpu/spl.c b/arch/sandbox/cpu/spl.c
> > index 39869f27a7b..f665f86d64c 100644
> > --- a/arch/sandbox/cpu/spl.c
> > +++ b/arch/sandbox/cpu/spl.c
> > @@ -3,14 +3,18 @@
> >    * Copyright (c) 2016 Google, Inc
> >    */
> >
> > +#define LOG_CATEGORY LOGC_BOOT
> > +
> >   #include <dm.h>
> >   #include <hang.h>
> >   #include <handoff.h>
> >   #include <image.h>
> >   #include <init.h>
> >   #include <log.h>
> > +#include <mapmem.h>
> >   #include <os.h>
> >   #include <spl.h>
> > +#include <upl.h>
> >   #include <asm/global_data.h>
> >   #include <asm/spl.h>
> >   #include <asm/state.h>
> > @@ -52,7 +56,8 @@ void board_init_f(ulong flag)
> >   void board_boot_order(u32 *spl_boot_list)
> >   {
> >       spl_boot_list[0] = BOOT_DEVICE_VBE;
> > -     spl_boot_list[1] = BOOT_DEVICE_BOARD;
> > +     spl_boot_list[1] = BOOT_DEVICE_UPL;
> > +     spl_boot_list[2] = BOOT_DEVICE_BOARD;
> >   }
> >
> >   static int spl_board_load_file(struct spl_image_info *spl_image,
> > @@ -246,3 +251,45 @@ int sandbox_spl_load_fit(char *fname, int maxlen, struct spl_image_info *image)
> >
> >       return 0;
> >   }
> > +
> > +static int upl_load_from_image(struct spl_image_info *spl_image,
> > +                            struct spl_boot_device *bootdev)
> > +{
> > +     long long size;
> > +     char *fname;
> > +     int ret, fd;
> > +     ulong addr;
> > +
> > +     if (!CONFIG_IS_ENABLED(UPL_OUT))
> > +             return -ENOTSUPP;
> > +
> > +     spl_upl_init();
> > +     fname = os_malloc(256);
> > +
> > +     ret = sandbox_spl_load_fit(fname, 256, spl_image);
> > +     if (ret)
> > +             return log_msg_ret("fit", ret);
> > +     spl_image->flags = SPL_SANDBOXF_ARG_IS_BUF;
> > +     spl_image->arg = map_sysmem(spl_image->load_addr, 0);
> > +     /* size is set by load_simple_fit(), offset is left as 0 */
> > +
> > +     /* now read the whole FIT into memory */
>
> Why do we have to do this? Didn't we just load the FIT in sandbox_spl_load_fit?

Sort-of, but really SPL the simple FIT loader just loads the images,
not the entire FIT. It is loaded here just for the benefit for the
test, which wants to check that the offsets provided in UPL are
correct.

>
> > +     fd = os_open(fname, OS_O_RDONLY);
> > +     if (fd < 0)
> > +             return log_msg_ret("op2", -ENOENT);
> > +     if (os_get_filesize(fname,  &size))
> > +             return log_msg_ret("fis", -ENOENT);
> > +
> > +     /* place it after the loaded image, allowing plenty of space */
> > +     addr = ALIGN(spl_image->load_addr + size, 0x1000);
> > +     log_debug("Loading whole FIT to %lx\n", addr);
> > +     if (os_read(fd, map_sysmem(addr, 0), size) != size)
> > +             return log_msg_ret("rea", -EIO);
> > +     os_close(fd);
> > +
> > +     /* tell UPL where it is */
> > +     upl_set_fit_addr(addr);
> > +
> > +     return 0;
> > +}
> > +SPL_LOAD_IMAGE_METHOD("upl", 4, BOOT_DEVICE_UPL, upl_load_from_image);
> > diff --git a/arch/sandbox/include/asm/spl.h b/arch/sandbox/include/asm/spl.h
> > index d50d9ad6b48..d824b2123a2 100644
> > --- a/arch/sandbox/include/asm/spl.h
> > +++ b/arch/sandbox/include/asm/spl.h
> > @@ -18,6 +18,7 @@ enum {
> >       BOOT_DEVICE_NOR,
> >       BOOT_DEVICE_SPI,
> >       BOOT_DEVICE_NAND,
> > +     BOOT_DEVICE_UPL,
> >   };
> >
> >   /**
>

Regards,
Simon


More information about the U-Boot mailing list