arm64: smp: honour #address-size when parsing CPU reg property
authorWill Deacon <will.deacon@arm.com>
Mon, 22 Apr 2013 17:28:55 +0000 (18:28 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Thu, 25 Apr 2013 16:45:43 +0000 (17:45 +0100)
For systems where the top 32-bits of the MPIDR are all zero, we should
allow the device-tree to specify an #address-size of 0x1 for the CPU reg
property and then zero extend the value there.

Without this patch, kvmtool breaks with the recent mpidr parsing code
introduced in 4c7aa0021356 ("arm64: kernel: initialise cpu_logical_map
from the DT").

Acked-by: Javi Merino <javi.merino@arm.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/smp.c

index d4dcc6515253e869f898feb2da50c0a390872837..a886194e58fd93ce538edd4cdf28e06b876f7880 100644 (file)
@@ -270,6 +270,7 @@ void __init smp_init_cpus(void)
        bool bootcpu_valid = false;
 
        while ((dn = of_find_node_by_type(dn, "cpu"))) {
+               const u32 *cell;
                u64 hwid;
 
                /*
@@ -277,10 +278,12 @@ void __init smp_init_cpus(void)
                 * considered invalid to build a cpu_logical_map
                 * entry.
                 */
-               if (of_property_read_u64(dn, "reg", &hwid)) {
+               cell = of_get_property(dn, "reg", NULL);
+               if (!cell) {
                        pr_err("%s: missing reg property\n", dn->full_name);
                        goto next;
                }
+               hwid = of_read_number(cell, of_n_addr_cells(dn));
 
                /*
                 * Non affinity bits must be set to 0 in the DT