[U-Boot] [PATCH 2/3] rockchip: add support for backing to bootrom download mode

Andy Yan andy.yan at rock-chips.com
Tue Sep 12 13:57:59 UTC 2017


Rockchip bootrom will enter download mode if it returns from
spl/tpl with a none-zero value and couldn't find a valid image
in the backup partition.
This patch provide a method to instruct the system to back to
bootrom download mode by checking the BROM_DOWNLOAD_FLAG register.
As the bootrom download function relys on some modules such as
interrupts, so we need to back to bootrom as early as possbile
before the tpl/tps code override the interrupt settings.

Signed-off-by: Andy Yan <andy.yan at rock-chips.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
---

 arch/arm/include/asm/arch-rockchip/boot_mode.h |  4 ++
 arch/arm/include/asm/arch-rockchip/bootrom.h   |  2 +-
 arch/arm/mach-rockchip/Kconfig                 |  1 +
 arch/arm/mach-rockchip/bootrom.c               |  2 +-
 arch/arm/mach-rockchip/save_boot_param.S       | 56 +++++++++++++++++++++-----
 5 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/boot_mode.h b/arch/arm/include/asm/arch-rockchip/boot_mode.h
index 163b2e7..6b2a610 100644
--- a/arch/arm/include/asm/arch-rockchip/boot_mode.h
+++ b/arch/arm/include/asm/arch-rockchip/boot_mode.h
@@ -15,7 +15,11 @@
 #define BOOT_CHARGING		(REBOOT_FLAG + 11)
 /* enter usb mass storage mode */
 #define BOOT_UMS		(REBOOT_FLAG + 12)
+/* enter bootrom download mode */
+#define BOOT_BROM_DOWNLOAD	0xEF08A53C
 
+#ifndef __ASSEMBLY__
 int setup_boot_mode(void);
+#endif
 
 #endif
diff --git a/arch/arm/include/asm/arch-rockchip/bootrom.h b/arch/arm/include/asm/arch-rockchip/bootrom.h
index 92eb878..6ae3e94 100644
--- a/arch/arm/include/asm/arch-rockchip/bootrom.h
+++ b/arch/arm/include/asm/arch-rockchip/bootrom.h
@@ -22,6 +22,6 @@ void back_to_bootrom(void);
 /**
  * Assembler component for the above (do not call this directly)
  */
-void _back_to_bootrom_s(void);
+void _back_to_bootrom_s(int mode);
 
 #endif
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index 527ca60..a2b7a7e 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -113,6 +113,7 @@ config ROCKCHIP_RK3399
 	select SPL_SERIAL_SUPPORT
 	select SPL_DRIVERS_MISC_SUPPORT
 	select ENABLE_ARM_SOC_BOOT0_HOOK
+	select ROCKCHIP_BROM_HELPER
 	select DEBUG_UART_BOARD_INIT
 	select BOARD_LATE_INIT
 	help
diff --git a/arch/arm/mach-rockchip/bootrom.c b/arch/arm/mach-rockchip/bootrom.c
index 8380e4e..6f0d583 100644
--- a/arch/arm/mach-rockchip/bootrom.c
+++ b/arch/arm/mach-rockchip/bootrom.c
@@ -12,5 +12,5 @@ void back_to_bootrom(void)
 #if CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT)
 	puts("Returning to boot ROM...\n");
 #endif
-	_back_to_bootrom_s();
+	_back_to_bootrom_s(0);
 }
diff --git a/arch/arm/mach-rockchip/save_boot_param.S b/arch/arm/mach-rockchip/save_boot_param.S
index 50fce20..325e81e 100644
--- a/arch/arm/mach-rockchip/save_boot_param.S
+++ b/arch/arm/mach-rockchip/save_boot_param.S
@@ -6,12 +6,25 @@
  */
 
 #include <linux/linkage.h>
+#include <asm/arch/boot_mode.h>
 
 #if defined(CONFIG_ARM64)
 .globl	SAVE_SP_ADDR
 SAVE_SP_ADDR:
 	.quad 0
 
