From a3be0ccc4746b64a6ed2f955b1238e9c53de8b16 Mon Sep 17 00:00:00 2001 From: Patrice Chotard Date: Tue, 22 Apr 2025 17:33:42 +0200 Subject: board: st: stm32mp2: add mmc_get_env_dev() Use the boot instance to select the correct mmc device identifier, this patch only to save the environment on eMMC = MMC(1) on STMicroelectronics boards. Set the CONFIG_SYS_MMC_ENV_DEV to -1 to select the mmc boot instance by default. Signed-off-by: Patrick Delaunay Signed-off-by: Patrice Chotard --- board/st/stm32mp2/stm32mp2.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'board/st/stm32mp2/stm32mp2.c') diff --git a/board/st/stm32mp2/stm32mp2.c b/board/st/stm32mp2/stm32mp2.c index c70ffaf5dbd..8446b8fd3d6 100644 --- a/board/st/stm32mp2/stm32mp2.c +++ b/board/st/stm32mp2/stm32mp2.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -78,6 +79,42 @@ enum env_location env_get_location(enum env_operation op, int prio) } } +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); +}; + +int mmc_get_env_dev(void) +{ + const int mmc_env_dev = CONFIG_IS_ENABLED(ENV_IS_IN_MMC, (CONFIG_SYS_MMC_ENV_DEV), (-1)); + + if (mmc_env_dev >= 0) + return mmc_env_dev; + + /* use boot instance to select the correct mmc device identifier */ + return mmc_get_boot(); +} + int board_late_init(void) { const void *fdt_compat; -- cgit v1.2.3