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

Lukasz Majewski lukma at denx.de
Fri May 17 08:34:30 UTC 2019


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

> +	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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190517/d51d5c9e/attachment.sig>


More information about the U-Boot mailing list