1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * pseries CPU Hotplug infrastructure.
4 *
5 * Split out from arch/powerpc/platforms/pseries/setup.c
6 * arch/powerpc/kernel/rtas.c, and arch/powerpc/platforms/pseries/smp.c
7 *
8 * Peter Bergner, IBM March 2001.
9 * Copyright (C) 2001 IBM.
10 * Dave Engebretsen, Peter Bergner, and
11 * Mike Corrigan {engebret|bergner|mikec}@us.ibm.com
12 * Plus various changes from other IBM teams...
13 *
14 * Copyright (C) 2006 Michael Ellerman, IBM Corporation
15 */
16
17 #define pr_fmt(fmt) "pseries-hotplug-cpu: " fmt
18
19 #include <linux/kernel.h>
20 #include <linux/interrupt.h>
21 #include <linux/delay.h>
22 #include <linux/sched.h> /* for idle_task_exit */
23 #include <linux/sched/hotplug.h>
24 #include <linux/cpu.h>
25 #include <linux/of.h>
26 #include <linux/slab.h>
27 #include <asm/prom.h>
28 #include <asm/rtas.h>
29 #include <asm/firmware.h>
30 #include <asm/machdep.h>
31 #include <asm/vdso_datapage.h>
32 #include <asm/xics.h>
33 #include <asm/xive.h>
34 #include <asm/plpar_wrappers.h>
35 #include <asm/topology.h>
36 #include <asm/systemcfg.h>
37
38 #include "pseries.h"
39
40 /* This version can't take the spinlock, because it never returns */
41 static int rtas_stop_self_token = RTAS_UNKNOWN_SERVICE;
42
43 /*
44 * Record the CPU ids used on each nodes.
45 * Protected by cpu_add_remove_lock.
46 */
47 static cpumask_var_t node_recorded_ids_map[MAX_NUMNODES];
48
rtas_stop_self(void)49 static void rtas_stop_self(void)
50 {
51 static struct rtas_args args;
52
53 local_irq_disable();
54
55 BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE);
56
57 rtas_call_unlocked(&args, rtas_stop_self_token, 0, 1, NULL);
58
59 panic("Alas, I survived.\n");
60 }
61
pseries_cpu_offline_self(void)62 static void pseries_cpu_offline_self(void)
63 {
64 unsigned int hwcpu = hard_smp_processor_id();
65
66 local_irq_disable();
67 idle_task_exit();
68 if (xive_enabled())
69 xive_teardown_cpu();
70 else
71 xics_teardown_cpu();
72
73 unregister_slb_shadow(hwcpu);
74 unregister_vpa(hwcpu);
75 rtas_stop_self();
76
77 /* Should never get here... */
78 BUG();
79 for(;;);
80 }
81
pseries_cpu_disable(void)82 static int pseries_cpu_disable(void)
83 {
84 int cpu = smp_processor_id();
85
86 set_cpu_online(cpu, false);
87 #ifdef CONFIG_PPC64_PROC_SYSTEMCFG
88 systemcfg->processorCount--;
89 #endif
90
91 /*fix boot_cpuid here*/
92 if (cpu == boot_cpuid)
93 boot_cpuid = cpumask_any(cpu_online_mask);
94
95 /* FIXME: abstract this to not be platform specific later on */
96 if (xive_enabled())
97 xive_smp_disable_cpu();
98 else
99 xics_migrate_irqs_away();
100
101 cleanup_cpu_mmu_context();
102
103 return 0;
104 }
105
106 /*
107 * pseries_cpu_die: Wait for the cpu to die.
108 * @cpu: logical processor id of the CPU whose death we're awaiting.
109 *
110 * This function is called from the context of the thread which is performing
111 * the cpu-offline. Here we wait for long enough to allow the cpu in question
112 * to self-destroy so that the cpu-offline thread can send the CPU_DEAD
113 * notifications.
114 *
115 * OTOH, pseries_cpu_offline_self() is called by the @cpu when it wants to
116 * self-destruct.
117 */
pseries_cpu_die(unsigned int cpu)118 static void pseries_cpu_die(unsigned int cpu)
119 {
120 int cpu_status = 1;
121 unsigned int pcpu = get_hard_smp_processor_id(cpu);
122 unsigned long timeout = jiffies + msecs_to_jiffies(120000);
123
124 while (true) {
125 cpu_status = smp_query_cpu_stopped(pcpu);
126 if (cpu_status == QCSS_STOPPED ||
127 cpu_status == QCSS_HARDWARE_ERROR)
128 break;
129
130 if (time_after(jiffies, timeout)) {
131 pr_warn("CPU %i (hwid %i) didn't die after 120 seconds\n",
132 cpu, pcpu);
133 timeout = jiffies + msecs_to_jiffies(120000);
134 }
135
136 cond_resched();
137 }
138
139 if (cpu_status == QCSS_HARDWARE_ERROR) {
140 pr_warn("CPU %i (hwid %i) reported error while dying\n",
141 cpu, pcpu);
142 }
143
144 paca_ptrs[cpu]->cpu_start = 0;
145 }
146
147 /**
148 * find_cpu_id_range - found a linear ranger of @nthreads free CPU ids.
149 * @nthreads : the number of threads (cpu ids)
150 * @assigned_node : the node it belongs to or NUMA_NO_NODE if free ids from any
151 * node can be peek.
152 * @cpu_mask: the returned CPU mask.
153 *
154 * Returns 0 on success.
155 */
find_cpu_id_range(unsigned int nthreads,int assigned_node,cpumask_var_t * cpu_mask)156 static int find_cpu_id_range(unsigned int nthreads, int assigned_node,
157 cpumask_var_t *cpu_mask)
158 {
159 cpumask_var_t candidate_mask;
160 unsigned int cpu, node;
161 int rc = -ENOSPC;
162
163 if (!zalloc_cpumask_var(&candidate_mask, GFP_KERNEL))
164 return -ENOMEM;
165
166 cpumask_clear(*cpu_mask);
167 for (cpu = 0; cpu < nthreads; cpu++)
168 cpumask_set_cpu(cpu, *cpu_mask);
169
170 BUG_ON(!cpumask_subset(cpu_present_mask, cpu_possible_mask));
171
172 /* Get a bitmap of unoccupied slots. */
173 cpumask_xor(candidate_mask, cpu_possible_mask, cpu_present_mask);
174
175 if (assigned_node != NUMA_NO_NODE) {
176 /*
177 * Remove free ids previously assigned on the other nodes. We
178 * can walk only online nodes because once a node became online
179 * it is not turned offlined back.
180 */
181 for_each_online_node(node) {
182 if (node == assigned_node)
183 continue;
184 cpumask_andnot(candidate_mask, candidate_mask,
185 node_recorded_ids_map[node]);
186 }
187 }
188
189 if (cpumask_empty(candidate_mask))
190 goto out;
191
192 while (!cpumask_empty(*cpu_mask)) {
193 if (cpumask_subset(*cpu_mask, candidate_mask))
194 /* Found a range where we can insert the new cpu(s) */
195 break;
196 cpumask_shift_left(*cpu_mask, *cpu_mask, nthreads);
197 }
198
199 if (!cpumask_empty(*cpu_mask))
200 rc = 0;
201
202 out:
203 free_cpumask_var(candidate_mask);
204 return rc;
205 }
206
207 /*
208 * Update cpu_present_mask and paca(s) for a new cpu node. The wrinkle
209 * here is that a cpu device node may represent multiple logical cpus
210 * in the SMT case. We must honor the assumption in other code that
211 * the logical ids for sibling SMT threads x and y are adjacent, such
212 * that x^1 == y and y^1 == x.
213 */
pseries_add_processor(struct device_node * np)214 static int pseries_add_processor(struct device_node *np)
215 {
216 int len, nthreads, node, cpu, assigned_node;
217 int rc = 0;
218 cpumask_var_t cpu_mask;
219 const __be32 *intserv;
220
221 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s", &len);
222 if (!intserv)
223 return 0;
224
225 nthreads = len / sizeof(u32);
226
227 if (!alloc_cpumask_var(&cpu_mask, GFP_KERNEL))
228 return -ENOMEM;
229
230 /*
231 * Fetch from the DT nodes read by dlpar_configure_connector() the NUMA
232 * node id the added CPU belongs to.
233 */
234 node = of_node_to_nid(np);
235 if (node < 0 || !node_possible(node))
236 node = first_online_node;
237
238 BUG_ON(node == NUMA_NO_NODE);
239 assigned_node = node;
240
241 cpu_maps_update_begin();
242
243 rc = find_cpu_id_range(nthreads, node, &cpu_mask);
244 if (rc && nr_node_ids > 1) {
245 /*
246 * Try again, considering the free CPU ids from the other node.
247 */
248 node = NUMA_NO_NODE;
249 rc = find_cpu_id_range(nthreads, NUMA_NO_NODE, &cpu_mask);
250 }
251
252 if (rc) {
253 pr_err("Cannot add cpu %pOF; this system configuration"
254 " supports %d logical cpus.\n", np, num_possible_cpus());
255 goto out;
256 }
257
258 for_each_cpu(cpu, cpu_mask) {
259 BUG_ON(cpu_present(cpu));
260 set_cpu_present(cpu, true);
261 set_hard_smp_processor_id(cpu, be32_to_cpu(*intserv++));
262 }
263
264 /* Record the newly used CPU ids for the associate node. */
265 cpumask_or(node_recorded_ids_map[assigned_node],
266 node_recorded_ids_map[assigned_node], cpu_mask);
267
268 /*
269 * If node is set to NUMA_NO_NODE, CPU ids have be reused from
270 * another node, remove them from its mask.
271 */
272 if (node == NUMA_NO_NODE) {
273 cpu = cpumask_first(cpu_mask);
274 pr_warn("Reusing free CPU ids %d-%d from another node\n",
275 cpu, cpu + nthreads - 1);
276 for_each_online_node(node) {
277 if (node == assigned_node)
278 continue;
279 cpumask_andnot(node_recorded_ids_map[node],
280 node_recorded_ids_map[node],
281 cpu_mask);
282 }
283 }
284
285 out:
286 cpu_maps_update_done();
287 free_cpumask_var(cpu_mask);
288 return rc;
289 }
290
291 /*
292 * Update the present map for a cpu node which is going away, and set
293 * the hard id in the paca(s) to -1 to be consistent with boot time
294 * convention for non-present cpus.
295 */
pseries_remove_processor(struct device_node * np)296 static void pseries_remove_processor(struct device_node *np)
297 {
298 unsigned int cpu;
299 int len, nthreads, i;
300 const __be32 *intserv;
301 u32 thread;
302
303 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s", &len);
304 if (!intserv)
305 return;
306
307 nthreads = len / sizeof(u32);
308
309 cpu_maps_update_begin();
310 for (i = 0; i < nthreads; i++) {
311 thread = be32_to_cpu(intserv[i]);
312 for_each_present_cpu(cpu) {
313 if (get_hard_smp_processor_id(cpu) != thread)
314 continue;
315 BUG_ON(cpu_online(cpu));
316 set_cpu_present(cpu, false);
317 set_hard_smp_processor_id(cpu, -1);
318 update_numa_cpu_lookup_table(cpu, -1);
319 break;
320 }
321 if (cpu >= nr_cpu_ids)
322 printk(KERN_WARNING "Could not find cpu to remove "
323 "with physical id 0x%x\n", thread);
324 }
325 cpu_maps_update_done();
326 }
327
dlpar_offline_cpu(struct device_node * dn)328 static int dlpar_offline_cpu(struct device_node *dn)
329 {
330 int rc = 0;
331 unsigned int cpu;
332 int len, nthreads, i;
333 const __be32 *intserv;
334 u32 thread;
335
336 intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len);
337 if (!intserv)
338 return -EINVAL;
339
340 nthreads = len / sizeof(u32);
341
342 cpu_maps_update_begin();
343 for (i = 0; i < nthreads; i++) {
344 thread = be32_to_cpu(intserv[i]);
345 for_each_present_cpu(cpu) {
346 if (get_hard_smp_processor_id(cpu) != thread)
347 continue;
348
349 if (!cpu_online(cpu))
350 break;
351
352 /*
353 * device_offline() will return -EBUSY (via cpu_down()) if there
354 * is only one CPU left. Check it here to fail earlier and with a
355 * more informative error message, while also retaining the
356 * cpu_add_remove_lock to be sure that no CPUs are being
357 * online/offlined during this check.
358 */
359 if (num_online_cpus() == 1) {
360 pr_warn("Unable to remove last online CPU %pOFn\n", dn);
361 rc = -EBUSY;
362 goto out_unlock;
363 }
364
365 cpu_maps_update_done();
366 rc = device_offline(get_cpu_device(cpu));
367 if (rc)
368 goto out;
369 cpu_maps_update_begin();
370 break;
371 }
372 if (cpu == num_possible_cpus()) {
373 pr_warn("Could not find cpu to offline with physical id 0x%x\n",
374 thread);
375 }
376 }
377 out_unlock:
378 cpu_maps_update_done();
379
380 out:
381 return rc;
382 }
383
dlpar_online_cpu(struct device_node * dn)384 static int dlpar_online_cpu(struct device_node *dn)
385 {
386 int rc = 0;
387 unsigned int cpu;
388 int len, nthreads, i;
389 const __be32 *intserv;
390 u32 thread;
391
392 intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len);
393 if (!intserv)
394 return -EINVAL;
395
396 nthreads = len / sizeof(u32);
397
398 cpu_maps_update_begin();
399 for (i = 0; i < nthreads; i++) {
400 thread = be32_to_cpu(intserv[i]);
401 for_each_present_cpu(cpu) {
402 if (get_hard_smp_processor_id(cpu) != thread)
403 continue;
404
405 if (!topology_is_primary_thread(cpu)) {
406 if (cpu_smt_control != CPU_SMT_ENABLED)
407 break;
408 if (!topology_smt_thread_allowed(cpu))
409 break;
410 }
411
412 cpu_maps_update_done();
413 find_and_update_cpu_nid(cpu);
414 rc = device_online(get_cpu_device(cpu));
415 if (rc) {
416 dlpar_offline_cpu(dn);
417 goto out;
418 }
419 cpu_maps_update_begin();
420
421 break;
422 }
423 if (cpu == num_possible_cpus())
424 printk(KERN_WARNING "Could not find cpu to online "
425 "with physical id 0x%x\n", thread);
426 }
427 cpu_maps_update_done();
428
429 out:
430 return rc;
431
432 }
433
dlpar_cpu_exists(struct device_node * parent,u32 drc_index)434 static bool dlpar_cpu_exists(struct device_node *parent, u32 drc_index)
435 {
436 struct device_node *child = NULL;
437 u32 my_drc_index;
438 bool found;
439 int rc;
440
441 /* Assume cpu doesn't exist */
442 found = false;
443
444 for_each_child_of_node(parent, child) {
445 rc = of_property_read_u32(child, "ibm,my-drc-index",
446 &my_drc_index);
447 if (rc)
448 continue;
449
450 if (my_drc_index == drc_index) {
451 of_node_put(child);
452 found = true;
453 break;
454 }
455 }
456
457 return found;
458 }
459
drc_info_valid_index(struct device_node * parent,u32 drc_index)460 static bool drc_info_valid_index(struct device_node *parent, u32 drc_index)
461 {
462 struct property *info;
463 struct of_drc_info drc;
464 const __be32 *value;
465 u32 index;
466 int count, i, j;
467
468 info = of_find_property(parent, "ibm,drc-info", NULL);
469 if (!info)
470 return false;
471
472 value = of_prop_next_u32(info, NULL, &count);
473
474 /* First value of ibm,drc-info is number of drc-info records */
475 if (value)
476 value++;
477 else
478 return false;
479
480 for (i = 0; i < count; i++) {
481 if (of_read_drc_info_cell(&info, &value, &drc))
482 return false;
483
484 if (strncmp(drc.drc_type, "CPU", 3))
485 break;
486
487 if (drc_index > drc.last_drc_index)
488 continue;
489
490 index = drc.drc_index_start;
491 for (j = 0; j < drc.num_sequential_elems; j++) {
492 if (drc_index == index)
493 return true;
494
495 index += drc.sequential_inc;
496 }
497 }
498
499 return false;
500 }
501
valid_cpu_drc_index(struct device_node * parent,u32 drc_index)502 static bool valid_cpu_drc_index(struct device_node *parent, u32 drc_index)
503 {
504 bool found = false;
505 int rc, index;
506
507 if (of_property_present(parent, "ibm,drc-info"))
508 return drc_info_valid_index(parent, drc_index);
509
510 /* Note that the format of the ibm,drc-indexes array is
511 * the number of entries in the array followed by the array
512 * of drc values so we start looking at index = 1.
513 */
514 index = 1;
515 while (!found) {
516 u32 drc;
517
518 rc = of_property_read_u32_index(parent, "ibm,drc-indexes",
519 index++, &drc);
520
521 if (rc)
522 break;
523
524 if (drc == drc_index)
525 found = true;
526 }
527
528 return found;
529 }
530
pseries_cpuhp_attach_nodes(struct device_node * dn)531 static int pseries_cpuhp_attach_nodes(struct device_node *dn)
532 {
533 struct of_changeset cs;
534 int ret;
535
536 /*
537 * This device node is unattached but may have siblings; open-code the
538 * traversal.
539 */
540 for (of_changeset_init(&cs); dn != NULL; dn = dn->sibling) {
541 ret = of_changeset_attach_node(&cs, dn);
542 if (ret)
543 goto out;
544 }
545
546 ret = of_changeset_apply(&cs);
547 out:
548 of_changeset_destroy(&cs);
549 return ret;
550 }
551
dlpar_cpu_add(u32 drc_index)552 static ssize_t dlpar_cpu_add(u32 drc_index)
553 {
554 struct device_node *dn, *parent;
555 int rc, saved_rc;
556
557 pr_debug("Attempting to add CPU, drc index: %x\n", drc_index);
558
559 parent = of_find_node_by_path("/cpus");
560 if (!parent) {
561 pr_warn("Failed to find CPU root node \"/cpus\"\n");
562 return -ENODEV;
563 }
564
565 if (dlpar_cpu_exists(parent, drc_index)) {
566 of_node_put(parent);
567 pr_warn("CPU with drc index %x already exists\n", drc_index);
568 return -EINVAL;
569 }
570
571 if (!valid_cpu_drc_index(parent, drc_index)) {
572 of_node_put(parent);
573 pr_warn("Cannot find CPU (drc index %x) to add.\n", drc_index);
574 return -EINVAL;
575 }
576
577 rc = dlpar_acquire_drc(drc_index);
578 if (rc) {
579 pr_warn("Failed to acquire DRC, rc: %d, drc index: %x\n",
580 rc, drc_index);
581 of_node_put(parent);
582 return -EINVAL;
583 }
584
585 dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
586 if (!dn) {
587 pr_warn("Failed call to configure-connector, drc index: %x\n",
588 drc_index);
589 dlpar_release_drc(drc_index);
590 of_node_put(parent);
591 return -EINVAL;
592 }
593
594 rc = pseries_cpuhp_attach_nodes(dn);
595
596 /* Regardless we are done with parent now */
597 of_node_put(parent);
598
599 if (rc) {
600 saved_rc = rc;
601 pr_warn("Failed to attach node %pOFn, rc: %d, drc index: %x\n",
602 dn, rc, drc_index);
603
604 rc = dlpar_release_drc(drc_index);
605 if (!rc)
606 dlpar_free_cc_nodes(dn);
607
608 return saved_rc;
609 }
610
611 update_numa_distance(dn);
612
613 rc = dlpar_online_cpu(dn);
614 if (rc) {
615 saved_rc = rc;
616 pr_warn("Failed to online cpu %pOFn, rc: %d, drc index: %x\n",
617 dn, rc, drc_index);
618
619 rc = dlpar_detach_node(dn);
620 if (!rc)
621 dlpar_release_drc(drc_index);
622
623 return saved_rc;
624 }
625
626 pr_debug("Successfully added CPU %pOFn, drc index: %x\n", dn,
627 drc_index);
628 return rc;
629 }
630
pseries_cpuhp_cache_use_count(const struct device_node * cachedn)631 static unsigned int pseries_cpuhp_cache_use_count(const struct device_node *cachedn)
632 {
633 unsigned int use_count = 0;
634 struct device_node *dn, *tn;
635
636 WARN_ON(!of_node_is_type(cachedn, "cache"));
637
638 for_each_of_cpu_node(dn) {
639 tn = of_find_next_cache_node(dn);
640 of_node_put(tn);
641 if (tn == cachedn)
642 use_count++;
643 }
644
645 for_each_node_by_type(dn, "cache") {
646 tn = of_find_next_cache_node(dn);
647 of_node_put(tn);
648 if (tn == cachedn)
649 use_count++;
650 }
651
652 return use_count;
653 }
654
pseries_cpuhp_detach_nodes(struct device_node * cpudn)655 static int pseries_cpuhp_detach_nodes(struct device_node *cpudn)
656 {
657 struct device_node *dn;
658 struct of_changeset cs;
659 int ret = 0;
660
661 of_changeset_init(&cs);
662 ret = of_changeset_detach_node(&cs, cpudn);
663 if (ret)
664 goto out;
665
666 dn = cpudn;
667 while ((dn = of_find_next_cache_node(dn))) {
668 if (pseries_cpuhp_cache_use_count(dn) > 1) {
669 of_node_put(dn);
670 break;
671 }
672
673 ret = of_changeset_detach_node(&cs, dn);
674 of_node_put(dn);
675 if (ret)
676 goto out;
677 }
678
679 ret = of_changeset_apply(&cs);
680 out:
681 of_changeset_destroy(&cs);
682 return ret;
683 }
684
dlpar_cpu_remove(struct device_node * dn,u32 drc_index)685 static ssize_t dlpar_cpu_remove(struct device_node *dn, u32 drc_index)
686 {
687 int rc;
688
689 pr_debug("Attempting to remove CPU %pOFn, drc index: %x\n",
690 dn, drc_index);
691
692 rc = dlpar_offline_cpu(dn);
693 if (rc) {
694 pr_warn("Failed to offline CPU %pOFn, rc: %d\n", dn, rc);
695 return -EINVAL;
696 }
697
698 rc = dlpar_release_drc(drc_index);
699 if (rc) {
700 pr_warn("Failed to release drc (%x) for CPU %pOFn, rc: %d\n",
701 drc_index, dn, rc);
702 dlpar_online_cpu(dn);
703 return rc;
704 }
705
706 rc = pseries_cpuhp_detach_nodes(dn);
707 if (rc) {
708 int saved_rc = rc;
709
710 pr_warn("Failed to detach CPU %pOFn, rc: %d", dn, rc);
711
712 rc = dlpar_acquire_drc(drc_index);
713 if (!rc)
714 dlpar_online_cpu(dn);
715
716 return saved_rc;
717 }
718
719 pr_debug("Successfully removed CPU, drc index: %x\n", drc_index);
720 return 0;
721 }
722
cpu_drc_index_to_dn(u32 drc_index)723 static struct device_node *cpu_drc_index_to_dn(u32 drc_index)
724 {
725 struct device_node *dn;
726 u32 my_index;
727 int rc;
728
729 for_each_node_by_type(dn, "cpu") {
730 rc = of_property_read_u32(dn, "ibm,my-drc-index", &my_index);
731 if (rc)
732 continue;
733
734 if (my_index == drc_index)
735 break;
736 }
737
738 return dn;
739 }
740
dlpar_cpu_remove_by_index(u32 drc_index)741 static int dlpar_cpu_remove_by_index(u32 drc_index)
742 {
743 struct device_node *dn;
744 int rc;
745
746 dn = cpu_drc_index_to_dn(drc_index);
747 if (!dn) {
748 pr_warn("Cannot find CPU (drc index %x) to remove\n",
749 drc_index);
750 return -ENODEV;
751 }
752
753 rc = dlpar_cpu_remove(dn, drc_index);
754 of_node_put(dn);
755 return rc;
756 }
757
dlpar_cpu(struct pseries_hp_errorlog * hp_elog)758 int dlpar_cpu(struct pseries_hp_errorlog *hp_elog)
759 {
760 u32 drc_index;
761 int rc;
762
763 drc_index = be32_to_cpu(hp_elog->_drc_u.drc_index);
764
765 lock_device_hotplug();
766
767 switch (hp_elog->action) {
768 case PSERIES_HP_ELOG_ACTION_REMOVE:
769 if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) {
770 rc = dlpar_cpu_remove_by_index(drc_index);
771 /*
772 * Setting the isolation state of an UNISOLATED/CONFIGURED
773 * device to UNISOLATE is a no-op, but the hypervisor can
774 * use it as a hint that the CPU removal failed.
775 */
776 if (rc)
777 dlpar_unisolate_drc(drc_index);
778 }
779 else
780 rc = -EINVAL;
781 break;
782 case PSERIES_HP_ELOG_ACTION_ADD:
783 if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX)
784 rc = dlpar_cpu_add(drc_index);
785 else
786 rc = -EINVAL;
787 break;
788 default:
789 pr_err("Invalid action (%d) specified\n", hp_elog->action);
790 rc = -EINVAL;
791 break;
792 }
793
794 unlock_device_hotplug();
795 return rc;
796 }
797
798 #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
799
dlpar_cpu_probe(const char * buf,size_t count)800 static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
801 {
802 u32 drc_index;
803 int rc;
804
805 rc = kstrtou32(buf, 0, &drc_index);
806 if (rc)
807 return -EINVAL;
808
809 rc = dlpar_cpu_add(drc_index);
810
811 return rc ? rc : count;
812 }
813
dlpar_cpu_release(const char * buf,size_t count)814 static ssize_t dlpar_cpu_release(const char *buf, size_t count)
815 {
816 struct device_node *dn;
817 u32 drc_index;
818 int rc;
819
820 dn = of_find_node_by_path(buf);
821 if (!dn)
822 return -EINVAL;
823
824 rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
825 if (rc) {
826 of_node_put(dn);
827 return -EINVAL;
828 }
829
830 rc = dlpar_cpu_remove(dn, drc_index);
831 of_node_put(dn);
832
833 return rc ? rc : count;
834 }
835
836 #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */
837
pseries_smp_notifier(struct notifier_block * nb,unsigned long action,void * data)838 static int pseries_smp_notifier(struct notifier_block *nb,
839 unsigned long action, void *data)
840 {
841 struct of_reconfig_data *rd = data;
842 int err = 0;
843
844 switch (action) {
845 case OF_RECONFIG_ATTACH_NODE:
846 err = pseries_add_processor(rd->dn);
847 break;
848 case OF_RECONFIG_DETACH_NODE:
849 pseries_remove_processor(rd->dn);
850 break;
851 }
852 return notifier_from_errno(err);
853 }
854
855 static struct notifier_block pseries_smp_nb = {
856 .notifier_call = pseries_smp_notifier,
857 };
858
pseries_cpu_hotplug_init(void)859 void __init pseries_cpu_hotplug_init(void)
860 {
861 int qcss_tok;
862
863 rtas_stop_self_token = rtas_function_token(RTAS_FN_STOP_SELF);
864 qcss_tok = rtas_function_token(RTAS_FN_QUERY_CPU_STOPPED_STATE);
865
866 if (rtas_stop_self_token == RTAS_UNKNOWN_SERVICE ||
867 qcss_tok == RTAS_UNKNOWN_SERVICE) {
868 printk(KERN_INFO "CPU Hotplug not supported by firmware "
869 "- disabling.\n");
870 return;
871 }
872
873 smp_ops->cpu_offline_self = pseries_cpu_offline_self;
874 smp_ops->cpu_disable = pseries_cpu_disable;
875 smp_ops->cpu_die = pseries_cpu_die;
876 }
877
pseries_dlpar_init(void)878 static int __init pseries_dlpar_init(void)
879 {
880 unsigned int node;
881
882 #ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
883 ppc_md.cpu_probe = dlpar_cpu_probe;
884 ppc_md.cpu_release = dlpar_cpu_release;
885 #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */
886
887 /* Processors can be added/removed only on LPAR */
888 if (firmware_has_feature(FW_FEATURE_LPAR)) {
889 for_each_node(node) {
890 if (!alloc_cpumask_var_node(&node_recorded_ids_map[node],
891 GFP_KERNEL, node))
892 return -ENOMEM;
893
894 /* Record ids of CPU added at boot time */
895 cpumask_copy(node_recorded_ids_map[node],
896 cpumask_of_node(node));
897 }
898
899 of_reconfig_notifier_register(&pseries_smp_nb);
900 }
901
902 return 0;
903 }
904 machine_arch_initcall(pseries, pseries_dlpar_init);
905