Rockchip bootrom will enter download mode if it returns from
spl/tpl with a non-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 configurations.

Signed-off-by: Andy Yan <andy....@rock-chips.com>
Reviewed-by: Kever Yang <kever.y...@rock-chips.com>

---

Changes in v2:
- implement the back to bootrom download mode check in c, thanks for Dr. 
Philipp Tomsich's suggestion.

 arch/arm/include/asm/arch-rockchip/boot_mode.h |  5 +++++
 arch/arm/include/asm/arch-rockchip/bootrom.h   | 15 ++++++++++++-
 arch/arm/mach-rockchip/Kconfig                 |  1 +
 arch/arm/mach-rockchip/bootrom.c               | 31 +++++++++++++++++++++++++-
 arch/arm/mach-rockchip/save_boot_param.S       | 25 ++++++++++++++-------
 5 files changed, 67 insertions(+), 10 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..c2cf6fd 100644
--- a/arch/arm/include/asm/arch-rockchip/boot_mode.h
+++ b/arch/arm/include/asm/arch-rockchip/boot_mode.h
@@ -15,7 +15,12 @@
 #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);
+void check_back_to_brom_dnl_flag(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..0bdea14 100644
--- a/arch/arm/include/asm/arch-rockchip/bootrom.h
+++ b/arch/arm/include/asm/arch-rockchip/bootrom.h
@@ -8,6 +8,16 @@
 #define _ASM_ARCH_BOOTROM_H
 
 /*
+ *@BOOT_CONTINUE: bootrom continue load next stage image and boot.
+ *@BOOT_BROM_DNL, bootrom enter download mode if no valid image
+ *               found in backup partition.
+ */
+enum {
+       BOOT_BROM_CONTINUE = 0,
+       BOOT_BROM_DNL = 1
+};
+
+/*
  * Saved Stack pointer address.
  * Access might be needed in some special cases.
  */
@@ -21,7 +31,10 @@ void back_to_bootrom(void);
 
 /**
  * Assembler component for the above (do not call this directly)
+ * @mode: BOOT_BROM_CONTINUE, bootrom continue load next stage image and boot;
+ *        BOOT_BROM_DNL, bootrom enter download mode if no valid image
+ *        found in packup partition.
  */
-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 bf01395..2fd9eb2 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..463462c 100644
--- a/arch/arm/mach-rockchip/bootrom.c
+++ b/arch/arm/mach-rockchip/bootrom.c
@@ -5,12 +5,41 @@
  */
 
 #include <common.h>
+#include <asm/io.h>
 #include <asm/arch/bootrom.h>
+#include <asm/arch/boot_mode.h>
 
 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(BOOT_BROM_CONTINUE);
+}
+
+/*
+ * we back to bootrom download mode if get a
+ * BOOT_BROM_DOWNLOAD flag in boot mode register
+ *
+ * note: (a)the boot mode register is configured by
+ * application(next stage bootloader, kernel, etc),
+ * the bootrom never check this register, so we need
+ * to check it and back at very early bootstage(before
+ * some basic configurations such as interrupts been
+ * changed by TPL/TPL), as the bootrom download operation
+ * relys on many default settings(such as interrupts) by
+ * it's self.
+ *       (b)this function share the sampe SP with bootrom code.
+ */
+void check_back_to_brom_dnl_flag(void)
+{
+       u32 boot_mode;
+
+       if (CONFIG_ROCKCHIP_BOOT_MODE_REG) {
+               boot_mode = readl(CONFIG_ROCKCHIP_BOOT_MODE_REG);
+               if (boot_mode == BOOT_BROM_DOWNLOAD) {
+                       writel(0, CONFIG_ROCKCHIP_BOOT_MODE_REG);
+                       _back_to_bootrom_s(BOOT_BROM_DNL);
+               }
+       }
 }
diff --git a/arch/arm/mach-rockchip/save_boot_param.S 
b/arch/arm/mach-rockchip/save_boot_param.S
index 50fce20..e8fa10b 100644
--- a/arch/arm/mach-rockchip/save_boot_param.S
+++ b/arch/arm/mach-rockchip/save_boot_param.S
@@ -23,14 +23,19 @@ ENTRY(save_boot_params)
        ldr     x8, =SAVE_SP_ADDR
        mov     x9, sp
        str     x9, [x8]
+       bl      check_back_to_brom_dnl_flag
        b       save_boot_params_ret  /* back to my caller */
 ENDPROC(save_boot_params)
 
+/*
+ * x0: return value for bootrom, non-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 +43,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
@@ -55,15 +59,20 @@ 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
+       bl      check_back_to_brom_dnl_flag
+       b       save_boot_params_ret            @ back to my caller
 ENDPROC(save_boot_params)
 
 
+/*
+ * r0: return value for bootrom, non-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