[U-Boot] [PATCH] rockchip: add support for backing to bootrom download mode

Kever Yang kever.yang at rock-chips.com
Mon Sep 11 08:51:31 UTC 2017


Hi Andy,


On 09/11/2017 02:27 PM, Andy Yan 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>

It looks good to me,
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>
>   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




More information about the U-Boot mailing list