
Hi Philipp:
On 2017年09月19日 10:06, Andy Yan wrote:
Hi Philipp:
On 2017年09月19日 02:18, Philipp Tomsich wrote:
Recent discussions confirmed (what the code always assumed): the Rockchip BROM always enters U-Boot with the stack-pointer valid (i.e. the U-Boot startup code is running off the BROM stack).
We can thus replace the back-to-bootrom code (i.e. both the save_boot_params and back_to_bootrom implementations) using C-code based on setjmp/longjmp. The new implementation is already structured to allow an easy drop-in of Andy's changes to enter download-mode when returning to the BROM.
This entails one minor tweak to asm/system.h, which only exported the save_boot_params_ret prototype for ARMv7, but not for AArch64.
For v2, we force bootrom.o to alway be emitted as A32 (not T32), so we can safely call save_boot_params_ret().
This still have a problem, because the setjmp implementation for
ARM32 platform has humb code when CONFIG_SYS_THUMB_BUILD is enabled, this is a default setting for most ARMv7 boards. #if CONFIG_IS_ENABLED(SYS_THUMB_BUILD) ".align 2\n" "adr r0, jmp_target\n" "add r0, r0, $1\n" // r0 stored the jump target address and with bit[0] = 1, this will trigger a thumb switch in longjmp with code "bx r0" #endif
When I force the setjmp code go arm code path, I can back to bootrom successfully, But I got a data abort exception in later. it seems it happens when bootrom finished the uboot code copy, when jump to sdram, I need a further debug.
I found that r9 also need to be preserved, it seems that it hold the sdram base.
It also turned out that I had not caught the RK3188 in my earlier series... and my luck being what it is, the RK3188 needed some extra handholding to adapt to the new regime: instead of passing the context address (for returning to the BROM) from the TPL to the SPL, the SPL now returns to the TPL and the TPL then returns to the BROM.
Changes in v2:
- [added in v2] chain back_to_bootrom calls for SPL, first returning to the TPL (using the same mechanism) and further calling through to the BROM from the TPL by invoking back_to_bootrom again
- adapt the RK3188 spl support file (that I had originally missed)
Philipp Tomsich (5): arm: make save_boot_params_ret prototype visible for AArch64 rockchip: back-to-bootrom: replace assembly-implementation with C-code rockchip: back-to-bootrom: rk3188: chain from SPL via TPL to the BROM rockchip: back-to-bootrom: allow passing a cmd to the bootrom rockchip: back-to-bootrom: do not compile bootrom.o in thumb mode
arch/arm/include/asm/arch-rockchip/bootrom.h | 30 +++++++++--- arch/arm/include/asm/system.h | 62 ++++++++++++------------- arch/arm/mach-rockchip/Makefile | 10 +++- arch/arm/mach-rockchip/bootrom.c | 54 +++++++++++++++++++++- arch/arm/mach-rockchip/rk3036-board-spl.c | 2 +- arch/arm/mach-rockchip/rk3188-board-spl.c | 14 +----- arch/arm/mach-rockchip/rk3188-board-tpl.c | 19 ++++---- arch/arm/mach-rockchip/rk322x-board-spl.c | 2 +- arch/arm/mach-rockchip/rk3288-board-spl.c | 4 +- arch/arm/mach-rockchip/rk3368-board-tpl.c | 2 +- arch/arm/mach-rockchip/rk3399-board-spl.c | 2 +- arch/arm/mach-rockchip/save_boot_param.S | 69
12 files changed, 133 insertions(+), 137 deletions(-) delete mode 100644 arch/arm/mach-rockchip/save_boot_param.S