2 * Copyright (C) 2014 Gateworks Corporation
3 * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
5 * Author: Tim Harvey <tharvey@gateworks.com>
7 * SPDX-License-Identifier: GPL-2.0+
12 #include <asm/arch/imx-regs.h>
16 #if defined(CONFIG_MX6)
17 #define MX6_MMC_PORT_MASK GENMASK(12, 11)
18 #define MX6_MMC_PORT_2 BIT(11)
20 /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 register */
21 u32 spl_boot_device(void)
23 struct src *psrc = (struct src *)SRC_BASE_ADDR;
24 unsigned int gpr10_boot = readl(&psrc->gpr10) & (1 << 28);
25 unsigned reg = gpr10_boot ? readl(&psrc->gpr9) : readl(&psrc->sbmr1);
26 unsigned int bmode = readl(&psrc->sbmr2);
29 * Check for BMODE if serial downloader is enabled
30 * BOOT_MODE - see IMX6DQRM Table 8-1
32 if ((((bmode >> 24) & 0x03) == 0x01) || /* Serial Downloader */
33 (gpr10_boot && (reg == 1)))
34 return BOOT_DEVICE_UART;
35 /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
36 switch ((reg & 0x000000FF) >> 4) {
37 /* EIM: See 8.5.1, Table 8-9 */
39 /* BOOT_CFG1[3]: NOR/OneNAND Selection */
40 if ((reg & 0x00000008) >> 3)
41 return BOOT_DEVICE_ONENAND;
43 return BOOT_DEVICE_NOR;
45 /* SATA: See 8.5.4, Table 8-20 */
47 return BOOT_DEVICE_SATA;
48 /* Serial ROM: See 8.5.5.1, Table 8-22 */
51 switch ((reg & 0x07000000) >> 24) {
53 return BOOT_DEVICE_SPI;
55 return BOOT_DEVICE_I2C;
58 /* SD/eSD: 8.5.3, Table 8-15 */
64 if ((reg & MX6_MMC_PORT_MASK) == MX6_MMC_PORT_2)
65 return BOOT_DEVICE_MMC2;
66 return BOOT_DEVICE_MMC1;
67 /* NAND Flash: 8.5.2 */
69 return BOOT_DEVICE_NAND;
71 return BOOT_DEVICE_NONE;
75 #if defined(CONFIG_SPL_MMC_SUPPORT)
76 /* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
77 u32 spl_boot_mode(const u32 boot_device)
79 switch (spl_boot_device()) {
80 /* for MMC return either RAW or FAT mode */
81 case BOOT_DEVICE_MMC1:
82 case BOOT_DEVICE_MMC2:
83 #if defined(CONFIG_SPL_FAT_SUPPORT)
85 #elif defined(CONFIG_SUPPORT_EMMC_BOOT)
86 return MMCSD_MODE_EMMCBOOT;
88 return MMCSD_MODE_RAW;
92 puts("spl: ERROR: unsupported device\n");