On Thu, 16 May 2019 20:21:50 +0800
Andy Yan <andy....@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....@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: lu...@denx.de

Attachment: pgpsdSYiOO25E.pgp
Description: OpenPGP digital signature

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to