Commit 1f012283 authored by Rob Herring's avatar Rob Herring
Browse files

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: default avatarFrank Rowand <frank.rowand@sony.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Tested-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211215150102.1303588-1-robh@kernel.org
parent d665881d
Loading
Loading
Loading
Loading
+4 −15
Original line number Diff line number Diff line
@@ -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);
+10 −11
Original line number Diff line number Diff line
@@ -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)
+36 −32
Original line number Diff line number Diff line
@@ -1078,9 +1078,12 @@ 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)
{
	int node;
	const void *fdt = initial_boot_params;

	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;
@@ -1088,18 +1091,19 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,

		/* We are scanning "memory" nodes only */
		if (type == NULL || strcmp(type, "memory") != 0)
		return 0;
			continue;

		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;
			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", uname, l);
		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;
@@ -1120,7 +1124,7 @@ int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
				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);
+1 −2
Original line number Diff line number Diff line
@@ -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);