Message ID | 20211118181213.1433346-3-robh@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | of/fdt: Rework early FDT scanning functions | expand |
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@ellerman.id.au> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Frank Rowand <frowand.list@gmail.com> > Cc: linuxppc-dev@lists.ozlabs.org > Signed-off-by: Rob Herring <robh@kernel.org> > --- > 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@sony.com>
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);
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@ellerman.id.au> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: linuxppc-dev@lists.ozlabs.org Signed-off-by: Rob Herring <robh@kernel.org> --- arch/powerpc/kernel/prom.c | 4 ++-- drivers/of/fdt.c | 14 +++++++------- include/linux/of_fdt.h | 3 +-- 3 files changed, 10 insertions(+), 11 deletions(-)