diff options
Diffstat (limited to 'include/linux/cpu.h')
-rw-r--r-- | include/linux/cpu.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/include/linux/cpu.h b/include/linux/cpu.h new file mode 100644 index 000000000000..fe0298e5dae1 --- /dev/null +++ b/include/linux/cpu.h | |||
@@ -0,0 +1,83 @@ | |||
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 driverfs 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 <asm/semaphore.h> | ||
27 | |||
28 | struct cpu { | ||
29 | int node_id; /* The node which contains the CPU */ | ||
30 | int no_control; /* Should the sysfs control file be created? */ | ||
31 | struct sys_device sysdev; | ||
32 | }; | ||
33 | |||
34 | extern int register_cpu(struct cpu *, int, struct node *); | ||
35 | #ifdef CONFIG_HOTPLUG_CPU | ||
36 | extern void unregister_cpu(struct cpu *, struct node *); | ||
37 | #endif | ||
38 | struct notifier_block; | ||
39 | |||
40 | #ifdef CONFIG_SMP | ||
41 | /* Need to know about CPUs going up/down? */ | ||
42 | extern int register_cpu_notifier(struct notifier_block *nb); | ||
43 | extern void unregister_cpu_notifier(struct notifier_block *nb); | ||
44 | |||
45 | int cpu_up(unsigned int cpu); | ||
46 | |||
47 | #else | ||
48 | |||
49 | static inline int register_cpu_notifier(struct notifier_block *nb) | ||
50 | { | ||
51 | return 0; | ||
52 | } | ||
53 | static inline void unregister_cpu_notifier(struct notifier_block *nb) | ||
54 | { | ||
55 | } | ||
56 | |||
57 | #endif /* CONFIG_SMP */ | ||
58 | extern struct sysdev_class cpu_sysdev_class; | ||
59 | |||
60 | #ifdef CONFIG_HOTPLUG_CPU | ||
61 | /* Stop CPUs going up and down. */ | ||
62 | extern struct semaphore cpucontrol; | ||
63 | #define lock_cpu_hotplug() down(&cpucontrol) | ||
64 | #define unlock_cpu_hotplug() up(&cpucontrol) | ||
65 | #define lock_cpu_hotplug_interruptible() down_interruptible(&cpucontrol) | ||
66 | #define hotcpu_notifier(fn, pri) { \ | ||
67 | static struct notifier_block fn##_nb = \ | ||
68 | { .notifier_call = fn, .priority = pri }; \ | ||
69 | register_cpu_notifier(&fn##_nb); \ | ||
70 | } | ||
71 | int cpu_down(unsigned int cpu); | ||
72 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) | ||
73 | #else | ||
74 | #define lock_cpu_hotplug() do { } while (0) | ||
75 | #define unlock_cpu_hotplug() do { } while (0) | ||
76 | #define lock_cpu_hotplug_interruptible() 0 | ||
77 | #define hotcpu_notifier(fn, pri) | ||
78 | |||
79 | /* CPUs don't go offline once they're online w/o CONFIG_HOTPLUG_CPU */ | ||
80 | static inline int cpu_is_offline(int cpu) { return 0; } | ||
81 | #endif | ||
82 | |||
83 | #endif /* _LINUX_CPU_H_ */ | ||