1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#define KMSG_COMPONENT "cpu"
20#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
21
22#include <linux/workqueue.h>
23#include <linux/memblock.h>
24#include <linux/export.h>
25#include <linux/init.h>
26#include <linux/mm.h>
27#include <linux/err.h>
28#include <linux/spinlock.h>
29#include <linux/kernel_stat.h>
30#include <linux/delay.h>
31#include <linux/interrupt.h>
32#include <linux/irqflags.h>
33#include <linux/cpu.h>
34#include <linux/slab.h>
35#include <linux/sched/hotplug.h>
36#include <linux/sched/task_stack.h>
37#include <linux/crash_dump.h>
38#include <linux/kprobes.h>
39#include <asm/asm-offsets.h>
40#include <asm/diag.h>
41#include <asm/switch_to.h>
42#include <asm/facility.h>
43#include <asm/ipl.h>
44#include <asm/setup.h>
45#include <asm/irq.h>
46#include <asm/tlbflush.h>
47#include <asm/vtimer.h>
48#include <asm/lowcore.h>
49#include <asm/sclp.h>
50#include <asm/vdso.h>
51#include <asm/debug.h>
52#include <asm/os_info.h>
53#include <asm/sigp.h>
54#include <asm/idle.h>
55#include <asm/nmi.h>
56#include <asm/stacktrace.h>
57#include <asm/topology.h>
58#include "entry.h"
59
60enum {
61 ec_schedule = 0,
62 ec_call_function_single,
63 ec_stop_cpu,
64};
65
66enum {
67 CPU_STATE_STANDBY,
68 CPU_STATE_CONFIGURED,
69};
70
71static DEFINE_PER_CPU(struct cpu *, cpu_device);
72
73struct pcpu {
74 struct lowcore *lowcore;
75 unsigned long ec_mask;
76 unsigned long ec_clk;
77 signed char state;
78 signed char polarization;
79 u16 address;
80};
81
82static u8 boot_core_type;
83static struct pcpu pcpu_devices[NR_CPUS];
84
85unsigned int smp_cpu_mt_shift;
86EXPORT_SYMBOL(smp_cpu_mt_shift);
87
88unsigned int smp_cpu_mtid;
89EXPORT_SYMBOL(smp_cpu_mtid);
90
91#ifdef CONFIG_CRASH_DUMP
92__vector128 __initdata boot_cpu_vector_save_area[__NUM_VXRS];
93#endif
94
95static unsigned int smp_max_threads __initdata = -1U;
96
97static int __init early_nosmt(char *s)
98{
99 smp_max_threads = 1;
100 return 0;
101}
102early_param("nosmt", early_nosmt);
103
104static int __init early_smt(char *s)
105{
106 get_option(&s, &smp_max_threads);
107 return 0;
108}
109early_param("smt", early_smt);
110
111
112
113
114
115DEFINE_MUTEX(smp_cpu_state_mutex);
116
117
118
119
120static inline int __pcpu_sigp_relax(u16 addr, u8 order, unsigned long parm)
121{
122 int cc;
123
124 while (1) {
125 cc = __pcpu_sigp(addr, order, parm, NULL);
126 if (cc != SIGP_CC_BUSY)
127 return cc;
128 cpu_relax();
129 }
130}
131
132static int pcpu_sigp_retry(struct pcpu *pcpu, u8 order, u32 parm)
133{
134 int cc, retry;
135
136 for (retry = 0; ; retry++) {
137 cc = __pcpu_sigp(pcpu->address, order, parm, NULL);
138 if (cc != SIGP_CC_BUSY)
139 break;
140 if (retry >= 3)
141 udelay(10);
142 }
143 return cc;
144}
145
146static inline int pcpu_stopped(struct pcpu *pcpu)
147{
148 u32 uninitialized_var(status);
149
150 if (__pcpu_sigp(pcpu->address, SIGP_SENSE,
151 0, &status) != SIGP_CC_STATUS_STORED)
152 return 0;
153 return !!(status & (SIGP_STATUS_CHECK_STOP|SIGP_STATUS_STOPPED));
154}
155
156static inline int pcpu_running(struct pcpu *pcpu)
157{
158 if (__pcpu_sigp(pcpu->address, SIGP_SENSE_RUNNING,
159 0, NULL) != SIGP_CC_STATUS_STORED)
160 return 1;
161
162 return 0;
163}
164
165
166
167
168static struct pcpu *pcpu_find_address(const struct cpumask *mask, u16 address)
169{
170 int cpu;
171
172 for_each_cpu(cpu, mask)
173 if (pcpu_devices[cpu].address == address)
174 return pcpu_devices + cpu;
175 return NULL;
176}
177
178static void pcpu_ec_call(struct pcpu *pcpu, int ec_bit)
179{
180 int order;
181
182 if (test_and_set_bit(ec_bit, &pcpu->ec_mask))
183 return;
184 order = pcpu_running(pcpu) ? SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL;
185 pcpu->ec_clk = get_tod_clock_fast();
186 pcpu_sigp_retry(pcpu, order, 0);
187}
188
189static int pcpu_alloc_lowcore(struct pcpu *pcpu, int cpu)
190{
191 unsigned long async_stack, nodat_stack;
192 struct lowcore *lc;
193
194 if (pcpu != &pcpu_devices[0]) {
195 pcpu->lowcore = (struct lowcore *)
196 __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
197 nodat_stack = __get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER);
198 if (!pcpu->lowcore || !nodat_stack)
199 goto out;
200 } else {
201 nodat_stack = pcpu->lowcore->nodat_stack - STACK_INIT_OFFSET;
202 }
203 async_stack = stack_alloc();
204 if (!async_stack)
205 goto out;
206 lc = pcpu->lowcore;
207 memcpy(lc, &S390_lowcore, 512);
208 memset((char *) lc + 512, 0, sizeof(*lc) - 512);
209 lc->async_stack = async_stack + STACK_INIT_OFFSET;
210 lc->nodat_stack = nodat_stack + STACK_INIT_OFFSET;
211 lc->cpu_nr = cpu;
212 lc->spinlock_lockval = arch_spin_lockval(cpu);
213 lc->spinlock_index = 0;
214 lc->br_r1_trampoline = 0x07f1;
215 if (nmi_alloc_per_cpu(lc))
216 goto out_async;
217 if (vdso_alloc_per_cpu(lc))
218 goto out_mcesa;
219 lowcore_ptr[cpu] = lc;
220 pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, (u32)(unsigned long) lc);
221 return 0;
222
223out_mcesa:
224 nmi_free_per_cpu(lc);
225out_async:
226 stack_free(async_stack);
227out:
228 if (pcpu != &pcpu_devices[0]) {
229 free_pages(nodat_stack, THREAD_SIZE_ORDER);
230 free_pages((unsigned long) pcpu->lowcore, LC_ORDER);
231 }
232 return -ENOMEM;
233}
234
235static void pcpu_free_lowcore(struct pcpu *pcpu)
236{
237 unsigned long async_stack, nodat_stack, lowcore;
238
239 nodat_stack = pcpu->lowcore->nodat_stack - STACK_INIT_OFFSET;
240 async_stack = pcpu->lowcore->async_stack - STACK_INIT_OFFSET;
241 lowcore = (unsigned long) pcpu->lowcore;
242
243 pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, 0);
244 lowcore_ptr[pcpu - pcpu_devices] = NULL;
245 vdso_free_per_cpu(pcpu->lowcore);
246 nmi_free_per_cpu(pcpu->lowcore);
247 stack_free(async_stack);
248 if (pcpu == &pcpu_devices[0])
249 return;
250 free_pages(nodat_stack, THREAD_SIZE_ORDER);
251 free_pages(lowcore, LC_ORDER);
252}
253
254static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu)
255{
256 struct lowcore *lc = pcpu->lowcore;
257
258 cpumask_set_cpu(cpu, &init_mm.context.cpu_attach_mask);
259 cpumask_set_cpu(cpu, mm_cpumask(&init_mm));
260 lc->cpu_nr = cpu;
261 lc->spinlock_lockval = arch_spin_lockval(cpu);
262 lc->spinlock_index = 0;
263 lc->percpu_offset = __per_cpu_offset[cpu];
264 lc->kernel_asce = S390_lowcore.kernel_asce;
265 lc->user_asce = S390_lowcore.kernel_asce;
266 lc->machine_flags = S390_lowcore.machine_flags;
267 lc->user_timer = lc->system_timer =
268 lc->steal_timer = lc->avg_steal_timer = 0;
269 __ctl_store(lc->cregs_save_area, 0, 15);
270 lc->cregs_save_area[1] = lc->kernel_asce;
271 lc->cregs_save_area[7] = lc->vdso_asce;
272 save_access_regs((unsigned int *) lc->access_regs_save_area);
273 memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
274 sizeof(lc->stfle_fac_list));
275 memcpy(lc->alt_stfle_fac_list, S390_lowcore.alt_stfle_fac_list,
276 sizeof(lc->alt_stfle_fac_list));
277 arch_spin_lock_setup(cpu);
278}
279
280static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)
281{
282 struct lowcore *lc = pcpu->lowcore;
283
284 lc->kernel_stack = (unsigned long) task_stack_page(tsk)
285 + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
286 lc->current_task = (unsigned long) tsk;
287 lc->lpp = LPP_MAGIC;
288 lc->current_pid = tsk->pid;
289 lc->user_timer = tsk->thread.user_timer;
290 lc->guest_timer = tsk->thread.guest_timer;
291 lc->system_timer = tsk->thread.system_timer;
292 lc->hardirq_timer = tsk->thread.hardirq_timer;
293 lc->softirq_timer = tsk->thread.softirq_timer;
294 lc->steal_timer = 0;
295}
296
297static void pcpu_start_fn(struct pcpu *pcpu, void (*func)(void *), void *data)
298{
299 struct lowcore *lc = pcpu->lowcore;
300
301 lc->restart_stack = lc->nodat_stack;
302 lc->restart_fn = (unsigned long) func;
303 lc->restart_data = (unsigned long) data;
304 lc->restart_source = -1UL;
305 pcpu_sigp_retry(pcpu, SIGP_RESTART, 0);
306}
307
308
309
310
311static void __pcpu_delegate(void (*func)(void*), void *data)
312{
313 func(data);
314}
315
316static void __no_sanitize_address pcpu_delegate(struct pcpu *pcpu,
317 void (*func)(void *),
318 void *data, unsigned long stack)
319{
320 struct lowcore *lc = lowcore_ptr[pcpu - pcpu_devices];
321 unsigned long source_cpu = stap();
322
323 __load_psw_mask(PSW_KERNEL_BITS | PSW_MASK_DAT);
324 if (pcpu->address == source_cpu)
325 CALL_ON_STACK(__pcpu_delegate, stack, 2, func, data);
326
327 pcpu_sigp_retry(pcpu, SIGP_STOP, 0);
328
329 mem_assign_absolute(lc->restart_stack, stack);
330 mem_assign_absolute(lc->restart_fn, (unsigned long) func);
331 mem_assign_absolute(lc->restart_data, (unsigned long) data);
332 mem_assign_absolute(lc->restart_source, source_cpu);
333 __bpon();
334 asm volatile(
335 "0: sigp 0,%0,%2 # sigp restart to target cpu\n"
336 " brc 2,0b # busy, try again\n"
337 "1: sigp 0,%1,%3 # sigp stop to current cpu\n"
338 " brc 2,1b # busy, try again\n"
339 : : "d" (pcpu->address), "d" (source_cpu),
340 "K" (SIGP_RESTART), "K" (SIGP_STOP)
341 : "0", "1", "cc");
342 for (;;) ;
343}
344
345
346
347
348static int pcpu_set_smt(unsigned int mtid)
349{
350 int cc;
351
352 if (smp_cpu_mtid == mtid)
353 return 0;
354 cc = __pcpu_sigp(0, SIGP_SET_MULTI_THREADING, mtid, NULL);
355 if (cc == 0) {
356 smp_cpu_mtid = mtid;
357 smp_cpu_mt_shift = 0;
358 while (smp_cpu_mtid >= (1U << smp_cpu_mt_shift))
359 smp_cpu_mt_shift++;
360 pcpu_devices[0].address = stap();
361 }
362 return cc;
363}
364
365
366
367
368void smp_call_online_cpu(void (*func)(void *), void *data)
369{
370 struct pcpu *pcpu;
371
372
373 pcpu = pcpu_find_address(cpu_online_mask, stap());
374 if (!pcpu)
375
376 pcpu = pcpu_devices + cpumask_first(cpu_online_mask);
377 pcpu_delegate(pcpu, func, data, (unsigned long) restart_stack);
378}
379
380
381
382
383void smp_call_ipl_cpu(void (*func)(void *), void *data)
384{
385 struct lowcore *lc = pcpu_devices->lowcore;
386
387 if (pcpu_devices[0].address == stap())
388 lc = &S390_lowcore;
389
390 pcpu_delegate(&pcpu_devices[0], func, data,
391 lc->nodat_stack);
392}
393
394int smp_find_processor_id(u16 address)
395{
396 int cpu;
397
398 for_each_present_cpu(cpu)
399 if (pcpu_devices[cpu].address == address)
400 return cpu;
401 return -1;
402}
403
404bool arch_vcpu_is_preempted(int cpu)
405{
406 if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu))
407 return false;
408 if (pcpu_running(pcpu_devices + cpu))
409 return false;
410 return true;
411}
412EXPORT_SYMBOL(arch_vcpu_is_preempted);
413
414void smp_yield_cpu(int cpu)
415{
416 if (!MACHINE_HAS_DIAG9C)
417 return;
418 diag_stat_inc_norecursion(DIAG_STAT_X09C);
419 asm volatile("diag %0,0,0x9c"
420 : : "d" (pcpu_devices[cpu].address));
421}
422
423
424
425
426
427void notrace smp_emergency_stop(void)
428{
429 cpumask_t cpumask;
430 u64 end;
431 int cpu;
432
433 cpumask_copy(&cpumask, cpu_online_mask);
434 cpumask_clear_cpu(smp_processor_id(), &cpumask);
435
436 end = get_tod_clock() + (1000000UL << 12);
437 for_each_cpu(cpu, &cpumask) {
438 struct pcpu *pcpu = pcpu_devices + cpu;
439 set_bit(ec_stop_cpu, &pcpu->ec_mask);
440 while (__pcpu_sigp(pcpu->address, SIGP_EMERGENCY_SIGNAL,
441 0, NULL) == SIGP_CC_BUSY &&
442 get_tod_clock() < end)
443 cpu_relax();
444 }
445 while (get_tod_clock() < end) {
446 for_each_cpu(cpu, &cpumask)
447 if (pcpu_stopped(pcpu_devices + cpu))
448 cpumask_clear_cpu(cpu, &cpumask);
449 if (cpumask_empty(&cpumask))
450 break;
451 cpu_relax();
452 }
453}
454NOKPROBE_SYMBOL(smp_emergency_stop);
455
456
457
458
459void smp_send_stop(void)
460{
461 int cpu;
462
463
464 __load_psw_mask(PSW_KERNEL_BITS | PSW_MASK_DAT);
465 trace_hardirqs_off();
466
467 debug_set_critical();
468
469 if (oops_in_progress)
470 smp_emergency_stop();
471
472
473 for_each_online_cpu(cpu) {
474 if (cpu == smp_processor_id())
475 continue;
476 pcpu_sigp_retry(pcpu_devices + cpu, SIGP_STOP, 0);
477 while (!pcpu_stopped(pcpu_devices + cpu))
478 cpu_relax();
479 }
480}
481
482
483
484
485
486static void smp_handle_ext_call(void)
487{
488 unsigned long bits;
489
490
491 bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0);
492 if (test_bit(ec_stop_cpu, &bits))
493 smp_stop_cpu();
494 if (test_bit(ec_schedule, &bits))
495 scheduler_ipi();
496 if (test_bit(ec_call_function_single, &bits))
497 generic_smp_call_function_single_interrupt();
498}
499
500static void do_ext_call_interrupt(struct ext_code ext_code,
501 unsigned int param32, unsigned long param64)
502{
503 inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS);
504 smp_handle_ext_call();
505}
506
507void arch_send_call_function_ipi_mask(const struct cpumask *mask)
508{
509 int cpu;
510
511 for_each_cpu(cpu, mask)
512 pcpu_ec_call(pcpu_devices + cpu, ec_call_function_single);
513}
514
515void arch_send_call_function_single_ipi(int cpu)
516{
517 pcpu_ec_call(pcpu_devices + cpu, ec_call_function_single);
518}
519
520
521
522
523
524
525void smp_send_reschedule(int cpu)
526{
527 pcpu_ec_call(pcpu_devices + cpu, ec_schedule);
528}
529
530
531
532
533struct ec_creg_mask_parms {
534 unsigned long orval;
535 unsigned long andval;
536 int cr;
537};
538
539
540
541
542static void smp_ctl_bit_callback(void *info)
543{
544 struct ec_creg_mask_parms *pp = info;
545 unsigned long cregs[16];
546
547 __ctl_store(cregs, 0, 15);
548 cregs[pp->cr] = (cregs[pp->cr] & pp->andval) | pp->orval;
549 __ctl_load(cregs, 0, 15);
550}
551
552
553
554
555void smp_ctl_set_bit(int cr, int bit)
556{
557 struct ec_creg_mask_parms parms = { 1UL << bit, -1UL, cr };
558
559 on_each_cpu(smp_ctl_bit_callback, &parms, 1);
560}
561EXPORT_SYMBOL(smp_ctl_set_bit);
562
563
564
565
566void smp_ctl_clear_bit(int cr, int bit)
567{
568 struct ec_creg_mask_parms parms = { 0, ~(1UL << bit), cr };
569
570 on_each_cpu(smp_ctl_bit_callback, &parms, 1);
571}
572EXPORT_SYMBOL(smp_ctl_clear_bit);
573
574#ifdef CONFIG_CRASH_DUMP
575
576int smp_store_status(int cpu)
577{
578 struct pcpu *pcpu = pcpu_devices + cpu;
579 unsigned long pa;
580
581 pa = __pa(&pcpu->lowcore->floating_pt_save_area);
582 if (__pcpu_sigp_relax(pcpu->address, SIGP_STORE_STATUS_AT_ADDRESS,
583 pa) != SIGP_CC_ORDER_CODE_ACCEPTED)
584 return -EIO;
585 if (!MACHINE_HAS_VX && !MACHINE_HAS_GS)
586 return 0;
587 pa = __pa(pcpu->lowcore->mcesad & MCESA_ORIGIN_MASK);
588 if (MACHINE_HAS_GS)
589 pa |= pcpu->lowcore->mcesad & MCESA_LC_MASK;
590 if (__pcpu_sigp_relax(pcpu->address, SIGP_STORE_ADDITIONAL_STATUS,
591 pa) != SIGP_CC_ORDER_CODE_ACCEPTED)
592 return -EIO;
593 return 0;
594}
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622static __init void smp_save_cpu_vxrs(struct save_area *sa, u16 addr,
623 bool is_boot_cpu, unsigned long page)
624{
625 __vector128 *vxrs = (__vector128 *) page;
626
627 if (is_boot_cpu)
628 vxrs = boot_cpu_vector_save_area;
629 else
630 __pcpu_sigp_relax(addr, SIGP_STORE_ADDITIONAL_STATUS, page);
631 save_area_add_vxrs(sa, vxrs);
632}
633
634static __init void smp_save_cpu_regs(struct save_area *sa, u16 addr,
635 bool is_boot_cpu, unsigned long page)
636{
637 void *regs = (void *) page;
638
639 if (is_boot_cpu)
640 copy_oldmem_kernel(regs, (void *) __LC_FPREGS_SAVE_AREA, 512);
641 else
642 __pcpu_sigp_relax(addr, SIGP_STORE_STATUS_AT_ADDRESS, page);
643 save_area_add_regs(sa, regs);
644}
645
646void __init smp_save_dump_cpus(void)
647{
648 int addr, boot_cpu_addr, max_cpu_addr;
649 struct save_area *sa;
650 unsigned long page;
651 bool is_boot_cpu;
652
653 if (!(OLDMEM_BASE || ipl_info.type == IPL_TYPE_FCP_DUMP))
654
655 return;
656
657 page = memblock_phys_alloc_range(PAGE_SIZE, PAGE_SIZE, 0, 1UL << 31);
658 if (!page)
659 panic("ERROR: Failed to allocate %lx bytes below %lx\n",
660 PAGE_SIZE, 1UL << 31);
661
662
663 pcpu_set_smt(sclp.mtid_prev);
664 boot_cpu_addr = stap();
665 max_cpu_addr = SCLP_MAX_CORES << sclp.mtid_prev;
666 for (addr = 0; addr <= max_cpu_addr; addr++) {
667 if (__pcpu_sigp_relax(addr, SIGP_SENSE, 0) ==
668 SIGP_CC_NOT_OPERATIONAL)
669 continue;
670 is_boot_cpu = (addr == boot_cpu_addr);
671
672 sa = save_area_alloc(is_boot_cpu);
673 if (!sa)
674 panic("could not allocate memory for save area\n");
675 if (MACHINE_HAS_VX)
676
677 smp_save_cpu_vxrs(sa, addr, is_boot_cpu, page);
678
679
680
681
682
683
684 if (!is_boot_cpu || OLDMEM_BASE)
685
686 smp_save_cpu_regs(sa, addr, is_boot_cpu, page);
687 }
688 memblock_free(page, PAGE_SIZE);
689 diag_dma_ops.diag308_reset();
690 pcpu_set_smt(0);
691}
692#endif
693
694void smp_cpu_set_polarization(int cpu, int val)
695{
696 pcpu_devices[cpu].polarization = val;
697}
698
699int smp_cpu_get_polarization(int cpu)
700{
701 return pcpu_devices[cpu].polarization;
702}
703
704static void __ref smp_get_core_info(struct sclp_core_info *info, int early)
705{
706 static int use_sigp_detection;
707 int address;
708
709 if (use_sigp_detection || sclp_get_core_info(info, early)) {
710 use_sigp_detection = 1;
711 for (address = 0;
712 address < (SCLP_MAX_CORES << smp_cpu_mt_shift);
713 address += (1U << smp_cpu_mt_shift)) {
714 if (__pcpu_sigp_relax(address, SIGP_SENSE, 0) ==
715 SIGP_CC_NOT_OPERATIONAL)
716 continue;
717 info->core[info->configured].core_id =
718 address >> smp_cpu_mt_shift;
719 info->configured++;
720 }
721 info->combined = info->configured;
722 }
723}
724
725static int smp_add_present_cpu(int cpu);
726
727static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail,
728 bool configured, bool early)
729{
730 struct pcpu *pcpu;
731 int cpu, nr, i;
732 u16 address;
733
734 nr = 0;
735 if (sclp.has_core_type && core->type != boot_core_type)
736 return nr;
737 cpu = cpumask_first(avail);
738 address = core->core_id << smp_cpu_mt_shift;
739 for (i = 0; (i <= smp_cpu_mtid) && (cpu < nr_cpu_ids); i++) {
740 if (pcpu_find_address(cpu_present_mask, address + i))
741 continue;
742 pcpu = pcpu_devices + cpu;
743 pcpu->address = address + i;
744 if (configured)
745 pcpu->state = CPU_STATE_CONFIGURED;
746 else
747 pcpu->state = CPU_STATE_STANDBY;
748 smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
749 set_cpu_present(cpu, true);
750 if (!early && smp_add_present_cpu(cpu) != 0)
751 set_cpu_present(cpu, false);
752 else
753 nr++;
754 cpumask_clear_cpu(cpu, avail);
755 cpu = cpumask_next(cpu, avail);
756 }
757 return nr;
758}
759
760static int __smp_rescan_cpus(struct sclp_core_info *info, bool early)
761{
762 struct sclp_core_entry *core;
763 cpumask_t avail;
764 bool configured;
765 u16 core_id;
766 int nr, i;
767
768 nr = 0;
769 cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
770
771
772
773
774 if (early) {
775 core_id = pcpu_devices[0].address >> smp_cpu_mt_shift;
776 for (i = 0; i < info->configured; i++) {
777 core = &info->core[i];
778 if (core->core_id == core_id) {
779 nr += smp_add_core(core, &avail, true, early);
780 break;
781 }
782 }
783 }
784 for (i = 0; i < info->combined; i++) {
785 configured = i < info->configured;
786 nr += smp_add_core(&info->core[i], &avail, configured, early);
787 }
788 return nr;
789}
790
791void __init smp_detect_cpus(void)
792{
793 unsigned int cpu, mtid, c_cpus, s_cpus;
794 struct sclp_core_info *info;
795 u16 address;
796
797
798 info = memblock_alloc(sizeof(*info), 8);
799 if (!info)
800 panic("%s: Failed to allocate %zu bytes align=0x%x\n",
801 __func__, sizeof(*info), 8);
802 smp_get_core_info(info, 1);
803
804 if (sclp.has_core_type) {
805 address = stap();
806 for (cpu = 0; cpu < info->combined; cpu++)
807 if (info->core[cpu].core_id == address) {
808
809 boot_core_type = info->core[cpu].type;
810 break;
811 }
812 if (cpu >= info->combined)
813 panic("Could not find boot CPU type");
814 }
815
816
817 mtid = boot_core_type ? sclp.mtid : sclp.mtid_cp;
818 mtid = (mtid < smp_max_threads) ? mtid : smp_max_threads - 1;
819 pcpu_set_smt(mtid);
820
821
822 c_cpus = s_cpus = 0;
823 for (cpu = 0; cpu < info->combined; cpu++) {
824 if (sclp.has_core_type &&
825 info->core[cpu].type != boot_core_type)
826 continue;
827 if (cpu < info->configured)
828 c_cpus += smp_cpu_mtid + 1;
829 else
830 s_cpus += smp_cpu_mtid + 1;
831 }
832 pr_info("%d configured CPUs, %d standby CPUs\n", c_cpus, s_cpus);
833
834
835 get_online_cpus();
836 __smp_rescan_cpus(info, true);
837 put_online_cpus();
838 memblock_free_early((unsigned long)info, sizeof(*info));
839}
840
841static void smp_init_secondary(void)
842{
843 int cpu = smp_processor_id();
844
845 S390_lowcore.last_update_clock = get_tod_clock();
846 restore_access_regs(S390_lowcore.access_regs_save_area);
847 set_cpu_flag(CIF_ASCE_PRIMARY);
848 set_cpu_flag(CIF_ASCE_SECONDARY);
849 cpu_init();
850 preempt_disable();
851 init_cpu_timer();
852 vtime_init();
853 pfault_init();
854 notify_cpu_starting(smp_processor_id());
855 if (topology_cpu_dedicated(cpu))
856 set_cpu_flag(CIF_DEDICATED_CPU);
857 else
858 clear_cpu_flag(CIF_DEDICATED_CPU);
859 set_cpu_online(smp_processor_id(), true);
860 inc_irq_stat(CPU_RST);
861 local_irq_enable();
862 cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
863}
864
865
866
867
868static void __no_sanitize_address smp_start_secondary(void *cpuvoid)
869{
870 S390_lowcore.restart_stack = (unsigned long) restart_stack;
871 S390_lowcore.restart_fn = (unsigned long) do_restart;
872 S390_lowcore.restart_data = 0;
873 S390_lowcore.restart_source = -1UL;
874 __ctl_load(S390_lowcore.cregs_save_area, 0, 15);
875 __load_psw_mask(PSW_KERNEL_BITS | PSW_MASK_DAT);
876 CALL_ON_STACK_NORETURN(smp_init_secondary, S390_lowcore.kernel_stack);
877}
878
879
880int __cpu_up(unsigned int cpu, struct task_struct *tidle)
881{
882 struct pcpu *pcpu;
883 int base, i, rc;
884
885 pcpu = pcpu_devices + cpu;
886 if (pcpu->state != CPU_STATE_CONFIGURED)
887 return -EIO;
888 base = smp_get_base_cpu(cpu);
889 for (i = 0; i <= smp_cpu_mtid; i++) {
890 if (base + i < nr_cpu_ids)
891 if (cpu_online(base + i))
892 break;
893 }
894
895
896
897
898 if (i > smp_cpu_mtid &&
899 pcpu_sigp_retry(pcpu_devices + base, SIGP_INITIAL_CPU_RESET, 0) !=
900 SIGP_CC_ORDER_CODE_ACCEPTED)
901 return -EIO;
902
903 rc = pcpu_alloc_lowcore(pcpu, cpu);
904 if (rc)
905 return rc;
906 pcpu_prepare_secondary(pcpu, cpu);
907 pcpu_attach_task(pcpu, tidle);
908 pcpu_start_fn(pcpu, smp_start_secondary, NULL);
909
910 while (!cpu_online(cpu))
911 cpu_relax();
912 return 0;
913}
914
915static unsigned int setup_possible_cpus __initdata;
916
917static int __init _setup_possible_cpus(char *s)
918{
919 get_option(&s, &setup_possible_cpus);
920 return 0;
921}
922early_param("possible_cpus", _setup_possible_cpus);
923
924int __cpu_disable(void)
925{
926 unsigned long cregs[16];
927
928
929 smp_handle_ext_call();
930 set_cpu_online(smp_processor_id(), false);
931
932 pfault_fini();
933
934 __ctl_store(cregs, 0, 15);
935 cregs[0] &= ~0x0000ee70UL;
936 cregs[6] &= ~0xff000000UL;
937 cregs[14] &= ~0x1f000000UL;
938 __ctl_load(cregs, 0, 15);
939 clear_cpu_flag(CIF_NOHZ_DELAY);
940 return 0;
941}
942
943void __cpu_die(unsigned int cpu)
944{
945 struct pcpu *pcpu;
946
947
948 pcpu = pcpu_devices + cpu;
949 while (!pcpu_stopped(pcpu))
950 cpu_relax();
951 pcpu_free_lowcore(pcpu);
952 cpumask_clear_cpu(cpu, mm_cpumask(&init_mm));
953 cpumask_clear_cpu(cpu, &init_mm.context.cpu_attach_mask);
954}
955
956void __noreturn cpu_die(void)
957{
958 idle_task_exit();
959 __bpon();
960 pcpu_sigp_retry(pcpu_devices + smp_processor_id(), SIGP_STOP, 0);
961 for (;;) ;
962}
963
964void __init smp_fill_possible_mask(void)
965{
966 unsigned int possible, sclp_max, cpu;
967
968 sclp_max = max(sclp.mtid, sclp.mtid_cp) + 1;
969 sclp_max = min(smp_max_threads, sclp_max);
970 sclp_max = (sclp.max_cores * sclp_max) ?: nr_cpu_ids;
971 possible = setup_possible_cpus ?: nr_cpu_ids;
972 possible = min(possible, sclp_max);
973 for (cpu = 0; cpu < possible && cpu < nr_cpu_ids; cpu++)
974 set_cpu_possible(cpu, true);
975}
976
977void __init smp_prepare_cpus(unsigned int max_cpus)
978{
979
980 if (register_external_irq(EXT_IRQ_EMERGENCY_SIG, do_ext_call_interrupt))
981 panic("Couldn't request external interrupt 0x1201");
982
983 if (register_external_irq(EXT_IRQ_EXTERNAL_CALL, do_ext_call_interrupt))
984 panic("Couldn't request external interrupt 0x1202");
985}
986
987void __init smp_prepare_boot_cpu(void)
988{
989 struct pcpu *pcpu = pcpu_devices;
990
991 WARN_ON(!cpu_present(0) || !cpu_online(0));
992 pcpu->state = CPU_STATE_CONFIGURED;
993 pcpu->lowcore = (struct lowcore *)(unsigned long) store_prefix();
994 S390_lowcore.percpu_offset = __per_cpu_offset[0];
995 smp_cpu_set_polarization(0, POLARIZATION_UNKNOWN);
996}
997
998void __init smp_cpus_done(unsigned int max_cpus)
999{
1000}
1001
1002void __init smp_setup_processor_id(void)
1003{
1004 pcpu_devices[0].address = stap();
1005 S390_lowcore.cpu_nr = 0;
1006 S390_lowcore.spinlock_lockval = arch_spin_lockval(0);
1007 S390_lowcore.spinlock_index = 0;
1008}
1009
1010
1011
1012
1013
1014
1015
1016int setup_profiling_timer(unsigned int multiplier)
1017{
1018 return 0;
1019}
1020
1021static ssize_t cpu_configure_show(struct device *dev,
1022 struct device_attribute *attr, char *buf)
1023{
1024 ssize_t count;
1025
1026 mutex_lock(&smp_cpu_state_mutex);
1027 count = sprintf(buf, "%d\n", pcpu_devices[dev->id].state);
1028 mutex_unlock(&smp_cpu_state_mutex);
1029 return count;
1030}
1031
1032static ssize_t cpu_configure_store(struct device *dev,
1033 struct device_attribute *attr,
1034 const char *buf, size_t count)
1035{
1036 struct pcpu *pcpu;
1037 int cpu, val, rc, i;
1038 char delim;
1039
1040 if (sscanf(buf, "%d %c", &val, &delim) != 1)
1041 return -EINVAL;
1042 if (val != 0 && val != 1)
1043 return -EINVAL;
1044 get_online_cpus();
1045 mutex_lock(&smp_cpu_state_mutex);
1046 rc = -EBUSY;
1047
1048 cpu = dev->id;
1049 cpu = smp_get_base_cpu(cpu);
1050 if (cpu == 0)
1051 goto out;
1052 for (i = 0; i <= smp_cpu_mtid; i++)
1053 if (cpu_online(cpu + i))
1054 goto out;
1055 pcpu = pcpu_devices + cpu;
1056 rc = 0;
1057 switch (val) {
1058 case 0:
1059 if (pcpu->state != CPU_STATE_CONFIGURED)
1060 break;
1061 rc = sclp_core_deconfigure(pcpu->address >> smp_cpu_mt_shift);
1062 if (rc)
1063 break;
1064 for (i = 0; i <= smp_cpu_mtid; i++) {
1065 if (cpu + i >= nr_cpu_ids || !cpu_present(cpu + i))
1066 continue;
1067 pcpu[i].state = CPU_STATE_STANDBY;
1068 smp_cpu_set_polarization(cpu + i,
1069 POLARIZATION_UNKNOWN);
1070 }
1071 topology_expect_change();
1072 break;
1073 case 1:
1074 if (pcpu->state != CPU_STATE_STANDBY)
1075 break;
1076 rc = sclp_core_configure(pcpu->address >> smp_cpu_mt_shift);
1077 if (rc)
1078 break;
1079 for (i = 0; i <= smp_cpu_mtid; i++) {
1080 if (cpu + i >= nr_cpu_ids || !cpu_present(cpu + i))
1081 continue;
1082 pcpu[i].state = CPU_STATE_CONFIGURED;
1083 smp_cpu_set_polarization(cpu + i,
1084 POLARIZATION_UNKNOWN);
1085 }
1086 topology_expect_change();
1087 break;
1088 default:
1089 break;
1090 }
1091out:
1092 mutex_unlock(&smp_cpu_state_mutex);
1093 put_online_cpus();
1094 return rc ? rc : count;
1095}
1096static DEVICE_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);
1097
1098static ssize_t show_cpu_address(struct device *dev,
1099 struct device_attribute *attr, char *buf)
1100{
1101 return sprintf(buf, "%d\n", pcpu_devices[dev->id].address);
1102}
1103static DEVICE_ATTR(address, 0444, show_cpu_address, NULL);
1104
1105static struct attribute *cpu_common_attrs[] = {
1106 &dev_attr_configure.attr,
1107 &dev_attr_address.attr,
1108 NULL,
1109};
1110
1111static struct attribute_group cpu_common_attr_group = {
1112 .attrs = cpu_common_attrs,
1113};
1114
1115static struct attribute *cpu_online_attrs[] = {
1116 &dev_attr_idle_count.attr,
1117 &dev_attr_idle_time_us.attr,
1118 NULL,
1119};
1120
1121static struct attribute_group cpu_online_attr_group = {
1122 .attrs = cpu_online_attrs,
1123};
1124
1125static int smp_cpu_online(unsigned int cpu)
1126{
1127 struct device *s = &per_cpu(cpu_device, cpu)->dev;
1128
1129 return sysfs_create_group(&s->kobj, &cpu_online_attr_group);
1130}
1131static int smp_cpu_pre_down(unsigned int cpu)
1132{
1133 struct device *s = &per_cpu(cpu_device, cpu)->dev;
1134
1135 sysfs_remove_group(&s->kobj, &cpu_online_attr_group);
1136 return 0;
1137}
1138
1139static int smp_add_present_cpu(int cpu)
1140{
1141 struct device *s;
1142 struct cpu *c;
1143 int rc;
1144
1145 c = kzalloc(sizeof(*c), GFP_KERNEL);
1146 if (!c)
1147 return -ENOMEM;
1148 per_cpu(cpu_device, cpu) = c;
1149 s = &c->dev;
1150 c->hotpluggable = 1;
1151 rc = register_cpu(c, cpu);
1152 if (rc)
1153 goto out;
1154 rc = sysfs_create_group(&s->kobj, &cpu_common_attr_group);
1155 if (rc)
1156 goto out_cpu;
1157 rc = topology_cpu_init(c);
1158 if (rc)
1159 goto out_topology;
1160 return 0;
1161
1162out_topology:
1163 sysfs_remove_group(&s->kobj, &cpu_common_attr_group);
1164out_cpu:
1165 unregister_cpu(c);
1166out:
1167 return rc;
1168}
1169
1170int __ref smp_rescan_cpus(void)
1171{
1172 struct sclp_core_info *info;
1173 int nr;
1174
1175 info = kzalloc(sizeof(*info), GFP_KERNEL);
1176 if (!info)
1177 return -ENOMEM;
1178 smp_get_core_info(info, 0);
1179 get_online_cpus();
1180 mutex_lock(&smp_cpu_state_mutex);
1181 nr = __smp_rescan_cpus(info, false);
1182 mutex_unlock(&smp_cpu_state_mutex);
1183 put_online_cpus();
1184 kfree(info);
1185 if (nr)
1186 topology_schedule_update();
1187 return 0;
1188}
1189
1190static ssize_t __ref rescan_store(struct device *dev,
1191 struct device_attribute *attr,
1192 const char *buf,
1193 size_t count)
1194{
1195 int rc;
1196
1197 rc = lock_device_hotplug_sysfs();
1198 if (rc)
1199 return rc;
1200 rc = smp_rescan_cpus();
1201 unlock_device_hotplug();
1202 return rc ? rc : count;
1203}
1204static DEVICE_ATTR_WO(rescan);
1205
1206static int __init s390_smp_init(void)
1207{
1208 int cpu, rc = 0;
1209
1210 rc = device_create_file(cpu_subsys.dev_root, &dev_attr_rescan);
1211 if (rc)
1212 return rc;
1213 for_each_present_cpu(cpu) {
1214 rc = smp_add_present_cpu(cpu);
1215 if (rc)
1216 goto out;
1217 }
1218
1219 rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "s390/smp:online",
1220 smp_cpu_online, smp_cpu_pre_down);
1221 rc = rc <= 0 ? rc : 0;
1222out:
1223 return rc;
1224}
1225subsys_initcall(s390_smp_init);
1226