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....@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot