Hi Kunihiko, On Thu, 8 Jun 2023 at 07:53, Kunihiko Hayashi <hayashi.kunih...@socionext.com> wrote: > > There are cases that the devicetree blob is placed after _end, such as > fdt_find_separate() returns _end. This is in bss area cleared before > relocation. > > When GD_FLG_SKIP_RELOC is set, the blob is still in bss, but will be > cleared. As a result, the devicetree become invalid. > > To avoid this issue, should relocate it to the new fdt area using the > latter condition in reloc_fdt(). > > Signed-off-by: Kunihiko Hayashi <hayashi.kunih...@socionext.com> > --- > common/board_f.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/common/board_f.c b/common/board_f.c > index 51d2f3c365e9..9a245872d190 100644 > --- a/common/board_f.c > +++ b/common/board_f.c > @@ -622,7 +622,8 @@ static int init_post(void) > static int reloc_fdt(void) > { > if (!IS_ENABLED(CONFIG_OF_EMBED)) { > - if (gd->flags & GD_FLG_SKIP_RELOC) > + if (gd->flags & GD_FLG_SKIP_RELOC && > + gd->fdt_blob != &_end)
!IS_ENABLED(CONFIG_OF_EMBED) == IS_ENABLED(CONFIG_OF_SEPARATE) reloc_fdt() is only called by U-Boot (not SP) So the FDT was found by fdt_find_separate() and gd->fdt_blob == &_end So, is there any case where: gd->flags & GD_FLG_SKIP_RELO is true gd->fdt_blob != &_end is true ? I can't think of one. If that is the case, then you could add a comment to this effect and unconditionally relocate if !CONFIG_OF_EMBED. Of course the down size is that you would probably rather relocate it to just after BSS (rather than to the top of memory) but it doesn't much matter, I suspect. > return 0; > if (gd->new_fdt) { > memcpy(gd->new_fdt, gd->fdt_blob, > -- > 2.25.1 > Regards, Simon