@@ -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 */
@@ -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)
@@ -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;
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.vasut@mailbox.org> --- Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> Cc: Janne Grunau <j@jannau.net> Cc: Mattijs Korpershoek <mkorpershoek@kernel.org> Cc: Patrick Rudolph <patrick.rudolph@9elements.com> Cc: Sam Edwards <cfsworks@gmail.com> Cc: Simon Glass <sjg@chromium.org> Cc: Tom Rini <trini@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(+)