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

Simon Glass sjg at chromium.org
Sat May 18 16:26:04 UTC 2019


Hi Andy,

Instead of this could you:

- move ATF?
- change the SPL load address so it is not in the way (since TPL can
load to any address)
- (in extremis) create a function which does a memmove() and a jump,
copy it somewhere and run it (I think x86 does this)

Regards,
Simon

On Thu, 16 May 2019 at 06:22, 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);
> +
> +       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)
> --
> 2.17.1
>
>
>


More information about the U-Boot mailing list