On Mon, 20 May 2019 14:34:01 +0800 Andy Yan <andy....@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. 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? 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....@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); > >> + > >> + 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@lists.denx.de https://lists.denx.de/listinfo/u-boot