[U-Boot] U-Boot proper(not SPL) relocate option

Kever Yang kever.yang at rock-chips.com
Wed Nov 22 01:59:19 UTC 2017


Hi Lukasz,


     Thanks for your quick comments on this topic.
On 11/21/2017 06:29 PM, Lukasz Majewski wrote:
> Hi Kever,
>
>> Hi Guys,
>>
>>       I try to understand why we need to do the relocate in U-Boot.
>>   From the document README/crt0.S, I think the relocation feature comes
>> from some SoC have limited SRAM whose size is enough to load the whole
>> U-Boot, but not enough to run all the drivers.
>>
>>       I don't know how many SoCs/Archs still must use this feature,
>> but I'm sure all
>> Rockchip SoCs do not need this feature in both SPL and proper U-Boot,
>> because rockchip using SPL always running in SRAM to init DDR SDRAM,
>> and after DRAM available always running U-Boot in DRAM.
> I always thought that u-boot needs relocation to place itself in the
> "known" area of SDRAM (which ends in its very end).

I can understand this feature, we always do dram_init_banks() first,
then we relocate to 'known' area, then will be no risk to access memory.
I believe there must be some historical reason for some kind of device,
the relocate feature is a wonderful idea for it.

In another case, we can also have a choice for not relocate because:
- we still can have similar 'bdinfo' but without relocate, we can init 
dram info
     first, and then init SP, malloc area and so on, and then other 
driver init.
- All solution for Rockchip SoCs at least have 512MByte DRAM,
     which should be enough for U-Boot and could consider to be 'known' 
area,
     many other SoCs should be similar.
- Without relocate we can save many step, some of our customer really
     care much about the boot time duration.
     * no need to relocate everything
     * no need to copy all the code
     * no need init the driver more than once

Thanks,
- Kever
>
> In this way we can upload u-boot proper via SPL to any SDRAM location
> and then (after relocation) it puts itself to "known" location.
>
> (Please check bdinfo command for details).
>
> Having u-boot at known location helps with:
>
> - Using the non fragmented SDRAM to download updates
>
> - Booting u-boot on many different devices (with different amount of
>    RAM) -> you always download u-boot in the near of SDRAM beginning and
>    then it relocates itself appropriately.
>
>
> However, I'm not sure if we would need relocation in SPL (which
> runs in SRAM). It seems to me that SPL binary is so board specific, that
> we shouldn't need such generic feature there.
>
>> There is a CONFIG_SPL_SKIP_RELOCATE for SPL to skip the relocate,
>> can we have another CONFIG_SKIP_RELOCATE for U-Boot proper?
>>
>>
>> Here is the document from README:
>>
>> board_init_f():
>>           - purpose: set up the machine ready for running
>> board_init_r(): i.e. SDRAM and serial UART
>>           - global_data is available
>>           - stack is in SRAM
>>           - BSS is not available, so you cannot use global/static
>> variables, only stack variables and global_data
>>
>>           Non-SPL-specific notes:
>>           - dram_init() is called to set up DRAM. If already done in
>> SPL this
>>                   can do nothing
>>
>>           SPL-specific notes:
>>           - you can override the entire board_init_f() function with
>> your own version as needed.
>>           - preloader_console_init() can be called here in extremis
>>           - should set up SDRAM, and anything needed to make the UART
>> work
>>           - these is no need to clear BSS, it will be done by crt0.S
>>           - must return normally from this function (don't call
>> board_init_r()
>>                   directly)
>>
>> board_init_r():
>>           - purpose: main execution, common code
>>           - global_data is available
>>           - SDRAM is available
>>           - BSS is available, all static/global variables can be used
>>           - execution eventually continues to main_loop()
>>
>>           Non-SPL-specific notes:
>>           - U-Boot is relocated to the top of memory and is now
>> running from there.
>>
>>           SPL-specific notes:
>>           - stack is optionally in SDRAM, if CONFIG_SPL_STACK_R is
>> defined and
>>                   CONFIG_SPL_STACK_R_ADDR points into SDRAM
>>           - preloader_console_init() can be called here - typically
>> this is done by selecting CONFIG_SPL_BOARD_INIT and then
>> supplying a
>>                   spl_board_init() function containing this call
>>           - loads U-Boot or (in falcon mode) Linux
>>
>>
>> Thanks,
>> - Kever
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> https://lists.denx.de/listinfo/u-boot
>
>
> Best regards,
>
> Lukasz Majewski
>
> --
>
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de




More information about the U-Boot mailing list