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.delau...@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.chot...@foss.st.com> Thanks Patrice