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

Reply via email to