[U-Boot] [PATCH 1/4] sunxi: Make FEL mode usable again

Siarhei Siamashka siarhei.siamashka at gmail.com
Fri Jan 30 12:58:46 CET 2015


The commit f630974ccb3ce93e9607a3354e9acb266a8b7e95
'sunxi: Move SPL s_init() code to board_init_f()'
broke the FEL boot mode.

This patch moves the DRAM initialization back to s_init() and
introduces an assembly entry point for FEL in order to provide
guaranteed initialization of the gdata pointer (r9). The assembly
entry point is also needed to ensure that the SPL code starts
executing in ARM mode.

Because the sunxi board_init_f() does not contain anything that
is not already done by the default board_init_f(), it is removed
too.

Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
---
 arch/arm/cpu/armv7/sunxi/Makefile           |  1 +
 arch/arm/cpu/armv7/sunxi/board.c            | 26 ++++++++++----------------
 arch/arm/cpu/armv7/sunxi/start_fel.S        | 16 ++++++++++++++++
 arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds |  3 ++-
 4 files changed, 29 insertions(+), 17 deletions(-)
 create mode 100644 arch/arm/cpu/armv7/sunxi/start_fel.S

diff --git a/arch/arm/cpu/armv7/sunxi/Makefile b/arch/arm/cpu/armv7/sunxi/Makefile
index 48db744..e0d413d 100644
--- a/arch/arm/cpu/armv7/sunxi/Makefile
+++ b/arch/arm/cpu/armv7/sunxi/Makefile
@@ -40,5 +40,6 @@ obj-$(CONFIG_MACH_SUN7I)	+= dram_sun4i.o
 obj-$(CONFIG_MACH_SUN8I)	+= dram_sun8i.o
 ifdef CONFIG_SPL_FEL
 obj-y	+= start.o
+extra-y	+= start_fel.o
 endif
 endif
diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
index 6e28bcd..ea6cb60 100644
--- a/arch/arm/cpu/armv7/sunxi/board.c
+++ b/arch/arm/cpu/armv7/sunxi/board.c
@@ -85,6 +85,16 @@ void s_init(void)
 	timer_init();
 	gpio_init();
 	i2c_init_board();
+
+#ifdef CONFIG_SPL_BUILD
+	preloader_console_init();
+
+#ifdef CONFIG_SPL_I2C_SUPPORT
+	/* Needed early by sunxi_board_init if PMU is enabled */
+	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+#endif
+	sunxi_board_init();
+#endif
 }
 
 #ifdef CONFIG_SPL_BUILD
@@ -103,22 +113,6 @@ u32 spl_boot_mode(void)
 {
 	return MMCSD_MODE_RAW;
 }
-
-void board_init_f(ulong dummy)
-{
-	preloader_console_init();
-
-#ifdef CONFIG_SPL_I2C_SUPPORT
-	/* Needed early by sunxi_board_init if PMU is enabled */
-	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
-#endif
-	sunxi_board_init();
-
-	/* Clear the BSS. */
-	memset(__bss_start, 0, __bss_end - __bss_start);
-
-	board_init_r(NULL, 0);
-}
 #endif
 
 void reset_cpu(ulong addr)
diff --git a/arch/arm/cpu/armv7/sunxi/start_fel.S b/arch/arm/cpu/armv7/sunxi/start_fel.S
new file mode 100644
index 0000000..e1c7cd4
--- /dev/null
+++ b/arch/arm/cpu/armv7/sunxi/start_fel.S
@@ -0,0 +1,16 @@
+/*
+ * Entry point of the FEL mode SPL.
+ *
+ * Copyright (c) 2015 Siarhei Siamashka <siarhei.siamashka at gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <asm-offsets.h>
+#include <config.h>
+#include <linux/linkage.h>
+
+ENTRY(_start_fel)
+	ldr	r9, =gdata
+	b	s_init
+ENDPROC(_start_fel)
diff --git a/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds b/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
index 928b7c1..beb8900 100644
--- a/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
+++ b/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
@@ -6,7 +6,7 @@
  */
 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
-ENTRY(s_init)
+ENTRY(_start_fel)
 SECTIONS
 {
 	. = 0x00002000;
@@ -14,6 +14,7 @@ SECTIONS
 	. = ALIGN(4);
 	.text :
 	{
+		arch/arm/cpu/armv7/sunxi/start_fel.o	(.text)
 		*(.text.s_init)
 		*(.text*)
 	}
-- 
2.0.5



More information about the U-Boot mailing list