diff mbox series

[U-Boot,v4,2/2] armv8: layerscape: Discard the needless cpu nodes

Message ID 20171204041830.30745-2-wenbin.song@nxp.com
State Accepted
Delegated to: York Sun
Headers show
Series [U-Boot,v4,1/2] armv8: ls1043a/ls2080a: check SoC by device ID | expand

Commit Message

Wenbin song Dec. 4, 2017, 4:18 a.m. UTC
Using "cpu_pos_mask()" function to detect the real online cpus,
and discard the needless cpu nodes on kernel dts.

Signed-off-by: Wenbin Song <wenbin.song@nxp.com>
---
Changes for v1:
		Remove the config option.
		Use id_to_core() funcation to find the position of core.
Changes for v2:
		None.
Changes for v3:
		Replace "ls1043a" with "layerscape" on the subject.
---
 arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

Comments

York Sun Dec. 19, 2017, 4:03 p.m. UTC | #1
On 12/03/2017 08:37 PM, Wenbin song wrote:
> Using "cpu_pos_mask()" function to detect the real online cpus,
> and discard the needless cpu nodes on kernel dts.
> 
> Signed-off-by: Wenbin Song <wenbin.song@nxp.com>
> ---
> Changes for v1:
> 		Remove the config option.
> 		Use id_to_core() funcation to find the position of core.
> Changes for v2:
> 		None.
> Changes for v3:
> 		Replace "ls1043a" with "layerscape" on the subject.
> ---

Applied to fsl-qoriq master. Thanks.

York
diff mbox series

Patch

diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
index d1a7d0de9c..39ffe1ab4d 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
@@ -42,6 +42,33 @@  void ft_fixup_cpu(void *blob)
 	int addr_cells;
 	u64 val, core_id;
 	size_t *boot_code_size = &(__secondary_boot_code_size);
+	u32 mask = cpu_pos_mask();
+	int off_prev = -1;
+
+	off = fdt_path_offset(blob, "/cpus");
+	if (off < 0) {
+		puts("couldn't find /cpus node\n");
+		return;
+	}
+
+	fdt_support_default_count_cells(blob, off, &addr_cells, NULL);
+
+	off = fdt_node_offset_by_prop_value(blob, off_prev, "device_type",
+					    "cpu", 4);
+	while (off != -FDT_ERR_NOTFOUND) {
+		reg = (fdt32_t *)fdt_getprop(blob, off, "reg", 0);
+		if (reg) {
+			core_id = fdt_read_number(reg, addr_cells);
+			if (!test_bit(id_to_core(core_id), &mask)) {
+				fdt_del_node(blob, off);
+				off = off_prev;
+			}
+		}
+		off_prev = off;
+		off = fdt_node_offset_by_prop_value(blob, off_prev,
+						    "device_type", "cpu", 4);
+	}
+
 #if defined(CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT) && \
 	defined(CONFIG_SEC_FIRMWARE_ARMV8_PSCI)
 	int node;