+ENTRY(check_back_to_brom_dnl_flag)
+	ldr	x8, =CONFIG_ROCKCHIP_BOOT_MODE_REG
+	ldr	x9, [x8]
+	ldr	x0, =BOOT_BROM_DOWNLOAD
+	cmp	x9, x0
+	b.ne	save_boot_params_ret
+	mov	x9, xzr
+	str	x9, [x8]	/* clear flag */
+	mov	x0, #1          /* indicate the bootrom to enter download mode */
+	b	_back_to_bootrom_s
+ENDPROC(check_back_to_brom_dnl_flag)
+
 ENTRY(save_boot_params)
 	sub	sp, sp, #0x60
 	stp	x29, x30, [sp, #0x50]
@@ -23,14 +36,22 @@ ENTRY(save_boot_params)
 	ldr	x8, =SAVE_SP_ADDR
 	mov	x9, sp
 	str	x9, [x8]
+#if CONFIG_ROCKCHIP_BOOT_MODE_REG
+	b	check_back_to_brom_dnl_flag
+#else
 	b	save_boot_params_ret  /* back to my caller */
+#endif
 ENDPROC(save_boot_params)
 
+/*
+ * x0: return value for bootrom, none-zero for bootrom download
+ *     mode and zero for normal boot mode
+ */
 .globl _back_to_bootrom_s
 ENTRY(_back_to_bootrom_s)
-	ldr	x0, =SAVE_SP_ADDR
-	ldr	x0, [x0]
-	mov	sp, x0
+	ldr	x1, =SAVE_SP_ADDR
+	ldr	x1, [x1]
+	mov	sp, x1
 	ldp	x29, x30, [sp, #0x50]
 	ldp	x27, x28, [sp, #0x40]
 	ldp	x25, x26, [sp, #0x30]
@@ -38,7 +59,6 @@ ENTRY(_back_to_bootrom_s)
 	ldp	x21, x22, [sp, #0x10]
 	ldp	x19, x20, [sp]
 	add	sp, sp, #0x60
-	mov	x0, xzr
 	ret
 ENDPROC(_back_to_bootrom_s)
 #else
@@ -46,6 +66,18 @@ ENDPROC(_back_to_bootrom_s)
 SAVE_SP_ADDR:
 	.word 0
 
+ENTRY(check_back_to_brom_dnl_flag)
+	ldr	r0, =CONFIG_ROCKCHIP_BOOT_MODE_REG
+	ldr	r1, [r0]
+	ldr	r2, =BOOT_BROM_DOWNLOAD
+	cmp	r1, r2
+	bne	save_boot_params_ret
+	mov	r3, #0
+	str	r3, [r0]        @clear flag
+	mov	r0, #1          @indicate the bootrom to enter download mode
+	b	_back_to_bootrom_s
+ENDPROC(check_back_to_brom_dnl_flag)
+
 /*
  * void save_boot_params
  *
@@ -55,15 +87,21 @@ ENTRY(save_boot_params)
 	push	{r1-r12, lr}
 	ldr	r0, =SAVE_SP_ADDR
 	str	sp, [r0]
-	b	save_boot_params_ret		@ back to my caller
+#if CONFIG_ROCKCHIP_BOOT_MODE_REG
+	b	check_back_to_brom_dnl_flag
+#else
+	b       save_boot_params_ret
+#endif
 ENDPROC(save_boot_params)
 
-
+/*
+ * r0: return value for bootrom, none-zero for bootrom download
+ *     mode and zero for normal boot mode
+ */
 .globl _back_to_bootrom_s
 ENTRY(_back_to_bootrom_s)
-	ldr	r0, =SAVE_SP_ADDR
-	ldr	sp, [r0]
-	mov	r0, #0
+	ldr	r1, =SAVE_SP_ADDR
+	ldr	sp, [r1]
 	pop	{r1-r12, pc}
 ENDPROC(_back_to_bootrom_s)
 #endif
-- 
2.7.4




More information about the U-Boot mailing list