]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
stm32mp: use device sequence number in boot_instance variable
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Tue, 6 Jul 2021 15:19:45 +0000 (17:19 +0200)
committerPatrick Delaunay <patrick.delaunay@foss.st.com>
Fri, 16 Jul 2021 07:28:46 +0000 (09:28 +0200)
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@foss.st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
arch/arm/mach-stm32mp/cpu.c
arch/arm/mach-stm32mp/include/mach/stm32.h
board/st/stm32mp1/stm32mp1.c

index 592bfd413dfc49c84aa14425e05615b848345e65..f6ed2ce0e4d947460bc259303e4e9ad400257509 100644 (file)
@@ -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;
index 5fdb893b0edccb6fd579c6343723d209aba7b0ad..c11a9903f203657ae1216c38de84be109215c926 100644 (file)
 #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
 
index 18b8870269fee0f217b073743ff317e161314475..2faf5c81b451f2a01fe59525b91ff22ae33974db 100644 (file)
@@ -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)