Message ID | 1505224679-30046-1-git-send-email-andy.yan@rock-chips.com |
---|---|
State | Superseded |
Delegated to: | Philipp Tomsich |
Headers | show |
Series | support enter download mode on rockchip platform | expand |
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
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