From: João Paulo Gonçalves <joao.goncal...@toradex.com>

On i.MX9 platforms, when booting from USB, the U-Boot environment is
always assumed to be in RAM. However, this causes the boot to hang when
`CONFIG_ENV_IS_NOWHERE` is not enabled. The boot also hangs even if the
environment is present in another storage media (for example, eMMC). Fix
the issue by correctly handling the U-Boot environment's location when
booting from USB. Also for i.MX95, set the environment location based on
the ENV config and not solely based on the boot device type.

Suggested-by: Frieder Schrempf <frieder.schre...@kontron.de>
Signed-off-by: João Paulo Gonçalves <joao.goncal...@toradex.com>
---
v2:
- Changed the env location order on USB boot to maintain current
behavior on i.MX9
- Applied the fix to other i.MX9 platforms, not only i.MX95
- Added Suggested-by: Frieder Schrempf
v1: 
https://lore.kernel.org/u-boot/20250722-v1-fix-imx95-usb-boot-v1-1-dec7f2384...@toradex.com/
---
 arch/arm/mach-imx/imx9/scmi/soc.c | 13 ++++++++++---
 arch/arm/mach-imx/imx9/soc.c      |  8 +++++++-
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-imx/imx9/scmi/soc.c 
b/arch/arm/mach-imx/imx9/scmi/soc.c
index 
13f13ca7d1056ac5a9f1b529b13e0d8dbe2462f1..f973652d0cbe8723b0cdc1a6235fbdd719146065
 100644
--- a/arch/arm/mach-imx/imx9/scmi/soc.c
+++ b/arch/arm/mach-imx/imx9/scmi/soc.c
@@ -635,7 +635,8 @@ enum env_location env_get_location(enum env_operation op, 
int prio)
 
        switch (dev) {
        case QSPI_BOOT:
-               env_loc = ENVL_SPI_FLASH;
+               if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
+                       env_loc = ENVL_SPI_FLASH;
                break;
        case SD1_BOOT:
        case SD2_BOOT:
@@ -643,10 +644,16 @@ enum env_location env_get_location(enum env_operation op, 
int prio)
        case MMC1_BOOT:
        case MMC2_BOOT:
        case MMC3_BOOT:
-               env_loc =  ENVL_MMC;
+               if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC))
+                       env_loc =  ENVL_MMC;
                break;
        default:
-               env_loc = ENVL_NOWHERE;
+               if (IS_ENABLED(CONFIG_ENV_IS_NOWHERE))
+                       env_loc = ENVL_NOWHERE;
+               else if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
+                       env_loc = ENVL_SPI_FLASH;
+               else if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC))
+                       env_loc = ENVL_MMC;
                break;
        }
 
diff --git a/arch/arm/mach-imx/imx9/soc.c b/arch/arm/mach-imx/imx9/soc.c
index 
9fb82644f126b8717b2f2ba1c9e77fb75d2e7757..3f7dafdcce5d3c6df102fe0a2a5d0b61c394937b
 100644
--- a/arch/arm/mach-imx/imx9/soc.c
+++ b/arch/arm/mach-imx/imx9/soc.c
@@ -809,7 +809,13 @@ enum env_location env_get_location(enum env_operation op, 
int prio)
                        return ENVL_FAT;
                return ENVL_NOWHERE;
        default:
-               return ENVL_NOWHERE;
+               if (IS_ENABLED(CONFIG_ENV_IS_NOWHERE))
+                       return ENVL_NOWHERE;
+               else if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH))
+                       return ENVL_SPI_FLASH;
+               else if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC))
+                       return ENVL_MMC;
+               return ENVL_UNKNOWN;
        }
 }
 

---
base-commit: b6e2cfca1a6fd10c8f12016a40d690d2ec61796c
change-id: 20250811-v2-fix-imx9-usb-boot-48679993463d

Best regards,
-- 
João Paulo Gonçalves <joao.goncal...@toradex.com>

Reply via email to