diff options
Diffstat (limited to 'include/acpi/processor.h')
-rw-r--r-- | include/acpi/processor.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/include/acpi/processor.h b/include/acpi/processor.h new file mode 100644 index 000000000000..2f50a5bb0c78 --- /dev/null +++ b/include/acpi/processor.h | |||
@@ -0,0 +1,235 @@ | |||
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 | ||