mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
of/fdt: Rework early_init_dt_scan_memory() to call directly
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_memory() to be called directly and use libfdt. Cc: John Crispin <john@phrozen.org> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> 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: linux-mips@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Reviewed-by: Frank Rowand <frank.rowand@sony.com> Signed-off-by: Rob Herring <robh@kernel.org> Tested-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211215150102.1303588-1-robh@kernel.org
This commit is contained in:
parent
d665881d21
commit
1f012283e9
@ -53,17 +53,6 @@ void __init device_tree_init(void)
|
||||
unflatten_and_copy_device_tree();
|
||||
}
|
||||
|
||||
static int memory_dtb;
|
||||
|
||||
static int __init early_init_dt_find_memory(unsigned long node,
|
||||
const char *uname, int depth, void *data)
|
||||
{
|
||||
if (depth == 1 && !strcmp(uname, "memory@0"))
|
||||
memory_dtb = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init plat_mem_setup(void)
|
||||
{
|
||||
void *dtb;
|
||||
@ -77,10 +66,10 @@ void __init plat_mem_setup(void)
|
||||
dtb = get_fdt();
|
||||
__dt_setup_arch(dtb);
|
||||
|
||||
of_scan_flat_dt(early_init_dt_find_memory, NULL);
|
||||
if (memory_dtb)
|
||||
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
|
||||
else if (soc_info.mem_detect)
|
||||
if (!early_init_dt_scan_memory())
|
||||
return;
|
||||
|
||||
if (soc_info.mem_detect)
|
||||
soc_info.mem_detect();
|
||||
else if (soc_info.mem_size)
|
||||
memblock_add(soc_info.mem_base, soc_info.mem_size * SZ_1M);
|
||||
|
@ -532,19 +532,18 @@ static int __init early_init_drmem_lmb(struct drmem_lmb *lmb,
|
||||
}
|
||||
#endif /* CONFIG_PPC_PSERIES */
|
||||
|
||||
static int __init early_init_dt_scan_memory_ppc(unsigned long node,
|
||||
const char *uname,
|
||||
int depth, void *data)
|
||||
static int __init early_init_dt_scan_memory_ppc(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
if (depth == 1 &&
|
||||
strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) {
|
||||
const void *fdt = initial_boot_params;
|
||||
int node = fdt_path_offset(fdt, "/ibm,dynamic-reconfiguration-memory");
|
||||
|
||||
if (node > 0)
|
||||
walk_drmem_lmbs_early(node, NULL, early_init_drmem_lmb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return early_init_dt_scan_memory(node, uname, depth, data);
|
||||
|
||||
return early_init_dt_scan_memory();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -749,7 +748,7 @@ void __init early_init_devtree(void *params)
|
||||
|
||||
/* Scan memory nodes and rebuild MEMBLOCKs */
|
||||
early_init_dt_scan_root();
|
||||
of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
|
||||
early_init_dt_scan_memory_ppc();
|
||||
|
||||
parse_early_param();
|
||||
|
||||
@ -858,7 +857,7 @@ void __init early_get_first_memblock_info(void *params, phys_addr_t *size)
|
||||
*/
|
||||
add_mem_to_memblock = 0;
|
||||
early_init_dt_scan_root();
|
||||
of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
|
||||
early_init_dt_scan_memory_ppc();
|
||||
add_mem_to_memblock = 1;
|
||||
|
||||
if (size)
|
||||
|
@ -1078,49 +1078,53 @@ u64 __init dt_mem_next_cell(int s, const __be32 **cellp)
|
||||
/*
|
||||
* early_init_dt_scan_memory - Look for and parse memory nodes
|
||||
*/
|
||||
int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
|
||||
int depth, void *data)
|
||||
int __init early_init_dt_scan_memory(void)
|
||||
{
|
||||
const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
|
||||
const __be32 *reg, *endp;
|
||||
int l;
|
||||
bool hotpluggable;
|
||||
int node;
|
||||
const void *fdt = initial_boot_params;
|
||||
|
||||
/* We are scanning "memory" nodes only */
|
||||
if (type == NULL || strcmp(type, "memory") != 0)
|
||||
return 0;
|
||||
fdt_for_each_subnode(node, fdt, 0) {
|
||||
const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
|
||||
const __be32 *reg, *endp;
|
||||
int l;
|
||||
bool hotpluggable;
|
||||
|
||||
reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
|
||||
if (reg == NULL)
|
||||
reg = of_get_flat_dt_prop(node, "reg", &l);
|
||||
if (reg == NULL)
|
||||
return 0;
|
||||
|
||||
endp = reg + (l / sizeof(__be32));
|
||||
hotpluggable = of_get_flat_dt_prop(node, "hotpluggable", NULL);
|
||||
|
||||
pr_debug("memory scan node %s, reg size %d,\n", uname, l);
|
||||
|
||||
while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
|
||||
u64 base, size;
|
||||
|
||||
base = dt_mem_next_cell(dt_root_addr_cells, ®);
|
||||
size = dt_mem_next_cell(dt_root_size_cells, ®);
|
||||
|
||||
if (size == 0)
|
||||
continue;
|
||||
pr_debug(" - %llx, %llx\n", base, size);
|
||||
|
||||
early_init_dt_add_memory_arch(base, size);
|
||||
|
||||
if (!hotpluggable)
|
||||
/* We are scanning "memory" nodes only */
|
||||
if (type == NULL || strcmp(type, "memory") != 0)
|
||||
continue;
|
||||
|
||||
if (memblock_mark_hotplug(base, size))
|
||||
pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n",
|
||||
base, base + size);
|
||||
reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
|
||||
if (reg == NULL)
|
||||
reg = of_get_flat_dt_prop(node, "reg", &l);
|
||||
if (reg == NULL)
|
||||
continue;
|
||||
|
||||
endp = reg + (l / sizeof(__be32));
|
||||
hotpluggable = of_get_flat_dt_prop(node, "hotpluggable", NULL);
|
||||
|
||||
pr_debug("memory scan node %s, reg size %d,\n",
|
||||
fdt_get_name(fdt, node, NULL), l);
|
||||
|
||||
while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
|
||||
u64 base, size;
|
||||
|
||||
base = dt_mem_next_cell(dt_root_addr_cells, ®);
|
||||
size = dt_mem_next_cell(dt_root_size_cells, ®);
|
||||
|
||||
if (size == 0)
|
||||
continue;
|
||||
pr_debug(" - %llx, %llx\n", base, size);
|
||||
|
||||
early_init_dt_add_memory_arch(base, size);
|
||||
|
||||
if (!hotpluggable)
|
||||
continue;
|
||||
|
||||
if (memblock_mark_hotplug(base, size))
|
||||
pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n",
|
||||
base, base + size);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1271,7 +1275,7 @@ void __init early_init_dt_scan_nodes(void)
|
||||
pr_warn("No chosen node found, continuing without\n");
|
||||
|
||||
/* Setup memory, calling early_init_dt_add_memory_arch */
|
||||
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
|
||||
early_init_dt_scan_memory();
|
||||
|
||||
/* Handle linux,usable-memory-range property */
|
||||
memblock_cap_memory_range(cap_mem_addr, cap_mem_size);
|
||||
|
@ -59,8 +59,7 @@ extern unsigned long of_get_flat_dt_root(void);
|
||||
extern uint32_t of_get_flat_dt_phandle(unsigned long node);
|
||||
|
||||
extern int early_init_dt_scan_chosen(char *cmdline);
|
||||
extern int early_init_dt_scan_memory(unsigned long node, const char *uname,
|
||||
int depth, void *data);
|
||||
extern int early_init_dt_scan_memory(void);
|
||||
extern int early_init_dt_scan_chosen_stdout(void);
|
||||
extern void early_init_fdt_scan_reserved_mem(void);
|
||||
extern void early_init_fdt_reserve_self(void);
|
||||
|
Loading…
Reference in New Issue
Block a user