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 / 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 - 2006, 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 /* acpisrc:struct_defs -- for acpisrc conversion */
49
50 /*
51  * The union acpi_operand_object is used to pass AML operands from the dispatcher
52  * to the interpreter, and to keep track of the various handlers such as
53  * address space handlers and notify handlers. The object is a constant
54  * size in order to allow it to be cached and reused.
55  */
56
57 /*******************************************************************************
58  *
59  * Common Descriptors
60  *
61  ******************************************************************************/
62
63 /*
64  * Common area for all objects.
65  *
66  * descriptor_type is used to differentiate between internal descriptors, and
67  * must be in the same place across all descriptors
68  *
69  * Note: The descriptor_type and Type fields must appear in the identical
70  * position in both the struct acpi_namespace_node and union acpi_operand_object
71  * structures.
72  */
73 #define ACPI_OBJECT_COMMON_HEADER \
74         union acpi_operand_object       *next_object;       /* Objects linked to parent NS node */\
75         u8                              descriptor_type;    /* To differentiate various internal objs */\
76         u8                              type;               /* acpi_object_type */\
77         u16                             reference_count;    /* For object deletion management */\
78         u8                              flags;
79         /*
80          * Note: There are 3 bytes available here before the
81          * next natural alignment boundary (for both 32/64 cases)
82          */
83
84 /* Values for Flag byte above */
85
86 #define AOPOBJ_AML_CONSTANT         0x01
87 #define AOPOBJ_STATIC_POINTER       0x02
88 #define AOPOBJ_DATA_VALID           0x04
89 #define AOPOBJ_OBJECT_INITIALIZED   0x08
90 #define AOPOBJ_SETUP_COMPLETE       0x10
91 #define AOPOBJ_SINGLE_DATUM         0x20
92 #define AOPOBJ_INVALID              0x40        /* Used if host OS won't allow an op_region address */
93
94 /******************************************************************************
95  *
96  * Basic data types
97  *
98  *****************************************************************************/
99
100 struct acpi_object_common {
101 ACPI_OBJECT_COMMON_HEADER};
102
103 struct acpi_object_integer {
104         ACPI_OBJECT_COMMON_HEADER acpi_integer value;
105 };
106
107 /*
108  * Note: The String and Buffer object must be identical through the Pointer
109  * and length elements.  There is code that depends on this.
110  *
111  * Fields common to both Strings and Buffers
112  */
113 #define ACPI_COMMON_BUFFER_INFO(_type) \
114         _type                           *pointer; \
115         u32                             length;
116
117 struct acpi_object_string {     /* Null terminated, ASCII characters only */
118         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(char) /* String in AML stream or allocated string */
119 };
120
121 struct acpi_object_buffer {
122         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(u8)   /* Buffer in AML stream or allocated buffer */
123         u32 aml_length;
124         u8 *aml_start;
125         struct acpi_namespace_node *node;       /* Link back to parent node */
126 };
127
128 struct acpi_object_package {
129         ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node;     /* Link back to parent node */
130         union acpi_operand_object **elements;   /* Array of pointers to acpi_objects */
131         u8 *aml_start;
132         u32 aml_length;
133         u32 count;              /* # of elements in package */
134 };
135
136 /******************************************************************************
137  *
138  * Complex data types
139  *
140  *****************************************************************************/
141
142 struct acpi_object_event {
143         ACPI_OBJECT_COMMON_HEADER acpi_semaphore os_semaphore;  /* Actual OS synchronization object */
144 };
145
146 struct acpi_object_mutex {
147         ACPI_OBJECT_COMMON_HEADER u8 sync_level;        /* 0-15, specified in Mutex() call */
148         u16 acquisition_depth;  /* Allow multiple Acquires, same thread */
149         struct acpi_thread_state *owner_thread; /* Current owner of the mutex */
150         acpi_mutex os_mutex;    /* Actual OS synchronization object */
151         union acpi_operand_object *prev;        /* Link for list of acquired mutexes */
152         union acpi_operand_object *next;        /* Link for list of acquired mutexes */
153         struct acpi_namespace_node *node;       /* Containing namespace node */
154         u8 original_sync_level; /* Owner's original sync level (0-15) */
155 };
156
157 struct acpi_object_region {
158         ACPI_OBJECT_COMMON_HEADER u8 space_id;
159         struct acpi_namespace_node *node;       /* Containing namespace node */
160         union acpi_operand_object *handler;     /* Handler for region access */
161         union acpi_operand_object *next;
162         acpi_physical_address address;
163         u32 length;
164 };
165
166 struct acpi_object_method {
167         ACPI_OBJECT_COMMON_HEADER u8 method_flags;
168         u8 param_count;
169         u8 sync_level;
170         union acpi_operand_object *mutex;
171         u8 *aml_start;
172         ACPI_INTERNAL_METHOD implementation;
173         u32 aml_length;
174         u8 thread_count;
175         acpi_owner_id owner_id;
176 };
177
178 /******************************************************************************
179  *
180  * Objects that can be notified.  All share a common notify_info area.
181  *
182  *****************************************************************************/
183
184 /*
185  * Common fields for objects that support ASL notifications
186  */
187 #define ACPI_COMMON_NOTIFY_INFO \
188         union acpi_operand_object       *system_notify;     /* Handler for system notifies */\
189         union acpi_operand_object       *device_notify;     /* Handler for driver notifies */\
190         union acpi_operand_object       *handler;       /* Handler for Address space */
191
192 struct acpi_object_notify_common {      /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
193 ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO};
194
195 struct acpi_object_device {
196         ACPI_OBJECT_COMMON_HEADER
197             ACPI_COMMON_NOTIFY_INFO struct acpi_gpe_block_info *gpe_block;
198 };
199
200 struct acpi_object_power_resource {
201         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 system_level;
202         u32 resource_order;
203 };
204
205 struct acpi_object_processor {
206         ACPI_OBJECT_COMMON_HEADER u8 proc_id;
207         u8 length;
208          ACPI_COMMON_NOTIFY_INFO acpi_io_address address;
209 };
210
211 struct acpi_object_thermal_zone {
212 ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO};
213
214 /******************************************************************************
215  *
216  * Fields.  All share a common header/info field.
217  *
218  *****************************************************************************/
219
220 /*
221  * Common bitfield for the field objects
222  * "Field Datum"  -- a datum from the actual field object
223  * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field
224  */
225 #define ACPI_COMMON_FIELD_INFO \
226         u8                              field_flags;        /* Access, update, and lock bits */\
227         u8                              attribute;          /* From access_as keyword */\
228         u8                              access_byte_width;  /* Read/Write size in bytes */\
229         struct acpi_namespace_node      *node;              /* Link back to parent node */\
230         u32                             bit_length;         /* Length of field in bits */\
231         u32                             base_byte_offset;   /* Byte offset within containing object */\
232         u32                             value;              /* Value to store into the Bank or Index register */\
233         u8                              start_field_bit_offset;/* Bit offset within first field datum (0-63) */\
234         u8                              access_bit_width;       /* Read/Write size in bits (8-64) */
235
236 struct acpi_object_field_common {       /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
237         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */
238 };
239
240 struct acpi_object_region_field {
241         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */
242 };
243
244 struct acpi_object_bank_field {
245         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */
246         union acpi_operand_object *bank_obj;    /* bank_select Register object */
247 };
248
249 struct acpi_object_index_field {
250         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO
251             /*
252              * No "RegionObj" pointer needed since the Index and Data registers
253              * are each field definitions unto themselves.
254              */
255         union acpi_operand_object *index_obj;   /* Index register */
256         union acpi_operand_object *data_obj;    /* Data register */
257 };
258
259 /* The buffer_field is different in that it is part of a Buffer, not an op_region */
260
261 struct acpi_object_buffer_field {
262         ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *buffer_obj; /* Containing Buffer object */
263 };
264
265 /******************************************************************************
266  *
267  * Objects for handlers
268  *
269  *****************************************************************************/
270
271 struct acpi_object_notify_handler {
272         ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node;     /* Parent device */
273         acpi_notify_handler handler;
274         void *context;
275 };
276
277 struct acpi_object_addr_handler {
278         ACPI_OBJECT_COMMON_HEADER u8 space_id;
279         u8 handler_flags;
280         acpi_adr_space_handler handler;
281         struct acpi_namespace_node *node;       /* Parent device */
282         void *context;
283         acpi_adr_space_setup setup;
284         union acpi_operand_object *region_list; /* regions using this handler */
285         union acpi_operand_object *next;
286 };
287
288 /* Flags for address handler (handler_flags) */
289
290 #define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED  0x01
291
292 /******************************************************************************
293  *
294  * Special internal objects
295  *
296  *****************************************************************************/
297
298 /*
299  * The Reference object type is used for these opcodes:
300  * Arg[0-6], Local[0-7], index_op, name_op, zero_op, one_op, ones_op, debug_op
301  */
302 struct acpi_object_reference {
303         ACPI_OBJECT_COMMON_HEADER u8 target_type;       /* Used for index_op */
304         u16 opcode;
305         void *object;           /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */
306         struct acpi_namespace_node *node;
307         union acpi_operand_object **where;
308         u32 offset;             /* Used for arg_op, local_op, and index_op */
309 };
310
311 /*
312  * Extra object is used as additional storage for types that
313  * have AML code in their declarations (term_args) that must be
314  * evaluated at run time.
315  *
316  * Currently: Region and field_unit types
317  */
318 struct acpi_object_extra {
319         ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG;       /* _REG method for this region (if any) */
320         void *region_context;   /* Region-specific data */
321         u8 *aml_start;
322         u32 aml_length;
323 };
324
325 /* Additional data that can be attached to namespace nodes */
326
327 struct acpi_object_data {
328         ACPI_OBJECT_COMMON_HEADER acpi_object_handler handler;
329         void *pointer;
330 };
331
332 /* Structure used when objects are cached for reuse */
333
334 struct acpi_object_cache_list {
335         ACPI_OBJECT_COMMON_HEADER union acpi_operand_object *next;      /* Link for object cache and internal lists */
336 };
337
338 /******************************************************************************
339  *
340  * union acpi_operand_object Descriptor - a giant union of all of the above
341  *
342  *****************************************************************************/
343
344 union acpi_operand_object {
345         struct acpi_object_common common;
346         struct acpi_object_integer integer;
347         struct acpi_object_string string;
348         struct acpi_object_buffer buffer;
349         struct acpi_object_package package;
350         struct acpi_object_event event;
351         struct acpi_object_method method;
352         struct acpi_object_mutex mutex;
353         struct acpi_object_region region;
354         struct acpi_object_notify_common common_notify;
355         struct acpi_object_device device;
356         struct acpi_object_power_resource power_resource;
357         struct acpi_object_processor processor;
358         struct acpi_object_thermal_zone thermal_zone;
359         struct acpi_object_field_common common_field;
360         struct acpi_object_region_field field;
361         struct acpi_object_buffer_field buffer_field;
362         struct acpi_object_bank_field bank_field;
363         struct acpi_object_index_field index_field;
364         struct acpi_object_notify_handler notify;
365         struct acpi_object_addr_handler address_space;
366         struct acpi_object_reference reference;
367         struct acpi_object_extra extra;
368         struct acpi_object_data data;
369         struct acpi_object_cache_list cache;
370 };
371
372 /******************************************************************************
373  *
374  * union acpi_descriptor - objects that share a common descriptor identifier
375  *
376  *****************************************************************************/
377
378 /* Object descriptor types */
379
380 #define ACPI_DESC_TYPE_CACHED           0x01    /* Used only when object is cached */
381 #define ACPI_DESC_TYPE_STATE            0x02
382 #define ACPI_DESC_TYPE_STATE_UPDATE     0x03
383 #define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
384 #define ACPI_DESC_TYPE_STATE_CONTROL    0x05
385 #define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
386 #define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
387 #define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
388 #define ACPI_DESC_TYPE_STATE_RESULT     0x09
389 #define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
390 #define ACPI_DESC_TYPE_STATE_THREAD     0x0B
391 #define ACPI_DESC_TYPE_WALK             0x0C
392 #define ACPI_DESC_TYPE_PARSER           0x0D
393 #define ACPI_DESC_TYPE_OPERAND          0x0E
394 #define ACPI_DESC_TYPE_NAMED            0x0F
395 #define ACPI_DESC_TYPE_MAX              0x0F
396
397 struct acpi_common_descriptor {
398         void *common_pointer;
399         u8 descriptor_type;     /* To differentiate various internal objs */
400 };
401
402 union acpi_descriptor {
403         struct acpi_common_descriptor common;
404         union acpi_operand_object object;
405         struct acpi_namespace_node node;
406         union acpi_parse_object op;
407 };
408
409 #endif                          /* _ACOBJECT_H */