[PATCH 1/2] stm32mp: use device sequence number in boot_instance variable

Patrice CHOTARD patrice.chotard at foss.st.com
Wed Jul 7 09:37:15 CEST 2021


Hi Patrick

On 7/6/21 5:19 PM, Patrick Delaunay wrote:
> Use the device sequence number in boot_instance variable
> and no more the SDMMC instance provided by ROM code/TF-A.
> 
> After this patch we don't need to define the mmc alias in
> device tree, for example:
>   mmc0 = &sdmmc1;
>   mmc1 = &sdmmc2;
>   mmc2 = &sdmmc3;
> to have a correct mapping between the ROM code boot device =
> "${boot_device}${boot_instance}" and the MMC device in U-Boot.
> 
> With this patch the 'mmc0' device (used in mmc commands) is
> always used when only one instance sdmmc is activated in device
> tree, even if it is only the sdmmc2 or sdmmc3.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
> ---
> Dependancy with [1] to have correct 'mmc' node name (sdmmc@ => mmc@)
> from kernel "ARM: dts: stm32: Rename mmc controller nodes to mmc@"
> 
> [1] "arm: dts: stm32mp15: alignment with v5.13"
>     http://patchwork.ozlabs.org/project/uboot/list/?series=251100&state=*
> 
> 
>  arch/arm/mach-stm32mp/cpu.c                | 16 +++++++++-
>  arch/arm/mach-stm32mp/include/mach/stm32.h |  4 +++
>  board/st/stm32mp1/stm32mp1.c               | 35 +++++++++++++++++-----
>  3 files changed, 46 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
> index 592bfd413d..f6ed2ce0e4 100644
> --- a/arch/arm/mach-stm32mp/cpu.c
> +++ b/arch/arm/mach-stm32mp/cpu.c
> @@ -483,6 +483,11 @@ static void setup_boot_mode(void)
>  		STM32_UART7_BASE,
>  		STM32_UART8_BASE
>  	};
> +	const u32 sdmmc_addr[] = {
> +		STM32_SDMMC1_BASE,
> +		STM32_SDMMC2_BASE,
> +		STM32_SDMMC3_BASE
> +	};
>  	char cmd[60];
>  	u32 boot_ctx = readl(TAMP_BOOT_CONTEXT);
>  	u32 boot_mode =
> @@ -525,7 +530,16 @@ static void setup_boot_mode(void)
>  		break;
>  	case BOOT_FLASH_SD:
>  	case BOOT_FLASH_EMMC:
> -		sprintf(cmd, "%d", instance);
> +		if (instance > ARRAY_SIZE(sdmmc_addr))
> +			break;
> +		/* search associated sdmmc node in devicetree */
> +		sprintf(cmd, "mmc@%x", sdmmc_addr[instance]);
> +		if (uclass_get_device_by_name(UCLASS_MMC, cmd, &dev)) {
> +			printf("mmc%d = %s not found in device tree!\n",
> +			       instance, cmd);
> +			break;
> +		}
> +		sprintf(cmd, "%d", dev_seq(dev));
>  		env_set("boot_device", "mmc");
>  		env_set("boot_instance", cmd);
>  		break;
> diff --git a/arch/arm/mach-stm32mp/include/mach/stm32.h b/arch/arm/mach-stm32mp/include/mach/stm32.h
> index 5fdb893b0e..c11a9903f2 100644
> --- a/arch/arm/mach-stm32mp/include/mach/stm32.h
> +++ b/arch/arm/mach-stm32mp/include/mach/stm32.h
> @@ -32,6 +32,10 @@
>  #define STM32_UART7_BASE		0x40018000
>  #define STM32_UART8_BASE		0x40019000
>  
> +#define STM32_SDMMC1_BASE		0x58005000
> +#define STM32_SDMMC2_BASE		0x58007000
> +#define STM32_SDMMC3_BASE		0x48004000
> +
>  #define STM32_SYSRAM_BASE		0x2FFC0000
>  #define STM32_SYSRAM_SIZE		SZ_256K
>  
> diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
> index 18b8870269..2faf5c81b4 100644
> --- a/board/st/stm32mp1/stm32mp1.c
> +++ b/board/st/stm32mp1/stm32mp1.c
> @@ -841,6 +841,31 @@ const char *env_ext4_get_intf(void)
>  	}
>  }
>  
> +int mmc_get_boot(void)
> +{
> +	struct udevice *dev;
> +	u32 boot_mode = get_bootmode();
> +	unsigned int instance = (boot_mode & TAMP_BOOT_INSTANCE_MASK) - 1;
> +	char cmd[20];
> +	const u32 sdmmc_addr[] = {
> +		STM32_SDMMC1_BASE,
> +		STM32_SDMMC2_BASE,
> +		STM32_SDMMC3_BASE
> +	};
> +
> +	if (instance > ARRAY_SIZE(sdmmc_addr))
> +		return 0;
> +
> +	/* search associated sdmmc node in devicetree */
> +	snprintf(cmd, sizeof(cmd), "mmc@%x", sdmmc_addr[instance]);
> +	if (uclass_get_device_by_name(UCLASS_MMC, cmd, &dev)) {
> +		log_err("mmc%d = %s not found in device tree!\n", instance, cmd);
> +		return 0;
> +	}
> +
> +	return dev_seq(dev);
> +};
> +
>  const char *env_ext4_get_dev_part(void)
>  {
>  	static char *const env_dev_part =
> @@ -854,22 +879,16 @@ const char *env_ext4_get_dev_part(void)
>  	if (strlen(env_dev_part) > 0)
>  		return env_dev_part;
>  
> -	u32 bootmode = get_bootmode();
> -
> -	return dev_part[(bootmode & TAMP_BOOT_INSTANCE_MASK) - 1];
> +	return dev_part[mmc_get_boot()];
>  }
>  
>  int mmc_get_env_dev(void)
>  {
> -	u32 bootmode;
> -
>  	if (CONFIG_SYS_MMC_ENV_DEV >= 0)
>  		return CONFIG_SYS_MMC_ENV_DEV;
>  
> -	bootmode = get_bootmode();
> -
>  	/* use boot instance to select the correct mmc device identifier */
> -	return (bootmode & TAMP_BOOT_INSTANCE_MASK) - 1;
> +	return mmc_get_boot();
>  }
>  
>  #if defined(CONFIG_OF_BOARD_SETUP)
> 

Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>

Thanks
Patrice


More information about the U-Boot mailing list