else
obj-y := sl-mx6ul.o
endif
+
+obj-y += sl-mx6ul-common.o
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2022 Kontron Electronics GmbH
+ */
+
+#include <asm/types.h>
+#include <asm/arch/sys_proto.h>
+
+#include <sl-mx6ul-common.h>
+
+bool sl_mx6ul_is_spi_nor_boot(void)
+{
+ u32 bmode = imx6_src_get_boot_mode();
+
+ /*
+ * Check if "EEPROM Recovery" enabled and ECSPI2_CONREG not 0x0.
+ * If this is the case and U-Boot didn't initialize the SPI bus
+ * yet, we can safely assume that we are booting from SPI NOR.
+ */
+ if ((bmode & 0x40000000) && readl(0x0200c008))
+ return true;
+
+ return false;
+}
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022 Kontron Electronics GmbH
+ */
+
+#ifndef __SL_MX6UL_COMMON_H
+#define __SL_MX6UL_COMMON_H
+
+bool sl_mx6ul_is_spi_nor_boot(void);
+
+#endif // __SL_MX6UL_COMMON_H
#include <asm/arch/clock.h>
#include <asm/arch/sys_proto.h>
#include <asm/global_data.h>
+#include <env_internal.h>
#include <fdt_support.h>
#include <phy.h>
+#include <sl-mx6ul-common.h>
DECLARE_GLOBAL_DATA_PTR;
return 0;
}
+
+enum env_location env_get_location(enum env_operation op, int prio)
+{
+ if (prio)
+ return ENVL_UNKNOWN;
+
+ if (sl_mx6ul_is_spi_nor_boot() && CONFIG_IS_ENABLED(ENV_IS_IN_SPI_FLASH))
+ return ENVL_SPI_FLASH;
+ else if (CONFIG_IS_ENABLED(ENV_IS_IN_MMC))
+ return ENVL_MMC;
+
+ return ENVL_NOWHERE;
+}
#include <linux/sizes.h>
#include <linux/errno.h>
#include <mmc.h>
+#include <sl-mx6ul-common.h>
DECLARE_GLOBAL_DATA_PTR;
/*
* The default boot fuse settings use the SD card (MMC1) as primary
- * boot device, but allow SPI NOR as a fallback boot device.
- * We can't detect the fallback case and spl_boot_device() will return
- * BOOT_DEVICE_MMC1 despite the actual boot device being SPI NOR.
- * Therefore we try to load U-Boot proper vom SPI NOR after loading
- * from MMC has failed.
+ * boot device, but allow SPI NOR as a fallback boot device. There
+ * is no proper way to detect if the fallback was used. Therefore
+ * we read the ECSPI2_CONREG register and see if it differs from the
+ * reset value 0x0. If that's the case we can assume that the BootROM
+ * has successfully probed the SPI NOR.
*/
- spl_boot_list[0] = bootdev;
-
switch (bootdev) {
case BOOT_DEVICE_MMC1:
case BOOT_DEVICE_MMC2:
- spl_boot_list[1] = BOOT_DEVICE_SPI;
+ if (sl_mx6ul_is_spi_nor_boot()) {
+ spl_boot_list[0] = BOOT_DEVICE_SPI;
+ return;
+ }
break;
}
+
+ spl_boot_list[0] = bootdev;
}
int board_early_init_f(void)
{
setup_iomux_uart();
- setup_spi();
+ if (sl_mx6ul_is_spi_nor_boot())
+ setup_spi();
return 0;
}