[U-Boot] [PATCH 25/34] zynq: Add support to find bootmode

Jagannadha Sutradharudu Teki
2013-11-05T17:46:46Z

Added support to find the bootmodes by reading
slcr bootmode register. this can be helpful to
autoboot the configurations w.r.t a specified bootmode.

Added this functionality on board_late_init as it's not
needed for normal initializtion part.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
arch/arm/cpu/armv7/zynq/slcr.c | 6 ++++++
arch/arm/include/asm/arch-zynq/sys_proto.h | 1 +
board/xilinx/zynq/board.c | 33 ++++++++++++++++++++++++++++++
include/configs/zynq-common.h | 1 +
4 files changed, 41 insertions(+)

diff --git a/arch/arm/cpu/armv7/zynq/slcr.c b/arch/arm/cpu/armv7/zynq/slcr.c
index 717ec65..b4c11c3 100644
--- a/arch/arm/cpu/armv7/zynq/slcr.c
+++ b/arch/arm/cpu/armv7/zynq/slcr.c
@@ -101,6 +101,12 @@ void zynq_slcr_devcfg_enable(void)
zynq_slcr_lock();
}

+u32 zynq_slcr_get_boot_mode(void)
+{
+ /* Get the bootmode register value */
+ return readl(&slcr_base->boot_mode);
+}
+
u32 zynq_slcr_get_idcode(void)
{
return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >>
diff --git a/arch/arm/include/asm/arch-zynq/sys_proto.h b/arch/arm/include/asm/arch-zynq/sys_proto.h
index 110de90..8f925af 100644
--- a/arch/arm/include/asm/arch-zynq/sys_proto.h
+++ b/arch/arm/include/asm/arch-zynq/sys_proto.h
@@ -13,6 +13,7 @@ extern void zynq_slcr_cpu_reset(void);
extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk);
extern void zynq_slcr_devcfg_disable(void);
extern void zynq_slcr_devcfg_enable(void);
+extern u32 zynq_slcr_get_boot_mode(void);
extern u32 zynq_slcr_get_idcode(void);
extern void zynq_ddrc_init(void);

diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
index 5119c09..7d1063d 100644
--- a/board/xilinx/zynq/board.c
+++ b/board/xilinx/zynq/board.c
@@ -12,6 +12,14 @@

DECLARE_GLOBAL_DATA_PTR;

+/* Bootmode setting values */
+#define BOOT_MODES_MASK 0x0000000F
+#define QSPI_MODE 0x00000001
+#define NOR_FLASH_MODE 0x00000002
+#define NAND_FLASH_MODE 0x00000004
+#define SD_MODE 0x00000005
+#define JTAG_MODE 0x00000000
+
#ifdef CONFIG_FPGA
Xilinx_desc fpga;

@@ -59,6 +67,31 @@ int board_init(void)
return 0;
}

+int board_late_init(void)
+{
+ switch ((zynq_slcr_get_boot_mode()) & BOOT_MODES_MASK) {
+ case QSPI_MODE:
+ setenv("modeboot", "qspiboot");
+ break;
+ case NAND_FLASH_MODE:
+ setenv("modeboot", "nandboot");
+ break;
+ case NOR_FLASH_MODE:
+ setenv("modeboot", "norboot");
+ break;
+ case SD_MODE:
+ setenv("modeboot", "sdboot");
+ break;
+ case JTAG_MODE:
+ setenv("modeboot", "jtagboot");
+ break;
+ default:
+ setenv("modeboot", "");
+ break;
+ }
+
+ return 0;
+}

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h
index 97b49d4..c823036 100644
--- a/include/configs/zynq-common.h
+++ b/include/configs/zynq-common.h
@@ -162,6 +162,7 @@

#define CONFIG_CMDLINE_EDITING
#define CONFIG_AUTO_COMPLETE
+#define CONFIG_BOARD_LATE_INIT
#define CONFIG_SYS_LONGHELP
#define CONFIG_SYS_MAXARGS 15 /* max number of command args */
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
--
1.8.3