[U-Boot] [PATCH v2 2/3] spl: add relocation support

Andy Yan andy.yan at rock-chips.com
Fri May 17 09:03:20 UTC 2019


Hi Lukasz:

On 2019/5/17 下午4:34, Lukasz Majewski wrote:
> On Thu, 16 May 2019 20:21:50 +0800
> Andy Yan <andy.yan at rock-chips.com> wrote:
>
>> Some times we want to relocate spl code to dram after dram
>> initialization or relocate spl code to a high memory to avoid
>> code overid.
>>
>> For example on Rockchip armv8 platform, we run with boot flow
>> TPL->SPL->ATF->U-Boot.
>> TPL run in sram and is responsible for dram initialization.
>> SPL run from the start address of dram and is responsible for
>> loading ATF and U-Boot.
>>
>> The case here is that the ATF load address is from 64KB of dram,
>> which overlaps with spl code itself.
>>
>> So we want to relocate spl itself to high memory to aovid this.
>>
>> Signed-off-by: Andy Yan <andy.yan at rock-chips.com>
>> ---
>>
>> Changes in v2:
>> - Move Kconfig modification to PATCH 1/3
>>
>>   common/spl/spl.c | 55
>> ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55
>> insertions(+)
>>
>> diff --git a/common/spl/spl.c b/common/spl/spl.c
>> index 88d4b8a9bf..affb65ccbd 100644
>> --- a/common/spl/spl.c
>> +++ b/common/spl/spl.c
>> @@ -12,6 +12,7 @@
>>   #include <dm.h>
>>   #include <handoff.h>
>>   #include <spl.h>
>> +#include <asm/sections.h>
>>   #include <asm/u-boot.h>
>>   #include <nand.h>
>>   #include <fat.h>
>> @@ -439,6 +440,28 @@ static int spl_common_init(bool setup_malloc)
>>   	return 0;
>>   }
>>   
>> +#if !defined(CONFIG_SPL_SKIP_RELOCATE) && !defined(CONFIG_TPL_BUILD)
>> +static void spl_setup_relocate(void)
>> +{
>> +	gd->relocaddr = CONFIG_SPL_RELOC_TEXT_BASE;
>> +	gd->new_gd = (gd_t *)gd;
>> +	gd->start_addr_sp = gd->relocaddr;
>> +	gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000,
>> 32); +
> What is the purpose of 0x1000 magic number? Could it be described in
> some way (in-code comment, #define, etc) ?
>
This code is copied from board_f.c,  I think is to aligned to 4KB here.


>> +	gd->start_addr_sp -= gd->fdt_size;
>> +	gd->new_fdt = (void *)gd->start_addr_sp;
>> +	memcpy(gd->new_fdt, gd->fdt_blob, gd->fdt_size);
>> +	gd->fdt_blob = gd->new_fdt;
>> +
>> +	gd->reloc_off = gd->relocaddr - (unsigned
>> long)__image_copy_start; +}
>> +#else
>> +static void spl_setup_relocate(void)
>> +{
>> +
>> +}
>> +#endif
>> +
>>   void spl_set_bd(void)
>>   {
>>   	/*
>> @@ -460,6 +483,8 @@ int spl_early_init(void)
>>   		return ret;
>>   	gd->flags |= GD_FLG_SPL_EARLY_INIT;
>>   
>> +	spl_setup_relocate();
>> +
>>   	return 0;
>>   }
>>   
>> @@ -563,6 +588,34 @@ static int boot_from_devices(struct
>> spl_image_info *spl_image, return -ENODEV;
>>   }
>>   
>> +#if defined(CONFIG_DM) && !defined(CONFIG_SPL_SKIP_RELOCATE)
>> && !defined(CONFIG_TPL_BUILD) +static int spl_initr_dm(void)
>> +{
>> +	int ret;
>> +
>> +	/* Save the pre-reloc driver model and start a new one */
>> +	gd->dm_root_f = gd->dm_root;
>> +	gd->dm_root = NULL;
>> +	bootstage_start(BOOTSTATE_ID_ACCUM_DM_R, "dm_r");
>> +	ret = dm_init_and_scan(false);
>> +	bootstage_accum(BOOTSTATE_ID_ACCUM_DM_R);
>> +	if (ret)
>> +		return ret;
>> +
>> +#if defined(CONFIG_TIMER)
>> +	gd->timer = NULL;
>> +#endif
>> +	serial_init();
>> +
>> +	return 0;
>> +}
>> +#else
>> +static int spl_initr_dm(void)
>> +{
>> +	return 0;
>> +}
>> +#endif
>> +
>>   void board_init_r(gd_t *dummy1, ulong dummy2)
>>   {
>>   	u32 spl_boot_list[] = {
>> @@ -577,6 +630,8 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
>>   
>>   	debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
>>   
>> +	spl_initr_dm();
>> +
>>   	spl_set_bd();
>>   
>>   #if defined(CONFIG_SYS_SPL_MALLOC_START)
>
>
>
> 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-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de




More information about the U-Boot mailing list