diff options
Diffstat (limited to 'arch/powerpc/mm/numa.c')
-rw-r--r-- | arch/powerpc/mm/numa.c | 35 |
1 files changed, 3 insertions, 32 deletions
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 5ac08b8ab654..0507faa65478 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -158,35 +158,6 @@ static void unmap_cpu_from_node(unsigned long cpu) | |||
158 | } | 158 | } |
159 | #endif /* CONFIG_HOTPLUG_CPU */ | 159 | #endif /* CONFIG_HOTPLUG_CPU */ |
160 | 160 | ||
161 | static struct device_node * __cpuinit find_cpu_node(unsigned int cpu) | ||
162 | { | ||
163 | unsigned int hw_cpuid = get_hard_smp_processor_id(cpu); | ||
164 | struct device_node *cpu_node = NULL; | ||
165 | const unsigned int *interrupt_server, *reg; | ||
166 | int len; | ||
167 | |||
168 | while ((cpu_node = of_find_node_by_type(cpu_node, "cpu")) != NULL) { | ||
169 | /* Try interrupt server first */ | ||
170 | interrupt_server = of_get_property(cpu_node, | ||
171 | "ibm,ppc-interrupt-server#s", &len); | ||
172 | |||
173 | len = len / sizeof(u32); | ||
174 | |||
175 | if (interrupt_server && (len > 0)) { | ||
176 | while (len--) { | ||
177 | if (interrupt_server[len] == hw_cpuid) | ||
178 | return cpu_node; | ||
179 | } | ||
180 | } else { | ||
181 | reg = of_get_property(cpu_node, "reg", &len); | ||
182 | if (reg && (len > 0) && (reg[0] == hw_cpuid)) | ||
183 | return cpu_node; | ||
184 | } | ||
185 | } | ||
186 | |||
187 | return NULL; | ||
188 | } | ||
189 | |||
190 | /* must hold reference to node during call */ | 161 | /* must hold reference to node during call */ |
191 | static const int *of_get_associativity(struct device_node *dev) | 162 | static const int *of_get_associativity(struct device_node *dev) |
192 | { | 163 | { |
@@ -290,7 +261,7 @@ static int __init find_min_common_depth(void) | |||
290 | ref_points = of_get_property(rtas_root, | 261 | ref_points = of_get_property(rtas_root, |
291 | "ibm,associativity-reference-points", &len); | 262 | "ibm,associativity-reference-points", &len); |
292 | 263 | ||
293 | if ((len >= 1) && ref_points) { | 264 | if ((len >= 2 * sizeof(unsigned int)) && ref_points) { |
294 | depth = ref_points[1]; | 265 | depth = ref_points[1]; |
295 | } else { | 266 | } else { |
296 | dbg("NUMA: ibm,associativity-reference-points not found.\n"); | 267 | dbg("NUMA: ibm,associativity-reference-points not found.\n"); |
@@ -470,7 +441,7 @@ static int of_drconf_to_nid_single(struct of_drconf_cell *drmem, | |||
470 | static int __cpuinit numa_setup_cpu(unsigned long lcpu) | 441 | static int __cpuinit numa_setup_cpu(unsigned long lcpu) |
471 | { | 442 | { |
472 | int nid = 0; | 443 | int nid = 0; |
473 | struct device_node *cpu = find_cpu_node(lcpu); | 444 | struct device_node *cpu = of_get_cpu_node(lcpu, NULL); |
474 | 445 | ||
475 | if (!cpu) { | 446 | if (!cpu) { |
476 | WARN_ON(1); | 447 | WARN_ON(1); |
@@ -652,7 +623,7 @@ static int __init parse_numa_properties(void) | |||
652 | for_each_present_cpu(i) { | 623 | for_each_present_cpu(i) { |
653 | int nid; | 624 | int nid; |
654 | 625 | ||
655 | cpu = find_cpu_node(i); | 626 | cpu = of_get_cpu_node(i, NULL); |
656 | BUG_ON(!cpu); | 627 | BUG_ON(!cpu); |
657 | nid = of_node_to_nid_single(cpu); | 628 | nid = of_node_to_nid_single(cpu); |
658 | of_node_put(cpu); | 629 | of_node_put(cpu); |