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

Reply via email to