d4914fda6a3769fcfe614521e3e2160917082eb9
[safe/jmp/linux-2.6] / drivers / acpi / namespace / nsaccess.c
1 /*******************************************************************************
2  *
3  * Module Name: nsaccess - Top-level functions for accessing ACPI namespace
4  *
5  ******************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2006, 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 #include <acpi/acpi.h>
45 #include <acpi/amlcode.h>
46 #include <acpi/acnamesp.h>
47 #include <acpi/acdispat.h>
48
49 #define _COMPONENT          ACPI_NAMESPACE
50 ACPI_MODULE_NAME("nsaccess")
51
52 /*******************************************************************************
53  *
54  * FUNCTION:    acpi_ns_root_initialize
55  *
56  * PARAMETERS:  None
57  *
58  * RETURN:      Status
59  *
60  * DESCRIPTION: Allocate and initialize the default root named objects
61  *
62  * MUTEX:       Locks namespace for entire execution
63  *
64  ******************************************************************************/
65 acpi_status acpi_ns_root_initialize(void)
66 {
67         acpi_status status;
68         const struct acpi_predefined_names *init_val = NULL;
69         struct acpi_namespace_node *new_node;
70         union acpi_operand_object *obj_desc;
71         acpi_string val = NULL;
72
73         ACPI_FUNCTION_TRACE("ns_root_initialize");
74
75         status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
76         if (ACPI_FAILURE(status)) {
77                 return_ACPI_STATUS(status);
78         }
79
80         /*
81          * The global root ptr is initially NULL, so a non-NULL value indicates
82          * that acpi_ns_root_initialize() has already been called; just return.
83          */
84         if (acpi_gbl_root_node) {
85                 status = AE_OK;
86                 goto unlock_and_exit;
87         }
88
89         /*
90          * Tell the rest of the subsystem that the root is initialized
91          * (This is OK because the namespace is locked)
92          */
93         acpi_gbl_root_node = &acpi_gbl_root_node_struct;
94
95         /* Enter the pre-defined names in the name table */
96
97         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
98                           "Entering predefined entries into namespace\n"));
99
100         for (init_val = acpi_gbl_pre_defined_names; init_val->name; init_val++) {
101
102                 /* _OSI is optional for now, will be permanent later */
103
104                 if (!ACPI_STRCMP(init_val->name, "_OSI")
105                     && !acpi_gbl_create_osi_method) {
106                         continue;
107                 }
108
109                 status = acpi_ns_lookup(NULL, init_val->name, init_val->type,
110                                         ACPI_IMODE_LOAD_PASS2,
111                                         ACPI_NS_NO_UPSEARCH, NULL, &new_node);
112
113                 if (ACPI_FAILURE(status) || (!new_node)) {      /* Must be on same line for code converter */
114                         ACPI_EXCEPTION((AE_INFO, status,
115                                         "Could not create predefined name %s",
116                                         init_val->name));
117                 }
118
119                 /*
120                  * Name entered successfully.
121                  * If entry in pre_defined_names[] specifies an
122                  * initial value, create the initial value.
123                  */
124                 if (init_val->val) {
125                         status = acpi_os_predefined_override(init_val, &val);
126                         if (ACPI_FAILURE(status)) {
127                                 ACPI_ERROR((AE_INFO,
128                                             "Could not override predefined %s",
129                                             init_val->name));
130                         }
131
132                         if (!val) {
133                                 val = init_val->val;
134                         }
135
136                         /*
137                          * Entry requests an initial value, allocate a
138                          * descriptor for it.
139                          */
140                         obj_desc =
141                             acpi_ut_create_internal_object(init_val->type);
142                         if (!obj_desc) {
143                                 status = AE_NO_MEMORY;
144                                 goto unlock_and_exit;
145                         }
146
147                         /*
148                          * Convert value string from table entry to
149                          * internal representation. Only types actually
150                          * used for initial values are implemented here.
151                          */
152                         switch (init_val->type) {
153                         case ACPI_TYPE_METHOD:
154                                 obj_desc->method.param_count =
155                                     (u8) ACPI_TO_INTEGER(val);
156                                 obj_desc->common.flags |= AOPOBJ_DATA_VALID;
157
158 #if defined (ACPI_ASL_COMPILER)
159
160                                 /* save the parameter count for the i_aSL compiler */
161
162                                 new_node->value = obj_desc->method.param_count;
163 #else
164                                 /* Mark this as a very SPECIAL method */
165
166                                 obj_desc->method.method_flags =
167                                     AML_METHOD_INTERNAL_ONLY;
168
169 #ifndef ACPI_DUMP_APP
170                                 obj_desc->method.implementation =
171                                     acpi_ut_osi_implementation;
172 #endif
173 #endif
174                                 break;
175
176                         case ACPI_TYPE_INTEGER:
177
178                                 obj_desc->integer.value = ACPI_TO_INTEGER(val);
179                                 break;
180
181                         case ACPI_TYPE_STRING:
182
183                                 /*
184                                  * Build an object around the static string
185                                  */
186                                 obj_desc->string.length =
187                                     (u32) ACPI_STRLEN(val);
188                                 obj_desc->string.pointer = val;
189                                 obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;
190                                 break;
191
192                         case ACPI_TYPE_MUTEX:
193
194                                 obj_desc->mutex.node = new_node;
195                                 obj_desc->mutex.sync_level =
196                                     (u8) (ACPI_TO_INTEGER(val) - 1);
197
198                                 if (ACPI_STRCMP(init_val->name, "_GL_") == 0) {
199                                         /*
200                                          * Create a counting semaphore for the
201                                          * global lock
202                                          */
203                                         status =
204                                             acpi_os_create_semaphore
205                                             (ACPI_NO_UNIT_LIMIT, 1,
206                                              &obj_desc->mutex.semaphore);
207                                         if (ACPI_FAILURE(status)) {
208                                                 acpi_ut_remove_reference
209                                                     (obj_desc);
210                                                 goto unlock_and_exit;
211                                         }
212
213                                         /*
214                                          * We just created the mutex for the
215                                          * global lock, save it
216                                          */
217                                         acpi_gbl_global_lock_semaphore =
218                                             obj_desc->mutex.semaphore;
219                                 } else {
220                                         /* Create a mutex */
221
222                                         status = acpi_os_create_semaphore(1, 1,
223                                                                           &obj_desc->
224                                                                           mutex.
225                                                                           semaphore);
226                                         if (ACPI_FAILURE(status)) {
227                                                 acpi_ut_remove_reference
228                                                     (obj_desc);
229                                                 goto unlock_and_exit;
230                                         }
231                                 }
232                                 break;
233
234                         default:
235
236                                 ACPI_ERROR((AE_INFO,
237                                             "Unsupported initial type value %X",
238                                             init_val->type));
239                                 acpi_ut_remove_reference(obj_desc);
240                                 obj_desc = NULL;
241                                 continue;
242                         }
243
244                         /* Store pointer to value descriptor in the Node */
245
246                         status = acpi_ns_attach_object(new_node, obj_desc,
247                                                        ACPI_GET_OBJECT_TYPE
248                                                        (obj_desc));
249
250                         /* Remove local reference to the object */
251
252                         acpi_ut_remove_reference(obj_desc);
253                 }
254         }
255
256       unlock_and_exit:
257         (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
258
259         /* Save a handle to "_GPE", it is always present */
260
261         if (ACPI_SUCCESS(status)) {
262                 status =
263                     acpi_ns_get_node_by_path("\\_GPE", NULL,
264                                              ACPI_NS_NO_UPSEARCH,
265                                              &acpi_gbl_fadt_gpe_device);
266         }
267
268         return_ACPI_STATUS(status);
269 }
270
271 /*******************************************************************************
272  *
273  * FUNCTION:    acpi_ns_lookup
274  *
275  * PARAMETERS:  scope_info      - Current scope info block
276  *              Pathname        - Search pathname, in internal format
277  *                                (as represented in the AML stream)
278  *              Type            - Type associated with name
279  *              interpreter_mode - IMODE_LOAD_PASS2 => add name if not found
280  *              Flags           - Flags describing the search restrictions
281  *              walk_state      - Current state of the walk
282  *              return_node     - Where the Node is placed (if found
283  *                                or created successfully)
284  *
285  * RETURN:      Status
286  *
287  * DESCRIPTION: Find or enter the passed name in the name space.
288  *              Log an error if name not found in Exec mode.
289  *
290  * MUTEX:       Assumes namespace is locked.
291  *
292  ******************************************************************************/
293
294 acpi_status
295 acpi_ns_lookup(union acpi_generic_state *scope_info,
296                char *pathname,
297                acpi_object_type type,
298                acpi_interpreter_mode interpreter_mode,
299                u32 flags,
300                struct acpi_walk_state *walk_state,
301                struct acpi_namespace_node **return_node)
302 {
303         acpi_status status;
304         char *path = pathname;
305         struct acpi_namespace_node *prefix_node;
306         struct acpi_namespace_node *current_node = NULL;
307         struct acpi_namespace_node *this_node = NULL;
308         u32 num_segments;
309         u32 num_carats;
310         acpi_name simple_name;
311         acpi_object_type type_to_check_for;
312         acpi_object_type this_search_type;
313         u32 search_parent_flag = ACPI_NS_SEARCH_PARENT;
314         u32 local_flags = flags & ~(ACPI_NS_ERROR_IF_FOUND |
315                                     ACPI_NS_SEARCH_PARENT);
316
317         ACPI_FUNCTION_TRACE("ns_lookup");
318
319         if (!return_node) {
320                 return_ACPI_STATUS(AE_BAD_PARAMETER);
321         }
322
323         acpi_gbl_ns_lookup_count++;
324         *return_node = ACPI_ENTRY_NOT_FOUND;
325
326         if (!acpi_gbl_root_node) {
327                 return_ACPI_STATUS(AE_NO_NAMESPACE);
328         }
329
330         /*
331          * Get the prefix scope.
332          * A null scope means use the root scope
333          */
334         if ((!scope_info) || (!scope_info->scope.node)) {
335                 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
336                                   "Null scope prefix, using root node (%p)\n",
337                                   acpi_gbl_root_node));
338
339                 prefix_node = acpi_gbl_root_node;
340         } else {
341                 prefix_node = scope_info->scope.node;
342                 if (ACPI_GET_DESCRIPTOR_TYPE(prefix_node) !=
343                     ACPI_DESC_TYPE_NAMED) {
344                         ACPI_ERROR((AE_INFO, "%p is not a namespace node [%s]",
345                                     prefix_node,
346                                     acpi_ut_get_descriptor_name(prefix_node)));
347                         return_ACPI_STATUS(AE_AML_INTERNAL);
348                 }
349
350                 if (!(flags & ACPI_NS_PREFIX_IS_SCOPE)) {
351                         /*
352                          * This node might not be a actual "scope" node (such as a
353                          * Device/Method, etc.)  It could be a Package or other object node.
354                          * Backup up the tree to find the containing scope node.
355                          */
356                         while (!acpi_ns_opens_scope(prefix_node->type) &&
357                                prefix_node->type != ACPI_TYPE_ANY) {
358                                 prefix_node =
359                                     acpi_ns_get_parent_node(prefix_node);
360                         }
361                 }
362         }
363
364         /* Save type   TBD: may be no longer necessary */
365
366         type_to_check_for = type;
367
368         /*
369          * Begin examination of the actual pathname
370          */
371         if (!pathname) {
372
373                 /* A Null name_path is allowed and refers to the root */
374
375                 num_segments = 0;
376                 this_node = acpi_gbl_root_node;
377                 path = "";
378
379                 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
380                                   "Null Pathname (Zero segments), Flags=%X\n",
381                                   flags));
382         } else {
383                 /*
384                  * Name pointer is valid (and must be in internal name format)
385                  *
386                  * Check for scope prefixes:
387                  *
388                  * As represented in the AML stream, a namepath consists of an
389                  * optional scope prefix followed by a name segment part.
390                  *
391                  * If present, the scope prefix is either a Root Prefix (in
392                  * which case the name is fully qualified), or one or more
393                  * Parent Prefixes (in which case the name's scope is relative
394                  * to the current scope).
395                  */
396                 if (*path == (u8) AML_ROOT_PREFIX) {
397
398                         /* Pathname is fully qualified, start from the root */
399
400                         this_node = acpi_gbl_root_node;
401                         search_parent_flag = ACPI_NS_NO_UPSEARCH;
402
403                         /* Point to name segment part */
404
405                         path++;
406
407                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
408                                           "Path is absolute from root [%p]\n",
409                                           this_node));
410                 } else {
411                         /* Pathname is relative to current scope, start there */
412
413                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
414                                           "Searching relative to prefix scope [%4.4s] (%p)\n",
415                                           acpi_ut_get_node_name(prefix_node),
416                                           prefix_node));
417
418                         /*
419                          * Handle multiple Parent Prefixes (carat) by just getting
420                          * the parent node for each prefix instance.
421                          */
422                         this_node = prefix_node;
423                         num_carats = 0;
424                         while (*path == (u8) AML_PARENT_PREFIX) {
425
426                                 /* Name is fully qualified, no search rules apply */
427
428                                 search_parent_flag = ACPI_NS_NO_UPSEARCH;
429                                 /*
430                                  * Point past this prefix to the name segment
431                                  * part or the next Parent Prefix
432                                  */
433                                 path++;
434
435                                 /* Backup to the parent node */
436
437                                 num_carats++;
438                                 this_node = acpi_ns_get_parent_node(this_node);
439                                 if (!this_node) {
440
441                                         /* Current scope has no parent scope */
442
443                                         ACPI_ERROR((AE_INFO,
444                                                     "ACPI path has too many parent prefixes (^) - reached beyond root node"));
445                                         return_ACPI_STATUS(AE_NOT_FOUND);
446                                 }
447                         }
448
449                         if (search_parent_flag == ACPI_NS_NO_UPSEARCH) {
450                                 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
451                                                   "Search scope is [%4.4s], path has %d carat(s)\n",
452                                                   acpi_ut_get_node_name
453                                                   (this_node), num_carats));
454                         }
455                 }
456
457                 /*
458                  * Determine the number of ACPI name segments in this pathname.
459                  *
460                  * The segment part consists of either:
461                  *  - A Null name segment (0)
462                  *  - A dual_name_prefix followed by two 4-byte name segments
463                  *  - A multi_name_prefix followed by a byte indicating the
464                  *      number of segments and the segments themselves.
465                  *  - A single 4-byte name segment
466                  *
467                  * Examine the name prefix opcode, if any, to determine the number of
468                  * segments.
469                  */
470                 switch (*path) {
471                 case 0:
472                         /*
473                          * Null name after a root or parent prefixes. We already
474                          * have the correct target node and there are no name segments.
475                          */
476                         num_segments = 0;
477                         type = this_node->type;
478
479                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
480                                           "Prefix-only Pathname (Zero name segments), Flags=%X\n",
481                                           flags));
482                         break;
483
484                 case AML_DUAL_NAME_PREFIX:
485
486                         /* More than one name_seg, search rules do not apply */
487
488                         search_parent_flag = ACPI_NS_NO_UPSEARCH;
489
490                         /* Two segments, point to first name segment */
491
492                         num_segments = 2;
493                         path++;
494
495                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
496                                           "Dual Pathname (2 segments, Flags=%X)\n",
497                                           flags));
498                         break;
499
500                 case AML_MULTI_NAME_PREFIX_OP:
501
502                         /* More than one name_seg, search rules do not apply */
503
504                         search_parent_flag = ACPI_NS_NO_UPSEARCH;
505
506                         /* Extract segment count, point to first name segment */
507
508                         path++;
509                         num_segments = (u32) (u8) * path;
510                         path++;
511
512                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
513                                           "Multi Pathname (%d Segments, Flags=%X)\n",
514                                           num_segments, flags));
515                         break;
516
517                 default:
518                         /*
519                          * Not a Null name, no Dual or Multi prefix, hence there is
520                          * only one name segment and Pathname is already pointing to it.
521                          */
522                         num_segments = 1;
523
524                         ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
525                                           "Simple Pathname (1 segment, Flags=%X)\n",
526                                           flags));
527                         break;
528                 }
529
530                 ACPI_DEBUG_EXEC(acpi_ns_print_pathname(num_segments, path));
531         }
532
533         /*
534          * Search namespace for each segment of the name.  Loop through and
535          * verify (or add to the namespace) each name segment.
536          *
537          * The object type is significant only at the last name
538          * segment.  (We don't care about the types along the path, only
539          * the type of the final target object.)
540          */
541         this_search_type = ACPI_TYPE_ANY;
542         current_node = this_node;
543         while (num_segments && current_node) {
544                 num_segments--;
545                 if (!num_segments) {
546                         /*
547                          * This is the last segment, enable typechecking
548                          */
549                         this_search_type = type;
550
551                         /*
552                          * Only allow automatic parent search (search rules) if the caller
553                          * requested it AND we have a single, non-fully-qualified name_seg
554                          */
555                         if ((search_parent_flag != ACPI_NS_NO_UPSEARCH) &&
556                             (flags & ACPI_NS_SEARCH_PARENT)) {
557                                 local_flags |= ACPI_NS_SEARCH_PARENT;
558                         }
559
560                         /* Set error flag according to caller */
561
562                         if (flags & ACPI_NS_ERROR_IF_FOUND) {
563                                 local_flags |= ACPI_NS_ERROR_IF_FOUND;
564                         }
565                 }
566
567                 /* Extract one ACPI name from the front of the pathname */
568
569                 ACPI_MOVE_32_TO_32(&simple_name, path);
570
571                 /* Try to find the single (4 character) ACPI name */
572
573                 status =
574                     acpi_ns_search_and_enter(simple_name, walk_state,
575                                              current_node, interpreter_mode,
576                                              this_search_type, local_flags,
577                                              &this_node);
578                 if (ACPI_FAILURE(status)) {
579                         if (status == AE_NOT_FOUND) {
580
581                                 /* Name not found in ACPI namespace */
582
583                                 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
584                                                   "Name [%4.4s] not found in scope [%4.4s] %p\n",
585                                                   (char *)&simple_name,
586                                                   (char *)&current_node->name,
587                                                   current_node));
588                         }
589
590                         *return_node = this_node;
591                         return_ACPI_STATUS(status);
592                 }
593
594                 /*
595                  * Sanity typecheck of the target object:
596                  *
597                  * If 1) This is the last segment (num_segments == 0)
598                  *    2) And we are looking for a specific type
599                  *       (Not checking for TYPE_ANY)
600                  *    3) Which is not an alias
601                  *    4) Which is not a local type (TYPE_SCOPE)
602                  *    5) And the type of target object is known (not TYPE_ANY)
603                  *    6) And target object does not match what we are looking for
604                  *
605                  * Then we have a type mismatch.  Just warn and ignore it.
606                  */
607                 if ((num_segments == 0) &&
608                     (type_to_check_for != ACPI_TYPE_ANY) &&
609                     (type_to_check_for != ACPI_TYPE_LOCAL_ALIAS) &&
610                     (type_to_check_for != ACPI_TYPE_LOCAL_METHOD_ALIAS) &&
611                     (type_to_check_for != ACPI_TYPE_LOCAL_SCOPE) &&
612                     (this_node->type != ACPI_TYPE_ANY) &&
613                     (this_node->type != type_to_check_for)) {
614
615                         /* Complain about a type mismatch */
616
617                         ACPI_WARNING((AE_INFO,
618                                       "ns_lookup: Type mismatch on %4.4s (%s), searching for (%s)",
619                                       ACPI_CAST_PTR(char, &simple_name),
620                                       acpi_ut_get_type_name(this_node->type),
621                                       acpi_ut_get_type_name
622                                       (type_to_check_for)));
623                 }
624
625                 /*
626                  * If this is the last name segment and we are not looking for a
627                  * specific type, but the type of found object is known, use that type
628                  * to see if it opens a scope.
629                  */
630                 if ((num_segments == 0) && (type == ACPI_TYPE_ANY)) {
631                         type = this_node->type;
632                 }
633
634                 /* Point to next name segment and make this node current */
635
636                 path += ACPI_NAME_SIZE;
637                 current_node = this_node;
638         }
639
640         /*
641          * Always check if we need to open a new scope
642          */
643         if (!(flags & ACPI_NS_DONT_OPEN_SCOPE) && (walk_state)) {
644                 /*
645                  * If entry is a type which opens a scope, push the new scope on the
646                  * scope stack.
647                  */
648                 if (acpi_ns_opens_scope(type)) {
649                         status =
650                             acpi_ds_scope_stack_push(this_node, type,
651                                                      walk_state);
652                         if (ACPI_FAILURE(status)) {
653                                 return_ACPI_STATUS(status);
654                         }
655                 }
656         }
657
658         *return_node = this_node;
659         return_ACPI_STATUS(AE_OK);
660 }