[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