
Hi Andy,
On 12 September 2017 at 07:57, Andy Yan andy.yan@rock-chips.com wrote:
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@rock-chips.com Reviewed-by: Kever Yang kever.yang@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);
Please document the arg
#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);
What does 0 mean? Should this be an enum / #define ?
} 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)
Please document what this function does
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
Regards, Simon