Re: [PATCH v2 03/10] spl: ufs: add Falcon mode load path

Alexey Charkov <[email protected]> Tue, 4 Aug 2026 18:09:03 +0400
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <CAKTNdwHH1tJ3yuRDEA0BZy1mMeqkAK4958ix144_hjEgb--+sg@mail.gmail.com>
Hi Simon,

On Tue, Aug 4, 2026 at 5:02=E2=80=AFPM Simon Glass <[email protected]> wrote=
:
>
> Hi Alexey,
>
> On 2026-07-31T17:10:44, Alexey Charkov <[email protected]> wrote:
> > spl: ufs: add Falcon mode load path
> >
> > In Falcon mode, the SPL loads a FIT image containing a Linux kernel
> > instead of U-boot proper, and it may need to fall back to loading U-boo=
t
> > if Linux is unavailable.
> >
> > Add support for images containing a Linux kernel, optionally on a
> > different UFS LUN and/or offset vs. U-boot proper to enable fallback.
> >
> > Signed-off-by: Alexey Charkov <[email protected]>
> >
> > common/spl/Kconfig   | 23 +++++++++++++++++++++
> >  common/spl/spl_ufs.c | 58 ++++++++++++++++++++++++++++++++++++++++++++=
++++++--
> >  2 files changed, 79 insertions(+), 2 deletions(-)
>
> >     In Falcon mode, the SPL loads a FIT image containing a Linux kernel
> >     instead of U-boot proper, and it may need to fall back to loading U=
-boot
> >     if Linux is unavailable.
>
> Please spell it 'U-Boot' (both occurrences). Since this patch actually
> accepts TF-A and TEE payloads too, please mention that here - the
> current wording suggests only a Linux kernel is expected.

Ack

> > diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c
> > @@ -20,13 +20,38 @@ static ulong spl_ufs_load_read(struct spl_load_info=
 *load, ulong off, ulong size
> > +     if (spl_image->os !=3D IH_OS_LINUX && spl_image->os !=3D IH_OS_TE=
E &&
> > +         spl_image->os !=3D IH_OS_ARM_TRUSTED_FIRMWARE) {
> > +             puts("Expected OS image is not found\n");
> > +             return -ENOENT;
> > +     }
>
> The equivalent check in mmc_load_image_raw_os() only accepts LINUX and
> TEE - the ARM_TRUSTED_FIRMWARE addition is new and specific to this
> series. Please mention that in the commit message so it is not
> mistaken for a copy/paste divergence, and consider whether the
> mmc/nand/spi paths should have the same relaxation in a follow-up.

Will do. I only tested the UFS and RAM boot paths, so I haven't
touched the others. I'll see if I can test MMC/SPI too (I don't have
any NAND-equipped board).

> > diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c
> > @@ -20,13 +20,38 @@ static ulong spl_ufs_load_read(struct spl_load_info=
 *load, ulong off, ulong size
> > +static int spl_ufs_load_image_raw_os(struct spl_image_info *spl_image,
> > +                                  struct spl_boot_device *bootdev,
> > +                                  struct spl_load_info *load,
> > +                                  struct blk_desc *bd)
> > +{
> > +     ulong sector =3D config_opt_enabled(CONFIG_SPL_OS_BOOT,
> > +                                       CONFIG_SPL_UFS_RAW_OS_SECTOR,
> > +                                       CONFIG_SPL_UFS_RAW_U_BOOT_SECTO=
R);
>
> bd here is just load->priv - please drop the extra parameter and fetch
> log2blksz from load->priv, matching how spl_ufs_load_read() already
> does it. Also, config_opt_enabled() is redundant: this helper is only
> reachable from the OS_BOOT branch below, so
> CONFIG_SPL_UFS_RAW_OS_SECTOR is always defined - just use it directly.

I believe dropping the guard caused compilation errors for the
non-Falcon case, as apparently GCC 15 didn't dead-code-eliminate it.
Will re-test.

> > diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c
> > @@ -36,6 +61,35 @@ static int spl_ufs_load_image(struct spl_image_info =
*spl_image,
> > +             if (os_devnum =3D=3D devnum) {
> > +                     os_bd =3D bd;
> > +                     os_load =3D load;
> > +             } else {
>
> The struct copy of load into os_load is unusual - spl_load_info is
> meant to be initialised through spl_load_init(). Since the two
> branches only diverge when the device differs, please just pass &load,
> bd to the helper in the equal case and drop os_load entirely; only the
> !=3D branch needs a second spl_load_info.

Ack

> > diff --git a/common/spl/spl_ufs.c b/common/spl/spl_ufs.c
> > @@ -36,6 +61,35 @@ static int spl_ufs_load_image(struct spl_image_info =
*spl_image,
> > +             puts("spl_ufs_load_image: Failed to load falcon payload\n=
");
> > +             log_debug("(error=3D%d)\n", err);
> > +             if (CONFIG_IS_ENABLED(OS_BOOT_SECURE))
> > +                     return err;
> > +     }
> > +
> > +load_uboot:
>
> The other backends (spl_mmc, spl_nor, ...) print 'Fallback to U-Boot'
> before dropping through - please do the same here for consistency,
> otherwise the boot log just shows the failure with no indication that
> fallback is happening.

Ack

Thanks a lot for looking into this!

Best regards,
Alexey