Hi Lukasz:
On 2019/5/17 下午4:34, Lukasz Majewski wrote:
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) ?
This code is copied from board_f.c, I think is to aligned to 4KB here.
+ 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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot