Linux-2.6.12-rc2
[linux-2.6.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