[PATCH v9 4/8] mach-k3: common: support only MMC in R5 falcon mode

Andrew Davis afd at ti.com
Thu Oct 30 14:55:40 CET 2025


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 <anshuld at ti.com>
> ---
>   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)



More information about the U-Boot mailing list