[U-Boot] [PATCH] rockchip: add support for backing to bootrom download mode
Andy Yan
andy.yan at rock-chips.com
Mon Sep 11 06:27:51 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>
---
arch/arm/include/asm/arch-rockchip/bootrom.h | 2 +-
arch/arm/mach-rockchip/Kconfig | 13 +++++++
arch/arm/mach-rockchip/bootrom.c | 2 +-
arch/arm/mach-rockchip/save_boot_param.S | 57 +++++++++++++++++++++++-----
4 files changed, 63 insertions(+), 11 deletions(-)
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 d9b25d5..3ab0c30 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
help
The Rockchip RK3399 is a ARM-based SoC with a dual-core Cortex-A72
@@ -149,6 +150,18 @@ config TPL_ROCKCHIP_BACK_TO_BROM
SPL will return to the boot rom, which will then load the U-Boot
binary to keep going on.
+config ROCKCHIP_BACK_TO_BROM_DOWNLOAD_REG
+ hex "Bootrom download mode flag register address"
+ default 0x200081c8 if ROCKCHIP_RK3036
+ default 0xff730094 if ROCKCHIP_RK3288
+ default 0xff738200 if ROCKCHIP_RK3368
+ default 0xff320300 if ROCKCHIP_RK3399
+ default 0x10300580 if ROCKCHIP_RV1108
+ default 0x00
+ help
+ The Soc will return to bootrom download mode if this register set
+ to BOOTROM_DOWNLOAD_FLAG.
+
config ROCKCHIP_SPL_RESERVE_IRAM
hex "Size of IRAM reserved in SPL"
default 0x4000
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..f1bed0b 100644
--- a/arch/arm/mach-rockchip/save_boot_param.S
+++ b/arch/arm/mach-rockchip/save_boot_param.S
@@ -7,11 +7,25 @@
#include <linux/linkage.h>
+#define BACK_TO_BROM_DOWNLOAD_FLAG 0xEF08A53C
+
#if defined(CONFIG_ARM64)
.globl SAVE_SP_ADDR
SAVE_SP_ADDR:
.quad 0
+ENTRY(check_back_to_brom_dnl_flag)
+ ldr x8, =CONFIG_ROCKCHIP_BACK_TO_BROM_DOWNLOAD_REG
+ ldr x9, [x8]
+ ldr x0, =BACK_TO_BROM_DOWNLOAD_FLAG
+ 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 +37,22 @@ ENTRY(save_boot_params)
ldr x8, =SAVE_SP_ADDR
mov x9, sp
str x9, [x8]
+#if CONFIG_ROCKCHIP_BACK_TO_BROM_DOWNLOAD_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 +60,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 +67,18 @@ ENDPROC(_back_to_bootrom_s)
SAVE_SP_ADDR:
.word 0
+ENTRY(check_back_to_brom_dnl_flag)
+ ldr r0, =CONFIG_ROCKCHIP_BACK_TO_BROM_DOWNLOAD_REG
+ ldr r1, [r0]
+ ldr r2, =BACK_TO_BROM_DOWNLOAD_FLAG
+ 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 +88,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_BACK_TO_BROM_DOWNLOAD_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