[U-Boot] [PATCH 2/3] rockchip: add support for backing to bootrom download mode
Simon Glass
sjg at chromium.org
Wed Sep 13 04:26:35 UTC 2017
Hi Andy,
On 12 September 2017 at 07:57, Andy Yan <andy.yan at 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 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);
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
More information about the U-Boot
mailing list