[U-Boot] [RFC/RESEND PATCH v1 0/2] Fix to keystone2 uinitrd fixup logic

For ks2 devices with PAE enabled, the function ft_board_setup() (board/ti/ks2_evm/board.c) is supposed to update at runtime the /chosen fdt node by shifting the initrd start/end addresses into the 36b it address space. Unfortunately, this mechanism doesn't work since the /chosen node has not been populated at the time of the ft_board_setup() call. The root of the issue is that, at some point in u-boot history, the call sequence of fdt_initrd() and ft_board_setup() (common/image-fdt.c) has been inverted: ft_board_setup() is called before fdt_initrd().
Error shown by Linux during startup is: [ 0.000000] INITRD: 0x8fcec000+0x00313dc8 is not a memory region - disabling initrd
I would propose to move the fdt initrd fixup logic from ft_board_setup() to ft_board_setup_ex() since the latter is called esclusively for keystone devices.
Moreover, cmd/fdt.c command should include the call of ft_board_setup_ex() since keystone2 devices will require it.
Nicholas Faustini (2): fdt: add call to ft_board_setup_ex() for ks2 boards board: ks2: move uinitrd fixup logic inside ft_board_setup_ex
board/ti/ks2_evm/board.c | 44 ++++++++++++++++++++-------------------- cmd/fdt.c | 3 +++ 2 files changed, 25 insertions(+), 22 deletions(-)

When updating the board FDT, some of the operations are performed by ft_board_setup_ex() and should be executed also by the fdt command.
Signed-off-by: Nicholas Faustini nicholas.faustini@azcomtech.com ---
cmd/fdt.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/cmd/fdt.c b/cmd/fdt.c index 28de467f96..8a19a3fdbf 100644 --- a/cmd/fdt.c +++ b/cmd/fdt.c @@ -596,6 +596,9 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) fdt_strerror(err)); return CMD_RET_FAILURE; } +#ifdef CONFIG_SOC_KEYSTONE + ft_board_setup_ex(working_fdt, gd->bd); +#endif } #endif /* Create a chosen node */

On Thu, Sep 27, 2018 at 10:01:47AM +0200, Nicholas Faustini wrote:
When updating the board FDT, some of the operations are performed by ft_board_setup_ex() and should be executed also by the fdt command.
Signed-off-by: Nicholas Faustini nicholas.faustini@azcomtech.com
Reviewed-by: Tom Rini trini@konsulko.com

The uinitrd fixup logic should be executed after the FDT /chosen node has been properly populated by fdt_initrd()
Signed-off-by: Nicholas Faustini nicholas.faustini@azcomtech.com
---
board/ti/ks2_evm/board.c | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/board/ti/ks2_evm/board.c b/board/ti/ks2_evm/board.c index 274f18e942..d81c8e621f 100644 --- a/board/ti/ks2_evm/board.c +++ b/board/ti/ks2_evm/board.c @@ -146,14 +146,10 @@ int ft_board_setup(void *blob, bd_t *bd) int nbanks; u64 size[2]; u64 start[2]; - int nodeoffset; u32 ddr3a_size; - int unitrd_fixup = 0;
env = env_get("mem_lpae"); lpae = env && simple_strtol(env, NULL, 0); - env = env_get("uinitrd_fixup"); - unitrd_fixup = env && simple_strtol(env, NULL, 0);
ddr3a_size = 0; if (lpae) { @@ -191,24 +187,41 @@ int ft_board_setup(void *blob, bd_t *bd)
fdt_fixup_memory_banks(blob, start, size, nbanks);
+ return 0; +} + +void ft_board_setup_ex(void *blob, bd_t *bd) +{ + int lpae; + u64 size; + char *env; + u64 *reserve_start; + int unitrd_fixup = 0; + + env = env_get("mem_lpae"); + lpae = env && simple_strtol(env, NULL, 0); + env = env_get("uinitrd_fixup"); + unitrd_fixup = env && simple_strtol(env, NULL, 0); + /* Fix up the initrd */ if (lpae && unitrd_fixup) { + int nodeoffset; int err; - u32 *prop1, *prop2; + u64 *prop1, *prop2; u64 initrd_start, initrd_end;
nodeoffset = fdt_path_offset(blob, "/chosen"); if (nodeoffset >= 0) { - prop1 = (u32 *)fdt_getprop(blob, nodeoffset, + prop1 = (u64 *)fdt_getprop(blob, nodeoffset, "linux,initrd-start", NULL); - prop2 = (u32 *)fdt_getprop(blob, nodeoffset, + prop2 = (u64 *)fdt_getprop(blob, nodeoffset, "linux,initrd-end", NULL); if (prop1 && prop2) { - initrd_start = __be32_to_cpu(*prop1); + initrd_start = __be64_to_cpu(*prop1); initrd_start -= CONFIG_SYS_SDRAM_BASE; initrd_start += CONFIG_SYS_LPAE_SDRAM_BASE; initrd_start = __cpu_to_be64(initrd_start); - initrd_end = __be32_to_cpu(*prop2); + initrd_end = __be64_to_cpu(*prop2); initrd_end -= CONFIG_SYS_SDRAM_BASE; initrd_end += CONFIG_SYS_LPAE_SDRAM_BASE; initrd_end = __cpu_to_be64(initrd_end); @@ -240,19 +253,6 @@ int ft_board_setup(void *blob, bd_t *bd) } }
- return 0; -} - -void ft_board_setup_ex(void *blob, bd_t *bd) -{ - int lpae; - u64 size; - char *env; - u64 *reserve_start; - - env = env_get("mem_lpae"); - lpae = env && simple_strtol(env, NULL, 0); - if (lpae) { /* * the initrd and other reserved memory areas are

On Thu, Sep 27, 2018 at 10:01:48AM +0200, Nicholas Faustini wrote:
The uinitrd fixup logic should be executed after the FDT /chosen node has been properly populated by fdt_initrd()
Signed-off-by: Nicholas Faustini nicholas.faustini@azcomtech.com
Reviewed-by: Tom Rini trini@konsulko.com
participants (2)
-
Nicholas Faustini
-
Tom Rini