Revert "imx: Introduce CONFIG_SPL_FORCE_MMC_BOOT to force MMC boot on falcon mode"
[oweals/u-boot.git] / arch / arm / mach-imx / spl.c
index 5944f99482607790aa6b40937fbbd9852af94b8c..e3f51e45edf29063d24fa43818941b09bfcf6b47 100644 (file)
@@ -1,23 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2014 Gateworks Corporation
  * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
  *
  * Author: Tim Harvey <tharvey@gateworks.com>
- *
- * SPDX-License-Identifier:     GPL-2.0+
  */
 
 #include <common.h>
+#include <hang.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/spl.h>
 #include <spl.h>
 #include <asm/mach-imx/hab.h>
+#include <asm/mach-imx/boot_mode.h>
 #include <g_dnl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+__weak int spl_board_boot_device(enum boot_device boot_dev_spl)
+{
+       return 0;
+}
+
 #if defined(CONFIG_MX6)
 /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */
 u32 spl_boot_device(void)
@@ -90,31 +96,135 @@ u32 spl_boot_device(void)
        case IMX6_BMODE_EMMC:
                return BOOT_DEVICE_MMC1;
        /* NAND Flash: 8.5.2, Table 8-10 */
-       case IMX6_BMODE_NAND:
+       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;
 }
 
-#ifdef CONFIG_SPL_USB_GADGET_SUPPORT
+#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)
+{
+#if defined(CONFIG_MX7)
+       unsigned int bmode = readl(&src_base->sbmr2);
+
+       /*
+        * Check for BMODE if serial downloader is enabled
+        * BOOT_MODE - see IMX7DRM Table 6-24
+        */
+       if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
+               return BOOT_DEVICE_BOARD;
+
+       /*
+        * The above method does not detect that the boot ROM used
+        * serial downloader in case the boot ROM decided to use the
+        * serial downloader as a fall back (primary boot source failed).
+        *
+        * Infer that the boot ROM used the USB serial downloader by
+        * checking whether the USB PHY is currently active... This
+        * assumes that SPL did not (yet) initialize the USB PHY...
+        */
+       if (is_boot_from_usb())
+               return BOOT_DEVICE_BOARD;
+#endif
+
+       enum boot_device boot_device_spl = get_boot_device();
+
+       if (IS_ENABLED(CONFIG_IMX8MM) || IS_ENABLED(CONFIG_IMX8MN) ||
+           IS_ENABLED(CONFIG_IMX8MP))
+               return spl_board_boot_device(boot_device_spl);
+
+       switch (boot_device_spl) {
+#if defined(CONFIG_MX7)
+       case SD1_BOOT:
+       case MMC1_BOOT:
+       case SD2_BOOT:
+       case MMC2_BOOT:
+       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:
+               return BOOT_DEVICE_MMC1;
+       case SD2_BOOT:
+       case MMC2_BOOT:
+               return BOOT_DEVICE_MMC2;
+#endif
+       case NAND_BOOT:
+               return BOOT_DEVICE_NAND;
+       case SPI_NOR_BOOT:
+               return BOOT_DEVICE_SPI;
+       case USB_BOOT:
+               return BOOT_DEVICE_USB;
+       default:
+               return BOOT_DEVICE_NONE;
+       }
+}
+#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)
 {
-       put_unaligned(CONFIG_G_DNL_PRODUCT_NUM + 0xfff, &dev->idProduct);
+       put_unaligned(CONFIG_USB_GADGET_PRODUCT_NUM + 0xfff, &dev->idProduct);
 
        return 0;
 }
 #endif
-#endif
 
 #if defined(CONFIG_SPL_MMC_SUPPORT)
 /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
-u32 spl_boot_mode(const u32 boot_device)
+u32 spl_mmc_boot_mode(const u32 boot_device)
 {
-       switch (spl_boot_device()) {
+#if defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || defined(CONFIG_IMX8)
+       switch (get_boot_device()) {
+       /* for MMC return either RAW or FAT mode */
+       case SD1_BOOT:
+       case SD2_BOOT:
+       case SD3_BOOT:
+#if defined(CONFIG_SPL_FAT_SUPPORT)
+               return MMCSD_MODE_FS;
+#else
+               return MMCSD_MODE_RAW;
+#endif
+               break;
+       case MMC1_BOOT:
+       case MMC2_BOOT:
+       case MMC3_BOOT:
+#if defined(CONFIG_SPL_FAT_SUPPORT)
+               return MMCSD_MODE_FS;
+#elif defined(CONFIG_SUPPORT_EMMC_BOOT)
+               return MMCSD_MODE_EMMCBOOT;
+#else
+               return MMCSD_MODE_RAW;
+#endif
+               break;
+       default:
+               puts("spl: ERROR:  unsupported device\n");
+               hang();
+       }
+#else
+       switch (boot_device) {
        /* 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;
@@ -126,30 +236,99 @@ u32 spl_boot_mode(const u32 boot_device)
                puts("spl: ERROR:  unsupported device\n");
                hang();
        }
+#endif
 }
 #endif
 
-#if defined(CONFIG_SECURE_BOOT)
+#if defined(CONFIG_IMX_HAB)
+
+/*
+ * +------------+  0x0 (DDR_UIMAGE_START) -
+ * |   Header   |                          |
+ * +------------+  0x40                    |
+ * |            |                          |
+ * |            |                          |
+ * |            |                          |
+ * |            |                          |
+ * | Image Data |                          |
+ * .            |                          |
+ * .            |                           > Stuff to be authenticated ----+
+ * .            |                          |                                |
+ * |            |                          |                                |
+ * |            |                          |                                |
+ * +------------+                          |                                |
+ * |            |                          |                                |
+ * | Fill Data  |                          |                                |
+ * |            |                          |                                |
+ * +------------+ Align to ALIGN_SIZE      |                                |
+ * |    IVT     |                          |                                |
+ * +------------+ + IVT_SIZE              -                                 |
+ * |            |                                                           |
+ * |  CSF DATA  | <---------------------------------------------------------+
+ * |            |
+ * +------------+
+ * |            |
+ * | Fill Data  |
+ * |            |
+ * +------------+ + CSF_PAD_SIZE
+ */
 
 __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 {
        typedef void __noreturn (*image_entry_noargs_t)(void);
+       uint32_t offset;
 
        image_entry_noargs_t image_entry =
                (image_entry_noargs_t)(unsigned long)spl_image->entry_point;
 
        debug("image entry point: 0x%lX\n", spl_image->entry_point);
 
-       /* HAB looks for the CSF at the end of the authenticated data therefore,
-        * we need to subtract the size of the CSF from the actual filesize */
-       if (authenticate_image(spl_image->load_addr,
-                              spl_image->size - CONFIG_CSF_SIZE)) {
+       if (spl_image->flags & SPL_FIT_FOUND) {
                image_entry();
        } else {
+               /*
+                * HAB looks for the CSF at the end of the authenticated
+                * data therefore, we need to subtract the size of the
+                * CSF from the actual filesize
+                */
+               offset = spl_image->size - CONFIG_CSF_SIZE;
+               if (!imx_hab_authenticate_image(spl_image->load_addr,
+                                               offset + IVT_SIZE +
+                                               CSF_PAD_SIZE, offset)) {
+                       image_entry();
+               } else {
+                       puts("spl: ERROR:  image authentication fail\n");
+                       hang();
+               }
+       }
+}
+
+#if !defined(CONFIG_SPL_FIT_SIGNATURE)
+ulong board_spl_fit_size_align(ulong size)
+{
+       /*
+        * HAB authenticate_image requests the IVT offset is
+        * aligned to 0x1000
+        */
+
+       size = ALIGN(size, 0x1000);
+       size += CONFIG_CSF_SIZE;
+
+       return size;
+}
+
+void board_spl_fit_post_load(ulong load_addr, size_t length)
+{
+       u32 offset = length - CONFIG_CSF_SIZE;
+
+       if (imx_hab_authenticate_image(load_addr,
+                                      offset + IVT_SIZE + CSF_PAD_SIZE,
+                                      offset)) {
                puts("spl: ERROR:  image authentication unsuccessful\n");
                hang();
        }
 }
+#endif
 
 #endif