On 10/30/25 12:19 AM, Anshul Dalal wrote:
To simplify the boot process and prevent the R5 SPL size from growing,
this patch restricts the boot media to load the next stage payload
(tifalcon.bin and kernel FIT) from MMC only.


Is R5 SPL size the only reason? This seems rather restrictive to only
support one boot mode with all this..

Signed-off-by: Anshul Dalal <[email protected]>
---
  arch/arm/mach-k3/am62ax/am62a7_init.c |  3 +++
  arch/arm/mach-k3/am62px/am62p5_init.c |  4 ++++
  arch/arm/mach-k3/am62x/am625_init.c   |  3 +++
  arch/arm/mach-k3/common.h             |  1 +
  arch/arm/mach-k3/r5/common.c          | 17 ++++++++++++++++-
  5 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-k3/am62ax/am62a7_init.c 
b/arch/arm/mach-k3/am62ax/am62a7_init.c
index 48d578e7d6f..1c8a5fd2a35 100644
--- a/arch/arm/mach-k3/am62ax/am62a7_init.c
+++ b/arch/arm/mach-k3/am62ax/am62a7_init.c
@@ -240,5 +240,8 @@ u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 
boot_device)
u32 spl_boot_device(void)
  {
+#if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64)

The check for CONFIG_ARM64 might not be needed, what if we want to
falcon boot from A53 SPL right into Linux?

+       return k3_r5_falcon_bootmode();
+#endif

This should be an #else capturing the below return call, otherwise
think about what the function looks like after the preprocessor step
if the above is true:

u32 spl_boot_device(void)
{
        return k3_r5_falcon_bootmode();
        return get_boot_device();
}

just seems odd.

Andrew

        return get_boot_device();
  }
diff --git a/arch/arm/mach-k3/am62px/am62p5_init.c 
b/arch/arm/mach-k3/am62px/am62p5_init.c
index aebd5200b0d..4c215d5cebe 100644
--- a/arch/arm/mach-k3/am62px/am62p5_init.c
+++ b/arch/arm/mach-k3/am62px/am62p5_init.c
@@ -375,6 +375,10 @@ u32 spl_boot_device(void)
        u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
        u32 bootmedia;
+#if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64)
+       return k3_r5_falcon_bootmode();
+#endif
+
        if (bootindex == K3_PRIMARY_BOOTMODE)
                bootmedia = __get_primary_bootmedia(devstat);
        else
diff --git a/arch/arm/mach-k3/am62x/am625_init.c 
b/arch/arm/mach-k3/am62x/am625_init.c
index 14f93ac998f..44b8d2654b2 100644
--- a/arch/arm/mach-k3/am62x/am625_init.c
+++ b/arch/arm/mach-k3/am62x/am625_init.c
@@ -327,5 +327,8 @@ u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 
boot_device)
u32 spl_boot_device(void)
  {
+#if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64)
+       return k3_r5_falcon_bootmode();
+#endif
        return get_boot_device();
  }
diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h
index 5807d358464..cd3e19374dc 100644
--- a/arch/arm/mach-k3/common.h
+++ b/arch/arm/mach-k3/common.h
@@ -54,6 +54,7 @@ int shutdown_mcu_r5_core1(void);
#if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64)
  int k3_r5_falcon_bootmode(void);
+int k3_r5_falcon_prep(void);
  #endif
#if (IS_ENABLED(CONFIG_K3_QOS))
diff --git a/arch/arm/mach-k3/r5/common.c b/arch/arm/mach-k3/r5/common.c
index 439dd92ef54..aa94c0c1956 100644
--- a/arch/arm/mach-k3/r5/common.c
+++ b/arch/arm/mach-k3/r5/common.c
@@ -391,6 +391,21 @@ int spl_start_uboot(void)
                return 0;
  }
+int k3_r5_falcon_bootmode(void)
+{
+       char *mmcdev = env_get("mmcdev");
+
+       if (!mmcdev)
+               return BOOT_DEVICE_NOBOOT;
+
+       if (strncmp(mmcdev, "0", sizeof("0")) == 0)
+               return BOOT_DEVICE_MMC1;
+       else if (strncmp(mmcdev, "1", sizeof("1")) == 0)
+               return BOOT_DEVICE_MMC2;
+       else
+               return BOOT_DEVICE_NOBOOT;
+}
+
  int k3_r5_falcon_prep(void)
  {
        struct spl_image_loader *loader, *drv;
@@ -402,7 +417,7 @@ int k3_r5_falcon_prep(void)
        memset(&kernel_image, '\0', sizeof(kernel_image));
        drv = ll_entry_start(struct spl_image_loader, spl_image_loader);
        n_ents = ll_entry_count(struct spl_image_loader, spl_image_loader);
-       bootdev.boot_device = spl_boot_device();
+       bootdev.boot_device = k3_r5_falcon_bootmode();
for (loader = drv; loader != drv + n_ents; loader++) {
                if (bootdev.boot_device != loader->boot_device)

Reply via email to