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

Tim Harvey tharvey at gateworks.com
Thu Apr 3 08:01:05 CEST 2014


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

Signed-off-by: Tim Harvey <tharvey at 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 at 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



More information about the U-Boot mailing list