Add support for jumping to Linux kernel through OpTee-OS on ARMv7a to SPL. This is already supported on ARMv8a, this patch adds the ARMv7a support. Extend the SPL fitImage loader to record OpTee-OS load address and in case the load address is non-zero, use the same bootm-optee.S code used by the U-Boot fitImage jump code to start OpTee-OS first and jump to Linux next.
Signed-off-by: Marek Vasut <marek.va...@mailbox.org> --- Cc: Heinrich Schuchardt <xypron.g...@gmx.de> Cc: Ilias Apalodimas <ilias.apalodi...@linaro.org> Cc: Janne Grunau <j...@jannau.net> Cc: Mattijs Korpershoek <mkorpersh...@kernel.org> Cc: Patrick Rudolph <patrick.rudo...@9elements.com> Cc: Sam Edwards <cfswo...@gmail.com> Cc: Simon Glass <s...@chromium.org> Cc: Tom Rini <tr...@konsulko.com> Cc: u-boot@lists.denx.de --- arch/arm/lib/spl.c | 8 ++++++++ common/spl/spl_fit.c | 20 ++++++++++++++++++++ include/spl.h | 3 +++ 3 files changed, 31 insertions(+) diff --git a/arch/arm/lib/spl.c b/arch/arm/lib/spl.c index c43a63f1819..f41a53f0ed2 100644 --- a/arch/arm/lib/spl.c +++ b/arch/arm/lib/spl.c @@ -16,6 +16,7 @@ #include <asm/global_data.h> #include <linux/compiler.h> #include <asm/mach-types.h> +#include <asm/armv7.h> #ifndef CONFIG_SPL_DM /* Pointer to as well as the global data structure for SPL */ @@ -72,6 +73,13 @@ void __noreturn jump_to_image_linux(struct spl_image_info *spl_image) image_entry_arg_t image_entry = (image_entry_arg_t)(uintptr_t) spl_image->entry_point; cleanup_before_linux(); +#if defined(CONFIG_BOOTM_OPTEE) && defined(CONFIG_ARM) && !defined(CONFIG_ARM64) + if (spl_image->optee_addr) + boot_jump_linux_via_optee((void *)(spl_image->entry_point), + machid, + (u32)(spl_image->arg), + spl_image->optee_addr); +#endif image_entry(0, machid, spl_image->arg); } #endif /* CONFIG_ARM64 */ diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 86506d6905c..294fb49b9e6 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -544,6 +544,23 @@ static int spl_fit_image_is_fpga(const void *fit, int node) return !strcmp(type, "fpga"); } +static void spl_fit_image_record_arm32_optee(const void *fit, int node, + struct spl_image_info *spl_image, + struct spl_image_info *image_info) +{ +#if defined(CONFIG_BOOTM_OPTEE) && defined(CONFIG_ARM) && !defined(CONFIG_ARM64) + const char *type = fdt_getprop(fit, node, FIT_TYPE_PROP, NULL); + + if (!type) + return; + + if (strcmp(type, "tee")) + return; + + spl_image->optee_addr = image_info->load_addr; +#endif +} + static int spl_fit_image_get_os(const void *fit, int noffset, uint8_t *os) { if (!CONFIG_IS_ENABLED(FIT_IMAGE_TINY) || CONFIG_IS_ENABLED(OS_BOOT)) @@ -859,6 +876,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, image_info.entry_point != FDT_ERROR) spl_image->entry_point = image_info.entry_point; + spl_fit_image_record_arm32_optee(ctx.fit, node, spl_image, + &image_info); + /* Record our loadables into the FDT */ if (!CONFIG_IS_ENABLED(FIT_IMAGE_TINY) && xpl_get_fdt_update(info) && spl_image->fdt_addr) diff --git a/include/spl.h b/include/spl.h index 850c64d4b19..a51dfa4f494 100644 --- a/include/spl.h +++ b/include/spl.h @@ -288,6 +288,9 @@ struct spl_image_info { ulong entry_point; #if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL) void *fdt_addr; +#endif +#if defined(CONFIG_BOOTM_OPTEE) && defined(CONFIG_ARM) && !defined(CONFIG_ARM64) + ulong optee_addr; #endif u32 boot_device; u32 offset; -- 2.47.2