[U-Boot] [PATCH v2 2/3] spl: add relocation support【请注意,邮件由sjg at google.com代发】

Andy Yan andyshrk at gmail.com
Wed May 22 01:42:58 UTC 2019


Hi Andre:

Andre Przywara <andre.przywara at arm.com> 于2019年5月20日周一 下午11:59写道:

> On Mon, 20 May 2019 14:34:01 +0800
> Andy Yan <andy.yan at rock-chips.com> wrote:
>
> Hi,
>
> > On 2019/5/19 上午12:26, Simon Glass wrote:
> > > Hi Andy,
> > >
> > > Instead of this could you:
> > >
> > > - move ATF?
> >
> > All rockchip based arm64 ATF run from the start 64KB of dram as this
> > will give convenient for kernel manage the memory.
>
> This is just BL31 of ATF, right?
> ATF recently gained PIE support for BL31 [1], so by just enabling this in
> platform.mk you will get a relocatable BL31 image, with a very minimal
> runtime linker. Worked out of the box on Allwinner for me, but YMMV.
> So you could load newer ATF builds everywhere.
>
>
This is not the root case, actually we want put ATF as close as possible to
the start of dram, this give linux kernel convenient to manage the memory.



> Does that help you?
>
> > On the other hand, change the ATF load address will break the
> > compatibility of the exiting firmware.
>
> I am not sure what you mean with "compatibility of existing firmware"?
> Surely you combine all the firmware components (SPL/TPL/ATF/U-Boot proper)
> into one image? And there would be no real mix and match, with older
> pre-compiled builds? So by changing the ATF base address and the load
> address in TPL at the same time you won't have issues?
>

I mean older pre-compiled builds published by rockchip rkbin [1], many
projects and popular boards directly use this , for example Armbian. How to
change the base address of the pre-build binary?
 [1] https://github.com/rockchip-linux/rkbin


> Cheers,
> Andre.
>
> [1]
> https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=fc922ca87cc6af8277dc0eb710fc63a2957f0194
>
> > > - change the SPL load address so it is not in the way (since TPL can
> > > load to any address)
> >
> > The SPL is loaded by bootrom after TPL back to bootrom, so the load
> > address if fixed by bootrom code.
> >
> > I know we can build mmc or other storage driver into TPL so we can use
> > tpl load spl on some platform that sram is big enough, but there are
> > also many rockchip soc has very small sram, so we tend to only do dram
> > initialization in tpl, and let bootrom load next stage .
> >
> > > - (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
> > >>
> > >>
> > >>
> > >
> > >
> >
> >
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
>


More information about the U-Boot mailing list