Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Added Kitten
[palacios.git] / kitten / include / acpi / acpi_bus.h
1 /*
2  *  acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or (at
12  *  your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful, but
15  *  WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License along
20  *  with this program; if not, write to the Free Software Foundation, Inc.,
21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22  *
23  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  */
25
26 #ifndef __ACPI_BUS_H__
27 #define __ACPI_BUS_H__
28
29 #include <linux/device.h>
30
31 #include <acpi/acpi.h>
32
33 #define PREFIX                  "ACPI: "
34
35 /* TBD: Make dynamic */
36 #define ACPI_MAX_HANDLES        10
37 struct acpi_handle_list {
38         u32 count;
39         acpi_handle handles[ACPI_MAX_HANDLES];
40 };
41
42 /* acpi_utils.h */
43 acpi_status
44 acpi_extract_package(union acpi_object *package,
45                      struct acpi_buffer *format, struct acpi_buffer *buffer);
46 acpi_status
47 acpi_evaluate_integer(acpi_handle handle,
48                       acpi_string pathname,
49                       struct acpi_object_list *arguments, unsigned long *data);
50 acpi_status
51 acpi_evaluate_reference(acpi_handle handle,
52                         acpi_string pathname,
53                         struct acpi_object_list *arguments,
54                         struct acpi_handle_list *list);
55
56 #ifdef CONFIG_ACPI
57
58 #include <linux/proc_fs.h>
59
60 #define ACPI_BUS_FILE_ROOT      "acpi"
61 extern struct proc_dir_entry *acpi_root_dir;
62 extern struct fadt_descriptor acpi_fadt;
63
64 enum acpi_bus_removal_type {
65         ACPI_BUS_REMOVAL_NORMAL = 0,
66         ACPI_BUS_REMOVAL_EJECT,
67         ACPI_BUS_REMOVAL_SUPRISE,
68         ACPI_BUS_REMOVAL_TYPE_COUNT
69 };
70
71 enum acpi_bus_device_type {
72         ACPI_BUS_TYPE_DEVICE = 0,
73         ACPI_BUS_TYPE_POWER,
74         ACPI_BUS_TYPE_PROCESSOR,
75         ACPI_BUS_TYPE_THERMAL,
76         ACPI_BUS_TYPE_SYSTEM,
77         ACPI_BUS_TYPE_POWER_BUTTON,
78         ACPI_BUS_TYPE_SLEEP_BUTTON,
79         ACPI_BUS_DEVICE_TYPE_COUNT
80 };
81
82 struct acpi_driver;
83 struct acpi_device;
84
85 /*
86  * ACPI Driver
87  * -----------
88  */
89
90 typedef int (*acpi_op_add) (struct acpi_device * device);
91 typedef int (*acpi_op_remove) (struct acpi_device * device, int type);
92 typedef int (*acpi_op_lock) (struct acpi_device * device, int type);
93 typedef int (*acpi_op_start) (struct acpi_device * device);
94 typedef int (*acpi_op_stop) (struct acpi_device * device, int type);
95 typedef int (*acpi_op_suspend) (struct acpi_device * device, int state);
96 typedef int (*acpi_op_resume) (struct acpi_device * device, int state);
97 typedef int (*acpi_op_scan) (struct acpi_device * device);
98 typedef int (*acpi_op_bind) (struct acpi_device * device);
99 typedef int (*acpi_op_unbind) (struct acpi_device * device);
100 typedef int (*acpi_op_match) (struct acpi_device * device,
101                               struct acpi_driver * driver);
102
103 struct acpi_bus_ops {
104         u32 acpi_op_add:1;
105         u32 acpi_op_remove:1;
106         u32 acpi_op_lock:1;
107         u32 acpi_op_start:1;
108         u32 acpi_op_stop:1;
109         u32 acpi_op_suspend:1;
110         u32 acpi_op_resume:1;
111         u32 acpi_op_scan:1;
112         u32 acpi_op_bind:1;
113         u32 acpi_op_unbind:1;
114         u32 acpi_op_match:1;
115         u32 reserved:21;
116 };
117
118 struct acpi_device_ops {
119         acpi_op_add add;
120         acpi_op_remove remove;
121         acpi_op_lock lock;
122         acpi_op_start start;
123         acpi_op_stop stop;
124         acpi_op_suspend suspend;
125         acpi_op_resume resume;
126         acpi_op_scan scan;
127         acpi_op_bind bind;
128         acpi_op_unbind unbind;
129         acpi_op_match match;
130 };
131
132 struct acpi_driver {
133         struct list_head node;
134         char name[80];
135         char class[80];
136         atomic_t references;
137         char *ids;              /* Supported Hardware IDs */
138         struct acpi_device_ops ops;
139 };
140
141 /*
142  * ACPI Device
143  * -----------
144  */
145
146 /* Status (_STA) */
147
148 struct acpi_device_status {
149         u32 present:1;
150         u32 enabled:1;
151         u32 show_in_ui:1;
152         u32 functional:1;
153         u32 battery_present:1;
154         u32 reserved:27;
155 };
156
157 /* Flags */
158
159 struct acpi_device_flags {
160         u32 dynamic_status:1;
161         u32 hardware_id:1;
162         u32 compatible_ids:1;
163         u32 bus_address:1;
164         u32 unique_id:1;
165         u32 removable:1;
166         u32 ejectable:1;
167         u32 lockable:1;
168         u32 suprise_removal_ok:1;
169         u32 power_manageable:1;
170         u32 performance_manageable:1;
171         u32 wake_capable:1;     /* Wakeup(_PRW) supported? */
172         u32 force_power_state:1;
173         u32 reserved:19;
174 };
175
176 /* File System */
177
178 struct acpi_device_dir {
179         struct proc_dir_entry *entry;
180 };
181
182 #define acpi_device_dir(d)      ((d)->dir.entry)
183
184 /* Plug and Play */
185
186 typedef char acpi_bus_id[5];
187 typedef unsigned long acpi_bus_address;
188 typedef char acpi_hardware_id[9];
189 typedef char acpi_unique_id[9];
190 typedef char acpi_device_name[40];
191 typedef char acpi_device_class[20];
192
193 struct acpi_device_pnp {
194         acpi_bus_id bus_id;     /* Object name */
195         acpi_bus_address bus_address;   /* _ADR */
196         acpi_hardware_id hardware_id;   /* _HID */
197         struct acpi_compatible_id_list *cid_list;       /* _CIDs */
198         acpi_unique_id unique_id;       /* _UID */
199         acpi_device_name device_name;   /* Driver-determined */
200         acpi_device_class device_class; /*        "          */
201 };
202
203 #define acpi_device_bid(d)      ((d)->pnp.bus_id)
204 #define acpi_device_adr(d)      ((d)->pnp.bus_address)
205 #define acpi_device_hid(d)      ((d)->pnp.hardware_id)
206 #define acpi_device_uid(d)      ((d)->pnp.unique_id)
207 #define acpi_device_name(d)     ((d)->pnp.device_name)
208 #define acpi_device_class(d)    ((d)->pnp.device_class)
209
210 /* Power Management */
211
212 struct acpi_device_power_flags {
213         u32 explicit_get:1;     /* _PSC present? */
214         u32 power_resources:1;  /* Power resources */
215         u32 inrush_current:1;   /* Serialize Dx->D0 */
216         u32 power_removed:1;    /* Optimize Dx->D0 */
217         u32 reserved:28;
218 };
219
220 struct acpi_device_power_state {
221         struct {
222                 u8 valid:1;
223                 u8 explicit_set:1;      /* _PSx present? */
224                 u8 reserved:6;
225         } flags;
226         int power;              /* % Power (compared to D0) */
227         int latency;            /* Dx->D0 time (microseconds) */
228         struct acpi_handle_list resources;      /* Power resources referenced */
229 };
230
231 struct acpi_device_power {
232         int state;              /* Current state */
233         struct acpi_device_power_flags flags;
234         struct acpi_device_power_state states[4];       /* Power states (D0-D3) */
235 };
236
237 /* Performance Management */
238
239 struct acpi_device_perf_flags {
240         u8 reserved:8;
241 };
242
243 struct acpi_device_perf_state {
244         struct {
245                 u8 valid:1;
246                 u8 reserved:7;
247         } flags;
248         u8 power;               /* % Power (compared to P0) */
249         u8 performance;         /* % Performance (    "   ) */
250         int latency;            /* Px->P0 time (microseconds) */
251 };
252
253 struct acpi_device_perf {
254         int state;
255         struct acpi_device_perf_flags flags;
256         int state_count;
257         struct acpi_device_perf_state *states;
258 };
259
260 /* Wakeup Management */
261 struct acpi_device_wakeup_flags {
262         u8 valid:1;             /* Can successfully enable wakeup? */
263         u8 run_wake:1;          /* Run-Wake GPE devices */
264 };
265
266 struct acpi_device_wakeup_state {
267         u8 enabled:1;
268         u8 active:1;
269 };
270
271 struct acpi_device_wakeup {
272         acpi_handle gpe_device;
273         acpi_integer gpe_number;
274         acpi_integer sleep_state;
275         struct acpi_handle_list resources;
276         struct acpi_device_wakeup_state state;
277         struct acpi_device_wakeup_flags flags;
278 };
279
280 /* Device */
281
282 struct acpi_device {
283         acpi_handle handle;
284         struct acpi_device *parent;
285         struct list_head children;
286         struct list_head node;
287         struct list_head wakeup_list;
288         struct list_head g_list;
289         struct acpi_device_status status;
290         struct acpi_device_flags flags;
291         struct acpi_device_pnp pnp;
292         struct acpi_device_power power;
293         struct acpi_device_wakeup wakeup;
294         struct acpi_device_perf performance;
295         struct acpi_device_dir dir;
296         struct acpi_device_ops ops;
297         struct acpi_driver *driver;
298         void *driver_data;
299         struct kobject kobj;
300         struct device dev;
301 };
302
303 #define acpi_driver_data(d)     ((d)->driver_data)
304
305 /*
306  * Events
307  * ------
308  */
309
310 struct acpi_bus_event {
311         struct list_head node;
312         acpi_device_class device_class;
313         acpi_bus_id bus_id;
314         u32 type;
315         u32 data;
316 };
317
318 extern struct subsystem acpi_subsys;
319
320 /*
321  * External Functions
322  */
323
324 int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
325 void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
326 int acpi_bus_get_status(struct acpi_device *device);
327 int acpi_bus_get_power(acpi_handle handle, int *state);
328 int acpi_bus_set_power(acpi_handle handle, int state);
329 int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data);
330 int acpi_bus_receive_event(struct acpi_bus_event *event);
331 int acpi_bus_register_driver(struct acpi_driver *driver);
332 void acpi_bus_unregister_driver(struct acpi_driver *driver);
333 int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
334                  acpi_handle handle, int type);
335 int acpi_bus_trim(struct acpi_device *start, int rmdevice);
336 int acpi_bus_start(struct acpi_device *device);
337 acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd);
338 int acpi_match_ids(struct acpi_device *device, char *ids);
339 int acpi_create_dir(struct acpi_device *);
340 void acpi_remove_dir(struct acpi_device *);
341
342 /*
343  * Bind physical devices with ACPI devices
344  */
345 #include <linux/device.h>
346 struct acpi_bus_type {
347         struct list_head list;
348         struct bus_type *bus;
349         /* For general devices under the bus */
350         int (*find_device) (struct device *, acpi_handle *);
351         /* For bridges, such as PCI root bridge, IDE controller */
352         int (*find_bridge) (struct device *, acpi_handle *);
353 };
354 int register_acpi_bus_type(struct acpi_bus_type *);
355 int unregister_acpi_bus_type(struct acpi_bus_type *);
356 struct device *acpi_get_physical_device(acpi_handle);
357 /* helper */
358 acpi_handle acpi_get_child(acpi_handle, acpi_integer);
359 acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
360 #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->firmware_data))
361
362 #endif /* CONFIG_ACPI */
363
364 #endif /*__ACPI_BUS_H__*/