xref: /OK3568_Linux_fs/kernel/include/linux/cpuhotplug.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __CPUHOTPLUG_H
3*4882a593Smuzhiyun #define __CPUHOTPLUG_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun  * CPU-up			CPU-down
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * BP		AP		BP		AP
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * OFFLINE			OFFLINE
13*4882a593Smuzhiyun  *   |				  ^
14*4882a593Smuzhiyun  *   v				  |
15*4882a593Smuzhiyun  * BRINGUP_CPU->AP_OFFLINE	BRINGUP_CPU  <- AP_IDLE_DEAD (idle thread/play_dead)
16*4882a593Smuzhiyun  *		  |				AP_OFFLINE
17*4882a593Smuzhiyun  *		  v (IRQ-off)	  ,---------------^
18*4882a593Smuzhiyun  *		AP_ONLNE	  | (stop_machine)
19*4882a593Smuzhiyun  *		  |		TEARDOWN_CPU <-	AP_ONLINE_IDLE
20*4882a593Smuzhiyun  *		  |				  ^
21*4882a593Smuzhiyun  *		  v				  |
22*4882a593Smuzhiyun  *              AP_ACTIVE			AP_ACTIVE
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun enum cpuhp_state {
26*4882a593Smuzhiyun 	CPUHP_INVALID = -1,
27*4882a593Smuzhiyun 	CPUHP_OFFLINE = 0,
28*4882a593Smuzhiyun 	CPUHP_CREATE_THREADS,
29*4882a593Smuzhiyun 	CPUHP_PERF_PREPARE,
30*4882a593Smuzhiyun 	CPUHP_PERF_X86_PREPARE,
31*4882a593Smuzhiyun 	CPUHP_PERF_X86_AMD_UNCORE_PREP,
32*4882a593Smuzhiyun 	CPUHP_PERF_POWER,
33*4882a593Smuzhiyun 	CPUHP_PERF_SUPERH,
34*4882a593Smuzhiyun 	CPUHP_X86_HPET_DEAD,
35*4882a593Smuzhiyun 	CPUHP_X86_APB_DEAD,
36*4882a593Smuzhiyun 	CPUHP_X86_MCE_DEAD,
37*4882a593Smuzhiyun 	CPUHP_VIRT_NET_DEAD,
38*4882a593Smuzhiyun 	CPUHP_SLUB_DEAD,
39*4882a593Smuzhiyun 	CPUHP_DEBUG_OBJ_DEAD,
40*4882a593Smuzhiyun 	CPUHP_MM_WRITEBACK_DEAD,
41*4882a593Smuzhiyun 	CPUHP_MM_VMSTAT_DEAD,
42*4882a593Smuzhiyun 	CPUHP_SOFTIRQ_DEAD,
43*4882a593Smuzhiyun 	CPUHP_NET_MVNETA_DEAD,
44*4882a593Smuzhiyun 	CPUHP_CPUIDLE_DEAD,
45*4882a593Smuzhiyun 	CPUHP_ARM64_FPSIMD_DEAD,
46*4882a593Smuzhiyun 	CPUHP_ARM_OMAP_WAKE_DEAD,
47*4882a593Smuzhiyun 	CPUHP_IRQ_POLL_DEAD,
48*4882a593Smuzhiyun 	CPUHP_BLOCK_SOFTIRQ_DEAD,
49*4882a593Smuzhiyun 	CPUHP_ACPI_CPUDRV_DEAD,
50*4882a593Smuzhiyun 	CPUHP_S390_PFAULT_DEAD,
51*4882a593Smuzhiyun 	CPUHP_BLK_MQ_DEAD,
52*4882a593Smuzhiyun 	CPUHP_FS_BUFF_DEAD,
53*4882a593Smuzhiyun 	CPUHP_PRINTK_DEAD,
54*4882a593Smuzhiyun 	CPUHP_MM_MEMCQ_DEAD,
55*4882a593Smuzhiyun 	CPUHP_PERCPU_CNT_DEAD,
56*4882a593Smuzhiyun 	CPUHP_RADIX_DEAD,
57*4882a593Smuzhiyun 	CPUHP_PAGE_ALLOC_DEAD,
58*4882a593Smuzhiyun 	CPUHP_NET_DEV_DEAD,
59*4882a593Smuzhiyun 	CPUHP_PCI_XGENE_DEAD,
60*4882a593Smuzhiyun 	CPUHP_IOMMU_INTEL_DEAD,
61*4882a593Smuzhiyun 	CPUHP_LUSTRE_CFS_DEAD,
62*4882a593Smuzhiyun 	CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
63*4882a593Smuzhiyun 	CPUHP_PADATA_DEAD,
64*4882a593Smuzhiyun 	CPUHP_WORKQUEUE_PREP,
65*4882a593Smuzhiyun 	CPUHP_POWER_NUMA_PREPARE,
66*4882a593Smuzhiyun 	CPUHP_HRTIMERS_PREPARE,
67*4882a593Smuzhiyun 	CPUHP_PROFILE_PREPARE,
68*4882a593Smuzhiyun 	CPUHP_X2APIC_PREPARE,
69*4882a593Smuzhiyun 	CPUHP_SMPCFD_PREPARE,
70*4882a593Smuzhiyun 	CPUHP_RELAY_PREPARE,
71*4882a593Smuzhiyun 	CPUHP_SLAB_PREPARE,
72*4882a593Smuzhiyun 	CPUHP_MD_RAID5_PREPARE,
73*4882a593Smuzhiyun 	CPUHP_RCUTREE_PREP,
74*4882a593Smuzhiyun 	CPUHP_CPUIDLE_COUPLED_PREPARE,
75*4882a593Smuzhiyun 	CPUHP_POWERPC_PMAC_PREPARE,
76*4882a593Smuzhiyun 	CPUHP_POWERPC_MMU_CTX_PREPARE,
77*4882a593Smuzhiyun 	CPUHP_XEN_PREPARE,
78*4882a593Smuzhiyun 	CPUHP_XEN_EVTCHN_PREPARE,
79*4882a593Smuzhiyun 	CPUHP_ARM_SHMOBILE_SCU_PREPARE,
80*4882a593Smuzhiyun 	CPUHP_SH_SH3X_PREPARE,
81*4882a593Smuzhiyun 	CPUHP_NET_FLOW_PREPARE,
82*4882a593Smuzhiyun 	CPUHP_TOPOLOGY_PREPARE,
83*4882a593Smuzhiyun 	CPUHP_NET_IUCV_PREPARE,
84*4882a593Smuzhiyun 	CPUHP_ARM_BL_PREPARE,
85*4882a593Smuzhiyun 	CPUHP_TRACE_RB_PREPARE,
86*4882a593Smuzhiyun 	CPUHP_MM_ZS_PREPARE,
87*4882a593Smuzhiyun 	CPUHP_MM_ZSWP_MEM_PREPARE,
88*4882a593Smuzhiyun 	CPUHP_MM_ZSWP_POOL_PREPARE,
89*4882a593Smuzhiyun 	CPUHP_KVM_PPC_BOOK3S_PREPARE,
90*4882a593Smuzhiyun 	CPUHP_ZCOMP_PREPARE,
91*4882a593Smuzhiyun 	CPUHP_TIMERS_PREPARE,
92*4882a593Smuzhiyun 	CPUHP_MIPS_SOC_PREPARE,
93*4882a593Smuzhiyun 	CPUHP_BP_PREPARE_DYN,
94*4882a593Smuzhiyun 	CPUHP_BP_PREPARE_DYN_END		= CPUHP_BP_PREPARE_DYN + 20,
95*4882a593Smuzhiyun 	CPUHP_BRINGUP_CPU,
96*4882a593Smuzhiyun 	CPUHP_AP_IDLE_DEAD,
97*4882a593Smuzhiyun 	CPUHP_AP_OFFLINE,
98*4882a593Smuzhiyun 	CPUHP_AP_SCHED_STARTING,
99*4882a593Smuzhiyun 	CPUHP_AP_RCUTREE_DYING,
100*4882a593Smuzhiyun 	CPUHP_AP_CPU_PM_STARTING,
101*4882a593Smuzhiyun 	CPUHP_AP_IRQ_GIC_STARTING,
102*4882a593Smuzhiyun 	CPUHP_AP_IRQ_HIP04_STARTING,
103*4882a593Smuzhiyun 	CPUHP_AP_IRQ_ARMADA_XP_STARTING,
104*4882a593Smuzhiyun 	CPUHP_AP_IRQ_BCM2836_STARTING,
105*4882a593Smuzhiyun 	CPUHP_AP_IRQ_MIPS_GIC_STARTING,
106*4882a593Smuzhiyun 	CPUHP_AP_IRQ_RISCV_STARTING,
107*4882a593Smuzhiyun 	CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING,
108*4882a593Smuzhiyun 	CPUHP_AP_ARM_MVEBU_COHERENCY,
109*4882a593Smuzhiyun 	CPUHP_AP_MICROCODE_LOADER,
110*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING,
111*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_STARTING,
112*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_AMD_IBS_STARTING,
113*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_CQM_STARTING,
114*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_CSTATE_STARTING,
115*4882a593Smuzhiyun 	CPUHP_AP_PERF_XTENSA_STARTING,
116*4882a593Smuzhiyun 	CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
117*4882a593Smuzhiyun 	CPUHP_AP_ARM_SDEI_STARTING,
118*4882a593Smuzhiyun 	CPUHP_AP_ARM_VFP_STARTING,
119*4882a593Smuzhiyun 	CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING,
120*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
121*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_ACPI_STARTING,
122*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_STARTING,
123*4882a593Smuzhiyun 	CPUHP_AP_ARM_L2X0_STARTING,
124*4882a593Smuzhiyun 	CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
125*4882a593Smuzhiyun 	CPUHP_AP_ARM_ARCH_TIMER_STARTING,
126*4882a593Smuzhiyun 	CPUHP_AP_ARM_GLOBAL_TIMER_STARTING,
127*4882a593Smuzhiyun 	CPUHP_AP_JCORE_TIMER_STARTING,
128*4882a593Smuzhiyun 	CPUHP_AP_ARM_TWD_STARTING,
129*4882a593Smuzhiyun 	CPUHP_AP_QCOM_TIMER_STARTING,
130*4882a593Smuzhiyun 	CPUHP_AP_TEGRA_TIMER_STARTING,
131*4882a593Smuzhiyun 	CPUHP_AP_ARMADA_TIMER_STARTING,
132*4882a593Smuzhiyun 	CPUHP_AP_MARCO_TIMER_STARTING,
133*4882a593Smuzhiyun 	CPUHP_AP_MIPS_GIC_TIMER_STARTING,
134*4882a593Smuzhiyun 	CPUHP_AP_ARC_TIMER_STARTING,
135*4882a593Smuzhiyun 	CPUHP_AP_RISCV_TIMER_STARTING,
136*4882a593Smuzhiyun 	CPUHP_AP_CLINT_TIMER_STARTING,
137*4882a593Smuzhiyun 	CPUHP_AP_CSKY_TIMER_STARTING,
138*4882a593Smuzhiyun 	CPUHP_AP_TI_GP_TIMER_STARTING,
139*4882a593Smuzhiyun 	CPUHP_AP_HYPERV_TIMER_STARTING,
140*4882a593Smuzhiyun 	CPUHP_AP_KVM_STARTING,
141*4882a593Smuzhiyun 	CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING,
142*4882a593Smuzhiyun 	CPUHP_AP_KVM_ARM_VGIC_STARTING,
143*4882a593Smuzhiyun 	CPUHP_AP_KVM_ARM_TIMER_STARTING,
144*4882a593Smuzhiyun 	/* Must be the last timer callback */
145*4882a593Smuzhiyun 	CPUHP_AP_DUMMY_TIMER_STARTING,
146*4882a593Smuzhiyun 	CPUHP_AP_ARM_XEN_STARTING,
147*4882a593Smuzhiyun 	CPUHP_AP_ARM_CORESIGHT_STARTING,
148*4882a593Smuzhiyun 	CPUHP_AP_ARM_CORESIGHT_CTI_STARTING,
149*4882a593Smuzhiyun 	CPUHP_AP_ARM64_ISNDEP_STARTING,
150*4882a593Smuzhiyun 	CPUHP_AP_SMPCFD_DYING,
151*4882a593Smuzhiyun 	CPUHP_AP_X86_TBOOT_DYING,
152*4882a593Smuzhiyun 	CPUHP_AP_ARM_CACHE_B15_RAC_DYING,
153*4882a593Smuzhiyun 	CPUHP_AP_ONLINE,
154*4882a593Smuzhiyun 	CPUHP_TEARDOWN_CPU,
155*4882a593Smuzhiyun 	CPUHP_AP_ONLINE_IDLE,
156*4882a593Smuzhiyun 	CPUHP_AP_SMPBOOT_THREADS,
157*4882a593Smuzhiyun 	CPUHP_AP_X86_VDSO_VMA_ONLINE,
158*4882a593Smuzhiyun 	CPUHP_AP_IRQ_AFFINITY_ONLINE,
159*4882a593Smuzhiyun 	CPUHP_AP_BLK_MQ_ONLINE,
160*4882a593Smuzhiyun 	CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS,
161*4882a593Smuzhiyun 	CPUHP_AP_X86_INTEL_EPB_ONLINE,
162*4882a593Smuzhiyun 	CPUHP_AP_PERF_ONLINE,
163*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_ONLINE,
164*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_UNCORE_ONLINE,
165*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE,
166*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_AMD_POWER_ONLINE,
167*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_RAPL_ONLINE,
168*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_CQM_ONLINE,
169*4882a593Smuzhiyun 	CPUHP_AP_PERF_X86_CSTATE_ONLINE,
170*4882a593Smuzhiyun 	CPUHP_AP_PERF_S390_CF_ONLINE,
171*4882a593Smuzhiyun 	CPUHP_AP_PERF_S390_SF_ONLINE,
172*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_CCI_ONLINE,
173*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_CCN_ONLINE,
174*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE,
175*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE,
176*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_HISI_L3_ONLINE,
177*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_L2X0_ONLINE,
178*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE,
179*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE,
180*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE,
181*4882a593Smuzhiyun 	CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE,
182*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE,
183*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE,
184*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE,
185*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE,
186*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE,
187*4882a593Smuzhiyun 	CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE,
188*4882a593Smuzhiyun 	CPUHP_AP_WATCHDOG_ONLINE,
189*4882a593Smuzhiyun 	CPUHP_AP_WORKQUEUE_ONLINE,
190*4882a593Smuzhiyun 	CPUHP_AP_RCUTREE_ONLINE,
191*4882a593Smuzhiyun 	CPUHP_AP_BASE_CACHEINFO_ONLINE,
192*4882a593Smuzhiyun 	CPUHP_AP_ONLINE_DYN,
193*4882a593Smuzhiyun 	CPUHP_AP_ONLINE_DYN_END		= CPUHP_AP_ONLINE_DYN + 30,
194*4882a593Smuzhiyun 	CPUHP_AP_X86_HPET_ONLINE,
195*4882a593Smuzhiyun 	CPUHP_AP_X86_KVM_CLK_ONLINE,
196*4882a593Smuzhiyun 	CPUHP_AP_DTPM_CPU_ONLINE,
197*4882a593Smuzhiyun 	CPUHP_AP_ACTIVE,
198*4882a593Smuzhiyun 	CPUHP_ANDROID_RESERVED_1,
199*4882a593Smuzhiyun 	CPUHP_ANDROID_RESERVED_2,
200*4882a593Smuzhiyun 	CPUHP_ANDROID_RESERVED_3,
201*4882a593Smuzhiyun 	CPUHP_ANDROID_RESERVED_4,
202*4882a593Smuzhiyun 	CPUHP_ONLINE,
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun int __cpuhp_setup_state(enum cpuhp_state state,	const char *name, bool invoke,
206*4882a593Smuzhiyun 			int (*startup)(unsigned int cpu),
207*4882a593Smuzhiyun 			int (*teardown)(unsigned int cpu), bool multi_instance);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun int __cpuhp_setup_state_cpuslocked(enum cpuhp_state state, const char *name,
210*4882a593Smuzhiyun 				   bool invoke,
211*4882a593Smuzhiyun 				   int (*startup)(unsigned int cpu),
212*4882a593Smuzhiyun 				   int (*teardown)(unsigned int cpu),
213*4882a593Smuzhiyun 				   bool multi_instance);
214*4882a593Smuzhiyun /**
215*4882a593Smuzhiyun  * cpuhp_setup_state - Setup hotplug state callbacks with calling the callbacks
216*4882a593Smuzhiyun  * @state:	The state for which the calls are installed
217*4882a593Smuzhiyun  * @name:	Name of the callback (will be used in debug output)
218*4882a593Smuzhiyun  * @startup:	startup callback function
219*4882a593Smuzhiyun  * @teardown:	teardown callback function
220*4882a593Smuzhiyun  *
221*4882a593Smuzhiyun  * Installs the callback functions and invokes the startup callback on
222*4882a593Smuzhiyun  * the present cpus which have already reached the @state.
223*4882a593Smuzhiyun  */
cpuhp_setup_state(enum cpuhp_state state,const char * name,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu))224*4882a593Smuzhiyun static inline int cpuhp_setup_state(enum cpuhp_state state,
225*4882a593Smuzhiyun 				    const char *name,
226*4882a593Smuzhiyun 				    int (*startup)(unsigned int cpu),
227*4882a593Smuzhiyun 				    int (*teardown)(unsigned int cpu))
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun 	return __cpuhp_setup_state(state, name, true, startup, teardown, false);
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun 
cpuhp_setup_state_cpuslocked(enum cpuhp_state state,const char * name,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu))232*4882a593Smuzhiyun static inline int cpuhp_setup_state_cpuslocked(enum cpuhp_state state,
233*4882a593Smuzhiyun 					       const char *name,
234*4882a593Smuzhiyun 					       int (*startup)(unsigned int cpu),
235*4882a593Smuzhiyun 					       int (*teardown)(unsigned int cpu))
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	return __cpuhp_setup_state_cpuslocked(state, name, true, startup,
238*4882a593Smuzhiyun 					      teardown, false);
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun /**
242*4882a593Smuzhiyun  * cpuhp_setup_state_nocalls - Setup hotplug state callbacks without calling the
243*4882a593Smuzhiyun  *			       callbacks
244*4882a593Smuzhiyun  * @state:	The state for which the calls are installed
245*4882a593Smuzhiyun  * @name:	Name of the callback.
246*4882a593Smuzhiyun  * @startup:	startup callback function
247*4882a593Smuzhiyun  * @teardown:	teardown callback function
248*4882a593Smuzhiyun  *
249*4882a593Smuzhiyun  * Same as @cpuhp_setup_state except that no calls are executed are invoked
250*4882a593Smuzhiyun  * during installation of this callback. NOP if SMP=n or HOTPLUG_CPU=n.
251*4882a593Smuzhiyun  */
cpuhp_setup_state_nocalls(enum cpuhp_state state,const char * name,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu))252*4882a593Smuzhiyun static inline int cpuhp_setup_state_nocalls(enum cpuhp_state state,
253*4882a593Smuzhiyun 					    const char *name,
254*4882a593Smuzhiyun 					    int (*startup)(unsigned int cpu),
255*4882a593Smuzhiyun 					    int (*teardown)(unsigned int cpu))
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun 	return __cpuhp_setup_state(state, name, false, startup, teardown,
258*4882a593Smuzhiyun 				   false);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun 
cpuhp_setup_state_nocalls_cpuslocked(enum cpuhp_state state,const char * name,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu))261*4882a593Smuzhiyun static inline int cpuhp_setup_state_nocalls_cpuslocked(enum cpuhp_state state,
262*4882a593Smuzhiyun 						     const char *name,
263*4882a593Smuzhiyun 						     int (*startup)(unsigned int cpu),
264*4882a593Smuzhiyun 						     int (*teardown)(unsigned int cpu))
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	return __cpuhp_setup_state_cpuslocked(state, name, false, startup,
267*4882a593Smuzhiyun 					    teardown, false);
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /**
271*4882a593Smuzhiyun  * cpuhp_setup_state_multi - Add callbacks for multi state
272*4882a593Smuzhiyun  * @state:	The state for which the calls are installed
273*4882a593Smuzhiyun  * @name:	Name of the callback.
274*4882a593Smuzhiyun  * @startup:	startup callback function
275*4882a593Smuzhiyun  * @teardown:	teardown callback function
276*4882a593Smuzhiyun  *
277*4882a593Smuzhiyun  * Sets the internal multi_instance flag and prepares a state to work as a multi
278*4882a593Smuzhiyun  * instance callback. No callbacks are invoked at this point. The callbacks are
279*4882a593Smuzhiyun  * invoked once an instance for this state are registered via
280*4882a593Smuzhiyun  * @cpuhp_state_add_instance or @cpuhp_state_add_instance_nocalls.
281*4882a593Smuzhiyun  */
cpuhp_setup_state_multi(enum cpuhp_state state,const char * name,int (* startup)(unsigned int cpu,struct hlist_node * node),int (* teardown)(unsigned int cpu,struct hlist_node * node))282*4882a593Smuzhiyun static inline int cpuhp_setup_state_multi(enum cpuhp_state state,
283*4882a593Smuzhiyun 					  const char *name,
284*4882a593Smuzhiyun 					  int (*startup)(unsigned int cpu,
285*4882a593Smuzhiyun 							 struct hlist_node *node),
286*4882a593Smuzhiyun 					  int (*teardown)(unsigned int cpu,
287*4882a593Smuzhiyun 							  struct hlist_node *node))
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun 	return __cpuhp_setup_state(state, name, false,
290*4882a593Smuzhiyun 				   (void *) startup,
291*4882a593Smuzhiyun 				   (void *) teardown, true);
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun int __cpuhp_state_add_instance(enum cpuhp_state state, struct hlist_node *node,
295*4882a593Smuzhiyun 			       bool invoke);
296*4882a593Smuzhiyun int __cpuhp_state_add_instance_cpuslocked(enum cpuhp_state state,
297*4882a593Smuzhiyun 					  struct hlist_node *node, bool invoke);
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun /**
300*4882a593Smuzhiyun  * cpuhp_state_add_instance - Add an instance for a state and invoke startup
301*4882a593Smuzhiyun  *                            callback.
302*4882a593Smuzhiyun  * @state:	The state for which the instance is installed
303*4882a593Smuzhiyun  * @node:	The node for this individual state.
304*4882a593Smuzhiyun  *
305*4882a593Smuzhiyun  * Installs the instance for the @state and invokes the startup callback on
306*4882a593Smuzhiyun  * the present cpus which have already reached the @state. The @state must have
307*4882a593Smuzhiyun  * been earlier marked as multi-instance by @cpuhp_setup_state_multi.
308*4882a593Smuzhiyun  */
cpuhp_state_add_instance(enum cpuhp_state state,struct hlist_node * node)309*4882a593Smuzhiyun static inline int cpuhp_state_add_instance(enum cpuhp_state state,
310*4882a593Smuzhiyun 					   struct hlist_node *node)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun 	return __cpuhp_state_add_instance(state, node, true);
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /**
316*4882a593Smuzhiyun  * cpuhp_state_add_instance_nocalls - Add an instance for a state without
317*4882a593Smuzhiyun  *                                    invoking the startup callback.
318*4882a593Smuzhiyun  * @state:	The state for which the instance is installed
319*4882a593Smuzhiyun  * @node:	The node for this individual state.
320*4882a593Smuzhiyun  *
321*4882a593Smuzhiyun  * Installs the instance for the @state The @state must have been earlier
322*4882a593Smuzhiyun  * marked as multi-instance by @cpuhp_setup_state_multi.
323*4882a593Smuzhiyun  */
cpuhp_state_add_instance_nocalls(enum cpuhp_state state,struct hlist_node * node)324*4882a593Smuzhiyun static inline int cpuhp_state_add_instance_nocalls(enum cpuhp_state state,
325*4882a593Smuzhiyun 						   struct hlist_node *node)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	return __cpuhp_state_add_instance(state, node, false);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun static inline int
cpuhp_state_add_instance_nocalls_cpuslocked(enum cpuhp_state state,struct hlist_node * node)331*4882a593Smuzhiyun cpuhp_state_add_instance_nocalls_cpuslocked(enum cpuhp_state state,
332*4882a593Smuzhiyun 					    struct hlist_node *node)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun 	return __cpuhp_state_add_instance_cpuslocked(state, node, false);
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun void __cpuhp_remove_state(enum cpuhp_state state, bool invoke);
338*4882a593Smuzhiyun void __cpuhp_remove_state_cpuslocked(enum cpuhp_state state, bool invoke);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /**
341*4882a593Smuzhiyun  * cpuhp_remove_state - Remove hotplug state callbacks and invoke the teardown
342*4882a593Smuzhiyun  * @state:	The state for which the calls are removed
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * Removes the callback functions and invokes the teardown callback on
345*4882a593Smuzhiyun  * the present cpus which have already reached the @state.
346*4882a593Smuzhiyun  */
cpuhp_remove_state(enum cpuhp_state state)347*4882a593Smuzhiyun static inline void cpuhp_remove_state(enum cpuhp_state state)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun 	__cpuhp_remove_state(state, true);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /**
353*4882a593Smuzhiyun  * cpuhp_remove_state_nocalls - Remove hotplug state callbacks without invoking
354*4882a593Smuzhiyun  *				teardown
355*4882a593Smuzhiyun  * @state:	The state for which the calls are removed
356*4882a593Smuzhiyun  */
cpuhp_remove_state_nocalls(enum cpuhp_state state)357*4882a593Smuzhiyun static inline void cpuhp_remove_state_nocalls(enum cpuhp_state state)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun 	__cpuhp_remove_state(state, false);
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun 
cpuhp_remove_state_nocalls_cpuslocked(enum cpuhp_state state)362*4882a593Smuzhiyun static inline void cpuhp_remove_state_nocalls_cpuslocked(enum cpuhp_state state)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun 	__cpuhp_remove_state_cpuslocked(state, false);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun /**
368*4882a593Smuzhiyun  * cpuhp_remove_multi_state - Remove hotplug multi state callback
369*4882a593Smuzhiyun  * @state:	The state for which the calls are removed
370*4882a593Smuzhiyun  *
371*4882a593Smuzhiyun  * Removes the callback functions from a multi state. This is the reverse of
372*4882a593Smuzhiyun  * cpuhp_setup_state_multi(). All instances should have been removed before
373*4882a593Smuzhiyun  * invoking this function.
374*4882a593Smuzhiyun  */
cpuhp_remove_multi_state(enum cpuhp_state state)375*4882a593Smuzhiyun static inline void cpuhp_remove_multi_state(enum cpuhp_state state)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	__cpuhp_remove_state(state, false);
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun int __cpuhp_state_remove_instance(enum cpuhp_state state,
381*4882a593Smuzhiyun 				  struct hlist_node *node, bool invoke);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun /**
384*4882a593Smuzhiyun  * cpuhp_state_remove_instance - Remove hotplug instance from state and invoke
385*4882a593Smuzhiyun  *                               the teardown callback
386*4882a593Smuzhiyun  * @state:	The state from which the instance is removed
387*4882a593Smuzhiyun  * @node:	The node for this individual state.
388*4882a593Smuzhiyun  *
389*4882a593Smuzhiyun  * Removes the instance and invokes the teardown callback on the present cpus
390*4882a593Smuzhiyun  * which have already reached the @state.
391*4882a593Smuzhiyun  */
cpuhp_state_remove_instance(enum cpuhp_state state,struct hlist_node * node)392*4882a593Smuzhiyun static inline int cpuhp_state_remove_instance(enum cpuhp_state state,
393*4882a593Smuzhiyun 					      struct hlist_node *node)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun 	return __cpuhp_state_remove_instance(state, node, true);
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun /**
399*4882a593Smuzhiyun  * cpuhp_state_remove_instance_nocalls - Remove hotplug instance from state
400*4882a593Smuzhiyun  *					 without invoking the reatdown callback
401*4882a593Smuzhiyun  * @state:	The state from which the instance is removed
402*4882a593Smuzhiyun  * @node:	The node for this individual state.
403*4882a593Smuzhiyun  *
404*4882a593Smuzhiyun  * Removes the instance without invoking the teardown callback.
405*4882a593Smuzhiyun  */
cpuhp_state_remove_instance_nocalls(enum cpuhp_state state,struct hlist_node * node)406*4882a593Smuzhiyun static inline int cpuhp_state_remove_instance_nocalls(enum cpuhp_state state,
407*4882a593Smuzhiyun 						      struct hlist_node *node)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun 	return __cpuhp_state_remove_instance(state, node, false);
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #ifdef CONFIG_SMP
413*4882a593Smuzhiyun void cpuhp_online_idle(enum cpuhp_state state);
414*4882a593Smuzhiyun #else
cpuhp_online_idle(enum cpuhp_state state)415*4882a593Smuzhiyun static inline void cpuhp_online_idle(enum cpuhp_state state) { }
416*4882a593Smuzhiyun #endif
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun #endif
419