kernel.org linux-2.6.10
[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         /* Create a new Buffer object */
159
160         buffer_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
161         if (!buffer_desc) {
162                 return_PTR (NULL);
163         }
164
165         /* Create an actual buffer only if size > 0 */
166
167         if (buffer_size > 0) {
168                 /* Allocate the actual buffer */
169
170                 buffer = ACPI_MEM_CALLOCATE (buffer_size);
171                 if (!buffer) {
172                         ACPI_REPORT_ERROR (("create_buffer: could not allocate size %X\n",
173                                 (u32) buffer_size));
174                         acpi_ut_remove_reference (buffer_desc);
175                         return_PTR (NULL);
176                 }
177         }
178
179         /* Complete buffer object initialization */
180
181         buffer_desc->buffer.flags |= AOPOBJ_DATA_VALID;
182         buffer_desc->buffer.pointer = buffer;
183         buffer_desc->buffer.length = (u32) buffer_size;
184
185         /* Return the new buffer descriptor */
186
187         return_PTR (buffer_desc);
188 }
189
190
191 /*******************************************************************************
192  *
193  * FUNCTION:    acpi_ut_create_string_object
194  *
195  * PARAMETERS:  string_size            - Size of string to be created.  Does not
196  *                                       include NULL terminator, this is added
197  *                                       automatically.
198  *
199  * RETURN:      Pointer to a new String object
200  *
201  * DESCRIPTION: Create a fully initialized string object
202  *
203  ******************************************************************************/
204
205 union acpi_operand_object *
206 acpi_ut_create_string_object (
207         acpi_size                       string_size)
208 {
209         union acpi_operand_object       *string_desc;
210         char                            *string;
211
212
213         ACPI_FUNCTION_TRACE_U32 ("ut_create_string_object", string_size);
214
215
216         /* Create a new String object */
217
218         string_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING);
219         if (!string_desc) {
220                 return_PTR (NULL);
221         }
222
223         /*
224          * Allocate the actual string buffer -- (Size + 1) for NULL terminator.
225          * NOTE: Zero-length strings are NULL terminated
226          */
227         string = ACPI_MEM_CALLOCATE (string_size + 1);
228         if (!string) {
229                 ACPI_REPORT_ERROR (("create_string: could not allocate size %X\n",
230                         (u32) string_size));
231                 acpi_ut_remove_reference (string_desc);
232                 return_PTR (NULL);
233         }
234
235         /* Complete string object initialization */
236
237         string_desc->string.pointer = string;
238         string_desc->string.length = (u32) string_size;
239
240         /* Return the new string descriptor */
241
242         return_PTR (string_desc);
243 }
244
245
246 /*******************************************************************************
247  *
248  * FUNCTION:    acpi_ut_valid_internal_object
249  *
250  * PARAMETERS:  Object              - Object to be validated
251  *
252  * RETURN:      Validate a pointer to be an union acpi_operand_object
253  *
254  ******************************************************************************/
255
256 u8
257 acpi_ut_valid_internal_object (
258         void                            *object)
259 {
260
261         ACPI_FUNCTION_NAME ("ut_valid_internal_object");
262
263
264         /* Check for a null pointer */
265
266         if (!object) {
267                 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));
268                 return (FALSE);
269         }
270
271         /* Check the descriptor type field */
272
273         switch (ACPI_GET_DESCRIPTOR_TYPE (object)) {
274         case ACPI_DESC_TYPE_OPERAND:
275
276                 /* The object appears to be a valid union acpi_operand_object    */
277
278                 return (TRUE);
279
280         default:
281                 ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
282                                 "%p is not not an ACPI operand obj [%s]\n",
283                                 object, acpi_ut_get_descriptor_name (object)));
284                 break;
285         }
286
287         return (FALSE);
288 }
289
290
291 /*******************************************************************************
292  *
293  * FUNCTION:    acpi_ut_allocate_object_desc_dbg
294  *
295  * PARAMETERS:  module_name         - Caller's module name (for error output)
296  *              line_number         - Caller's line number (for error output)
297  *              component_id        - Caller's component ID (for error output)
298  *
299  * RETURN:      Pointer to newly allocated object descriptor.  Null on error
300  *
301  * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle
302  *              error conditions.
303  *
304  ******************************************************************************/
305
306 void *
307 acpi_ut_allocate_object_desc_dbg (
308         char                            *module_name,
309         u32                             line_number,
310         u32                             component_id)
311 {
312         union acpi_operand_object       *object;
313
314
315         ACPI_FUNCTION_TRACE ("ut_allocate_object_desc_dbg");
316
317
318         object = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_OPERAND);
319         if (!object) {
320                 _ACPI_REPORT_ERROR (module_name, line_number, component_id,
321                                   ("Could not allocate an object descriptor\n"));
322
323                 return_PTR (NULL);
324         }
325
326         /* Mark the descriptor type */
327
328         ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_OPERAND);
329
330         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n",
331                         object, (u32) sizeof (union acpi_operand_object)));
332
333         return_PTR (object);
334 }
335
336
337 /*******************************************************************************
338  *
339  * FUNCTION:    acpi_ut_delete_object_desc
340  *
341  * PARAMETERS:  Object          - An Acpi internal object to be deleted
342  *
343  * RETURN:      None.
344  *
345  * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
346  *
347  ******************************************************************************/
348
349 void
350 acpi_ut_delete_object_desc (
351         union acpi_operand_object       *object)
352 {
353         ACPI_FUNCTION_TRACE_PTR ("ut_delete_object_desc", object);
354
355
356         /* Object must be an union acpi_operand_object    */
357
358         if (ACPI_GET_DESCRIPTOR_TYPE (object) != ACPI_DESC_TYPE_OPERAND) {
359                 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
360                                 "%p is not an ACPI Operand object [%s]\n", object,
361                                 acpi_ut_get_descriptor_name (object)));
362                 return_VOID;
363         }
364
365         acpi_ut_release_to_cache (ACPI_MEM_LIST_OPERAND, object);
366
367         return_VOID;
368 }
369
370
371 /*******************************************************************************
372  *
373  * FUNCTION:    acpi_ut_delete_object_cache
374  *
375  * PARAMETERS:  None
376  *
377  * RETURN:      None
378  *
379  * DESCRIPTION: Purge the global state object cache.  Used during subsystem
380  *              termination.
381  *
382  ******************************************************************************/
383
384 void
385 acpi_ut_delete_object_cache (
386         void)
387 {
388         ACPI_FUNCTION_TRACE ("ut_delete_object_cache");
389
390
391         acpi_ut_delete_generic_cache (ACPI_MEM_LIST_OPERAND);
392         return_VOID;
393 }
394
395
396 /*******************************************************************************
397  *
398  * FUNCTION:    acpi_ut_get_simple_object_size
399  *
400  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
401  *              *obj_length         - Where the length is returned
402  *
403  * RETURN:      Status
404  *
405  * DESCRIPTION: This function is called to determine the space required to
406  *              contain a simple object for return to an external user.
407  *
408  *              The length includes the object structure plus any additional
409  *              needed space.
410  *
411  ******************************************************************************/
412
413 acpi_status
414 acpi_ut_get_simple_object_size (
415         union acpi_operand_object       *internal_object,
416         acpi_size                       *obj_length)
417 {
418         acpi_size                       length;
419         acpi_status                     status = AE_OK;
420
421
422         ACPI_FUNCTION_TRACE_PTR ("ut_get_simple_object_size", internal_object);
423
424
425         /* Handle a null object (Could be a uninitialized package element -- which is legal) */
426
427         if (!internal_object) {
428                 *obj_length = 0;
429                 return_ACPI_STATUS (AE_OK);
430         }
431
432         /* Start with the length of the Acpi object */
433
434         length = sizeof (union acpi_object);
435
436         if (ACPI_GET_DESCRIPTOR_TYPE (internal_object) == ACPI_DESC_TYPE_NAMED) {
437                 /* Object is a named object (reference), just return the length */
438
439                 *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD (length);
440                 return_ACPI_STATUS (status);
441         }
442
443         /*
444          * The final length depends on the object type
445          * Strings and Buffers are packed right up against the parent object and
446          * must be accessed bytewise or there may be alignment problems on
447          * certain processors
448          */
449         switch (ACPI_GET_OBJECT_TYPE (internal_object)) {
450         case ACPI_TYPE_STRING:
451
452                 length += (acpi_size) internal_object->string.length + 1;
453                 break;
454
455
456         case ACPI_TYPE_BUFFER:
457
458                 length += (acpi_size) internal_object->buffer.length;
459                 break;
460
461
462         case ACPI_TYPE_INTEGER:
463         case ACPI_TYPE_PROCESSOR:
464         case ACPI_TYPE_POWER:
465
466                 /*
467                  * No extra data for these types
468                  */
469                 break;
470
471
472         case ACPI_TYPE_LOCAL_REFERENCE:
473
474                 switch (internal_object->reference.opcode) {
475                 case AML_INT_NAMEPATH_OP:
476
477                         /*
478                          * Get the actual length of the full pathname to this object.
479                          * The reference will be converted to the pathname to the object
480                          */
481                         length += ACPI_ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node));
482                         break;
483
484                 default:
485
486                         /*
487                          * No other reference opcodes are supported.
488                          * Notably, Locals and Args are not supported, but this may be
489                          * required eventually.
490                          */
491                         ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
492                                 "Unsupported Reference opcode=%X in object %p\n",
493                                 internal_object->reference.opcode, internal_object));
494                         status = AE_TYPE;
495                         break;
496                 }
497                 break;
498
499
500         default:
501
502                 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported type=%X in object %p\n",
503                         ACPI_GET_OBJECT_TYPE (internal_object), internal_object));
504                 status = AE_TYPE;
505                 break;
506         }
507
508         /*
509          * Account for the space required by the object rounded up to the next
510          * multiple of the machine word size.  This keeps each object aligned
511          * on a machine word boundary. (preventing alignment faults on some
512          * machines.)
513          */
514         *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD (length);
515         return_ACPI_STATUS (status);
516 }
517
518
519 /*******************************************************************************
520  *
521  * FUNCTION:    acpi_ut_get_element_length
522  *
523  * PARAMETERS:  acpi_pkg_callback
524  *
525  * RETURN:      Status
526  *
527  * DESCRIPTION: Get the length of one package element.
528  *
529  ******************************************************************************/
530
531 acpi_status
532 acpi_ut_get_element_length (
533         u8                              object_type,
534         union acpi_operand_object       *source_object,
535         union acpi_generic_state        *state,
536         void                            *context)
537 {
538         acpi_status                     status = AE_OK;
539         struct acpi_pkg_info            *info = (struct acpi_pkg_info *) context;
540         acpi_size                       object_space;
541
542
543         switch (object_type) {
544         case ACPI_COPY_TYPE_SIMPLE:
545
546                 /*
547                  * Simple object - just get the size (Null object/entry is handled
548                  * here also) and sum it into the running package length
549                  */
550                 status = acpi_ut_get_simple_object_size (source_object, &object_space);
551                 if (ACPI_FAILURE (status)) {
552                         return (status);
553                 }
554
555                 info->length += object_space;
556                 break;
557
558
559         case ACPI_COPY_TYPE_PACKAGE:
560
561                 /* Package object - nothing much to do here, let the walk handle it */
562
563                 info->num_packages++;
564                 state->pkg.this_target_obj = NULL;
565                 break;
566
567
568         default:
569
570                 /* No other types allowed */
571
572                 return (AE_BAD_PARAMETER);
573         }
574
575         return (status);
576 }
577
578
579 /*******************************************************************************
580  *
581  * FUNCTION:    acpi_ut_get_package_object_size
582  *
583  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
584  *              *obj_length         - Where the length is returned
585  *
586  * RETURN:      Status
587  *
588  * DESCRIPTION: This function is called to determine the space required to
589  *              contain a package object for return to an external user.
590  *
591  *              This is moderately complex since a package contains other
592  *              objects including packages.
593  *
594  ******************************************************************************/
595
596 acpi_status
597 acpi_ut_get_package_object_size (
598         union acpi_operand_object       *internal_object,
599         acpi_size                       *obj_length)
600 {
601         acpi_status                     status;
602         struct acpi_pkg_info            info;
603
604
605         ACPI_FUNCTION_TRACE_PTR ("ut_get_package_object_size", internal_object);
606
607
608         info.length      = 0;
609         info.object_space = 0;
610         info.num_packages = 1;
611
612         status = acpi_ut_walk_package_tree (internal_object, NULL,
613                          acpi_ut_get_element_length, &info);
614         if (ACPI_FAILURE (status)) {
615                 return_ACPI_STATUS (status);
616         }
617
618         /*
619          * We have handled all of the objects in all levels of the package.
620          * just add the length of the package objects themselves.
621          * Round up to the next machine word.
622          */
623         info.length += ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object)) *
624                           (acpi_size) info.num_packages;
625
626         /* Return the total package length */
627
628         *obj_length = info.length;
629         return_ACPI_STATUS (status);
630 }
631
632
633 /*******************************************************************************
634  *
635  * FUNCTION:    acpi_ut_get_object_size
636  *
637  * PARAMETERS:  *internal_object    - Pointer to the object we are examining
638  *              *obj_length         - Where the length will be returned
639  *
640  * RETURN:      Status
641  *
642  * DESCRIPTION: This function is called to determine the space required to
643  *              contain an object for return to an API user.
644  *
645  ******************************************************************************/
646
647 acpi_status
648 acpi_ut_get_object_size(
649         union acpi_operand_object       *internal_object,
650         acpi_size                       *obj_length)
651 {
652         acpi_status                     status;
653
654
655         ACPI_FUNCTION_ENTRY ();
656
657
658         if ((ACPI_GET_DESCRIPTOR_TYPE (internal_object) == ACPI_DESC_TYPE_OPERAND) &&
659                 (ACPI_GET_OBJECT_TYPE (internal_object) == ACPI_TYPE_PACKAGE)) {
660                 status = acpi_ut_get_package_object_size (internal_object, obj_length);
661         }
662         else {
663                 status = acpi_ut_get_simple_object_size (internal_object, obj_length);
664         }
665
666         return (status);
667 }
668
669