[U-Boot] [PATCH v1 1/4] spl: record boot_device into spl_image and call spl_perform_fixups
Lukasz Majewski
lukma at denx.de
Thu May 24 22:11:26 UTC 2018
Hi Philipp,
> On some boards, we want to give the board/architecture-specific code a
> chance to look at where the next image has been loaded from and
> perform fixups before starting the next image. This is of particular
> importance, when we probe multiple devices for bootable payloads and
> boot the first one found.
>
> This change adds the following:
> - we record the boot_device used into the spl_image structure
> - we provide an extension-point for boards/architectures that can
> perform late fixups depending on a fully populated spl_image
> structure (i.e. we'll know the final boot_device and have info
> on the image type and operating system to be booted).
>
> Signed-off-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> Tested-by: Klaus Goger <klaus.goger at theobroma-systems.com>
> ---
>
> common/spl/spl.c | 12 +++++++++++-
> include/spl.h | 7 +++++++
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/common/spl/spl.c b/common/spl/spl.c
> index a09ada3..a1e7b9f 100644
> --- a/common/spl/spl.c
> +++ b/common/spl/spl.c
> @@ -80,6 +80,11 @@ int __weak bootz_setup(ulong image, ulong *start,
> ulong *end) }
> #endif
>
> +/* Weak default function for arch/board-specific fixups to the
> spl_image_info */ +void __weak spl_perform_fixups(struct
> spl_image_info *spl_image) +{
> +}
> +
> void spl_fixup_fdt(void)
> {
> #if defined(CONFIG_SPL_OF_LIBFDT) &&
> defined(CONFIG_SYS_SPL_ARGS_ADDR) @@ -445,8 +450,10 @@ static int
> boot_from_devices(struct spl_image_info *spl_image, else
> puts("SPL: Unsupported Boot Device!\n");
> #endif
> - if (loader && !spl_load_image(spl_image, loader))
> + if (loader && !spl_load_image(spl_image, loader)) {
> + spl_image->boot_device = spl_boot_list[i];
> return 0;
> + }
> }
>
> return -ENODEV;
> @@ -498,6 +505,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
> #ifdef CONFIG_SYS_SPL_ARGS_ADDR
> spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
> #endif
> + spl_image.boot_device = BOOT_DEVICE_NONE;
> board_boot_order(spl_boot_list);
>
> if (boot_from_devices(&spl_image, spl_boot_list,
> @@ -506,6 +514,8 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
> hang();
> }
>
> + spl_perform_fixups(&spl_image);
> +
> #ifdef CONFIG_CPU_V7M
> spl_image.entry_point |= 0x1;
> #endif
> diff --git a/include/spl.h b/include/spl.h
> index 8454ea7..8628787 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -29,6 +29,7 @@ struct spl_image_info {
> #if CONFIG_IS_ENABLED(LOAD_FIT)
> void *fdt_addr;
> #endif
> + u32 boot_device;
> u32 size;
> u32 flags;
> void *arg;
> @@ -296,4 +297,10 @@ void spl_invoke_atf(struct spl_image_info
> *spl_image);
> * can implement 'board_return_to_bootrom'.
> */
> void board_return_to_bootrom(void);
> +
> +/**
> + * spl_perform_fixups() - arch/board-specific callback before
> processing
> + * the boot-payload
> + */
> +void spl_perform_fixups(struct spl_image_info *spl_image);
> #endif
Have I understood correctly that after applying this patch I can define
my own spl_perform_fixup() function in my board's spl.c and then decide
if I want to boot kernel/u-boot proper from eMMC, even if I started the
boot process from SPI-NOR (where SPL is placed) ?
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180525/cd2eab21/attachment.sig>
More information about the U-Boot
mailing list