Hi Sean,

On Thu, 18 Jul 2024 at 15:12, Sean Anderson <sean...@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 <s...@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

Reply via email to