On 11/18/21 1:12 PM, Rob Herring wrote: > Use of the of_scan_flat_dt() function predates libfdt and is discouraged > as libfdt provides a nicer set of APIs. Rework early_init_dt_scan_root() > to be called directly and use libfdt. > > Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> > Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> > Cc: Paul Mackerras <paulus@xxxxxxxxx> > Cc: Frank Rowand <frowand.list@xxxxxxxxx> > Cc: linuxppc-dev@xxxxxxxxxxxxxxxx > Signed-off-by: Rob Herring <robh@xxxxxxxxxx> > --- > arch/powerpc/kernel/prom.c | 4 ++-- > drivers/of/fdt.c | 14 +++++++------- > include/linux/of_fdt.h | 3 +-- > 3 files changed, 10 insertions(+), 11 deletions(-) > > diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c > index c6c398ccd98a..6e1a106f02eb 100644 > --- a/arch/powerpc/kernel/prom.c > +++ b/arch/powerpc/kernel/prom.c > @@ -748,7 +748,7 @@ void __init early_init_devtree(void *params) > of_scan_flat_dt(early_init_dt_scan_chosen_ppc, boot_command_line); > > /* Scan memory nodes and rebuild MEMBLOCKs */ > - of_scan_flat_dt(early_init_dt_scan_root, NULL); > + early_init_dt_scan_root(); > of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); > > parse_early_param(); > @@ -857,7 +857,7 @@ void __init early_get_first_memblock_info(void *params, phys_addr_t *size) > * mess the memblock. > */ > add_mem_to_memblock = 0; > - of_scan_flat_dt(early_init_dt_scan_root, NULL); > + early_init_dt_scan_root(); > of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); > add_mem_to_memblock = 1; > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > index 1f1705f76263..5e216555fe4f 100644 > --- a/drivers/of/fdt.c > +++ b/drivers/of/fdt.c > @@ -1042,13 +1042,14 @@ int __init early_init_dt_scan_chosen_stdout(void) > /* > * early_init_dt_scan_root - fetch the top level address and size cells > */ > -int __init early_init_dt_scan_root(unsigned long node, const char *uname, > - int depth, void *data) > +int __init early_init_dt_scan_root(void) > { > const __be32 *prop; > + const void *fdt = initial_boot_params; > + int node = fdt_path_offset(fdt, "/"); > > - if (depth != 0) > - return 0; > + if (node < 0) > + return -ENODEV; > > dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; > dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; > @@ -1063,8 +1064,7 @@ int __init early_init_dt_scan_root(unsigned long node, const char *uname, > dt_root_addr_cells = be32_to_cpup(prop); > pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); > > - /* break now */ > - return 1; > + return 0; > } > > u64 __init dt_mem_next_cell(int s, const __be32 **cellp) > @@ -1263,7 +1263,7 @@ void __init early_init_dt_scan_nodes(void) > int rc; > > /* Initialize {size,address}-cells info */ > - of_scan_flat_dt(early_init_dt_scan_root, NULL); > + early_init_dt_scan_root(); > > /* Retrieve various information from the /chosen node */ > rc = early_init_dt_scan_chosen(boot_command_line); > diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h > index 654722235df6..df3d31926c3c 100644 > --- a/include/linux/of_fdt.h > +++ b/include/linux/of_fdt.h > @@ -68,8 +68,7 @@ extern void early_init_dt_add_memory_arch(u64 base, u64 size); > extern u64 dt_mem_next_cell(int s, const __be32 **cellp); > > /* Early flat tree scan hooks */ > -extern int early_init_dt_scan_root(unsigned long node, const char *uname, > - int depth, void *data); > +extern int early_init_dt_scan_root(void); > > extern bool early_init_dt_scan(void *params); > extern bool early_init_dt_verify(void *params); > Reviewed-by: Frank Rowand <frank.rowand@xxxxxxxx>