|
1 /* |
|
2 * include/linux/cpu.h - generic cpu definition |
|
3 * |
|
4 * This is mainly for topological representation. We define the |
|
5 * basic 'struct cpu' here, which can be embedded in per-arch |
|
6 * definitions of processors. |
|
7 * |
|
8 * Basic handling of the devices is done in drivers/base/cpu.c |
|
9 * and system devices are handled in drivers/base/sys.c. |
|
10 * |
|
11 * CPUs are exported via sysfs in the class/cpu/devices/ |
|
12 * directory. |
|
13 * |
|
14 * Per-cpu interfaces can be implemented using a struct device_interface. |
|
15 * See the following for how to do this: |
|
16 * - drivers/base/intf.c |
|
17 * - Documentation/driver-model/interface.txt |
|
18 */ |
|
19 #ifndef _LINUX_CPU_H_ |
|
20 #define _LINUX_CPU_H_ |
|
21 |
|
22 #include <linux/sysdev.h> |
|
23 #include <linux/node.h> |
|
24 #include <linux/compiler.h> |
|
25 #include <linux/cpumask.h> |
|
26 #include <linux/mutex.h> |
|
27 |
|
28 struct cpu { |
|
29 int node_id; /* The node which contains the CPU */ |
|
30 int hotpluggable; /* creates sysfs control file if hotpluggable */ |
|
31 struct sys_device sysdev; |
|
32 }; |
|
33 |
|
34 extern int register_cpu(struct cpu *cpu, int num); |
|
35 extern struct sys_device *get_cpu_sysdev(unsigned cpu); |
|
36 |
|
37 extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr); |
|
38 extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr); |
|
39 |
|
40 extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); |
|
41 extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); |
|
42 |
|
43 extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); |
|
44 |
|
45 #ifdef CONFIG_HOTPLUG_CPU |
|
46 extern void unregister_cpu(struct cpu *cpu); |
|
47 #endif |
|
48 struct notifier_block; |
|
49 |
|
50 #ifdef CONFIG_SMP |
|
51 /* Need to know about CPUs going up/down? */ |
|
52 #ifdef CONFIG_HOTPLUG_CPU |
|
53 extern int register_cpu_notifier(struct notifier_block *nb); |
|
54 extern void unregister_cpu_notifier(struct notifier_block *nb); |
|
55 #else |
|
56 |
|
57 #ifndef MODULE |
|
58 extern int register_cpu_notifier(struct notifier_block *nb); |
|
59 #else |
|
60 static inline int register_cpu_notifier(struct notifier_block *nb) |
|
61 { |
|
62 return 0; |
|
63 } |
|
64 #endif |
|
65 |
|
66 static inline void unregister_cpu_notifier(struct notifier_block *nb) |
|
67 { |
|
68 } |
|
69 #endif |
|
70 |
|
71 int cpu_up(unsigned int cpu); |
|
72 void notify_cpu_starting(unsigned int cpu); |
|
73 extern void cpu_hotplug_init(void); |
|
74 extern void cpu_maps_update_begin(void); |
|
75 extern void cpu_maps_update_done(void); |
|
76 |
|
77 #else /* CONFIG_SMP */ |
|
78 |
|
79 static inline int register_cpu_notifier(struct notifier_block *nb) |
|
80 { |
|
81 return 0; |
|
82 } |
|
83 |
|
84 static inline void unregister_cpu_notifier(struct notifier_block *nb) |
|
85 { |
|
86 } |
|
87 |
|
88 static inline void cpu_hotplug_init(void) |
|
89 { |
|
90 } |
|
91 |
|
92 static inline void cpu_maps_update_begin(void) |
|
93 { |
|
94 } |
|
95 |
|
96 static inline void cpu_maps_update_done(void) |
|
97 { |
|
98 } |
|
99 |
|
100 #endif /* CONFIG_SMP */ |
|
101 extern struct sysdev_class cpu_sysdev_class; |
|
102 |
|
103 #ifdef CONFIG_HOTPLUG_CPU |
|
104 /* Stop CPUs going up and down. */ |
|
105 |
|
106 static inline void cpuhotplug_mutex_lock(struct mutex *cpu_hp_mutex) |
|
107 { |
|
108 mutex_lock(cpu_hp_mutex); |
|
109 } |
|
110 |
|
111 static inline void cpuhotplug_mutex_unlock(struct mutex *cpu_hp_mutex) |
|
112 { |
|
113 mutex_unlock(cpu_hp_mutex); |
|
114 } |
|
115 |
|
116 extern void get_online_cpus(void); |
|
117 extern void put_online_cpus(void); |
|
118 #define hotcpu_notifier(fn, pri) { \ |
|
119 static struct notifier_block fn##_nb __cpuinitdata = \ |
|
120 { .notifier_call = fn, .priority = pri }; \ |
|
121 register_cpu_notifier(&fn##_nb); \ |
|
122 } |
|
123 #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) |
|
124 #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) |
|
125 int cpu_down(unsigned int cpu); |
|
126 |
|
127 #else /* CONFIG_HOTPLUG_CPU */ |
|
128 |
|
129 static inline void cpuhotplug_mutex_lock(struct mutex *cpu_hp_mutex) |
|
130 { } |
|
131 static inline void cpuhotplug_mutex_unlock(struct mutex *cpu_hp_mutex) |
|
132 { } |
|
133 |
|
134 #define get_online_cpus() do { } while (0) |
|
135 #define put_online_cpus() do { } while (0) |
|
136 #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) |
|
137 /* These aren't inline functions due to a GCC bug. */ |
|
138 #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) |
|
139 #define unregister_hotcpu_notifier(nb) ({ (void)(nb); }) |
|
140 #endif /* CONFIG_HOTPLUG_CPU */ |
|
141 |
|
142 #ifdef CONFIG_PM_SLEEP_SMP |
|
143 extern int suspend_cpu_hotplug; |
|
144 |
|
145 extern int disable_nonboot_cpus(void); |
|
146 extern void enable_nonboot_cpus(void); |
|
147 #else /* !CONFIG_PM_SLEEP_SMP */ |
|
148 #define suspend_cpu_hotplug 0 |
|
149 |
|
150 static inline int disable_nonboot_cpus(void) { return 0; } |
|
151 static inline void enable_nonboot_cpus(void) {} |
|
152 #endif /* !CONFIG_PM_SLEEP_SMP */ |
|
153 |
|
154 #endif /* _LINUX_CPU_H_ */ |