
Hi Tim,
On 03/04/2014 08:01, Tim Harvey wrote:
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 */
Use structure to access internal registers. The structure is already defined in imx-regs.h.
- /* 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:
Can we use #defines for that ?
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;
- }
The function can be used as well for MX5 SOCs. Move it into imx-common, and use constants without SOC names. Instead of MX6_NAND_BOOT, IMX_NAND_BOOT (or whatever you find makes sense..)
- 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
They are only defines and are not yet related to i.MX6 anymnore, because you have already mapped them. What about to move this defines into imx-common ?
+#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,
+};
See my remark before.
+enum boot_device get_boot_device(void);
#endif
Best regards, Stefano Babic