board_f: Relocate fdt even if GD_FLG_SKIP_RELOC is set

In case of OF_SEPARATE (!OF_EMBED), the devicetree blob is placed
after _end, and fdt_find_separate() always returns _end. There is
a .bss section after _end and the section is cleared before relocation.

When GD_FLG_SKIP_RELOC is set, relocation is skipped, so the blob is
still in .bss section, but will be cleared. As a result, the devicetree
become invalid.

To avoid this issue, should relocate it regardless of GD_FLG_SKIP_RELOC
in reloc_fdt().

Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Kunihiko Hayashi 2023-06-20 19:50:48 +09:00 committed by Tom Rini
parent ef402577c2
commit 874bf6e0e2

View file

@ -633,8 +633,6 @@ static int init_post(void)
static int reloc_fdt(void) static int reloc_fdt(void)
{ {
if (!IS_ENABLED(CONFIG_OF_EMBED)) { if (!IS_ENABLED(CONFIG_OF_EMBED)) {
if (gd->flags & GD_FLG_SKIP_RELOC)
return 0;
if (gd->new_fdt) { if (gd->new_fdt) {
memcpy(gd->new_fdt, gd->fdt_blob, memcpy(gd->new_fdt, gd->fdt_blob,
fdt_totalsize(gd->fdt_blob)); fdt_totalsize(gd->fdt_blob));