]> Pileus Git - ~andy/linux/blob - arch/powerpc/mm/numa.c
powerpc/pseries: Use stop machine to update cpu maps
[~andy/linux] / arch / powerpc / mm / numa.c
1 /*
2  * pSeries NUMA support
3  *
4  * Copyright (C) 2002 Anton Blanchard <anton@au.ibm.com>, IBM
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11 #include <linux/threads.h>
12 #include <linux/bootmem.h>
13 #include <linux/init.h>
14 #include <linux/mm.h>
15 #include <linux/mmzone.h>
16 #include <linux/export.h>
17 #include <linux/nodemask.h>
18 #include <linux/cpu.h>
19 #include <linux/notifier.h>
20 #include <linux/memblock.h>
21 #include <linux/of.h>
22 #include <linux/pfn.h>
23 #include <linux/cpuset.h>
24 #include <linux/node.h>
25 #include <linux/stop_machine.h>
26 #include <asm/sparsemem.h>
27 #include <asm/prom.h>
28 #include <asm/smp.h>
29 #include <asm/firmware.h>
30 #include <asm/paca.h>
31 #include <asm/hvcall.h>
32 #include <asm/setup.h>
33
34 static int numa_enabled = 1;
35
36 static char *cmdline __initdata;
37
38 static int numa_debug;
39 #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
40
41 int numa_cpu_lookup_table[NR_CPUS];
42 cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
43 struct pglist_data *node_data[MAX_NUMNODES];
44
45 EXPORT_SYMBOL(numa_cpu_lookup_table);
46 EXPORT_SYMBOL(node_to_cpumask_map);
47 EXPORT_SYMBOL(node_data);
48
49 static int min_common_depth;
50 static int n_mem_addr_cells, n_mem_size_cells;
51 static int form1_affinity;
52
53 #define MAX_DISTANCE_REF_POINTS 4
54 static int distance_ref_points_depth;
55 static const unsigned int *distance_ref_points;
56 static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS];
57
58 /*
59  * Allocate node_to_cpumask_map based on number of available nodes
60  * Requires node_possible_map to be valid.
61  *
62  * Note: cpumask_of_node() is not valid until after this is done.
63  */
64 static void __init setup_node_to_cpumask_map(void)
65 {
66         unsigned int node, num = 0;
67
68         /* setup nr_node_ids if not done yet */
69         if (nr_node_ids == MAX_NUMNODES) {
70                 for_each_node_mask(node, node_possible_map)
71                         num = node;
72                 nr_node_ids = num + 1;
73         }
74
75         /* allocate the map */
76         for (node = 0; node < nr_node_ids; node++)
77                 alloc_bootmem_cpumask_var(&node_to_cpumask_map[node]);
78
79         /* cpumask_of_node() will now work */
80         dbg("Node to cpumask map for %d nodes\n", nr_node_ids);
81 }
82
83 static int __init fake_numa_create_new_node(unsigned long end_pfn,
84                                                 unsigned int *nid)
85 {
86         unsigned long long mem;
87         char *p = cmdline;
88         static unsigned int fake_nid;
89         static unsigned long long curr_boundary;
90
91         /*
92          * Modify node id, iff we started creating NUMA nodes
93          * We want to continue from where we left of the last time
94          */
95         if (fake_nid)
96                 *nid = fake_nid;
97         /*
98          * In case there are no more arguments to parse, the
99          * node_id should be the same as the last fake node id
100          * (we've handled this above).
101          */
102         if (!p)
103                 return 0;
104
105         mem = memparse(p, &p);
106         if (!mem)
107                 return 0;
108
109         if (mem < curr_boundary)
110                 return 0;
111
112         curr_boundary = mem;
113
114         if ((end_pfn << PAGE_SHIFT) > mem) {
115                 /*
116                  * Skip commas and spaces
117                  */
118                 while (*p == ',' || *p == ' ' || *p == '\t')
119                         p++;
120
121                 cmdline = p;
122                 fake_nid++;
123                 *nid = fake_nid;
124                 dbg("created new fake_node with id %d\n", fake_nid);
125                 return 1;
126         }
127         return 0;
128 }
129
130 /*
131  * get_node_active_region - Return active region containing pfn
132  * Active range returned is empty if none found.
133  * @pfn: The page to return the region for
134  * @node_ar: Returned set to the active region containing @pfn
135  */
136 static void __init get_node_active_region(unsigned long pfn,
137                                           struct node_active_region *node_ar)
138 {
139         unsigned long start_pfn, end_pfn;
140         int i, nid;
141
142         for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) {
143                 if (pfn >= start_pfn && pfn < end_pfn) {
144                         node_ar->nid = nid;
145                         node_ar->start_pfn = start_pfn;
146                         node_ar->end_pfn = end_pfn;
147                         break;
148                 }
149         }
150 }
151
152 static void map_cpu_to_node(int cpu, int node)
153 {
154         numa_cpu_lookup_table[cpu] = node;
155
156         dbg("adding cpu %d to node %d\n", cpu, node);
157
158         if (!(cpumask_test_cpu(cpu, node_to_cpumask_map[node])))
159                 cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
160 }
161
162 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PPC_SPLPAR)
163 static void unmap_cpu_from_node(unsigned long cpu)
164 {
165         int node = numa_cpu_lookup_table[cpu];
166
167         dbg("removing cpu %lu from node %d\n", cpu, node);
168
169         if (cpumask_test_cpu(cpu, node_to_cpumask_map[node])) {
170                 cpumask_clear_cpu(cpu, node_to_cpumask_map[node]);
171         } else {
172                 printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
173                        cpu, node);
174         }
175 }
176 #endif /* CONFIG_HOTPLUG_CPU || CONFIG_PPC_SPLPAR */
177
178 /* must hold reference to node during call */
179 static const int *of_get_associativity(struct device_node *dev)
180 {
181         return of_get_property(dev, "ibm,associativity", NULL);
182 }
183
184 /*
185  * Returns the property linux,drconf-usable-memory if
186  * it exists (the property exists only in kexec/kdump kernels,
187  * added by kexec-tools)
188  */
189 static const u32 *of_get_usable_memory(struct device_node *memory)
190 {
191         const u32 *prop;
192         u32 len;
193         prop = of_get_property(memory, "linux,drconf-usable-memory", &len);
194         if (!prop || len < sizeof(unsigned int))
195                 return 0;
196         return prop;
197 }
198
199 int __node_distance(int a, int b)
200 {
201         int i;
202         int distance = LOCAL_DISTANCE;
203
204         if (!form1_affinity)
205                 return ((a == b) ? LOCAL_DISTANCE : REMOTE_DISTANCE);
206
207         for (i = 0; i < distance_ref_points_depth; i++) {
208                 if (distance_lookup_table[a][i] == distance_lookup_table[b][i])
209                         break;
210
211                 /* Double the distance for each NUMA level */
212                 distance *= 2;
213         }
214
215         return distance;
216 }
217
218 static void initialize_distance_lookup_table(int nid,
219                 const unsigned int *associativity)
220 {
221         int i;
222
223         if (!form1_affinity)
224                 return;
225
226         for (i = 0; i < distance_ref_points_depth; i++) {
227                 distance_lookup_table[nid][i] =
228                         associativity[distance_ref_points[i]];
229         }
230 }
231
232 /* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
233  * info is found.
234  */
235 static int associativity_to_nid(const unsigned int *associativity)
236 {
237         int nid = -1;
238
239         if (min_common_depth == -1)
240                 goto out;
241
242         if (associativity[0] >= min_common_depth)
243                 nid = associativity[min_common_depth];
244
245         /* POWER4 LPAR uses 0xffff as invalid node */
246         if (nid == 0xffff || nid >= MAX_NUMNODES)
247                 nid = -1;
248
249         if (nid > 0 && associativity[0] >= distance_ref_points_depth)
250                 initialize_distance_lookup_table(nid, associativity);
251
252 out:
253         return nid;
254 }
255
256 /* Returns the nid associated with the given device tree node,
257  * or -1 if not found.
258  */
259 static int of_node_to_nid_single(struct device_node *device)
260 {
261         int nid = -1;
262         const unsigned int *tmp;
263
264         tmp = of_get_associativity(device);
265         if (tmp)
266                 nid = associativity_to_nid(tmp);
267         return nid;
268 }
269
270 /* Walk the device tree upwards, looking for an associativity id */
271 int of_node_to_nid(struct device_node *device)
272 {
273         struct device_node *tmp;
274         int nid = -1;
275
276         of_node_get(device);
277         while (device) {
278                 nid = of_node_to_nid_single(device);
279                 if (nid != -1)
280                         break;
281
282                 tmp = device;
283                 device = of_get_parent(tmp);
284                 of_node_put(tmp);
285         }
286         of_node_put(device);
287
288         return nid;
289 }
290 EXPORT_SYMBOL_GPL(of_node_to_nid);
291
292 static int __init find_min_common_depth(void)
293 {
294         int depth;
295         struct device_node *root;
296
297         if (firmware_has_feature(FW_FEATURE_OPAL))
298                 root = of_find_node_by_path("/ibm,opal");
299         else
300                 root = of_find_node_by_path("/rtas");
301         if (!root)
302                 root = of_find_node_by_path("/");
303
304         /*
305          * This property is a set of 32-bit integers, each representing
306          * an index into the ibm,associativity nodes.
307          *
308          * With form 0 affinity the first integer is for an SMP configuration
309          * (should be all 0's) and the second is for a normal NUMA
310          * configuration. We have only one level of NUMA.
311          *
312          * With form 1 affinity the first integer is the most significant
313          * NUMA boundary and the following are progressively less significant
314          * boundaries. There can be more than one level of NUMA.
315          */
316         distance_ref_points = of_get_property(root,
317                                         "ibm,associativity-reference-points",
318                                         &distance_ref_points_depth);
319
320         if (!distance_ref_points) {
321                 dbg("NUMA: ibm,associativity-reference-points not found.\n");
322                 goto err;
323         }
324
325         distance_ref_points_depth /= sizeof(int);
326
327         if (firmware_has_feature(FW_FEATURE_OPAL) ||
328             firmware_has_feature(FW_FEATURE_TYPE1_AFFINITY)) {
329                 dbg("Using form 1 affinity\n");
330                 form1_affinity = 1;
331         }
332
333         if (form1_affinity) {
334                 depth = distance_ref_points[0];
335         } else {
336                 if (distance_ref_points_depth < 2) {
337                         printk(KERN_WARNING "NUMA: "
338                                 "short ibm,associativity-reference-points\n");
339                         goto err;
340                 }
341
342                 depth = distance_ref_points[1];
343         }
344
345         /*
346          * Warn and cap if the hardware supports more than
347          * MAX_DISTANCE_REF_POINTS domains.
348          */
349         if (distance_ref_points_depth > MAX_DISTANCE_REF_POINTS) {
350                 printk(KERN_WARNING "NUMA: distance array capped at "
351                         "%d entries\n", MAX_DISTANCE_REF_POINTS);
352                 distance_ref_points_depth = MAX_DISTANCE_REF_POINTS;
353         }
354
355         of_node_put(root);
356         return depth;
357
358 err:
359         of_node_put(root);
360         return -1;
361 }
362
363 static void __init get_n_mem_cells(int *n_addr_cells, int *n_size_cells)
364 {
365         struct device_node *memory = NULL;
366
367         memory = of_find_node_by_type(memory, "memory");
368         if (!memory)
369                 panic("numa.c: No memory nodes found!");
370
371         *n_addr_cells = of_n_addr_cells(memory);
372         *n_size_cells = of_n_size_cells(memory);
373         of_node_put(memory);
374 }
375
376 static unsigned long read_n_cells(int n, const unsigned int **buf)
377 {
378         unsigned long result = 0;
379
380         while (n--) {
381                 result = (result << 32) | **buf;
382                 (*buf)++;
383         }
384         return result;
385 }
386
387 /*
388  * Read the next memblock list entry from the ibm,dynamic-memory property
389  * and return the information in the provided of_drconf_cell structure.
390  */
391 static void read_drconf_cell(struct of_drconf_cell *drmem, const u32 **cellp)
392 {
393         const u32 *cp;
394
395         drmem->base_addr = read_n_cells(n_mem_addr_cells, cellp);
396
397         cp = *cellp;
398         drmem->drc_index = cp[0];
399         drmem->reserved = cp[1];
400         drmem->aa_index = cp[2];
401         drmem->flags = cp[3];
402
403         *cellp = cp + 4;
404 }
405
406 /*
407  * Retrieve and validate the ibm,dynamic-memory property of the device tree.
408  *
409  * The layout of the ibm,dynamic-memory property is a number N of memblock
410  * list entries followed by N memblock list entries.  Each memblock list entry
411  * contains information as laid out in the of_drconf_cell struct above.
412  */
413 static int of_get_drconf_memory(struct device_node *memory, const u32 **dm)
414 {
415         const u32 *prop;
416         u32 len, entries;
417
418         prop = of_get_property(memory, "ibm,dynamic-memory", &len);
419         if (!prop || len < sizeof(unsigned int))
420                 return 0;
421
422         entries = *prop++;
423
424         /* Now that we know the number of entries, revalidate the size
425          * of the property read in to ensure we have everything
426          */
427         if (len < (entries * (n_mem_addr_cells + 4) + 1) * sizeof(unsigned int))
428                 return 0;
429
430         *dm = prop;
431         return entries;
432 }
433
434 /*
435  * Retrieve and validate the ibm,lmb-size property for drconf memory
436  * from the device tree.
437  */
438 static u64 of_get_lmb_size(struct device_node *memory)
439 {
440         const u32 *prop;
441         u32 len;
442
443         prop = of_get_property(memory, "ibm,lmb-size", &len);
444         if (!prop || len < sizeof(unsigned int))
445                 return 0;
446
447         return read_n_cells(n_mem_size_cells, &prop);
448 }
449
450 struct assoc_arrays {
451         u32     n_arrays;
452         u32     array_sz;
453         const u32 *arrays;
454 };
455
456 /*
457  * Retrieve and validate the list of associativity arrays for drconf
458  * memory from the ibm,associativity-lookup-arrays property of the
459  * device tree..
460  *
461  * The layout of the ibm,associativity-lookup-arrays property is a number N
462  * indicating the number of associativity arrays, followed by a number M
463  * indicating the size of each associativity array, followed by a list
464  * of N associativity arrays.
465  */
466 static int of_get_assoc_arrays(struct device_node *memory,
467                                struct assoc_arrays *aa)
468 {
469         const u32 *prop;
470         u32 len;
471
472         prop = of_get_property(memory, "ibm,associativity-lookup-arrays", &len);
473         if (!prop || len < 2 * sizeof(unsigned int))
474                 return -1;
475
476         aa->n_arrays = *prop++;
477         aa->array_sz = *prop++;
478
479         /* Now that we know the number of arrays and size of each array,
480          * revalidate the size of the property read in.
481          */
482         if (len < (aa->n_arrays * aa->array_sz + 2) * sizeof(unsigned int))
483                 return -1;
484
485         aa->arrays = prop;
486         return 0;
487 }
488
489 /*
490  * This is like of_node_to_nid_single() for memory represented in the
491  * ibm,dynamic-reconfiguration-memory node.
492  */
493 static int of_drconf_to_nid_single(struct of_drconf_cell *drmem,
494                                    struct assoc_arrays *aa)
495 {
496         int default_nid = 0;
497         int nid = default_nid;
498         int index;
499
500         if (min_common_depth > 0 && min_common_depth <= aa->array_sz &&
501             !(drmem->flags & DRCONF_MEM_AI_INVALID) &&
502             drmem->aa_index < aa->n_arrays) {
503                 index = drmem->aa_index * aa->array_sz + min_common_depth - 1;
504                 nid = aa->arrays[index];
505
506                 if (nid == 0xffff || nid >= MAX_NUMNODES)
507                         nid = default_nid;
508         }
509
510         return nid;
511 }
512
513 /*
514  * Figure out to which domain a cpu belongs and stick it there.
515  * Return the id of the domain used.
516  */
517 static int __cpuinit numa_setup_cpu(unsigned long lcpu)
518 {
519         int nid = 0;
520         struct device_node *cpu = of_get_cpu_node(lcpu, NULL);
521
522         if (!cpu) {
523                 WARN_ON(1);
524                 goto out;
525         }
526
527         nid = of_node_to_nid_single(cpu);
528
529         if (nid < 0 || !node_online(nid))
530                 nid = first_online_node;
531 out:
532         map_cpu_to_node(lcpu, nid);
533
534         of_node_put(cpu);
535
536         return nid;
537 }
538
539 static int __cpuinit cpu_numa_callback(struct notifier_block *nfb,
540                              unsigned long action,
541                              void *hcpu)
542 {
543         unsigned long lcpu = (unsigned long)hcpu;
544         int ret = NOTIFY_DONE;
545
546         switch (action) {
547         case CPU_UP_PREPARE:
548         case CPU_UP_PREPARE_FROZEN:
549                 numa_setup_cpu(lcpu);
550                 ret = NOTIFY_OK;
551                 break;
552 #ifdef CONFIG_HOTPLUG_CPU
553         case CPU_DEAD:
554         case CPU_DEAD_FROZEN:
555         case CPU_UP_CANCELED:
556         case CPU_UP_CANCELED_FROZEN:
557                 unmap_cpu_from_node(lcpu);
558                 break;
559                 ret = NOTIFY_OK;
560 #endif
561         }
562         return ret;
563 }
564
565 /*
566  * Check and possibly modify a memory region to enforce the memory limit.
567  *
568  * Returns the size the region should have to enforce the memory limit.
569  * This will either be the original value of size, a truncated value,
570  * or zero. If the returned value of size is 0 the region should be
571  * discarded as it lies wholly above the memory limit.
572  */
573 static unsigned long __init numa_enforce_memory_limit(unsigned long start,
574                                                       unsigned long size)
575 {
576         /*
577          * We use memblock_end_of_DRAM() in here instead of memory_limit because
578          * we've already adjusted it for the limit and it takes care of
579          * having memory holes below the limit.  Also, in the case of
580          * iommu_is_off, memory_limit is not set but is implicitly enforced.
581          */
582
583         if (start + size <= memblock_end_of_DRAM())
584                 return size;
585
586         if (start >= memblock_end_of_DRAM())
587                 return 0;
588
589         return memblock_end_of_DRAM() - start;
590 }
591
592 /*
593  * Reads the counter for a given entry in
594  * linux,drconf-usable-memory property
595  */
596 static inline int __init read_usm_ranges(const u32 **usm)
597 {
598         /*
599          * For each lmb in ibm,dynamic-memory a corresponding
600          * entry in linux,drconf-usable-memory property contains
601          * a counter followed by that many (base, size) duple.
602          * read the counter from linux,drconf-usable-memory
603          */
604         return read_n_cells(n_mem_size_cells, usm);
605 }
606
607 /*
608  * Extract NUMA information from the ibm,dynamic-reconfiguration-memory
609  * node.  This assumes n_mem_{addr,size}_cells have been set.
610  */
611 static void __init parse_drconf_memory(struct device_node *memory)
612 {
613         const u32 *uninitialized_var(dm), *usm;
614         unsigned int n, rc, ranges, is_kexec_kdump = 0;
615         unsigned long lmb_size, base, size, sz;
616         int nid;
617         struct assoc_arrays aa = { .arrays = NULL };
618
619         n = of_get_drconf_memory(memory, &dm);
620         if (!n)
621                 return;
622
623         lmb_size = of_get_lmb_size(memory);
624         if (!lmb_size)
625                 return;
626
627         rc = of_get_assoc_arrays(memory, &aa);
628         if (rc)
629                 return;
630
631         /* check if this is a kexec/kdump kernel */
632         usm = of_get_usable_memory(memory);
633         if (usm != NULL)
634                 is_kexec_kdump = 1;
635
636         for (; n != 0; --n) {
637                 struct of_drconf_cell drmem;
638
639                 read_drconf_cell(&drmem, &dm);
640
641                 /* skip this block if the reserved bit is set in flags (0x80)
642                    or if the block is not assigned to this partition (0x8) */
643                 if ((drmem.flags & DRCONF_MEM_RESERVED)
644                     || !(drmem.flags & DRCONF_MEM_ASSIGNED))
645                         continue;
646
647                 base = drmem.base_addr;
648                 size = lmb_size;
649                 ranges = 1;
650
651                 if (is_kexec_kdump) {
652                         ranges = read_usm_ranges(&usm);
653                         if (!ranges) /* there are no (base, size) duple */
654                                 continue;
655                 }
656                 do {
657                         if (is_kexec_kdump) {
658                                 base = read_n_cells(n_mem_addr_cells, &usm);
659                                 size = read_n_cells(n_mem_size_cells, &usm);
660                         }
661                         nid = of_drconf_to_nid_single(&drmem, &aa);
662                         fake_numa_create_new_node(
663                                 ((base + size) >> PAGE_SHIFT),
664                                            &nid);
665                         node_set_online(nid);
666                         sz = numa_enforce_memory_limit(base, size);
667                         if (sz)
668                                 memblock_set_node(base, sz, nid);
669                 } while (--ranges);
670         }
671 }
672
673 static int __init parse_numa_properties(void)
674 {
675         struct device_node *memory;
676         int default_nid = 0;
677         unsigned long i;
678
679         if (numa_enabled == 0) {
680                 printk(KERN_WARNING "NUMA disabled by user\n");
681                 return -1;
682         }
683
684         min_common_depth = find_min_common_depth();
685
686         if (min_common_depth < 0)
687                 return min_common_depth;
688
689         dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
690
691         /*
692          * Even though we connect cpus to numa domains later in SMP
693          * init, we need to know the node ids now. This is because
694          * each node to be onlined must have NODE_DATA etc backing it.
695          */
696         for_each_present_cpu(i) {
697                 struct device_node *cpu;
698                 int nid;
699
700                 cpu = of_get_cpu_node(i, NULL);
701                 BUG_ON(!cpu);
702                 nid = of_node_to_nid_single(cpu);
703                 of_node_put(cpu);
704
705                 /*
706                  * Don't fall back to default_nid yet -- we will plug
707                  * cpus into nodes once the memory scan has discovered
708                  * the topology.
709                  */
710                 if (nid < 0)
711                         continue;
712                 node_set_online(nid);
713         }
714
715         get_n_mem_cells(&n_mem_addr_cells, &n_mem_size_cells);
716
717         for_each_node_by_type(memory, "memory") {
718                 unsigned long start;
719                 unsigned long size;
720                 int nid;
721                 int ranges;
722                 const unsigned int *memcell_buf;
723                 unsigned int len;
724
725                 memcell_buf = of_get_property(memory,
726                         "linux,usable-memory", &len);
727                 if (!memcell_buf || len <= 0)
728                         memcell_buf = of_get_property(memory, "reg", &len);
729                 if (!memcell_buf || len <= 0)
730                         continue;
731
732                 /* ranges in cell */
733                 ranges = (len >> 2) / (n_mem_addr_cells + n_mem_size_cells);
734 new_range:
735                 /* these are order-sensitive, and modify the buffer pointer */
736                 start = read_n_cells(n_mem_addr_cells, &memcell_buf);
737                 size = read_n_cells(n_mem_size_cells, &memcell_buf);
738
739                 /*
740                  * Assumption: either all memory nodes or none will
741                  * have associativity properties.  If none, then
742                  * everything goes to default_nid.
743                  */
744                 nid = of_node_to_nid_single(memory);
745                 if (nid < 0)
746                         nid = default_nid;
747
748                 fake_numa_create_new_node(((start + size) >> PAGE_SHIFT), &nid);
749                 node_set_online(nid);
750
751                 if (!(size = numa_enforce_memory_limit(start, size))) {
752                         if (--ranges)
753                                 goto new_range;
754                         else
755                                 continue;
756                 }
757
758                 memblock_set_node(start, size, nid);
759
760                 if (--ranges)
761                         goto new_range;
762         }
763
764         /*
765          * Now do the same thing for each MEMBLOCK listed in the
766          * ibm,dynamic-memory property in the
767          * ibm,dynamic-reconfiguration-memory node.
768          */
769         memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
770         if (memory)
771                 parse_drconf_memory(memory);
772
773         return 0;
774 }
775
776 static void __init setup_nonnuma(void)
777 {
778         unsigned long top_of_ram = memblock_end_of_DRAM();
779         unsigned long total_ram = memblock_phys_mem_size();
780         unsigned long start_pfn, end_pfn;
781         unsigned int nid = 0;
782         struct memblock_region *reg;
783
784         printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
785                top_of_ram, total_ram);
786         printk(KERN_DEBUG "Memory hole size: %ldMB\n",
787                (top_of_ram - total_ram) >> 20);
788
789         for_each_memblock(memory, reg) {
790                 start_pfn = memblock_region_memory_base_pfn(reg);
791                 end_pfn = memblock_region_memory_end_pfn(reg);
792
793                 fake_numa_create_new_node(end_pfn, &nid);
794                 memblock_set_node(PFN_PHYS(start_pfn),
795                                   PFN_PHYS(end_pfn - start_pfn), nid);
796                 node_set_online(nid);
797         }
798 }
799
800 void __init dump_numa_cpu_topology(void)
801 {
802         unsigned int node;
803         unsigned int cpu, count;
804
805         if (min_common_depth == -1 || !numa_enabled)
806                 return;
807
808         for_each_online_node(node) {
809                 printk(KERN_DEBUG "Node %d CPUs:", node);
810
811                 count = 0;
812                 /*
813                  * If we used a CPU iterator here we would miss printing
814                  * the holes in the cpumap.
815                  */
816                 for (cpu = 0; cpu < nr_cpu_ids; cpu++) {
817                         if (cpumask_test_cpu(cpu,
818                                         node_to_cpumask_map[node])) {
819                                 if (count == 0)
820                                         printk(" %u", cpu);
821                                 ++count;
822                         } else {
823                                 if (count > 1)
824                                         printk("-%u", cpu - 1);
825                                 count = 0;
826                         }
827                 }
828
829                 if (count > 1)
830                         printk("-%u", nr_cpu_ids - 1);
831                 printk("\n");
832         }
833 }
834
835 static void __init dump_numa_memory_topology(void)
836 {
837         unsigned int node;
838         unsigned int count;
839
840         if (min_common_depth == -1 || !numa_enabled)
841                 return;
842
843         for_each_online_node(node) {
844                 unsigned long i;
845
846                 printk(KERN_DEBUG "Node %d Memory:", node);
847
848                 count = 0;
849
850                 for (i = 0; i < memblock_end_of_DRAM();
851                      i += (1 << SECTION_SIZE_BITS)) {
852                         if (early_pfn_to_nid(i >> PAGE_SHIFT) == node) {
853                                 if (count == 0)
854                                         printk(" 0x%lx", i);
855                                 ++count;
856                         } else {
857                                 if (count > 0)
858                                         printk("-0x%lx", i);
859                                 count = 0;
860                         }
861                 }
862
863                 if (count > 0)
864                         printk("-0x%lx", i);
865                 printk("\n");
866         }
867 }
868
869 /*
870  * Allocate some memory, satisfying the memblock or bootmem allocator where
871  * required. nid is the preferred node and end is the physical address of
872  * the highest address in the node.
873  *
874  * Returns the virtual address of the memory.
875  */
876 static void __init *careful_zallocation(int nid, unsigned long size,
877                                        unsigned long align,
878                                        unsigned long end_pfn)
879 {
880         void *ret;
881         int new_nid;
882         unsigned long ret_paddr;
883
884         ret_paddr = __memblock_alloc_base(size, align, end_pfn << PAGE_SHIFT);
885
886         /* retry over all memory */
887         if (!ret_paddr)
888                 ret_paddr = __memblock_alloc_base(size, align, memblock_end_of_DRAM());
889
890         if (!ret_paddr)
891                 panic("numa.c: cannot allocate %lu bytes for node %d",
892                       size, nid);
893
894         ret = __va(ret_paddr);
895
896         /*
897          * We initialize the nodes in numeric order: 0, 1, 2...
898          * and hand over control from the MEMBLOCK allocator to the
899          * bootmem allocator.  If this function is called for
900          * node 5, then we know that all nodes <5 are using the
901          * bootmem allocator instead of the MEMBLOCK allocator.
902          *
903          * So, check the nid from which this allocation came
904          * and double check to see if we need to use bootmem
905          * instead of the MEMBLOCK.  We don't free the MEMBLOCK memory
906          * since it would be useless.
907          */
908         new_nid = early_pfn_to_nid(ret_paddr >> PAGE_SHIFT);
909         if (new_nid < nid) {
910                 ret = __alloc_bootmem_node(NODE_DATA(new_nid),
911                                 size, align, 0);
912
913                 dbg("alloc_bootmem %p %lx\n", ret, size);
914         }
915
916         memset(ret, 0, size);
917         return ret;
918 }
919
920 static struct notifier_block __cpuinitdata ppc64_numa_nb = {
921         .notifier_call = cpu_numa_callback,
922         .priority = 1 /* Must run before sched domains notifier. */
923 };
924
925 static void __init mark_reserved_regions_for_nid(int nid)
926 {
927         struct pglist_data *node = NODE_DATA(nid);
928         struct memblock_region *reg;
929
930         for_each_memblock(reserved, reg) {
931                 unsigned long physbase = reg->base;
932                 unsigned long size = reg->size;
933                 unsigned long start_pfn = physbase >> PAGE_SHIFT;
934                 unsigned long end_pfn = PFN_UP(physbase + size);
935                 struct node_active_region node_ar;
936                 unsigned long node_end_pfn = node->node_start_pfn +
937                                              node->node_spanned_pages;
938
939                 /*
940                  * Check to make sure that this memblock.reserved area is
941                  * within the bounds of the node that we care about.
942                  * Checking the nid of the start and end points is not
943                  * sufficient because the reserved area could span the
944                  * entire node.
945                  */
946                 if (end_pfn <= node->node_start_pfn ||
947                     start_pfn >= node_end_pfn)
948                         continue;
949
950                 get_node_active_region(start_pfn, &node_ar);
951                 while (start_pfn < end_pfn &&
952                         node_ar.start_pfn < node_ar.end_pfn) {
953                         unsigned long reserve_size = size;
954                         /*
955                          * if reserved region extends past active region
956                          * then trim size to active region
957                          */
958                         if (end_pfn > node_ar.end_pfn)
959                                 reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
960                                         - physbase;
961                         /*
962                          * Only worry about *this* node, others may not
963                          * yet have valid NODE_DATA().
964                          */
965                         if (node_ar.nid == nid) {
966                                 dbg("reserve_bootmem %lx %lx nid=%d\n",
967                                         physbase, reserve_size, node_ar.nid);
968                                 reserve_bootmem_node(NODE_DATA(node_ar.nid),
969                                                 physbase, reserve_size,
970                                                 BOOTMEM_DEFAULT);
971                         }
972                         /*
973                          * if reserved region is contained in the active region
974                          * then done.
975                          */
976                         if (end_pfn <= node_ar.end_pfn)
977                                 break;
978
979                         /*
980                          * reserved region extends past the active region
981                          *   get next active region that contains this
982                          *   reserved region
983                          */
984                         start_pfn = node_ar.end_pfn;
985                         physbase = start_pfn << PAGE_SHIFT;
986                         size = size - reserve_size;
987                         get_node_active_region(start_pfn, &node_ar);
988                 }
989         }
990 }
991
992
993 void __init do_init_bootmem(void)
994 {
995         int nid;
996
997         min_low_pfn = 0;
998         max_low_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
999         max_pfn = max_low_pfn;
1000
1001         if (parse_numa_properties())
1002                 setup_nonnuma();
1003         else
1004                 dump_numa_memory_topology();
1005
1006         for_each_online_node(nid) {
1007                 unsigned long start_pfn, end_pfn;
1008                 void *bootmem_vaddr;
1009                 unsigned long bootmap_pages;
1010
1011                 get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
1012
1013                 /*
1014                  * Allocate the node structure node local if possible
1015                  *
1016                  * Be careful moving this around, as it relies on all
1017                  * previous nodes' bootmem to be initialized and have
1018                  * all reserved areas marked.
1019                  */
1020                 NODE_DATA(nid) = careful_zallocation(nid,
1021                                         sizeof(struct pglist_data),
1022                                         SMP_CACHE_BYTES, end_pfn);
1023
1024                 dbg("node %d\n", nid);
1025                 dbg("NODE_DATA() = %p\n", NODE_DATA(nid));
1026
1027                 NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
1028                 NODE_DATA(nid)->node_start_pfn = start_pfn;
1029                 NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
1030
1031                 if (NODE_DATA(nid)->node_spanned_pages == 0)
1032                         continue;
1033
1034                 dbg("start_paddr = %lx\n", start_pfn << PAGE_SHIFT);
1035                 dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT);
1036
1037                 bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
1038                 bootmem_vaddr = careful_zallocation(nid,
1039                                         bootmap_pages << PAGE_SHIFT,
1040                                         PAGE_SIZE, end_pfn);
1041
1042                 dbg("bootmap_vaddr = %p\n", bootmem_vaddr);
1043
1044                 init_bootmem_node(NODE_DATA(nid),
1045                                   __pa(bootmem_vaddr) >> PAGE_SHIFT,
1046                                   start_pfn, end_pfn);
1047
1048                 free_bootmem_with_active_regions(nid, end_pfn);
1049                 /*
1050                  * Be very careful about moving this around.  Future
1051                  * calls to careful_zallocation() depend on this getting
1052                  * done correctly.
1053                  */
1054                 mark_reserved_regions_for_nid(nid);
1055                 sparse_memory_present_with_active_regions(nid);
1056         }
1057
1058         init_bootmem_done = 1;
1059
1060         /*
1061          * Now bootmem is initialised we can create the node to cpumask
1062          * lookup tables and setup the cpu callback to populate them.
1063          */
1064         setup_node_to_cpumask_map();
1065
1066         register_cpu_notifier(&ppc64_numa_nb);
1067         cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
1068                           (void *)(unsigned long)boot_cpuid);
1069 }
1070
1071 void __init paging_init(void)
1072 {
1073         unsigned long max_zone_pfns[MAX_NR_ZONES];
1074         memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
1075         max_zone_pfns[ZONE_DMA] = memblock_end_of_DRAM() >> PAGE_SHIFT;
1076         free_area_init_nodes(max_zone_pfns);
1077 }
1078
1079 static int __init early_numa(char *p)
1080 {
1081         if (!p)
1082                 return 0;
1083
1084         if (strstr(p, "off"))
1085                 numa_enabled = 0;
1086
1087         if (strstr(p, "debug"))
1088                 numa_debug = 1;
1089
1090         p = strstr(p, "fake=");
1091         if (p)
1092                 cmdline = p + strlen("fake=");
1093
1094         return 0;
1095 }
1096 early_param("numa", early_numa);
1097
1098 #ifdef CONFIG_MEMORY_HOTPLUG
1099 /*
1100  * Find the node associated with a hot added memory section for
1101  * memory represented in the device tree by the property
1102  * ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory.
1103  */
1104 static int hot_add_drconf_scn_to_nid(struct device_node *memory,
1105                                      unsigned long scn_addr)
1106 {
1107         const u32 *dm;
1108         unsigned int drconf_cell_cnt, rc;
1109         unsigned long lmb_size;
1110         struct assoc_arrays aa;
1111         int nid = -1;
1112
1113         drconf_cell_cnt = of_get_drconf_memory(memory, &dm);
1114         if (!drconf_cell_cnt)
1115                 return -1;
1116
1117         lmb_size = of_get_lmb_size(memory);
1118         if (!lmb_size)
1119                 return -1;
1120
1121         rc = of_get_assoc_arrays(memory, &aa);
1122         if (rc)
1123                 return -1;
1124
1125         for (; drconf_cell_cnt != 0; --drconf_cell_cnt) {
1126                 struct of_drconf_cell drmem;
1127
1128                 read_drconf_cell(&drmem, &dm);
1129
1130                 /* skip this block if it is reserved or not assigned to
1131                  * this partition */
1132                 if ((drmem.flags & DRCONF_MEM_RESERVED)
1133                     || !(drmem.flags & DRCONF_MEM_ASSIGNED))
1134                         continue;
1135
1136                 if ((scn_addr < drmem.base_addr)
1137                     || (scn_addr >= (drmem.base_addr + lmb_size)))
1138                         continue;
1139
1140                 nid = of_drconf_to_nid_single(&drmem, &aa);
1141                 break;
1142         }
1143
1144         return nid;
1145 }
1146
1147 /*
1148  * Find the node associated with a hot added memory section for memory
1149  * represented in the device tree as a node (i.e. memory@XXXX) for
1150  * each memblock.
1151  */
1152 int hot_add_node_scn_to_nid(unsigned long scn_addr)
1153 {
1154         struct device_node *memory;
1155         int nid = -1;
1156
1157         for_each_node_by_type(memory, "memory") {
1158                 unsigned long start, size;
1159                 int ranges;
1160                 const unsigned int *memcell_buf;
1161                 unsigned int len;
1162
1163                 memcell_buf = of_get_property(memory, "reg", &len);
1164                 if (!memcell_buf || len <= 0)
1165                         continue;
1166
1167                 /* ranges in cell */
1168                 ranges = (len >> 2) / (n_mem_addr_cells + n_mem_size_cells);
1169
1170                 while (ranges--) {
1171                         start = read_n_cells(n_mem_addr_cells, &memcell_buf);
1172                         size = read_n_cells(n_mem_size_cells, &memcell_buf);
1173
1174                         if ((scn_addr < start) || (scn_addr >= (start + size)))
1175                                 continue;
1176
1177                         nid = of_node_to_nid_single(memory);
1178                         break;
1179                 }
1180
1181                 if (nid >= 0)
1182                         break;
1183         }
1184
1185         of_node_put(memory);
1186
1187         return nid;
1188 }
1189
1190 /*
1191  * Find the node associated with a hot added memory section.  Section
1192  * corresponds to a SPARSEMEM section, not an MEMBLOCK.  It is assumed that
1193  * sections are fully contained within a single MEMBLOCK.
1194  */
1195 int hot_add_scn_to_nid(unsigned long scn_addr)
1196 {
1197         struct device_node *memory = NULL;
1198         int nid, found = 0;
1199
1200         if (!numa_enabled || (min_common_depth < 0))
1201                 return first_online_node;
1202
1203         memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
1204         if (memory) {
1205                 nid = hot_add_drconf_scn_to_nid(memory, scn_addr);
1206                 of_node_put(memory);
1207         } else {
1208                 nid = hot_add_node_scn_to_nid(scn_addr);
1209         }
1210
1211         if (nid < 0 || !node_online(nid))
1212                 nid = first_online_node;
1213
1214         if (NODE_DATA(nid)->node_spanned_pages)
1215                 return nid;
1216
1217         for_each_online_node(nid) {
1218                 if (NODE_DATA(nid)->node_spanned_pages) {
1219                         found = 1;
1220                         break;
1221                 }
1222         }
1223
1224         BUG_ON(!found);
1225         return nid;
1226 }
1227
1228 static u64 hot_add_drconf_memory_max(void)
1229 {
1230         struct device_node *memory = NULL;
1231         unsigned int drconf_cell_cnt = 0;
1232         u64 lmb_size = 0;
1233         const u32 *dm = 0;
1234
1235         memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
1236         if (memory) {
1237                 drconf_cell_cnt = of_get_drconf_memory(memory, &dm);
1238                 lmb_size = of_get_lmb_size(memory);
1239                 of_node_put(memory);
1240         }
1241         return lmb_size * drconf_cell_cnt;
1242 }
1243
1244 /*
1245  * memory_hotplug_max - return max address of memory that may be added
1246  *
1247  * This is currently only used on systems that support drconfig memory
1248  * hotplug.
1249  */
1250 u64 memory_hotplug_max(void)
1251 {
1252         return max(hot_add_drconf_memory_max(), memblock_end_of_DRAM());
1253 }
1254 #endif /* CONFIG_MEMORY_HOTPLUG */
1255
1256 /* Virtual Processor Home Node (VPHN) support */
1257 #ifdef CONFIG_PPC_SPLPAR
1258 struct topology_update_data {
1259         struct topology_update_data *next;
1260         unsigned int cpu;
1261         int old_nid;
1262         int new_nid;
1263 };
1264
1265 static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
1266 static cpumask_t cpu_associativity_changes_mask;
1267 static int vphn_enabled;
1268 static int prrn_enabled;
1269 static void reset_topology_timer(void);
1270
1271 /*
1272  * Store the current values of the associativity change counters in the
1273  * hypervisor.
1274  */
1275 static void setup_cpu_associativity_change_counters(void)
1276 {
1277         int cpu;
1278
1279         /* The VPHN feature supports a maximum of 8 reference points */
1280         BUILD_BUG_ON(MAX_DISTANCE_REF_POINTS > 8);
1281
1282         for_each_possible_cpu(cpu) {
1283                 int i;
1284                 u8 *counts = vphn_cpu_change_counts[cpu];
1285                 volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
1286
1287                 for (i = 0; i < distance_ref_points_depth; i++)
1288                         counts[i] = hypervisor_counts[i];
1289         }
1290 }
1291
1292 /*
1293  * The hypervisor maintains a set of 8 associativity change counters in
1294  * the VPA of each cpu that correspond to the associativity levels in the
1295  * ibm,associativity-reference-points property. When an associativity
1296  * level changes, the corresponding counter is incremented.
1297  *
1298  * Set a bit in cpu_associativity_changes_mask for each cpu whose home
1299  * node associativity levels have changed.
1300  *
1301  * Returns the number of cpus with unhandled associativity changes.
1302  */
1303 static int update_cpu_associativity_changes_mask(void)
1304 {
1305         int cpu;
1306         cpumask_t *changes = &cpu_associativity_changes_mask;
1307
1308         for_each_possible_cpu(cpu) {
1309                 int i, changed = 0;
1310                 u8 *counts = vphn_cpu_change_counts[cpu];
1311                 volatile u8 *hypervisor_counts = lppaca[cpu].vphn_assoc_counts;
1312
1313                 for (i = 0; i < distance_ref_points_depth; i++) {
1314                         if (hypervisor_counts[i] != counts[i]) {
1315                                 counts[i] = hypervisor_counts[i];
1316                                 changed = 1;
1317                         }
1318                 }
1319                 if (changed) {
1320                         cpumask_set_cpu(cpu, changes);
1321                 }
1322         }
1323
1324         return cpumask_weight(changes);
1325 }
1326
1327 /*
1328  * 6 64-bit registers unpacked into 12 32-bit associativity values. To form
1329  * the complete property we have to add the length in the first cell.
1330  */
1331 #define VPHN_ASSOC_BUFSIZE (6*sizeof(u64)/sizeof(u32) + 1)
1332
1333 /*
1334  * Convert the associativity domain numbers returned from the hypervisor
1335  * to the sequence they would appear in the ibm,associativity property.
1336  */
1337 static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
1338 {
1339         int i, nr_assoc_doms = 0;
1340         const u16 *field = (const u16*) packed;
1341
1342 #define VPHN_FIELD_UNUSED       (0xffff)
1343 #define VPHN_FIELD_MSB          (0x8000)
1344 #define VPHN_FIELD_MASK         (~VPHN_FIELD_MSB)
1345
1346         for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) {
1347                 if (*field == VPHN_FIELD_UNUSED) {
1348                         /* All significant fields processed, and remaining
1349                          * fields contain the reserved value of all 1's.
1350                          * Just store them.
1351                          */
1352                         unpacked[i] = *((u32*)field);
1353                         field += 2;
1354                 } else if (*field & VPHN_FIELD_MSB) {
1355                         /* Data is in the lower 15 bits of this field */
1356                         unpacked[i] = *field & VPHN_FIELD_MASK;
1357                         field++;
1358                         nr_assoc_doms++;
1359                 } else {
1360                         /* Data is in the lower 15 bits of this field
1361                          * concatenated with the next 16 bit field
1362                          */
1363                         unpacked[i] = *((u32*)field);
1364                         field += 2;
1365                         nr_assoc_doms++;
1366                 }
1367         }
1368
1369         /* The first cell contains the length of the property */
1370         unpacked[0] = nr_assoc_doms;
1371
1372         return nr_assoc_doms;
1373 }
1374
1375 /*
1376  * Retrieve the new associativity information for a virtual processor's
1377  * home node.
1378  */
1379 static long hcall_vphn(unsigned long cpu, unsigned int *associativity)
1380 {
1381         long rc;
1382         long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
1383         u64 flags = 1;
1384         int hwcpu = get_hard_smp_processor_id(cpu);
1385
1386         rc = plpar_hcall9(H_HOME_NODE_ASSOCIATIVITY, retbuf, flags, hwcpu);
1387         vphn_unpack_associativity(retbuf, associativity);
1388
1389         return rc;
1390 }
1391
1392 static long vphn_get_associativity(unsigned long cpu,
1393                                         unsigned int *associativity)
1394 {
1395         long rc;
1396
1397         rc = hcall_vphn(cpu, associativity);
1398
1399         switch (rc) {
1400         case H_FUNCTION:
1401                 printk(KERN_INFO
1402                         "VPHN is not supported. Disabling polling...\n");
1403                 stop_topology_update();
1404                 break;
1405         case H_HARDWARE:
1406                 printk(KERN_ERR
1407                         "hcall_vphn() experienced a hardware fault "
1408                         "preventing VPHN. Disabling polling...\n");
1409                 stop_topology_update();
1410         }
1411
1412         return rc;
1413 }
1414
1415 /*
1416  * Update the CPU maps and sysfs entries for a single CPU when its NUMA
1417  * characteristics change. This function doesn't perform any locking and is
1418  * only safe to call from stop_machine().
1419  */
1420 static int update_cpu_topology(void *data)
1421 {
1422         struct topology_update_data *update;
1423         unsigned long cpu;
1424
1425         if (!data)
1426                 return -EINVAL;
1427
1428         cpu = get_cpu();
1429
1430         for (update = data; update; update = update->next) {
1431                 if (cpu != update->cpu)
1432                         continue;
1433
1434                 unregister_cpu_under_node(update->cpu, update->old_nid);
1435                 unmap_cpu_from_node(update->cpu);
1436                 map_cpu_to_node(update->cpu, update->new_nid);
1437                 register_cpu_under_node(update->cpu, update->new_nid);
1438         }
1439
1440         return 0;
1441 }
1442
1443 /*
1444  * Update the node maps and sysfs entries for each cpu whose home node
1445  * has changed. Returns 1 when the topology has changed, and 0 otherwise.
1446  */
1447 int arch_update_cpu_topology(void)
1448 {
1449         unsigned int cpu, changed = 0;
1450         struct topology_update_data *updates, *ud;
1451         unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0};
1452         struct device *dev;
1453         int weight, i = 0;
1454
1455         weight = cpumask_weight(&cpu_associativity_changes_mask);
1456         if (!weight)
1457                 return 0;
1458
1459         updates = kzalloc(weight * (sizeof(*updates)), GFP_KERNEL);
1460         if (!updates)
1461                 return 0;
1462
1463         for_each_cpu(cpu, &cpu_associativity_changes_mask) {
1464                 ud = &updates[i++];
1465                 ud->cpu = cpu;
1466                 vphn_get_associativity(cpu, associativity);
1467                 ud->new_nid = associativity_to_nid(associativity);
1468
1469                 if (ud->new_nid < 0 || !node_online(ud->new_nid))
1470                         ud->new_nid = first_online_node;
1471
1472                 ud->old_nid = numa_cpu_lookup_table[cpu];
1473
1474                 if (i < weight)
1475                         ud->next = &updates[i];
1476         }
1477
1478         stop_machine(update_cpu_topology, &updates[0], cpu_online_mask);
1479
1480         for (ud = &updates[0]; ud; ud = ud->next) {
1481                 dev = get_cpu_device(ud->cpu);
1482                 if (dev)
1483                         kobject_uevent(&dev->kobj, KOBJ_CHANGE);
1484                 cpumask_clear_cpu(ud->cpu, &cpu_associativity_changes_mask);
1485                 changed = 1;
1486         }
1487
1488         kfree(updates);
1489         return changed;
1490 }
1491
1492 static void topology_work_fn(struct work_struct *work)
1493 {
1494         rebuild_sched_domains();
1495 }
1496 static DECLARE_WORK(topology_work, topology_work_fn);
1497
1498 void topology_schedule_update(void)
1499 {
1500         schedule_work(&topology_work);
1501 }
1502
1503 static void topology_timer_fn(unsigned long ignored)
1504 {
1505         if (prrn_enabled && cpumask_weight(&cpu_associativity_changes_mask))
1506                 topology_schedule_update();
1507         else if (vphn_enabled) {
1508                 if (update_cpu_associativity_changes_mask() > 0)
1509                         topology_schedule_update();
1510                 reset_topology_timer();
1511         }
1512 }
1513 static struct timer_list topology_timer =
1514         TIMER_INITIALIZER(topology_timer_fn, 0, 0);
1515
1516 static void reset_topology_timer(void)
1517 {
1518         topology_timer.data = 0;
1519         topology_timer.expires = jiffies + 60 * HZ;
1520         mod_timer(&topology_timer, topology_timer.expires);
1521 }
1522
1523 static void stage_topology_update(int core_id)
1524 {
1525         cpumask_or(&cpu_associativity_changes_mask,
1526                 &cpu_associativity_changes_mask, cpu_sibling_mask(core_id));
1527         reset_topology_timer();
1528 }
1529
1530 static int dt_update_callback(struct notifier_block *nb,
1531                                 unsigned long action, void *data)
1532 {
1533         struct of_prop_reconfig *update;
1534         int rc = NOTIFY_DONE;
1535
1536         switch (action) {
1537         case OF_RECONFIG_UPDATE_PROPERTY:
1538                 update = (struct of_prop_reconfig *)data;
1539                 if (!of_prop_cmp(update->dn->type, "cpu") &&
1540                     !of_prop_cmp(update->prop->name, "ibm,associativity")) {
1541                         u32 core_id;
1542                         of_property_read_u32(update->dn, "reg", &core_id);
1543                         stage_topology_update(core_id);
1544                         rc = NOTIFY_OK;
1545                 }
1546                 break;
1547         }
1548
1549         return rc;
1550 }
1551
1552 static struct notifier_block dt_update_nb = {
1553         .notifier_call = dt_update_callback,
1554 };
1555
1556 /*
1557  * Start polling for associativity changes.
1558  */
1559 int start_topology_update(void)
1560 {
1561         int rc = 0;
1562
1563         if (firmware_has_feature(FW_FEATURE_PRRN)) {
1564                 if (!prrn_enabled) {
1565                         prrn_enabled = 1;
1566                         vphn_enabled = 0;
1567                         rc = of_reconfig_notifier_register(&dt_update_nb);
1568                 }
1569         } else if (0 && firmware_has_feature(FW_FEATURE_VPHN) &&
1570                    get_lppaca()->shared_proc) {
1571                 /* Disabled until races with load balancing are fixed */
1572                 if (!vphn_enabled) {
1573                         prrn_enabled = 0;
1574                         vphn_enabled = 1;
1575                         setup_cpu_associativity_change_counters();
1576                         init_timer_deferrable(&topology_timer);
1577                         reset_topology_timer();
1578                 }
1579         }
1580
1581         return rc;
1582 }
1583 __initcall(start_topology_update);
1584
1585 /*
1586  * Disable polling for VPHN associativity changes.
1587  */
1588 int stop_topology_update(void)
1589 {
1590         int rc = 0;
1591
1592         if (prrn_enabled) {
1593                 prrn_enabled = 0;
1594                 rc = of_reconfig_notifier_unregister(&dt_update_nb);
1595         } else if (vphn_enabled) {
1596                 vphn_enabled = 0;
1597                 rc = del_timer_sync(&topology_timer);
1598         }
1599
1600         return rc;
1601 }
1602 #endif /* CONFIG_PPC_SPLPAR */