Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
[pandora-kernel.git] / include / acpi / acobject.h
1
2 /******************************************************************************
3  *
4  * Name: acobject.h - Definition of union acpi_operand_object    (Internal object only)
5  *
6  *****************************************************************************/
7
8 /*
9  * Copyright (C) 2000 - 2005, R. Byron Moore
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions, and the following disclaimer,
17  *    without modification.
18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19  *    substantially similar to the "NO WARRANTY" disclaimer below
20  *    ("Disclaimer") and any redistribution must be conditioned upon
21  *    including a substantially similar Disclaimer requirement for further
22  *    binary redistribution.
23  * 3. Neither the names of the above-listed copyright holders nor the names
24  *    of any contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * Alternatively, this software may be distributed under the terms of the
28  * GNU General Public License ("GPL") version 2 as published by the Free
29  * Software Foundation.
30  *
31  * NO WARRANTY
32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42  * POSSIBILITY OF SUCH DAMAGES.
43  */
44
45 #ifndef _ACOBJECT_H
46 #define _ACOBJECT_H
47
48
49 /*
50  * The union acpi_operand_object    is used to pass AML operands from the dispatcher
51  * to the interpreter, and to keep track of the various handlers such as
52  * address space handlers and notify handlers.  The object is a constant
53  * size in order to allow it to be cached and reused.
54  */
55
56 /*******************************************************************************
57  *
58  * Common Descriptors
59  *
60  ******************************************************************************/
61
62 /*
63  * Common area for all objects.
64  *
65  * data_type is used to differentiate between internal descriptors, and MUST
66  * be the first byte in this structure.
67  */
68 #define ACPI_OBJECT_COMMON_HEADER   /* SIZE/ALIGNMENT: 32 bits, one ptr plus trailing 8-bit flag */\
69         u8                                      descriptor;         /* To differentiate various internal objs */\
70         u8                                      type;               /* acpi_object_type */\
71         u16                                     reference_count;    /* For object deletion management */\
72         union acpi_operand_object               *next_object;       /* Objects linked to parent NS node */\
73         u8                                      flags; \
74
75 /* Values for flag byte above */
76
77 #define AOPOBJ_AML_CONSTANT         0x01
78 #define AOPOBJ_STATIC_POINTER       0x02
79 #define AOPOBJ_DATA_VALID           0x04
80 #define AOPOBJ_OBJECT_INITIALIZED   0x08
81 #define AOPOBJ_SETUP_COMPLETE       0x10
82 #define AOPOBJ_SINGLE_DATUM         0x20
83
84
85 /*
86  * Common bitfield for the field objects
87  * "Field Datum"  -- a datum from the actual field object
88  * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field
89  */
90 #define ACPI_COMMON_FIELD_INFO      /* SIZE/ALIGNMENT: 24 bits + three 32-bit values */\
91         u8                                      field_flags;        /* Access, update, and lock bits */\
92         u8                                      attribute;          /* From access_as keyword */\
93         u8                                      access_byte_width;  /* Read/Write size in bytes */\
94         u32                                     bit_length;         /* Length of field in bits */\
95         u32                                     base_byte_offset;   /* Byte offset within containing object */\
96         u8                                      start_field_bit_offset;/* Bit offset within first field datum (0-63) */\
97         u8                                      access_bit_width;   /* Read/Write size in bits (8-64) */\
98         u32                                     value;              /* Value to store into the Bank or Index register */\
99         struct acpi_namespace_node              *node;              /* Link back to parent node */
100
101
102 /*
103  * Fields common to both Strings and Buffers
104  */
105 #define ACPI_COMMON_BUFFER_INFO \
106         u32                                     length;
107
108
109 /*
110  * Common fields for objects that support ASL notifications
111  */
112 #define ACPI_COMMON_NOTIFY_INFO \
113         union acpi_operand_object               *system_notify;     /* Handler for system notifies */\
114         union acpi_operand_object               *device_notify;     /* Handler for driver notifies */\
115         union acpi_operand_object               *handler;           /* Handler for Address space */
116
117
118 /******************************************************************************
119  *
120  * Basic data types
121  *
122  *****************************************************************************/
123
124 struct acpi_object_common
125 {
126         ACPI_OBJECT_COMMON_HEADER
127 };
128
129
130 struct acpi_object_integer
131 {
132         ACPI_OBJECT_COMMON_HEADER
133         acpi_integer                            value;
134 };
135
136
137 /*
138  * Note: The String and Buffer object must be identical through the Pointer
139  * element.  There is code that depends on this.
140  */
141 struct acpi_object_string           /* Null terminated, ASCII characters only */
142 {
143         ACPI_OBJECT_COMMON_HEADER
144         ACPI_COMMON_BUFFER_INFO
145         char                                    *pointer;           /* String in AML stream or allocated string */
146 };
147
148
149 struct acpi_object_buffer
150 {
151         ACPI_OBJECT_COMMON_HEADER
152         ACPI_COMMON_BUFFER_INFO
153         u8                                      *pointer;           /* Buffer in AML stream or allocated buffer */
154         struct acpi_namespace_node              *node;              /* Link back to parent node */
155         u8                                      *aml_start;
156         u32                                     aml_length;
157 };
158
159
160 struct acpi_object_package
161 {
162         ACPI_OBJECT_COMMON_HEADER
163
164         u32                                     count;              /* # of elements in package */
165         u32                                     aml_length;
166         u8                                      *aml_start;
167         struct acpi_namespace_node              *node;              /* Link back to parent node */
168         union acpi_operand_object               **elements;         /* Array of pointers to acpi_objects */
169 };
170
171
172 /******************************************************************************
173  *
174  * Complex data types
175  *
176  *****************************************************************************/
177
178 struct acpi_object_event
179 {
180         ACPI_OBJECT_COMMON_HEADER
181         void                                    *semaphore;
182 };
183
184
185 #define ACPI_INFINITE_CONCURRENCY   0xFF
186
187 typedef
188 acpi_status (*ACPI_INTERNAL_METHOD) (
189         struct acpi_walk_state          *walk_state);
190
191 struct acpi_object_method
192 {
193         ACPI_OBJECT_COMMON_HEADER
194         u8                                      method_flags;
195         u8                                      param_count;
196         u32                                     aml_length;
197         void                                    *semaphore;
198         u8                                      *aml_start;
199         ACPI_INTERNAL_METHOD            implementation;
200         u8                                      concurrency;
201         u8                                      thread_count;
202         acpi_owner_id                           owning_id;
203 };
204
205
206 struct acpi_object_mutex
207 {
208         ACPI_OBJECT_COMMON_HEADER
209         u8                                      sync_level;         /* 0-15, specified in Mutex() call */
210         u16                                     acquisition_depth;  /* Allow multiple Acquires, same thread */
211         struct acpi_thread_state                *owner_thread;      /* Current owner of the mutex */
212         void                                    *semaphore;         /* Actual OS synchronization object */
213         union acpi_operand_object               *prev;              /* Link for list of acquired mutexes */
214         union acpi_operand_object               *next;              /* Link for list of acquired mutexes */
215         struct acpi_namespace_node              *node;              /* Containing namespace node */
216         u8                                      original_sync_level; /* Owner's original sync level (0-15) */
217 };
218
219
220 struct acpi_object_region
221 {
222         ACPI_OBJECT_COMMON_HEADER
223
224         u8                                      space_id;
225         union acpi_operand_object               *handler;           /* Handler for region access */
226         struct acpi_namespace_node              *node;              /* Containing namespace node */
227         union acpi_operand_object               *next;
228         u32                                     length;
229         acpi_physical_address                   address;
230 };
231
232
233 /******************************************************************************
234  *
235  * Objects that can be notified.  All share a common notify_info area.
236  *
237  *****************************************************************************/
238
239 struct acpi_object_notify_common            /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
240 {
241         ACPI_OBJECT_COMMON_HEADER
242         ACPI_COMMON_NOTIFY_INFO
243 };
244
245
246 struct acpi_object_device
247 {
248         ACPI_OBJECT_COMMON_HEADER
249         ACPI_COMMON_NOTIFY_INFO
250         struct acpi_gpe_block_info              *gpe_block;
251 };
252
253
254 struct acpi_object_power_resource
255 {
256         ACPI_OBJECT_COMMON_HEADER
257         ACPI_COMMON_NOTIFY_INFO
258         u32                                     system_level;
259         u32                                     resource_order;
260 };
261
262
263 struct acpi_object_processor
264 {
265         ACPI_OBJECT_COMMON_HEADER
266         ACPI_COMMON_NOTIFY_INFO
267         u32                                     proc_id;
268         u32                                     length;
269         acpi_io_address                         address;
270 };
271
272
273 struct acpi_object_thermal_zone
274 {
275         ACPI_OBJECT_COMMON_HEADER
276         ACPI_COMMON_NOTIFY_INFO
277 };
278
279
280 /******************************************************************************
281  *
282  * Fields.  All share a common header/info field.
283  *
284  *****************************************************************************/
285
286 struct acpi_object_field_common                         /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
287 {
288         ACPI_OBJECT_COMMON_HEADER
289         ACPI_COMMON_FIELD_INFO
290         union acpi_operand_object               *region_obj;        /* Containing Operation Region object */
291                           /* (REGION/BANK fields only) */
292 };
293
294
295 struct acpi_object_region_field
296 {
297         ACPI_OBJECT_COMMON_HEADER
298         ACPI_COMMON_FIELD_INFO
299         union acpi_operand_object               *region_obj;        /* Containing op_region object */
300 };
301
302
303 struct acpi_object_bank_field
304 {
305         ACPI_OBJECT_COMMON_HEADER
306         ACPI_COMMON_FIELD_INFO
307         union acpi_operand_object               *region_obj;        /* Containing op_region object */
308         union acpi_operand_object               *bank_obj;          /* bank_select Register object */
309 };
310
311
312 struct acpi_object_index_field
313 {
314         ACPI_OBJECT_COMMON_HEADER
315         ACPI_COMMON_FIELD_INFO
316
317         /*
318          * No "region_obj" pointer needed since the Index and Data registers
319          * are each field definitions unto themselves.
320          */
321         union acpi_operand_object               *index_obj;         /* Index register */
322         union acpi_operand_object               *data_obj;          /* Data register */
323 };
324
325
326 /* The buffer_field is different in that it is part of a Buffer, not an op_region */
327
328 struct acpi_object_buffer_field
329 {
330         ACPI_OBJECT_COMMON_HEADER
331         ACPI_COMMON_FIELD_INFO
332         union acpi_operand_object               *buffer_obj;        /* Containing Buffer object */
333 };
334
335
336 /******************************************************************************
337  *
338  * Objects for handlers
339  *
340  *****************************************************************************/
341
342 struct acpi_object_notify_handler
343 {
344         ACPI_OBJECT_COMMON_HEADER
345         struct acpi_namespace_node              *node;              /* Parent device */
346         acpi_notify_handler                     handler;
347         void                                    *context;
348 };
349
350
351 /* Flags for address handler */
352
353 #define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED  0x1
354
355
356 struct acpi_object_addr_handler
357 {
358         ACPI_OBJECT_COMMON_HEADER
359         u8                                      space_id;
360         u16                                     hflags;
361         acpi_adr_space_handler                  handler;
362         struct acpi_namespace_node              *node;              /* Parent device */
363         void                                    *context;
364         acpi_adr_space_setup                    setup;
365         union acpi_operand_object               *region_list;       /* regions using this handler */
366         union acpi_operand_object               *next;
367 };
368
369
370 /******************************************************************************
371  *
372  * Special internal objects
373  *
374  *****************************************************************************/
375
376 /*
377  * The Reference object type is used for these opcodes:
378  * Arg[0-6], Local[0-7], index_op, name_op, zero_op, one_op, ones_op, debug_op
379  */
380 struct acpi_object_reference
381 {
382         ACPI_OBJECT_COMMON_HEADER
383         u8                                      target_type;        /* Used for index_op */
384         u16                                     opcode;
385         u32                                     offset;             /* Used for arg_op, local_op, and index_op */
386         void                                    *object;            /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object  */
387         struct acpi_namespace_node              *node;
388         union acpi_operand_object               **where;
389 };
390
391
392 /*
393  * Extra object is used as additional storage for types that
394  * have AML code in their declarations (term_args) that must be
395  * evaluated at run time.
396  *
397  * Currently: Region and field_unit types
398  */
399 struct acpi_object_extra
400 {
401         ACPI_OBJECT_COMMON_HEADER
402         u8                                      byte_fill1;
403         u16                                     word_fill1;
404         u32                                     aml_length;
405         u8                                      *aml_start;
406         struct acpi_namespace_node              *method_REG;        /* _REG method for this region (if any) */
407         void                                    *region_context;    /* Region-specific data */
408 };
409
410
411 /* Additional data that can be attached to namespace nodes */
412
413 struct acpi_object_data
414 {
415         ACPI_OBJECT_COMMON_HEADER
416         acpi_object_handler                     handler;
417         void                                    *pointer;
418 };
419
420
421 /* Structure used when objects are cached for reuse */
422
423 struct acpi_object_cache_list
424 {
425         ACPI_OBJECT_COMMON_HEADER
426         union acpi_operand_object               *next;              /* Link for object cache and internal lists*/
427 };
428
429
430 /******************************************************************************
431  *
432  * union acpi_operand_object Descriptor - a giant union of all of the above
433  *
434  *****************************************************************************/
435
436 union acpi_operand_object
437 {
438         struct acpi_object_common               common;
439         struct acpi_object_integer              integer;
440         struct acpi_object_string               string;
441         struct acpi_object_buffer               buffer;
442         struct acpi_object_package              package;
443         struct acpi_object_event                event;
444         struct acpi_object_method               method;
445         struct acpi_object_mutex                mutex;
446         struct acpi_object_region               region;
447         struct acpi_object_notify_common        common_notify;
448         struct acpi_object_device               device;
449         struct acpi_object_power_resource       power_resource;
450         struct acpi_object_processor            processor;
451         struct acpi_object_thermal_zone         thermal_zone;
452         struct acpi_object_field_common         common_field;
453         struct acpi_object_region_field         field;
454         struct acpi_object_buffer_field         buffer_field;
455         struct acpi_object_bank_field           bank_field;
456         struct acpi_object_index_field          index_field;
457         struct acpi_object_notify_handler       notify;
458         struct acpi_object_addr_handler         address_space;
459         struct acpi_object_reference            reference;
460         struct acpi_object_extra                extra;
461         struct acpi_object_data                 data;
462         struct acpi_object_cache_list           cache;
463 };
464
465
466 /******************************************************************************
467  *
468  * union acpi_descriptor - objects that share a common descriptor identifier
469  *
470  *****************************************************************************/
471
472 /* Object descriptor types */
473
474 #define ACPI_DESC_TYPE_CACHED           0x01        /* Used only when object is cached */
475 #define ACPI_DESC_TYPE_STATE            0x02
476 #define ACPI_DESC_TYPE_STATE_UPDATE     0x03
477 #define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
478 #define ACPI_DESC_TYPE_STATE_CONTROL    0x05
479 #define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
480 #define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
481 #define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
482 #define ACPI_DESC_TYPE_STATE_RESULT     0x09
483 #define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
484 #define ACPI_DESC_TYPE_STATE_THREAD     0x0B
485 #define ACPI_DESC_TYPE_WALK             0x0C
486 #define ACPI_DESC_TYPE_PARSER           0x0D
487 #define ACPI_DESC_TYPE_OPERAND          0x0E
488 #define ACPI_DESC_TYPE_NAMED            0x0F
489 #define ACPI_DESC_TYPE_MAX              0x0F
490
491
492 union acpi_descriptor
493 {
494         u8                                      descriptor_id;  /* To differentiate various internal objs */\
495         union acpi_operand_object               object;
496         struct acpi_namespace_node              node;
497         union acpi_parse_object                 op;
498 };
499
500
501 #endif /* _ACOBJECT_H */