aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/kernel/devtree.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/devtree.c')
-rw-r--r--arch/arm/kernel/devtree.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index bee7f9d47f0..a4662b1c3fd 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -19,8 +19,10 @@
#include <linux/of_irq.h>
#include <linux/of_platform.h>
+#include <asm/cputype.h>
#include <asm/setup.h>
#include <asm/page.h>
+#include <asm/smp_plat.h>
#include <asm/mach/arch.h>
#include <asm/mach-types.h>
@@ -61,6 +63,44 @@ void __init arm_dt_memblock_reserve(void)
}
}
+/*
+ * arm_dt_init_cpu_maps - Function retrieves cpu nodes from the device tree
+ * and builds the cpu logical map array containing MPIDR values related to
+ * logical cpus
+ *
+ * Updates the cpu possible mask with the number of parsed cpu nodes
+ */
+void __init arm_dt_init_cpu_maps(void)
+{
+ struct device_node *dn = NULL;
+ int i, cpu = 1;
+
+ while ((dn = of_find_node_by_type(dn, "cpu")) && cpu <= nr_cpu_ids) {
+ const u32 *hwid;
+ int len;
+
+ pr_debug(" * %s...\n", dn->full_name);
+
+ hwid = of_get_property(dn, "reg", &len);
+
+ if (!hwid || len != 4) {
+ pr_err(" * %s missing reg property\n", dn->full_name);
+ continue;
+ }
+
+ i = (be32_to_cpup(hwid) == (read_cpuid_mpidr() & 0xffffff))
+ ? 0 : cpu++;
+
+ if (!i)
+ printk(KERN_INFO "Booting Linux on CPU HWID 0x%x\n",
+ be32_to_cpup(hwid));
+
+ cpu_logical_map(i) = be32_to_cpup(hwid);
+
+ set_cpu_possible(i, true);
+ }
+}
+
/**
* setup_machine_fdt - Machine setup when an dtb was passed to the kernel
* @dt_phys: physical address of dt blob