]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - include/acpi/processor.h
Linux-2.6.12-rc2
[mirror_ubuntu-artful-kernel.git] / include / acpi / processor.h
1 #ifndef __ACPI_PROCESSOR_H
2 #define __ACPI_PROCESSOR_H
3
4 #include <linux/kernel.h>
5 #include <linux/config.h>
6
7 #define ACPI_PROCESSOR_BUSY_METRIC 10
8
9 #define ACPI_PROCESSOR_MAX_POWER 8
10 #define ACPI_PROCESSOR_MAX_C2_LATENCY 100
11 #define ACPI_PROCESSOR_MAX_C3_LATENCY 1000
12
13 #define ACPI_PROCESSOR_MAX_THROTTLING 16
14 #define ACPI_PROCESSOR_MAX_THROTTLE 250 /* 25% */
15 #define ACPI_PROCESSOR_MAX_DUTY_WIDTH 4
16
17 /* Power Management */
18
19 struct acpi_processor_cx;
20
21 struct acpi_power_register {
22 u8 descriptor;
23 u16 length;
24 u8 space_id;
25 u8 bit_width;
26 u8 bit_offset;
27 u8 reserved;
28 u64 address;
29 } __attribute__ ((packed));
30
31
32 struct acpi_processor_cx_policy {
33 u32 count;
34 struct acpi_processor_cx *state;
35 struct {
36 u32 time;
37 u32 ticks;
38 u32 count;
39 u32 bm;
40 } threshold;
41 };
42
43 struct acpi_processor_cx {
44 u8 valid;
45 u8 type;
46 u32 address;
47 u32 latency;
48 u32 latency_ticks;
49 u32 power;
50 u32 usage;
51 struct acpi_processor_cx_policy promotion;
52 struct acpi_processor_cx_policy demotion;
53 };
54
55 struct acpi_processor_power {
56 struct acpi_processor_cx *state;
57 unsigned long bm_check_timestamp;
58 u32 default_state;
59 u32 bm_activity;
60 int count;
61 struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
62 };
63
64 /* Performance Management */
65
66 struct acpi_pct_register {
67 u8 descriptor;
68 u16 length;
69 u8 space_id;
70 u8 bit_width;
71 u8 bit_offset;
72 u8 reserved;
73 u64 address;
74 } __attribute__ ((packed));
75
76 struct acpi_processor_px {
77 acpi_integer core_frequency; /* megahertz */
78 acpi_integer power; /* milliWatts */
79 acpi_integer transition_latency; /* microseconds */
80 acpi_integer bus_master_latency; /* microseconds */
81 acpi_integer control; /* control value */
82 acpi_integer status; /* success indicator */
83 };
84
85 #define ACPI_PDC_REVISION_ID 0x1
86
87 struct acpi_processor_performance {
88 unsigned int state;
89 unsigned int platform_limit;
90 struct acpi_pct_register control_register;
91 struct acpi_pct_register status_register;
92 unsigned int state_count;
93 struct acpi_processor_px *states;
94
95 /* the _PDC objects passed by the driver, if any */
96 struct acpi_object_list *pdc;
97 };
98
99
100
101 /* Throttling Control */
102
103 struct acpi_processor_tx {
104 u16 power;
105 u16 performance;
106 };
107
108 struct acpi_processor_throttling {
109 int state;
110 u32 address;
111 u8 duty_offset;
112 u8 duty_width;
113 int state_count;
114 struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING];
115 };
116
117 /* Limit Interface */
118
119 struct acpi_processor_lx {
120 int px; /* performace state */
121 int tx; /* throttle level */
122 };
123
124 struct acpi_processor_limit {
125 struct acpi_processor_lx state; /* current limit */
126 struct acpi_processor_lx thermal; /* thermal limit */
127 struct acpi_processor_lx user; /* user limit */
128 };
129
130
131 struct acpi_processor_flags {
132 u8 power:1;
133 u8 performance:1;
134 u8 throttling:1;
135 u8 limit:1;
136 u8 bm_control:1;
137 u8 bm_check:1;
138 u8 has_cst:1;
139 u8 power_setup_done:1;
140 };
141
142 struct acpi_processor {
143 acpi_handle handle;
144 u32 acpi_id;
145 u32 id;
146 u32 pblk;
147 int performance_platform_limit;
148 struct acpi_processor_flags flags;
149 struct acpi_processor_power power;
150 struct acpi_processor_performance *performance;
151 struct acpi_processor_throttling throttling;
152 struct acpi_processor_limit limit;
153 };
154
155 struct acpi_processor_errata {
156 u8 smp;
157 struct {
158 u8 throttle:1;
159 u8 fdma:1;
160 u8 reserved:6;
161 u32 bmisx;
162 } piix4;
163 };
164
165 extern int acpi_processor_register_performance (
166 struct acpi_processor_performance * performance,
167 unsigned int cpu);
168 extern void acpi_processor_unregister_performance (
169 struct acpi_processor_performance * performance,
170 unsigned int cpu);
171
172 /* note: this locks both the calling module and the processor module
173 if a _PPC object exists, rmmod is disallowed then */
174 int acpi_processor_notify_smm(struct module *calling_module);
175
176
177
178 /* for communication between multiple parts of the processor kernel module */
179 extern struct acpi_processor *processors[NR_CPUS];
180 extern struct acpi_processor_errata errata;
181
182 /* in processor_perflib.c */
183 #ifdef CONFIG_CPU_FREQ
184 void acpi_processor_ppc_init(void);
185 void acpi_processor_ppc_exit(void);
186 int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
187 #else
188 static inline void acpi_processor_ppc_init(void) { return; }
189 static inline void acpi_processor_ppc_exit(void) { return; }
190 static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr) {
191 static unsigned int printout = 1;
192 if (printout) {
193 printk(KERN_WARNING "Warning: Processor Platform Limit event detected, but not handled.\n");
194 printk(KERN_WARNING "Consider compiling CPUfreq support into your kernel.\n");
195 printout = 0;
196 }
197 return 0;
198 }
199 #endif /* CONFIG_CPU_FREQ */
200
201 /* in processor_throttling.c */
202 int acpi_processor_get_throttling_info (struct acpi_processor *pr);
203 int acpi_processor_set_throttling (struct acpi_processor *pr, int state);
204 ssize_t acpi_processor_write_throttling (
205 struct file *file,
206 const char __user *buffer,
207 size_t count,
208 loff_t *data);
209 extern struct file_operations acpi_processor_throttling_fops;
210
211 /* in processor_idle.c */
212 int acpi_processor_power_init(struct acpi_processor *pr, struct acpi_device *device);
213 int acpi_processor_cst_has_changed (struct acpi_processor *pr);
214 int acpi_processor_power_exit(struct acpi_processor *pr, struct acpi_device *device);
215
216
217 /* in processor_thermal.c */
218 int acpi_processor_get_limit_info (struct acpi_processor *pr);
219 ssize_t acpi_processor_write_limit (
220 struct file *file,
221 const char __user *buffer,
222 size_t count,
223 loff_t *data);
224 extern struct file_operations acpi_processor_limit_fops;
225
226 #ifdef CONFIG_CPU_FREQ
227 void acpi_thermal_cpufreq_init(void);
228 void acpi_thermal_cpufreq_exit(void);
229 #else
230 static inline void acpi_thermal_cpufreq_init(void) { return; }
231 static inline void acpi_thermal_cpufreq_exit(void) { return; }
232 #endif
233
234
235 #endif