]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
spl: fit: Add ability to jump to Linux via OPTEE-OS on ARMv7a
authorMarek Vasut <marek.vasut@mailbox.org>
Thu, 30 Oct 2025 21:23:50 +0000 (22:23 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 6 Nov 2025 17:26:18 +0000 (11:26 -0600)
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>
arch/arm/lib/spl.c
common/spl/spl_fit.c
include/spl.h

index 6c7d1fb5629b19fa900359029ca67cf0177f0995..bce51b9cc7df17fb6a3f3431fbeae23cc5084a61 100644 (file)
@@ -16,6 +16,9 @@
 #include <asm/global_data.h>
 #include <linux/compiler.h>
 #include <asm/mach-types.h>
+#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
+#include <asm/armv7.h>
+#endif
 
 #ifndef CONFIG_SPL_DM
 /* Pointer to as well as the global data structure for SPL */
@@ -71,6 +74,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 */
index 746c3d2fa28d1b196cadee4c44387f6d4188e563..616df46e1c8472e9cdb8fe15c358379044cb02ad 100644 (file)
@@ -550,6 +550,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))
@@ -903,6 +920,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)
index cf45d411ecba0ce746e0bc7d5a5d2fd02144ccdd..06dc28362d3f844ecffafda12b8bf171422191cd 100644 (file)
@@ -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;