Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright IBM Corp. 1999, 2012
4 * Author(s): Denis Joseph Barrow,
5 * Martin Schwidefsky <schwidefsky@de.ibm.com>,
6 * Heiko Carstens <heiko.carstens@de.ibm.com>,
7 */
8#ifndef __ASM_SMP_H
9#define __ASM_SMP_H
10
11#include <asm/sigp.h>
12
13#ifdef CONFIG_SMP
14
15#include <asm/lowcore.h>
16
17#define raw_smp_processor_id() (S390_lowcore.cpu_nr)
18
19extern struct mutex smp_cpu_state_mutex;
20extern unsigned int smp_cpu_mt_shift;
21extern unsigned int smp_cpu_mtid;
22extern __vector128 __initdata boot_cpu_vector_save_area[__NUM_VXRS];
23
24extern int __cpu_up(unsigned int cpu, struct task_struct *tidle);
25
26extern void arch_send_call_function_single_ipi(int cpu);
27extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
28
29extern void smp_call_online_cpu(void (*func)(void *), void *);
30extern void smp_call_ipl_cpu(void (*func)(void *), void *);
31extern void smp_emergency_stop(void);
32
33extern int smp_find_processor_id(u16 address);
34extern int smp_store_status(int cpu);
35extern void smp_save_dump_cpus(void);
36extern int smp_vcpu_scheduled(int cpu);
37extern void smp_yield_cpu(int cpu);
38extern void smp_cpu_set_polarization(int cpu, int val);
39extern int smp_cpu_get_polarization(int cpu);
40extern void smp_fill_possible_mask(void);
41extern void smp_detect_cpus(void);
42
43#else /* CONFIG_SMP */
44
45#define smp_cpu_mtid 0
46
47static inline void smp_call_ipl_cpu(void (*func)(void *), void *data)
48{
49 func(data);
50}
51
52static inline void smp_call_online_cpu(void (*func)(void *), void *data)
53{
54 func(data);
55}
56
57static inline void smp_emergency_stop(void)
58{
59}
60
61static inline int smp_find_processor_id(u16 address) { return 0; }
62static inline int smp_store_status(int cpu) { return 0; }
63static inline int smp_vcpu_scheduled(int cpu) { return 1; }
64static inline void smp_yield_cpu(int cpu) { }
65static inline void smp_fill_possible_mask(void) { }
66static inline void smp_detect_cpus(void) { }
67
68#endif /* CONFIG_SMP */
69
70static inline void smp_stop_cpu(void)
71{
72 u16 pcpu = stap();
73
74 for (;;) {
75 __pcpu_sigp(pcpu, SIGP_STOP, 0, NULL);
76 cpu_relax();
77 }
78}
79
80/* Return thread 0 CPU number as base CPU */
81static inline int smp_get_base_cpu(int cpu)
82{
83 return cpu - (cpu % (smp_cpu_mtid + 1));
84}
85
86#ifdef CONFIG_HOTPLUG_CPU
87extern int smp_rescan_cpus(void);
88extern void __noreturn cpu_die(void);
89extern void __cpu_die(unsigned int cpu);
90extern int __cpu_disable(void);
91#else
92static inline int smp_rescan_cpus(void) { return 0; }
93static inline void cpu_die(void) { }
94#endif
95
96#endif /* __ASM_SMP_H */