[U-Boot] [PATCH 2/5] arm: Allow reset init to be controlled

Simon Glass sjg at chromium.org
Wed Feb 4 05:18:51 CET 2015


Some boards want to skip the normal reset init. For example OMAP4 SPL
does not want to touch VBAR and many boards don't want to set up
CP15.

Provide a return value from save_boot_params() which allows the board
to indicate what reset processing should be done.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 arch/arm/cpu/armv7/exynos/spl_boot.c |  5 ++++-
 arch/arm/cpu/armv7/start.S           | 11 ++++++++---
 arch/arm/include/asm/system.h        | 15 +++++++++++++++
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/arch/arm/cpu/armv7/exynos/spl_boot.c b/arch/arm/cpu/armv7/exynos/spl_boot.c
index bc237c9..6e249f1 100644
--- a/arch/arm/cpu/armv7/exynos/spl_boot.c
+++ b/arch/arm/cpu/armv7/exynos/spl_boot.c
@@ -309,4 +309,7 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	while (1)
 		;
 }
-void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) {}
+u32 save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
+{
+	return 0;
+}
diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S
index c5f94ef..0ba26f7 100644
--- a/arch/arm/cpu/armv7/start.S
+++ b/arch/arm/cpu/armv7/start.S
@@ -52,6 +52,9 @@ reset:
  * Continue to use ROM code vector only in OMAP4 spl)
  */
 #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
+	teq	r0, #RESET_SKIP_VBVAR
+	bne	vbar_done
+
 	/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
 	mrc	p15, 0, r2, c1, c0, 0	@ Read CP15 SCTLR Register
 	bic	r2, #CR_V		@ V = 0
@@ -61,10 +64,11 @@ reset:
 	ldr	r2, =_start
 	mcr	p15, 0, r2, c12, c0, 0	@Set VBAR
 #endif
-
+vbar_done:
 	/* the mask ROM code should have PLL and others stable */
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
-	bl	cpu_init_cp15
+	teq	r0, #RESET_SKIP_CP15
+	bleq	cpu_init_cp15
 	bl	cpu_init_crit
 #endif
 
@@ -88,11 +92,12 @@ ENDPROC(c_runtime_cpu_setup)
 
 /*************************************************************************
  *
- * void save_boot_params(u32 r2, u32 r1, u32 r2, u32 r3)
+ * u32 save_boot_params(u32 r2, u32 r1, u32 r2, u32 r3)
  *	__attribute__((weak));
  *
  * Stack pointer is not yet initialized at this moment
  * Don't save anything to stack even if compiled with -O0
+ * Return flags - see RESET_... in system.h
  *
  *************************************************************************/
 ENTRY(save_boot_params)
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
index 89f2294..98e49a7 100644
--- a/arch/arm/include/asm/system.h
+++ b/arch/arm/include/asm/system.h
@@ -140,8 +140,23 @@ void flush_l3_cache(void);
  */
 #define __asmeq(x, y)  ".ifnc " x "," y " ; .err ; .endif\n\t"
 
+/* Control bits for reset processing */
+#define RESET_SKIP_VBVAR	(1 << 0)	/* Skip vector address setup */
+#define RESET_SKIP_CP15		(1 << 1)	/* Skip CP15 setup */
+
 #ifndef __ASSEMBLY__
 
+/**
+ * save_boot_params() - Save boot parameters before starting reset sequence
+ *
+ * @r0:		Value of r0
+ * @r1:		Value of r1
+ * @r2:		Value of r2
+ * @r3:		Value of r3
+ * @return reset flags (see RESET_... above)
+ */
+u32 save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3);
+
 #define isb() __asm__ __volatile__ ("" : : : "memory")
 
 #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
-- 
2.2.0.rc0.207.ga3a616c



More information about the U-Boot mailing list