ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / acpi / utilities / utobject.c
1 /******************************************************************************
2  *
3  * Module Name: utobject - ACPI object create/delete/size/cache routines
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2004, R. Byron Moore
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44
45 #include <acpi/acpi.h>
46 #include <acpi/acnamesp.h>
47 #include <acpi/amlcode.h>
48
49
50 #define _COMPONENT          ACPI_UTILITIES
51          ACPI_MODULE_NAME    ("utobject")
52
53
54 /*******************************************************************************
55  *
56  * FUNCTION:    acpi_ut_create_internal_object_dbg
57  *
58  * PARAMETERS:  module_name         - Source file name of caller
59  *              line_number         - Line number of caller
60  *              component_id        - Component type of caller
61  *              Type                - ACPI Type of the new object
62  *
63  * RETURN:      Object              - The new object.  Null on failure
64  *
65  * DESCRIPTION: Create and initialize a new internal object.
66  *
67  * NOTE:        We always allocate the worst-case object descriptor because
68  *              these objects are cached, and we want them to be
69  *              one-size-satisifies-any-request.  This in itself may not be
70  *              the most memory efficient, but the efficiency of the object
71  *              cache should more than make up for this!
72  *
73  ******************************************************************************/
74
75 union acpi_operand_object    *
76 acpi_ut_create_internal_object_dbg (
77         char                            *module_name,
78         u32                             line_number,
79         u32                             component_id,
80         acpi_object_type                type)
81 {
82         union acpi_operand_object       *object;
83         union acpi_operand_object       *second_object;
84
85
86         ACPI_FUNCTION_TRACE_STR ("ut_create_internal_object_dbg", acpi_ut_get_type_name (type));
87
88
89         /* Allocate the raw object descriptor */
90
91         object = acpi_ut_allocate_object_desc_dbg (module_name, line_number, component_id);
92         if (!object) {
93                 return_PTR (NULL);
94         }
95
96         switch (type) {
97         case ACPI_TYPE_REGION:
98         case ACPI_TYPE_BUFFER_FIELD:
99
100                 /* These types require a secondary object */
101
102                 second_object = acpi_ut_allocate_object_desc_dbg (module_name, line_number, component_id);
103                 if (!second_object) {
104                         acpi_ut_delete_object_desc (object);
105                         return_PTR (NULL);
106                 }
107
108                 second_object->common.type = ACPI_TYPE_LOCAL_EXTRA;
109                 second_object->common.reference_count = 1;
110
111                 /* Link the second object to the first */
112
113                 object->common.next_object = second_object;
114                 break;
115
116         default:
117                 /* All others have no secondary object */
118                 break;
119         }
120
121         /* Save the object type in the object descriptor */
122
123         object->common.type = (u8) type;
124
125         /* Init the reference count */
126
127         object->common.reference_count = 1;
128
129         /* Any per-type initialization should go here */
130
131         return_PTR (object);
132 }
133
134
135 /*******************************************************************************
136  *
137  * FUNCTION:    acpi_ut_create_buffer_object
138  *
139  * PARAMETERS:  buffer_size            - Size of buffer to be created
140  *
141  * RETURN:      Pointer to a new Buffer object
142  *
143  * DESCRIPTION: Create a fully initialized buffer object
144  *
145  ******************************************************************************/
146
147 union acpi_operand_object *
148 acpi_ut_create_buffer_object (
149         acpi_size                       buffer_size)
150 {
151         union acpi_operand_object       *buffer_desc;
152         u8                              *buffer = NULL;
153
154
155         ACPI_FUNCTION_TRACE_U32 ("ut_create_buffer_object", buffer_size);
156
157
158         /*
159          * Create a new Buffer object
160          */
161         buffer_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
162         if (!buffer_desc) {
163                 return_PTR (NULL);
164         }
165
166         /* Create an actual buffer only if size > 0 */
167
168         if (buffer_size > 0) {
169                 /* Allocate the actual buffer */
170
171                 buffer = ACPI_MEM_CALLOCATE (buffer_size);
172                 if (!buffer) {
173                         ACPI_REPORT_ERROR (("create_buffer: could not allocate size %X\n",
174                                 (u32) buffer_size));
175                         acpi_ut_remove_reference (buffer_desc);
176                         return_PTR (NULL);
177                 }
178         }
179
180         /* Complete buffer object initialization */
181
182         buffer_desc->buffer.flags |= AOPOBJ_DATA_VALID;
183         buffer_desc->buffer.pointer = buffer;
184         buffer_desc->buffer.length = (u32) buffer_size;
185
186         /* Return the new buffer descriptor */
187
188         return_PTR (buffer_desc);
189 }
190
191
192 /*******************************************************************************
193  *
194  * FUNCTION:    acpi_ut_valid_internal_object
195  *
196  * PARAMETERS:  Object              - Object to be validated
197  *
198  * RETURN:      Validate a pointer to be an union acpi_operand_object
199  *
200  ******************************************************************************/
201
202 u8
203 acpi_ut_valid_internal_object (
204         void                            *object)
205 {
206
207         ACPI_FUNCTION_NAME ("ut_valid_internal_object");
208
209
210         /* Check for a null pointer */
211
212         if (!object) {
213                 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));
214                 return (FALSE);
215         }
216
217         /* Check the descriptor type field */
218
219         switch (ACPI_GET_DESCRIPTOR_TYPE (object)) {
220         case ACPI_DESC_TYPE_OPERAND:
221
222                 /* The object appears to be a valid union acpi_operand_object    */
223
224                 return (TRUE);
225
226         default:
227                 ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
228                                 "%p is not not an ACPI operand obj [%s]\n",
229                                 object, acpi_ut_get_descriptor_name (object)));
230                 break;
231         }
232
233         return (FALSE);
234 }
235
236
237 /*******************************************************************************
238  *
239  * FUNCTION:    acpi_ut_allocate_object_desc_dbg
240  *
241  * PARAMETERS:  module_name         - Caller's module name (for error output)
242  *              line_number         - Caller's line number (for error output)
243  *              component_id        - Caller's component ID (for error output)
244  *
245  * RETURN:      Pointer to newly allocated object descriptor.  Null on error
246  *
247  * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle
248  *              error conditions.
249  *
250  ******************************************************************************/
251
252 void *
253 acpi_ut_allocate_object_desc_dbg (
254         char                            *module_name,
255         u32                             line_number,
256         u32                             component_id)
257 {
258         union acpi_operand_object       *object;
259
260
261         ACPI_FUNCTION_TRACE ("ut_allocate_object_desc_dbg");
262
263
264         object = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_OPERAND);
265         if (!object) {
266                 _ACPI_REPORT_ERROR (module_name, line_number, component_id,
267                                   ("Could not allocate an object descriptor\n"));
268
269                 return_PTR (NULL);
270         }
271
272         /* Mark the descriptor type */
273
274         ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_OPERAND);
275
276         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n",
277                         object, (u32) sizeof (union acpi_operand_object)));
278
279         return_PTR (object);
280 }
281
282
283 /*******************************************************************************
284  *
285  * FUNCTION:    acpi_ut_delete_object_desc
286  *
287  * PARAMETERS:  Object          - An Acpi internal object to be deleted
288  *
289  * RETURN:      None.
290  *
291  * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
292  *
293  ******************************************************************************/
294
295 void
296 acpi_ut_delete_object_desc (
297         union acpi_operand_object       *object)
298 {
299         ACPI_FUNCTION_TRACE_PTR ("ut_delete_object_desc", object);
300
301
302         /* Object must be an union acpi_operand_object    */
303
304         if (ACPI_GET_DESCRIPTOR_TYPE (object) != ACPI_DESC_TYPE_OPERAND) {
305                 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
306                                 "%p is not an ACPI Operand object [%s]\n", object,
307                                 acpi_ut_get_descriptor_name (object)));
308                 return_VOID;
309         }
310
311         acpi_ut_release_to_cache (ACPI_MEM_LIST_OPERAND, object);
312
313         return_VOID;
314 }
315
316
317 /*******************************************************************************
318  *
319  * FUNCTION:    acpi_ut_delete_object_cache
320  *
321  * PARAMETERS:  None
322  *
323  * RETURN:      None
324  *
325  * DESCRIPTION: Purge the global state object cache.  Used during subsystem
326  *              termination.
327  *
328  ******************************************************************************/
329
330 void
331 acpi_ut_delete_object_cache (
332         void)
333 {
334         ACPI_FUNCTION_TRACE ("ut_delete_object_cache");
335
336
337         acpi_ut_delete_generic_cache (ACPI_MEM_LIST_OPERAND);
338         return_VOID;
339 }
340
341
342 /*******************************************************************************
343  *
344  * FUNCTION:    acpi_ut_get_simple_object_size
345  *
346  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
347  *              *obj_length         - Where the length is returned
348  *
349  * RETURN:      Status
350  *
351  * DESCRIPTION: This function is called to determine the space required to
352  *              contain a simple object for return to an external user.
353  *
354  *              The length includes the object structure plus any additional
355  *              needed space.
356  *
357  ******************************************************************************/
358
359 acpi_status
360 acpi_ut_get_simple_object_size (
361         union acpi_operand_object       *internal_object,
362         acpi_size                       *obj_length)
363 {
364         acpi_size                       length;
365         acpi_status                     status = AE_OK;
366
367
368         ACPI_FUNCTION_TRACE_PTR ("ut_get_simple_object_size", internal_object);
369
370
371         /* Handle a null object (Could be a uninitialized package element -- which is legal) */
372
373         if (!internal_object) {
374                 *obj_length = 0;
375                 return_ACPI_STATUS (AE_OK);
376         }
377
378         /* Start with the length of the Acpi object */
379
380         length = sizeof (union acpi_object);
381
382         if (ACPI_GET_DESCRIPTOR_TYPE (internal_object) == ACPI_DESC_TYPE_NAMED) {
383                 /* Object is a named object (reference), just return the length */
384
385                 *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD (length);
386                 return_ACPI_STATUS (status);
387         }
388
389         /*
390          * The final length depends on the object type
391          * Strings and Buffers are packed right up against the parent object and
392          * must be accessed bytewise or there may be alignment problems on
393          * certain processors
394          */
395         switch (ACPI_GET_OBJECT_TYPE (internal_object)) {
396         case ACPI_TYPE_STRING:
397
398                 length += (acpi_size) internal_object->string.length + 1;
399                 break;
400
401
402         case ACPI_TYPE_BUFFER:
403
404                 length += (acpi_size) internal_object->buffer.length;
405                 break;
406
407
408         case ACPI_TYPE_INTEGER:
409         case ACPI_TYPE_PROCESSOR:
410         case ACPI_TYPE_POWER:
411
412                 /*
413                  * No extra data for these types
414                  */
415                 break;
416
417
418         case ACPI_TYPE_LOCAL_REFERENCE:
419
420                 switch (internal_object->reference.opcode) {
421                 case AML_INT_NAMEPATH_OP:
422
423                         /*
424                          * Get the actual length of the full pathname to this object.
425                          * The reference will be converted to the pathname to the object
426                          */
427                         length += ACPI_ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node));
428                         break;
429
430                 default:
431
432                         /*
433                          * No other reference opcodes are supported.
434                          * Notably, Locals and Args are not supported, but this may be
435                          * required eventually.
436                          */
437                         ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
438                                 "Unsupported Reference opcode=%X in object %p\n",
439                                 internal_object->reference.opcode, internal_object));
440                         status = AE_TYPE;
441                         break;
442                 }
443                 break;
444
445
446         default:
447
448                 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported type=%X in object %p\n",
449                         ACPI_GET_OBJECT_TYPE (internal_object), internal_object));
450                 status = AE_TYPE;
451                 break;
452         }
453
454         /*
455          * Account for the space required by the object rounded up to the next
456          * multiple of the machine word size.  This keeps each object aligned
457          * on a machine word boundary. (preventing alignment faults on some
458          * machines.)
459          */
460         *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD (length);
461         return_ACPI_STATUS (status);
462 }
463
464
465 /*******************************************************************************
466  *
467  * FUNCTION:    acpi_ut_get_element_length
468  *
469  * PARAMETERS:  acpi_pkg_callback
470  *
471  * RETURN:      Status
472  *
473  * DESCRIPTION: Get the length of one package element.
474  *
475  ******************************************************************************/
476
477 acpi_status
478 acpi_ut_get_element_length (
479         u8                              object_type,
480         union acpi_operand_object       *source_object,
481         union acpi_generic_state        *state,
482         void                            *context)
483 {
484         acpi_status                     status = AE_OK;
485         struct acpi_pkg_info            *info = (struct acpi_pkg_info *) context;
486         acpi_size                       object_space;
487
488
489         switch (object_type) {
490         case ACPI_COPY_TYPE_SIMPLE:
491
492                 /*
493                  * Simple object - just get the size (Null object/entry is handled
494                  * here also) and sum it into the running package length
495                  */
496                 status = acpi_ut_get_simple_object_size (source_object, &object_space);
497                 if (ACPI_FAILURE (status)) {
498                         return (status);
499                 }
500
501                 info->length += object_space;
502                 break;
503
504
505         case ACPI_COPY_TYPE_PACKAGE:
506
507                 /* Package object - nothing much to do here, let the walk handle it */
508
509                 info->num_packages++;
510                 state->pkg.this_target_obj = NULL;
511                 break;
512
513
514         default:
515
516                 /* No other types allowed */
517
518                 return (AE_BAD_PARAMETER);
519         }
520
521         return (status);
522 }
523
524
525 /*******************************************************************************
526  *
527  * FUNCTION:    acpi_ut_get_package_object_size
528  *
529  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
530  *              *obj_length         - Where the length is returned
531  *
532  * RETURN:      Status
533  *
534  * DESCRIPTION: This function is called to determine the space required to
535  *              contain a package object for return to an external user.
536  *
537  *              This is moderately complex since a package contains other
538  *              objects including packages.
539  *
540  ******************************************************************************/
541
542 acpi_status
543 acpi_ut_get_package_object_size (
544         union acpi_operand_object       *internal_object,
545         acpi_size                       *obj_length)
546 {
547         acpi_status                     status;
548         struct acpi_pkg_info            info;
549
550
551         ACPI_FUNCTION_TRACE_PTR ("ut_get_package_object_size", internal_object);
552
553
554         info.length      = 0;
555         info.object_space = 0;
556         info.num_packages = 1;
557
558         status = acpi_ut_walk_package_tree (internal_object, NULL,
559                          acpi_ut_get_element_length, &info);
560         if (ACPI_FAILURE (status)) {
561                 return_ACPI_STATUS (status);
562         }
563
564         /*
565          * We have handled all of the objects in all levels of the package.
566          * just add the length of the package objects themselves.
567          * Round up to the next machine word.
568          */
569         info.length += ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object)) *
570                           (acpi_size) info.num_packages;
571
572         /* Return the total package length */
573
574         *obj_length = info.length;
575         return_ACPI_STATUS (status);
576 }
577
578
579 /*******************************************************************************
580  *
581  * FUNCTION:    acpi_ut_get_object_size
582  *
583  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
584  *              *obj_length         - Where the length will be returned
585  *
586  * RETURN:      Status
587  *
588  * DESCRIPTION: This function is called to determine the space required to
589  *              contain an object for return to an API user.
590  *
591  ******************************************************************************/
592
593 acpi_status
594 acpi_ut_get_object_size(
595         union acpi_operand_object       *internal_object,
596         acpi_size                       *obj_length)
597 {
598         acpi_status                     status;
599
600
601         ACPI_FUNCTION_ENTRY ();
602
603
604         if ((ACPI_GET_DESCRIPTOR_TYPE (internal_object) == ACPI_DESC_TYPE_OPERAND) &&
605                 (ACPI_GET_OBJECT_TYPE (internal_object) == ACPI_TYPE_PACKAGE)) {
606                 status = acpi_ut_get_package_object_size (internal_object, obj_length);
607         }
608         else {
609                 status = acpi_ut_get_simple_object_size (internal_object, obj_length);
610         }
611
612         return (status);
613 }
614
615