[U-Boot] [PATCH 05/11] MX6: add boot device support SPL

Tim Harvey
2014-04-03T06:01:05Z

Add enums, #defines, and helper functions needed for SPL images to describe
and detect IMX6 boot device.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
---
arch/arm/cpu/armv7/mx6/soc.c | 56 +++++++++++++++++++++++++++++
arch/arm/include/asm/arch-mx6/spl.h | 26 ++++++++++++++
arch/arm/include/asm/imx-common/boot_mode.h | 17 +++++++++
3 files changed, 99 insertions(+)
create mode 100644 arch/arm/include/asm/arch-mx6/spl.h

diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
index 1725279..4ee62c7 100644
--- a/arch/arm/cpu/armv7/mx6/soc.c
+++ b/arch/arm/cpu/armv7/mx6/soc.c
@@ -305,6 +305,62 @@ const struct boot_mode soc_boot_modes[] = {
{NULL, 0},
};

+/* determine boot device from SRC_SBMR1 register (BOOT_CFG[4:1]) */
+enum boot_device get_boot_device(void)
+{
+ enum boot_device boot_dev;
+
+ uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4); /* SRC_SBMR1 */
+
+ /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
+ switch ((soc_sbmr & 0x000000FF) >> 4) {
+ /* EIM: See 8.5.1, Table 8-9 */
+ case 0x0:
+ /* BOOT_CFG1[3]: NOR/OneNAND Selection */
+ if ((soc_sbmr & 0x00000008) >> 3)
+ boot_dev = MX6_ONE_NAND_BOOT;
+ else
+ boot_dev = MX6_WEIM_NOR_BOOT;
+ break;
+ /* SATA: See 8.5.4, Table 8-20 */
+ case 0x2:
+ boot_dev = MX6_SATA_BOOT;
+ break;
+ /* Serial ROM: See 8.5.5.1, Table 8-22 */
+ case 0x3:
+ /* BOOT_CFG4[2:0] */
+ switch ((soc_sbmr & 0x07000000) >> 24) {
+ case 0x0 ... 0x4:
+ boot_dev = MX6_SPI_NOR_BOOT;
+ break;
+ case 0x5 ... 0x7:
+ boot_dev = MX6_I2C_BOOT;
+ break;
+ }
+ break;
+ /* SD/eSD: 8.5.3, Table 8-15 */
+ case 0x4:
+ case 0x5:
+ boot_dev = MX6_SD_BOOT;
+ break;
+ /* MMC/eMMC: 8.5.3 */
+ case 0x6:
+ case 0x7:
+ boot_dev = MX6_MMC_BOOT;
+ break;
+ /* NAND Flash: 8.5.2 */
+ case 0x8 ... 0xf:
+ boot_dev = MX6_NAND_BOOT;
+ break;
+ default:
+ boot_dev = MX6_UNKNOWN_BOOT;
+ break;
+ }
+
+ return boot_dev;
+}
+
+
void s_init(void)
{
struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
diff --git a/arch/arm/include/asm/arch-mx6/spl.h b/arch/arm/include/asm/arch-mx6/spl.h
new file mode 100644
index 0000000..5611c71
--- /dev/null
+++ b/arch/arm/include/asm/arch-mx6/spl.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2013 TechNexion Ltd.
+ *
+ * Author: Richard Hu <linuxfae@technexion.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef __ASM_ARCH_SPL_H__
+#define __ASM_ARCH_SPL_H__
+
+#define BOOT_DEVICE_MMC1 0
+#define BOOT_DEVICE_MMC2 1
+#define BOOT_DEVICE_MMC2_2 2
+#define BOOT_DEVICE_NAND 3
+#define BOOT_DEVICE_SATA 4
+#define BOOT_DEVICE_USBETH 5
+#define BOOT_DEVICE_NONE 6
+
+#endif /* __ASM_ARCH_SPL_H__ */
diff --git a/arch/arm/include/asm/imx-common/boot_mode.h b/arch/arm/include/asm/imx-common/boot_mode.h
index de0205c..3686367 100644
--- a/arch/arm/include/asm/imx-common/boot_mode.h
+++ b/arch/arm/include/asm/imx-common/boot_mode.h
@@ -17,4 +17,21 @@ struct boot_mode {
void add_board_boot_modes(const struct boot_mode *p);
void boot_mode_apply(unsigned cfg_val);
extern const struct boot_mode soc_boot_modes[];
+
+/* boot devices */
+enum boot_device {
+ MX6_SD_BOOT,
+ MX6_MMC_BOOT,
+ MX6_NAND_BOOT,
+ MX6_SATA_BOOT,
+ MX6_WEIM_NOR_BOOT,
+ MX6_ONE_NAND_BOOT,
+ MX6_PATA_BOOT,
+ MX6_I2C_BOOT,
+ MX6_SPI_NOR_BOOT,
+ MX6_UNKNOWN_BOOT,
+ MX6_BOOT_DEV_NUM = MX6_UNKNOWN_BOOT,
+};
+enum boot_device get_boot_device(void);
+
#endif
--
1.8.3.2