[U-Boot] [PATCH v2 0/5] rockchip: back-to-bootrom: replace assembly-implementation with C-code

Andy Yan
2017-09-19T07:19:45Z

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
>>
>