1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _LINUX_CPU_H_
14#define _LINUX_CPU_H_
15
16#include <linux/node.h>
17#include <linux/compiler.h>
18#include <linux/cpumask.h>
19
20struct device;
21struct device_node;
22struct attribute_group;
23
24struct cpu {
25 int node_id;
26 int hotpluggable;
27 struct device dev;
28};
29
30extern int register_cpu(struct cpu *cpu, int num);
31extern struct device *get_cpu_device(unsigned cpu);
32extern bool cpu_is_hotpluggable(unsigned cpu);
33extern bool arch_match_cpu_phys_id(int cpu, u64 phys_id);
34extern bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
35 int cpu, unsigned int *thread);
36
37extern int cpu_add_dev_attr(struct device_attribute *attr);
38extern void cpu_remove_dev_attr(struct device_attribute *attr);
39
40extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
41extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
42
43extern struct device *cpu_device_create(struct device *parent, void *drvdata,
44 const struct attribute_group **groups,
45 const char *fmt, ...);
46#ifdef CONFIG_HOTPLUG_CPU
47extern void unregister_cpu(struct cpu *cpu);
48extern ssize_t arch_cpu_probe(const char *, size_t);
49extern ssize_t arch_cpu_release(const char *, size_t);
50#endif
51struct notifier_block;
52
53
54
55
56enum {
57
58
59
60
61
62
63
64
65
66
67
68 CPU_PRI_SCHED_ACTIVE = INT_MAX,
69 CPU_PRI_CPUSET_ACTIVE = INT_MAX - 1,
70 CPU_PRI_SCHED_INACTIVE = INT_MIN + 1,
71 CPU_PRI_CPUSET_INACTIVE = INT_MIN,
72
73
74 CPU_PRI_PERF = 20,
75 CPU_PRI_MIGRATION = 10,
76
77 CPU_PRI_WORKQUEUE_UP = 5,
78 CPU_PRI_WORKQUEUE_DOWN = -5,
79};
80
81#define CPU_ONLINE 0x0002
82#define CPU_UP_PREPARE 0x0003
83#define CPU_UP_CANCELED 0x0004
84#define CPU_DOWN_PREPARE 0x0005
85#define CPU_DOWN_FAILED 0x0006
86#define CPU_DEAD 0x0007
87#define CPU_DYING 0x0008
88
89
90
91
92#define CPU_POST_DEAD 0x0009
93
94#define CPU_STARTING 0x000A
95
96
97
98
99
100
101
102#define CPU_TASKS_FROZEN 0x0010
103
104#define CPU_ONLINE_FROZEN (CPU_ONLINE | CPU_TASKS_FROZEN)
105#define CPU_UP_PREPARE_FROZEN (CPU_UP_PREPARE | CPU_TASKS_FROZEN)
106#define CPU_UP_CANCELED_FROZEN (CPU_UP_CANCELED | CPU_TASKS_FROZEN)
107#define CPU_DOWN_PREPARE_FROZEN (CPU_DOWN_PREPARE | CPU_TASKS_FROZEN)
108#define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN)
109#define CPU_DEAD_FROZEN (CPU_DEAD | CPU_TASKS_FROZEN)
110#define CPU_DYING_FROZEN (CPU_DYING | CPU_TASKS_FROZEN)
111#define CPU_STARTING_FROZEN (CPU_STARTING | CPU_TASKS_FROZEN)
112
113
114#ifdef CONFIG_SMP
115
116#if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE)
117#define cpu_notifier(fn, pri) { \
118 static struct notifier_block fn##_nb = \
119 { .notifier_call = fn, .priority = pri }; \
120 register_cpu_notifier(&fn##_nb); \
121}
122
123#define __cpu_notifier(fn, pri) { \
124 static struct notifier_block fn##_nb = \
125 { .notifier_call = fn, .priority = pri }; \
126 __register_cpu_notifier(&fn##_nb); \
127}
128#else
129#define cpu_notifier(fn, pri) do { (void)(fn); } while (0)
130#define __cpu_notifier(fn, pri) do { (void)(fn); } while (0)
131#endif
132
133#ifdef CONFIG_HOTPLUG_CPU
134extern int register_cpu_notifier(struct notifier_block *nb);
135extern int __register_cpu_notifier(struct notifier_block *nb);
136extern void unregister_cpu_notifier(struct notifier_block *nb);
137extern void __unregister_cpu_notifier(struct notifier_block *nb);
138#else
139
140#ifndef MODULE
141extern int register_cpu_notifier(struct notifier_block *nb);
142extern int __register_cpu_notifier(struct notifier_block *nb);
143#else
144static inline int register_cpu_notifier(struct notifier_block *nb)
145{
146 return 0;
147}
148
149static inline int __register_cpu_notifier(struct notifier_block *nb)
150{
151 return 0;
152}
153#endif
154
155static inline void unregister_cpu_notifier(struct notifier_block *nb)
156{
157}
158
159static inline void __unregister_cpu_notifier(struct notifier_block *nb)
160{
161}
162#endif
163
164int cpu_up(unsigned int cpu);
165void notify_cpu_starting(unsigned int cpu);
166extern void cpu_maps_update_begin(void);
167extern void cpu_maps_update_done(void);
168
169#define cpu_notifier_register_begin cpu_maps_update_begin
170#define cpu_notifier_register_done cpu_maps_update_done
171
172#else
173
174#define cpu_notifier(fn, pri) do { (void)(fn); } while (0)
175#define __cpu_notifier(fn, pri) do { (void)(fn); } while (0)
176
177static inline int register_cpu_notifier(struct notifier_block *nb)
178{
179 return 0;
180}
181
182static inline int __register_cpu_notifier(struct notifier_block *nb)
183{
184 return 0;
185}
186
187static inline void unregister_cpu_notifier(struct notifier_block *nb)
188{
189}
190
191static inline void __unregister_cpu_notifier(struct notifier_block *nb)
192{
193}
194
195static inline void cpu_maps_update_begin(void)
196{
197}
198
199static inline void cpu_maps_update_done(void)
200{
201}
202
203static inline void cpu_notifier_register_begin(void)
204{
205}
206
207static inline void cpu_notifier_register_done(void)
208{
209}
210
211#endif
212extern struct bus_type cpu_subsys;
213
214#ifdef CONFIG_HOTPLUG_CPU
215
216
217extern void cpu_hotplug_begin(void);
218extern void cpu_hotplug_done(void);
219extern void get_online_cpus(void);
220extern bool try_get_online_cpus(void);
221extern void put_online_cpus(void);
222extern void cpu_hotplug_disable(void);
223extern void cpu_hotplug_enable(void);
224#define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri)
225#define __hotcpu_notifier(fn, pri) __cpu_notifier(fn, pri)
226#define register_hotcpu_notifier(nb) register_cpu_notifier(nb)
227#define __register_hotcpu_notifier(nb) __register_cpu_notifier(nb)
228#define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb)
229#define __unregister_hotcpu_notifier(nb) __unregister_cpu_notifier(nb)
230void clear_tasks_mm_cpumask(int cpu);
231int cpu_down(unsigned int cpu);
232
233#else
234
235static inline void cpu_hotplug_begin(void) {}
236static inline void cpu_hotplug_done(void) {}
237#define get_online_cpus() do { } while (0)
238#define try_get_online_cpus() true
239#define put_online_cpus() do { } while (0)
240#define cpu_hotplug_disable() do { } while (0)
241#define cpu_hotplug_enable() do { } while (0)
242#define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0)
243#define __hotcpu_notifier(fn, pri) do { (void)(fn); } while (0)
244
245#define register_hotcpu_notifier(nb) ({ (void)(nb); 0; })
246#define __register_hotcpu_notifier(nb) ({ (void)(nb); 0; })
247#define unregister_hotcpu_notifier(nb) ({ (void)(nb); })
248#define __unregister_hotcpu_notifier(nb) ({ (void)(nb); })
249#endif
250
251#ifdef CONFIG_PM_SLEEP_SMP
252extern int disable_nonboot_cpus(void);
253extern void enable_nonboot_cpus(void);
254#else
255static inline int disable_nonboot_cpus(void) { return 0; }
256static inline void enable_nonboot_cpus(void) {}
257#endif
258
259enum cpuhp_state {
260 CPUHP_OFFLINE,
261 CPUHP_ONLINE,
262};
263
264void cpu_startup_entry(enum cpuhp_state state);
265
266void cpu_idle_poll_ctrl(bool enable);
267
268void arch_cpu_idle(void);
269void arch_cpu_idle_prepare(void);
270void arch_cpu_idle_enter(void);
271void arch_cpu_idle_exit(void);
272void arch_cpu_idle_dead(void);
273
274#endif
275