]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 |