xref: /xnu-8796.101.5/osfmk/kern/cpu_quiesce.h (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1 /*
2  * Copyright (c) 2018 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _KERN_CPU_QUIESCE_H_
30 #define _KERN_CPU_QUIESCE_H_
31 
32 #ifdef XNU_KERNEL_PRIVATE
33 
34 #include <sys/cdefs.h>
35 
36 /* State field kept on each CPU to track participation */
37 typedef enum {
38 	/* Processor that never participated */
39 	CPU_QUIESCE_COUNTER_NONE = 0,
40 	/* Processor ready to participate, waiting for return to user */
41 	CPU_QUIESCE_COUNTER_PENDING_JOIN = 1,
42 	/* Processor currently participating in counter */
43 	CPU_QUIESCE_COUNTER_JOINED = 2,
44 	/* Processor currently not participating in counter */
45 	CPU_QUIESCE_COUNTER_LEFT = 3,
46 } cpu_quiescent_state_t;
47 
48 #if CONFIG_QUIESCE_COUNTER
49 
50 extern void cpu_quiescent_counter_join(uint64_t ctime);
51 extern void cpu_quiescent_counter_leave(uint64_t ctime);
52 extern void cpu_quiescent_counter_checkin(uint64_t ctime);
53 extern void cpu_quiescent_counter_ast(void);
54 extern void cpu_quiescent_counter_init(void);
55 
56 /* use of these is guarded by the config */
57 extern void cpu_quiescent_counter_set_min_interval_us(uint32_t new_value);
58 extern uint32_t cpu_quiescent_counter_get_min_interval_us(void);
59 
60 #else /* CONFIG_QUIESCE_COUNTER */
61 
62 /* stub routines for platforms without the counter */
63 
64 static inline void
cpu_quiescent_counter_join(__unused uint64_t ctime)65 cpu_quiescent_counter_join(__unused uint64_t ctime)
66 {
67 }
68 static inline void
cpu_quiescent_counter_leave(__unused uint64_t ctime)69 cpu_quiescent_counter_leave(__unused uint64_t ctime)
70 {
71 }
72 static inline void
cpu_quiescent_counter_checkin(__unused uint64_t ctime)73 cpu_quiescent_counter_checkin(__unused uint64_t ctime)
74 {
75 }
76 static inline void
cpu_quiescent_counter_ast(void)77 cpu_quiescent_counter_ast(void)
78 {
79 }
80 static inline void
cpu_quiescent_counter_init(void)81 cpu_quiescent_counter_init(void)
82 {
83 }
84 
85 #endif /* CONFIG_QUIESCE_COUNTER */
86 
87 #if MACH_ASSERT && CONFIG_QUIESCE_COUNTER
88 extern void cpu_quiescent_counter_assert_ast(void);
89 #else
90 static inline void
cpu_quiescent_counter_assert_ast(void)91 cpu_quiescent_counter_assert_ast(void)
92 {
93 }
94 #endif
95 
96 #endif /* XNU_KERNEL_PRIVATE */
97 
98 #endif /* _KERN_CPU_QUIESCE_H_ */
99