[U-Boot] [PATCH v4 10/18] rockchip: boot0 hook: support early return for RK3188/RK3066-style BROM
Andy Yan
andy.yan at rock-chips.com
Tue Oct 10 11:42:43 UTC 2017
Hi Philipp:
On 2017年10月10日 18:50, Dr. Philipp Tomsich wrote:
>
>> On 10 Oct 2017, at 11:22, Andy Yan <andy.yan at rock-chips.com
>> <mailto:andy.yan at rock-chips.com>> wrote:
>>
>> Hi:
>>
>>
>> On 2017年10月10日 17:01, Andy Yan wrote:
>>> Hi Philipp:
>>>
>>> On 2017年10月07日 03:28, Philipp Tomsich wrote:
>>>> Some Rockchip BROM versions (e.g. the RK3188 and RK3066) first read
>>>> 1KB data
>>>> from NAND into SRAM and executes it. Then, following a return to
>>>> bootrom, the
>>>> BROM loads additional code to SRAM (not overwriting the first block
>>>> read) and
>>>> reenters at the same address as the first time.
>>>>
>>>> To support booting either a TPL (on the RK3066) or SPL (on the
>>>> RK3188) using
>>>> this model of having to count entries, this commit adds code to the
>>>> boot0
>>>> hook to track the number of entries and handle them accordingly.
>>>>
>>>> Signed-off-by: Philipp Tomsich
>>>> <philipp.tomsich at theobroma-systems.com
>>>> <mailto:philipp.tomsich at theobroma-systems.com>>
>>>> Signed-off-by: Paweł Jarosz <paweljarosz3691 at gmail.com
>>>> <mailto:paweljarosz3691 at gmail.com>>
>>>> ---
>>>>
>>>> Changes in v4: None
>>>> Changes in v3: None
>>>> Changes in v2: None
>>>>
>>>> arch/arm/include/asm/arch-rockchip/boot0.h | 24
>>>> ++++++++++++++++++------
>>>> arch/arm/mach-rockchip/Kconfig | 28 ++++++++++++++++++++++++++++
>>>> 2 files changed, 46 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/arch/arm/include/asm/arch-rockchip/boot0.h
>>>> b/arch/arm/include/asm/arch-rockchip/boot0.h
>>>> index f7c6146..06091d0 100644
>>>> --- a/arch/arm/include/asm/arch-rockchip/boot0.h
>>>> +++ b/arch/arm/include/asm/arch-rockchip/boot0.h
>>>> @@ -19,12 +19,24 @@
>>>> * beginning of the executable. However, as we want to keep
>>>> * this generic and make it applicable to builds that are like
>>>> * the RK3368 (TPL needs this, SPL doesn't) or the RK3399 (no
>>>> - * TPL, but extra space needed in the SPL), we simply repeat
>>>> - * the 'b reset' with the expectation that the first one will
>>>> - * be overwritten, if this is the first stage contained in the
>>>> - * final image created with mkimage)...
>>>> + * TPL, but extra space needed in the SPL), we simply insert
>>>> + * a branch-to-next-instruction-word with the expectation that
>>>> + * the first one may be overwritten, if this is the first stage
>>>> + * contained in the final image created with mkimage)...
>>>> */
>>>> - b reset /* may be overwritten --- should be 'nop' or a 'b
>>>> reset' */
>>>> + b 1f /* if overwritten, entry-address is at the next word */
>>>> +1:
>>>> +#endif
>>>> +#if CONFIG_IS_ENABLED(ROCKCHIP_EARLYRETURN_TO_BROM)
>>>> + adr r3, entry_counter
>>>> + ldr r0, [r3]
>>>> + cmp r0, #1 /* check if entry_counter == 1 */
>>>> + beq reset /* regular bootup */
>>>> + add r0, #1
>>>> + str r0, [r3] /* increment the entry_counter in
>>>> memory */
>>
>> It seems that we need to clear r0 to zero before return to
>> bootrom, a non-zero return value will drive the system to bootrom
>> download mode.
>
> Did you test if clearing the r0-register before returning fixes this
> and we boot through into SPL?
> If so, I’ll create a v5 of the patch … if not, we will need to dig
> deeper to determine why this does not work as expected.
Yes, we can boot into uboot shell if clear r0 before return to
bootrom from here.
>
>>>> + bx lr /* return to bootrom */
>>> This seems not work on rk3188, When I track the code flow with DS-5, I
>>> found the entry_counter always be zero when we run here from
>>> bootrom(even it is set to 1 before return to bootrom), so it return
>>> to bootrom again and again.
>>>> +entry_counter:
>>>> + .word 0
>>>> #endif
>>>> b reset
>>>> #if !defined(CONFIG_ARM64)
>>>> @@ -32,7 +44,7 @@
>>>> * For armv7, the addr '_start' will used as vector start address
>>>> * and write to VBAR register, which needs to aligned to 0x20.
>>>> */
>>>> - .align(5)
>>>> + .align(5), 0x0
>>>> _start:
>>>> ARM_VECTORS
>>>> #endif
>>>> diff --git a/arch/arm/mach-rockchip/Kconfig
>>>> b/arch/arm/mach-rockchip/Kconfig
>>>> index 31e9864..d59a1d5 100644
>>>> --- a/arch/arm/mach-rockchip/Kconfig
>>>> +++ b/arch/arm/mach-rockchip/Kconfig
>>>> @@ -158,6 +158,34 @@ config ROCKCHIP_SPL_RESERVE_IRAM
>>>> config ROCKCHIP_BROM_HELPER
>>>> bool
>>>> +config SPL_ROCKCHIP_EARLYRETURN_TO_BROM
>>>> + bool "SPL requires early-return (for RK3188-style BROM) to
>>>> BROM"
>>>> + depends on SPL && ENABLE_ARM_SOC_BOOT0_HOOK
>>>> + help
>>>> + Some Rockchip BROM variants (e.g. on the RK3188) load the
>>>> + first stage in segments and enter multiple times. E.g. on
>>>> + the RK3188, the first 1KB of the first stage are loaded
>>>> + first and entered; after returning to the BROM, the
>>>> + remainder of the first stage is loaded, but the BROM
>>>> + re-enters at the same address/to the same code as previously.
>>>> +
>>>> + This enables support code in the BOOT0 hook for the SPL stage
>>>> + to allow multiple entries.
>>>> +
>>>> +config TPL_ROCKCHIP_EARLYRETURN_TO_BROM
>>>> + bool "TPL requires early-return (for RK3188-style BROM) to
>>>> BROM"
>>>> + depends on TPL && ENABLE_ARM_SOC_BOOT0_HOOK
>>>> + help
>>>> + Some Rockchip BROM variants (e.g. on the RK3188) load the
>>>> + first stage in segments and enter multiple times. E.g. on
>>>> + the RK3188, the first 1KB of the first stage are loaded
>>>> + first and entered; after returning to the BROM, the
>>>> + remainder of the first stage is loaded, but the BROM
>>>> + re-enters at the same address/to the same code as previously.
>>>> +
>>>> + This enables support code in the BOOT0 hook for the TPL stage
>>>> + to allow multiple entries.
>>>> +
>>>> config SPL_MMC_SUPPORT
>>>> default y if !SPL_ROCKCHIP_BACK_TO_BROM
>
More information about the U-Boot
mailing list