ARM: imx: Add QSPI boot mode for i.MX6UL/ULL
[platform/kernel/u-boot.git] / arch / arm / mach-imx / spl.c
index 397d6d4..f33b9f0 100644 (file)
@@ -24,6 +24,7 @@ u32 spl_boot_device(void)
 {
        unsigned int bmode = readl(&src_base->sbmr2);
        u32 reg = imx6_src_get_boot_mode();
+       u32 mmc_index = ((reg >> 11) & 0x03);
 
        /*
         * Check for BMODE if serial downloader is enabled
@@ -84,19 +85,25 @@ u32 spl_boot_device(void)
        /* SD/eSD: 8.5.3, Table 8-15  */
        case IMX6_BMODE_SD:
        case IMX6_BMODE_ESD:
-               return BOOT_DEVICE_MMC1;
-       /* MMC/eMMC: 8.5.3 */
        case IMX6_BMODE_MMC:
        case IMX6_BMODE_EMMC:
-               return BOOT_DEVICE_MMC1;
+               if (mmc_index == 1)
+                       return BOOT_DEVICE_MMC2;
+               else
+                       return BOOT_DEVICE_MMC1;
        /* NAND Flash: 8.5.2, Table 8-10 */
        case IMX6_BMODE_NAND_MIN ... IMX6_BMODE_NAND_MAX:
                return BOOT_DEVICE_NAND;
+#if defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL)
+       /* QSPI boot */
+       case IMX6_BMODE_QSPI:
+               return BOOT_DEVICE_SPI;
+#endif
        }
        return BOOT_DEVICE_NONE;
 }
 
-#elif defined(CONFIG_MX7) || defined(CONFIG_IMX8M)
+#elif defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
 /* Translate iMX7/i.MX8M boot device to the SPL boot device enumeration */
 u32 spl_boot_device(void)
 {
@@ -134,6 +141,15 @@ u32 spl_boot_device(void)
        case SD3_BOOT:
        case MMC3_BOOT:
                return BOOT_DEVICE_MMC1;
+#elif defined(CONFIG_IMX8)
+       case MMC1_BOOT:
+               return BOOT_DEVICE_MMC1;
+       case SD2_BOOT:
+               return BOOT_DEVICE_MMC2_2;
+       case SD3_BOOT:
+               return BOOT_DEVICE_MMC1;
+       case FLEXSPI_BOOT:
+               return BOOT_DEVICE_SPI;
 #elif defined(CONFIG_IMX8M)
        case SD1_BOOT:
        case MMC1_BOOT:
@@ -152,7 +168,7 @@ u32 spl_boot_device(void)
                return BOOT_DEVICE_NONE;
        }
 }
-#endif /* CONFIG_MX7 || CONFIG_IMX8M */
+#endif /* CONFIG_MX7 || CONFIG_IMX8M || CONFIG_IMX8 */
 
 #ifdef CONFIG_SPL_USB_GADGET
 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
@@ -167,11 +183,23 @@ int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
 /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
 u32 spl_boot_mode(const u32 boot_device)
 {
+/*
+ * When CONFIG_SPL_FORCE_MMC_BOOT is defined the 'boot_device' is used
+ * unconditionally to decide about device to use for booting.
+ * This is crucial for falcon boot mode, when board boots up (i.e. ROM
+ * loads SPL) from slow SPI-NOR memory and afterwards the SPL's 'falcon' boot
+ * mode is used to load Linux OS from eMMC partition.
+ */
+#ifdef CONFIG_SPL_FORCE_MMC_BOOT
+       switch (boot_device) {
+#else
        switch (spl_boot_device()) {
+#endif
        /* for MMC return either RAW or FAT mode */
        case BOOT_DEVICE_MMC1:
        case BOOT_DEVICE_MMC2:
-#if defined(CONFIG_SPL_FAT_SUPPORT)
+       case BOOT_DEVICE_MMC2_2:
+#if defined(CONFIG_SPL_FS_FAT)
                return MMCSD_MODE_FS;
 #elif defined(CONFIG_SUPPORT_EMMC_BOOT)
                return MMCSD_MODE_EMMCBOOT;
@@ -249,6 +277,7 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        }
 }
 
+#if !defined(CONFIG_SPL_FIT_SIGNATURE)
 ulong board_spl_fit_size_align(ulong size)
 {
        /*
@@ -273,6 +302,7 @@ void board_spl_fit_post_load(ulong load_addr, size_t length)
                hang();
        }
 }
+#endif
 
 #endif