Merge branch 'devicetree/merge' into spi/merge
[pandora-kernel.git] / drivers / acpi / acpica / dswload.c
1 /******************************************************************************
2  *
3  * Module Name: dswload - Dispatcher namespace load callbacks
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2011, Intel Corp.
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 "accommon.h"
46 #include "acparser.h"
47 #include "amlcode.h"
48 #include "acdispat.h"
49 #include "acinterp.h"
50 #include "acnamesp.h"
51 #include "acevents.h"
52
53 #ifdef ACPI_ASL_COMPILER
54 #include <acpi/acdisasm.h>
55 #endif
56
57 #define _COMPONENT          ACPI_DISPATCHER
58 ACPI_MODULE_NAME("dswload")
59
60 /*******************************************************************************
61  *
62  * FUNCTION:    acpi_ds_init_callbacks
63  *
64  * PARAMETERS:  walk_state      - Current state of the parse tree walk
65  *              pass_number     - 1, 2, or 3
66  *
67  * RETURN:      Status
68  *
69  * DESCRIPTION: Init walk state callbacks
70  *
71  ******************************************************************************/
72 acpi_status
73 acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number)
74 {
75
76         switch (pass_number) {
77         case 1:
78                 walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
79                     ACPI_PARSE_DELETE_TREE;
80                 walk_state->descending_callback = acpi_ds_load1_begin_op;
81                 walk_state->ascending_callback = acpi_ds_load1_end_op;
82                 break;
83
84         case 2:
85                 walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
86                     ACPI_PARSE_DELETE_TREE;
87                 walk_state->descending_callback = acpi_ds_load2_begin_op;
88                 walk_state->ascending_callback = acpi_ds_load2_end_op;
89                 break;
90
91         case 3:
92 #ifndef ACPI_NO_METHOD_EXECUTION
93                 walk_state->parse_flags |= ACPI_PARSE_EXECUTE |
94                     ACPI_PARSE_DELETE_TREE;
95                 walk_state->descending_callback = acpi_ds_exec_begin_op;
96                 walk_state->ascending_callback = acpi_ds_exec_end_op;
97 #endif
98                 break;
99
100         default:
101                 return (AE_BAD_PARAMETER);
102         }
103
104         return (AE_OK);
105 }
106
107 /*******************************************************************************
108  *
109  * FUNCTION:    acpi_ds_load1_begin_op
110  *
111  * PARAMETERS:  walk_state      - Current state of the parse tree walk
112  *              out_op          - Where to return op if a new one is created
113  *
114  * RETURN:      Status
115  *
116  * DESCRIPTION: Descending callback used during the loading of ACPI tables.
117  *
118  ******************************************************************************/
119
120 acpi_status
121 acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
122                        union acpi_parse_object ** out_op)
123 {
124         union acpi_parse_object *op;
125         struct acpi_namespace_node *node;
126         acpi_status status;
127         acpi_object_type object_type;
128         char *path;
129         u32 flags;
130
131         ACPI_FUNCTION_TRACE(ds_load1_begin_op);
132
133         op = walk_state->op;
134         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
135                           walk_state));
136
137         /* We are only interested in opcodes that have an associated name */
138
139         if (op) {
140                 if (!(walk_state->op_info->flags & AML_NAMED)) {
141                         *out_op = op;
142                         return_ACPI_STATUS(AE_OK);
143                 }
144
145                 /* Check if this object has already been installed in the namespace */
146
147                 if (op->common.node) {
148                         *out_op = op;
149                         return_ACPI_STATUS(AE_OK);
150                 }
151         }
152
153         path = acpi_ps_get_next_namestring(&walk_state->parser_state);
154
155         /* Map the raw opcode into an internal object type */
156
157         object_type = walk_state->op_info->object_type;
158
159         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
160                           "State=%p Op=%p [%s]\n", walk_state, op,
161                           acpi_ut_get_type_name(object_type)));
162
163         switch (walk_state->opcode) {
164         case AML_SCOPE_OP:
165
166                 /*
167                  * The target name of the Scope() operator must exist at this point so
168                  * that we can actually open the scope to enter new names underneath it.
169                  * Allow search-to-root for single namesegs.
170                  */
171                 status =
172                     acpi_ns_lookup(walk_state->scope_info, path, object_type,
173                                    ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
174                                    walk_state, &(node));
175 #ifdef ACPI_ASL_COMPILER
176                 if (status == AE_NOT_FOUND) {
177                         /*
178                          * Table disassembly:
179                          * Target of Scope() not found. Generate an External for it, and
180                          * insert the name into the namespace.
181                          */
182                         acpi_dm_add_to_external_list(path, ACPI_TYPE_DEVICE, 0);
183                         status =
184                             acpi_ns_lookup(walk_state->scope_info, path,
185                                            object_type, ACPI_IMODE_LOAD_PASS1,
186                                            ACPI_NS_SEARCH_PARENT, walk_state,
187                                            &node);
188                 }
189 #endif
190                 if (ACPI_FAILURE(status)) {
191                         ACPI_ERROR_NAMESPACE(path, status);
192                         return_ACPI_STATUS(status);
193                 }
194
195                 /*
196                  * Check to make sure that the target is
197                  * one of the opcodes that actually opens a scope
198                  */
199                 switch (node->type) {
200                 case ACPI_TYPE_ANY:
201                 case ACPI_TYPE_LOCAL_SCOPE:     /* Scope  */
202                 case ACPI_TYPE_DEVICE:
203                 case ACPI_TYPE_POWER:
204                 case ACPI_TYPE_PROCESSOR:
205                 case ACPI_TYPE_THERMAL:
206
207                         /* These are acceptable types */
208                         break;
209
210                 case ACPI_TYPE_INTEGER:
211                 case ACPI_TYPE_STRING:
212                 case ACPI_TYPE_BUFFER:
213
214                         /*
215                          * These types we will allow, but we will change the type.
216                          * This enables some existing code of the form:
217                          *
218                          *  Name (DEB, 0)
219                          *  Scope (DEB) { ... }
220                          *
221                          * Note: silently change the type here. On the second pass,
222                          * we will report a warning
223                          */
224                         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
225                                           "Type override - [%4.4s] had invalid type (%s) "
226                                           "for Scope operator, changed to type ANY\n",
227                                           acpi_ut_get_node_name(node),
228                                           acpi_ut_get_type_name(node->type)));
229
230                         node->type = ACPI_TYPE_ANY;
231                         walk_state->scope_info->common.value = ACPI_TYPE_ANY;
232                         break;
233
234                 default:
235
236                         /* All other types are an error */
237
238                         ACPI_ERROR((AE_INFO,
239                                     "Invalid type (%s) for target of "
240                                     "Scope operator [%4.4s] (Cannot override)",
241                                     acpi_ut_get_type_name(node->type),
242                                     acpi_ut_get_node_name(node)));
243
244                         return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
245                 }
246                 break;
247
248         default:
249                 /*
250                  * For all other named opcodes, we will enter the name into
251                  * the namespace.
252                  *
253                  * Setup the search flags.
254                  * Since we are entering a name into the namespace, we do not want to
255                  * enable the search-to-root upsearch.
256                  *
257                  * There are only two conditions where it is acceptable that the name
258                  * already exists:
259                  *    1) the Scope() operator can reopen a scoping object that was
260                  *       previously defined (Scope, Method, Device, etc.)
261                  *    2) Whenever we are parsing a deferred opcode (op_region, Buffer,
262                  *       buffer_field, or Package), the name of the object is already
263                  *       in the namespace.
264                  */
265                 if (walk_state->deferred_node) {
266
267                         /* This name is already in the namespace, get the node */
268
269                         node = walk_state->deferred_node;
270                         status = AE_OK;
271                         break;
272                 }
273
274                 /*
275                  * If we are executing a method, do not create any namespace objects
276                  * during the load phase, only during execution.
277                  */
278                 if (walk_state->method_node) {
279                         node = NULL;
280                         status = AE_OK;
281                         break;
282                 }
283
284                 flags = ACPI_NS_NO_UPSEARCH;
285                 if ((walk_state->opcode != AML_SCOPE_OP) &&
286                     (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
287                         flags |= ACPI_NS_ERROR_IF_FOUND;
288                         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
289                                           "[%s] Cannot already exist\n",
290                                           acpi_ut_get_type_name(object_type)));
291                 } else {
292                         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
293                                           "[%s] Both Find or Create allowed\n",
294                                           acpi_ut_get_type_name(object_type)));
295                 }
296
297                 /*
298                  * Enter the named type into the internal namespace. We enter the name
299                  * as we go downward in the parse tree. Any necessary subobjects that
300                  * involve arguments to the opcode must be created as we go back up the
301                  * parse tree later.
302                  */
303                 status =
304                     acpi_ns_lookup(walk_state->scope_info, path, object_type,
305                                    ACPI_IMODE_LOAD_PASS1, flags, walk_state,
306                                    &node);
307                 if (ACPI_FAILURE(status)) {
308                         if (status == AE_ALREADY_EXISTS) {
309
310                                 /* The name already exists in this scope */
311
312                                 if (node->flags & ANOBJ_IS_EXTERNAL) {
313                                         /*
314                                          * Allow one create on an object or segment that was
315                                          * previously declared External
316                                          */
317                                         node->flags &= ~ANOBJ_IS_EXTERNAL;
318                                         node->type = (u8) object_type;
319
320                                         /* Just retyped a node, probably will need to open a scope */
321
322                                         if (acpi_ns_opens_scope(object_type)) {
323                                                 status =
324                                                     acpi_ds_scope_stack_push
325                                                     (node, object_type,
326                                                      walk_state);
327                                                 if (ACPI_FAILURE(status)) {
328                                                         return_ACPI_STATUS
329                                                             (status);
330                                                 }
331                                         }
332
333                                         status = AE_OK;
334                                 }
335                         }
336
337                         if (ACPI_FAILURE(status)) {
338                                 ACPI_ERROR_NAMESPACE(path, status);
339                                 return_ACPI_STATUS(status);
340                         }
341                 }
342                 break;
343         }
344
345         /* Common exit */
346
347         if (!op) {
348
349                 /* Create a new op */
350
351                 op = acpi_ps_alloc_op(walk_state->opcode);
352                 if (!op) {
353                         return_ACPI_STATUS(AE_NO_MEMORY);
354                 }
355         }
356
357         /* Initialize the op */
358
359 #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
360         op->named.path = ACPI_CAST_PTR(u8, path);
361 #endif
362
363         if (node) {
364                 /*
365                  * Put the Node in the "op" object that the parser uses, so we
366                  * can get it again quickly when this scope is closed
367                  */
368                 op->common.node = node;
369                 op->named.name = node->name.integer;
370         }
371
372         acpi_ps_append_arg(acpi_ps_get_parent_scope(&walk_state->parser_state),
373                            op);
374         *out_op = op;
375         return_ACPI_STATUS(status);
376 }
377
378 /*******************************************************************************
379  *
380  * FUNCTION:    acpi_ds_load1_end_op
381  *
382  * PARAMETERS:  walk_state      - Current state of the parse tree walk
383  *
384  * RETURN:      Status
385  *
386  * DESCRIPTION: Ascending callback used during the loading of the namespace,
387  *              both control methods and everything else.
388  *
389  ******************************************************************************/
390
391 acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
392 {
393         union acpi_parse_object *op;
394         acpi_object_type object_type;
395         acpi_status status = AE_OK;
396
397         ACPI_FUNCTION_TRACE(ds_load1_end_op);
398
399         op = walk_state->op;
400         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
401                           walk_state));
402
403         /* We are only interested in opcodes that have an associated name */
404
405         if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
406                 return_ACPI_STATUS(AE_OK);
407         }
408
409         /* Get the object type to determine if we should pop the scope */
410
411         object_type = walk_state->op_info->object_type;
412
413 #ifndef ACPI_NO_METHOD_EXECUTION
414         if (walk_state->op_info->flags & AML_FIELD) {
415                 /*
416                  * If we are executing a method, do not create any namespace objects
417                  * during the load phase, only during execution.
418                  */
419                 if (!walk_state->method_node) {
420                         if (walk_state->opcode == AML_FIELD_OP ||
421                             walk_state->opcode == AML_BANK_FIELD_OP ||
422                             walk_state->opcode == AML_INDEX_FIELD_OP) {
423                                 status =
424                                     acpi_ds_init_field_objects(op, walk_state);
425                         }
426                 }
427                 return_ACPI_STATUS(status);
428         }
429
430         /*
431          * If we are executing a method, do not create any namespace objects
432          * during the load phase, only during execution.
433          */
434         if (!walk_state->method_node) {
435                 if (op->common.aml_opcode == AML_REGION_OP) {
436                         status =
437                             acpi_ex_create_region(op->named.data,
438                                                   op->named.length,
439                                                   (acpi_adr_space_type) ((op->
440                                                                           common.
441                                                                           value.
442                                                                           arg)->
443                                                                          common.
444                                                                          value.
445                                                                          integer),
446                                                   walk_state);
447                         if (ACPI_FAILURE(status)) {
448                                 return_ACPI_STATUS(status);
449                         }
450                 } else if (op->common.aml_opcode == AML_DATA_REGION_OP) {
451                         status =
452                             acpi_ex_create_region(op->named.data,
453                                                   op->named.length,
454                                                   REGION_DATA_TABLE,
455                                                   walk_state);
456                         if (ACPI_FAILURE(status)) {
457                                 return_ACPI_STATUS(status);
458                         }
459                 }
460         }
461 #endif
462
463         if (op->common.aml_opcode == AML_NAME_OP) {
464
465                 /* For Name opcode, get the object type from the argument */
466
467                 if (op->common.value.arg) {
468                         object_type = (acpi_ps_get_opcode_info((op->common.
469                                                                 value.arg)->
470                                                                common.
471                                                                aml_opcode))->
472                             object_type;
473
474                         /* Set node type if we have a namespace node */
475
476                         if (op->common.node) {
477                                 op->common.node->type = (u8) object_type;
478                         }
479                 }
480         }
481
482         /*
483          * If we are executing a method, do not create any namespace objects
484          * during the load phase, only during execution.
485          */
486         if (!walk_state->method_node) {
487                 if (op->common.aml_opcode == AML_METHOD_OP) {
488                         /*
489                          * method_op pkg_length name_string method_flags term_list
490                          *
491                          * Note: We must create the method node/object pair as soon as we
492                          * see the method declaration. This allows later pass1 parsing
493                          * of invocations of the method (need to know the number of
494                          * arguments.)
495                          */
496                         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
497                                           "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
498                                           walk_state, op, op->named.node));
499
500                         if (!acpi_ns_get_attached_object(op->named.node)) {
501                                 walk_state->operands[0] =
502                                     ACPI_CAST_PTR(void, op->named.node);
503                                 walk_state->num_operands = 1;
504
505                                 status =
506                                     acpi_ds_create_operands(walk_state,
507                                                             op->common.value.
508                                                             arg);
509                                 if (ACPI_SUCCESS(status)) {
510                                         status =
511                                             acpi_ex_create_method(op->named.
512                                                                   data,
513                                                                   op->named.
514                                                                   length,
515                                                                   walk_state);
516                                 }
517
518                                 walk_state->operands[0] = NULL;
519                                 walk_state->num_operands = 0;
520
521                                 if (ACPI_FAILURE(status)) {
522                                         return_ACPI_STATUS(status);
523                                 }
524                         }
525                 }
526         }
527
528         /* Pop the scope stack (only if loading a table) */
529
530         if (!walk_state->method_node && acpi_ns_opens_scope(object_type)) {
531                 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
532                                   "(%s): Popping scope for Op %p\n",
533                                   acpi_ut_get_type_name(object_type), op));
534
535                 status = acpi_ds_scope_stack_pop(walk_state);
536         }
537
538         return_ACPI_STATUS(status);
539 }
540
541 /*******************************************************************************
542  *
543  * FUNCTION:    acpi_ds_load2_begin_op
544  *
545  * PARAMETERS:  walk_state      - Current state of the parse tree walk
546  *              out_op          - Wher to return op if a new one is created
547  *
548  * RETURN:      Status
549  *
550  * DESCRIPTION: Descending callback used during the loading of ACPI tables.
551  *
552  ******************************************************************************/
553
554 acpi_status
555 acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
556                        union acpi_parse_object **out_op)
557 {
558         union acpi_parse_object *op;
559         struct acpi_namespace_node *node;
560         acpi_status status;
561         acpi_object_type object_type;
562         char *buffer_ptr;
563         u32 flags;
564
565         ACPI_FUNCTION_TRACE(ds_load2_begin_op);
566
567         op = walk_state->op;
568         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
569                           walk_state));
570
571         if (op) {
572                 if ((walk_state->control_state) &&
573                     (walk_state->control_state->common.state ==
574                      ACPI_CONTROL_CONDITIONAL_EXECUTING)) {
575
576                         /* We are executing a while loop outside of a method */
577
578                         status = acpi_ds_exec_begin_op(walk_state, out_op);
579                         return_ACPI_STATUS(status);
580                 }
581
582                 /* We only care about Namespace opcodes here */
583
584                 if ((!(walk_state->op_info->flags & AML_NSOPCODE) &&
585                      (walk_state->opcode != AML_INT_NAMEPATH_OP)) ||
586                     (!(walk_state->op_info->flags & AML_NAMED))) {
587                         return_ACPI_STATUS(AE_OK);
588                 }
589
590                 /* Get the name we are going to enter or lookup in the namespace */
591
592                 if (walk_state->opcode == AML_INT_NAMEPATH_OP) {
593
594                         /* For Namepath op, get the path string */
595
596                         buffer_ptr = op->common.value.string;
597                         if (!buffer_ptr) {
598
599                                 /* No name, just exit */
600
601                                 return_ACPI_STATUS(AE_OK);
602                         }
603                 } else {
604                         /* Get name from the op */
605
606                         buffer_ptr = ACPI_CAST_PTR(char, &op->named.name);
607                 }
608         } else {
609                 /* Get the namestring from the raw AML */
610
611                 buffer_ptr =
612                     acpi_ps_get_next_namestring(&walk_state->parser_state);
613         }
614
615         /* Map the opcode into an internal object type */
616
617         object_type = walk_state->op_info->object_type;
618
619         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
620                           "State=%p Op=%p Type=%X\n", walk_state, op,
621                           object_type));
622
623         switch (walk_state->opcode) {
624         case AML_FIELD_OP:
625         case AML_BANK_FIELD_OP:
626         case AML_INDEX_FIELD_OP:
627
628                 node = NULL;
629                 status = AE_OK;
630                 break;
631
632         case AML_INT_NAMEPATH_OP:
633                 /*
634                  * The name_path is an object reference to an existing object.
635                  * Don't enter the name into the namespace, but look it up
636                  * for use later.
637                  */
638                 status =
639                     acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
640                                    object_type, ACPI_IMODE_EXECUTE,
641                                    ACPI_NS_SEARCH_PARENT, walk_state, &(node));
642                 break;
643
644         case AML_SCOPE_OP:
645
646                 /* Special case for Scope(\) -> refers to the Root node */
647
648                 if (op && (op->named.node == acpi_gbl_root_node)) {
649                         node = op->named.node;
650
651                         status =
652                             acpi_ds_scope_stack_push(node, object_type,
653                                                      walk_state);
654                         if (ACPI_FAILURE(status)) {
655                                 return_ACPI_STATUS(status);
656                         }
657                 } else {
658                         /*
659                          * The Path is an object reference to an existing object.
660                          * Don't enter the name into the namespace, but look it up
661                          * for use later.
662                          */
663                         status =
664                             acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
665                                            object_type, ACPI_IMODE_EXECUTE,
666                                            ACPI_NS_SEARCH_PARENT, walk_state,
667                                            &(node));
668                         if (ACPI_FAILURE(status)) {
669 #ifdef ACPI_ASL_COMPILER
670                                 if (status == AE_NOT_FOUND) {
671                                         status = AE_OK;
672                                 } else {
673                                         ACPI_ERROR_NAMESPACE(buffer_ptr,
674                                                              status);
675                                 }
676 #else
677                                 ACPI_ERROR_NAMESPACE(buffer_ptr, status);
678 #endif
679                                 return_ACPI_STATUS(status);
680                         }
681                 }
682
683                 /*
684                  * We must check to make sure that the target is
685                  * one of the opcodes that actually opens a scope
686                  */
687                 switch (node->type) {
688                 case ACPI_TYPE_ANY:
689                 case ACPI_TYPE_LOCAL_SCOPE:     /* Scope */
690                 case ACPI_TYPE_DEVICE:
691                 case ACPI_TYPE_POWER:
692                 case ACPI_TYPE_PROCESSOR:
693                 case ACPI_TYPE_THERMAL:
694
695                         /* These are acceptable types */
696                         break;
697
698                 case ACPI_TYPE_INTEGER:
699                 case ACPI_TYPE_STRING:
700                 case ACPI_TYPE_BUFFER:
701
702                         /*
703                          * These types we will allow, but we will change the type.
704                          * This enables some existing code of the form:
705                          *
706                          *  Name (DEB, 0)
707                          *  Scope (DEB) { ... }
708                          */
709                         ACPI_WARNING((AE_INFO,
710                                       "Type override - [%4.4s] had invalid type (%s) "
711                                       "for Scope operator, changed to type ANY\n",
712                                       acpi_ut_get_node_name(node),
713                                       acpi_ut_get_type_name(node->type)));
714
715                         node->type = ACPI_TYPE_ANY;
716                         walk_state->scope_info->common.value = ACPI_TYPE_ANY;
717                         break;
718
719                 default:
720
721                         /* All other types are an error */
722
723                         ACPI_ERROR((AE_INFO,
724                                     "Invalid type (%s) for target of "
725                                     "Scope operator [%4.4s] (Cannot override)",
726                                     acpi_ut_get_type_name(node->type),
727                                     acpi_ut_get_node_name(node)));
728
729                         return (AE_AML_OPERAND_TYPE);
730                 }
731                 break;
732
733         default:
734
735                 /* All other opcodes */
736
737                 if (op && op->common.node) {
738
739                         /* This op/node was previously entered into the namespace */
740
741                         node = op->common.node;
742
743                         if (acpi_ns_opens_scope(object_type)) {
744                                 status =
745                                     acpi_ds_scope_stack_push(node, object_type,
746                                                              walk_state);
747                                 if (ACPI_FAILURE(status)) {
748                                         return_ACPI_STATUS(status);
749                                 }
750                         }
751
752                         return_ACPI_STATUS(AE_OK);
753                 }
754
755                 /*
756                  * Enter the named type into the internal namespace. We enter the name
757                  * as we go downward in the parse tree. Any necessary subobjects that
758                  * involve arguments to the opcode must be created as we go back up the
759                  * parse tree later.
760                  *
761                  * Note: Name may already exist if we are executing a deferred opcode.
762                  */
763                 if (walk_state->deferred_node) {
764
765                         /* This name is already in the namespace, get the node */
766
767                         node = walk_state->deferred_node;
768                         status = AE_OK;
769                         break;
770                 }
771
772                 flags = ACPI_NS_NO_UPSEARCH;
773                 if (walk_state->pass_number == ACPI_IMODE_EXECUTE) {
774
775                         /* Execution mode, node cannot already exist, node is temporary */
776
777                         flags |= ACPI_NS_ERROR_IF_FOUND;
778
779                         if (!
780                             (walk_state->
781                              parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
782                                 flags |= ACPI_NS_TEMPORARY;
783                         }
784                 }
785
786                 /* Add new entry or lookup existing entry */
787
788                 status =
789                     acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
790                                    object_type, ACPI_IMODE_LOAD_PASS2, flags,
791                                    walk_state, &node);
792
793                 if (ACPI_SUCCESS(status) && (flags & ACPI_NS_TEMPORARY)) {
794                         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
795                                           "***New Node [%4.4s] %p is temporary\n",
796                                           acpi_ut_get_node_name(node), node));
797                 }
798                 break;
799         }
800
801         if (ACPI_FAILURE(status)) {
802                 ACPI_ERROR_NAMESPACE(buffer_ptr, status);
803                 return_ACPI_STATUS(status);
804         }
805
806         if (!op) {
807
808                 /* Create a new op */
809
810                 op = acpi_ps_alloc_op(walk_state->opcode);
811                 if (!op) {
812                         return_ACPI_STATUS(AE_NO_MEMORY);
813                 }
814
815                 /* Initialize the new op */
816
817                 if (node) {
818                         op->named.name = node->name.integer;
819                 }
820                 *out_op = op;
821         }
822
823         /*
824          * Put the Node in the "op" object that the parser uses, so we
825          * can get it again quickly when this scope is closed
826          */
827         op->common.node = node;
828         return_ACPI_STATUS(status);
829 }
830
831 /*******************************************************************************
832  *
833  * FUNCTION:    acpi_ds_load2_end_op
834  *
835  * PARAMETERS:  walk_state      - Current state of the parse tree walk
836  *
837  * RETURN:      Status
838  *
839  * DESCRIPTION: Ascending callback used during the loading of the namespace,
840  *              both control methods and everything else.
841  *
842  ******************************************************************************/
843
844 acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
845 {
846         union acpi_parse_object *op;
847         acpi_status status = AE_OK;
848         acpi_object_type object_type;
849         struct acpi_namespace_node *node;
850         union acpi_parse_object *arg;
851         struct acpi_namespace_node *new_node;
852 #ifndef ACPI_NO_METHOD_EXECUTION
853         u32 i;
854         u8 region_space;
855 #endif
856
857         ACPI_FUNCTION_TRACE(ds_load2_end_op);
858
859         op = walk_state->op;
860         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
861                           walk_state->op_info->name, op, walk_state));
862
863         /* Check if opcode had an associated namespace object */
864
865         if (!(walk_state->op_info->flags & AML_NSOBJECT)) {
866                 return_ACPI_STATUS(AE_OK);
867         }
868
869         if (op->common.aml_opcode == AML_SCOPE_OP) {
870                 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
871                                   "Ending scope Op=%p State=%p\n", op,
872                                   walk_state));
873         }
874
875         object_type = walk_state->op_info->object_type;
876
877         /*
878          * Get the Node/name from the earlier lookup
879          * (It was saved in the *op structure)
880          */
881         node = op->common.node;
882
883         /*
884          * Put the Node on the object stack (Contains the ACPI Name of
885          * this object)
886          */
887         walk_state->operands[0] = (void *)node;
888         walk_state->num_operands = 1;
889
890         /* Pop the scope stack */
891
892         if (acpi_ns_opens_scope(object_type) &&
893             (op->common.aml_opcode != AML_INT_METHODCALL_OP)) {
894                 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
895                                   "(%s) Popping scope for Op %p\n",
896                                   acpi_ut_get_type_name(object_type), op));
897
898                 status = acpi_ds_scope_stack_pop(walk_state);
899                 if (ACPI_FAILURE(status)) {
900                         goto cleanup;
901                 }
902         }
903
904         /*
905          * Named operations are as follows:
906          *
907          * AML_ALIAS
908          * AML_BANKFIELD
909          * AML_CREATEBITFIELD
910          * AML_CREATEBYTEFIELD
911          * AML_CREATEDWORDFIELD
912          * AML_CREATEFIELD
913          * AML_CREATEQWORDFIELD
914          * AML_CREATEWORDFIELD
915          * AML_DATA_REGION
916          * AML_DEVICE
917          * AML_EVENT
918          * AML_FIELD
919          * AML_INDEXFIELD
920          * AML_METHOD
921          * AML_METHODCALL
922          * AML_MUTEX
923          * AML_NAME
924          * AML_NAMEDFIELD
925          * AML_OPREGION
926          * AML_POWERRES
927          * AML_PROCESSOR
928          * AML_SCOPE
929          * AML_THERMALZONE
930          */
931
932         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
933                           "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
934                           acpi_ps_get_opcode_name(op->common.aml_opcode),
935                           walk_state, op, node));
936
937         /* Decode the opcode */
938
939         arg = op->common.value.arg;
940
941         switch (walk_state->op_info->type) {
942 #ifndef ACPI_NO_METHOD_EXECUTION
943
944         case AML_TYPE_CREATE_FIELD:
945                 /*
946                  * Create the field object, but the field buffer and index must
947                  * be evaluated later during the execution phase
948                  */
949                 status = acpi_ds_create_buffer_field(op, walk_state);
950                 break;
951
952         case AML_TYPE_NAMED_FIELD:
953                 /*
954                  * If we are executing a method, initialize the field
955                  */
956                 if (walk_state->method_node) {
957                         status = acpi_ds_init_field_objects(op, walk_state);
958                 }
959
960                 switch (op->common.aml_opcode) {
961                 case AML_INDEX_FIELD_OP:
962
963                         status =
964                             acpi_ds_create_index_field(op,
965                                                        (acpi_handle) arg->
966                                                        common.node, walk_state);
967                         break;
968
969                 case AML_BANK_FIELD_OP:
970
971                         status =
972                             acpi_ds_create_bank_field(op, arg->common.node,
973                                                       walk_state);
974                         break;
975
976                 case AML_FIELD_OP:
977
978                         status =
979                             acpi_ds_create_field(op, arg->common.node,
980                                                  walk_state);
981                         break;
982
983                 default:
984                         /* All NAMED_FIELD opcodes must be handled above */
985                         break;
986                 }
987                 break;
988
989         case AML_TYPE_NAMED_SIMPLE:
990
991                 status = acpi_ds_create_operands(walk_state, arg);
992                 if (ACPI_FAILURE(status)) {
993                         goto cleanup;
994                 }
995
996                 switch (op->common.aml_opcode) {
997                 case AML_PROCESSOR_OP:
998
999                         status = acpi_ex_create_processor(walk_state);
1000                         break;
1001
1002                 case AML_POWER_RES_OP:
1003
1004                         status = acpi_ex_create_power_resource(walk_state);
1005                         break;
1006
1007                 case AML_MUTEX_OP:
1008
1009                         status = acpi_ex_create_mutex(walk_state);
1010                         break;
1011
1012                 case AML_EVENT_OP:
1013
1014                         status = acpi_ex_create_event(walk_state);
1015                         break;
1016
1017                 case AML_ALIAS_OP:
1018
1019                         status = acpi_ex_create_alias(walk_state);
1020                         break;
1021
1022                 default:
1023                         /* Unknown opcode */
1024
1025                         status = AE_OK;
1026                         goto cleanup;
1027                 }
1028
1029                 /* Delete operands */
1030
1031                 for (i = 1; i < walk_state->num_operands; i++) {
1032                         acpi_ut_remove_reference(walk_state->operands[i]);
1033                         walk_state->operands[i] = NULL;
1034                 }
1035
1036                 break;
1037 #endif                          /* ACPI_NO_METHOD_EXECUTION */
1038
1039         case AML_TYPE_NAMED_COMPLEX:
1040
1041                 switch (op->common.aml_opcode) {
1042 #ifndef ACPI_NO_METHOD_EXECUTION
1043                 case AML_REGION_OP:
1044                 case AML_DATA_REGION_OP:
1045
1046                         if (op->common.aml_opcode == AML_REGION_OP) {
1047                                 region_space = (acpi_adr_space_type)
1048                                     ((op->common.value.arg)->common.value.
1049                                      integer);
1050                         } else {
1051                                 region_space = REGION_DATA_TABLE;
1052                         }
1053
1054                         /*
1055                          * The op_region is not fully parsed at this time. The only valid
1056                          * argument is the space_id. (We must save the address of the
1057                          * AML of the address and length operands)
1058                          *
1059                          * If we have a valid region, initialize it. The namespace is
1060                          * unlocked at this point.
1061                          *
1062                          * Need to unlock interpreter if it is locked (if we are running
1063                          * a control method), in order to allow _REG methods to be run
1064                          * during acpi_ev_initialize_region.
1065                          */
1066                         if (walk_state->method_node) {
1067                                 /*
1068                                  * Executing a method: initialize the region and unlock
1069                                  * the interpreter
1070                                  */
1071                                 status =
1072                                     acpi_ex_create_region(op->named.data,
1073                                                           op->named.length,
1074                                                           region_space,
1075                                                           walk_state);
1076                                 if (ACPI_FAILURE(status)) {
1077                                         return (status);
1078                                 }
1079
1080                                 acpi_ex_exit_interpreter();
1081                         }
1082
1083                         status =
1084                             acpi_ev_initialize_region
1085                             (acpi_ns_get_attached_object(node), FALSE);
1086                         if (walk_state->method_node) {
1087                                 acpi_ex_enter_interpreter();
1088                         }
1089
1090                         if (ACPI_FAILURE(status)) {
1091                                 /*
1092                                  *  If AE_NOT_EXIST is returned, it is not fatal
1093                                  *  because many regions get created before a handler
1094                                  *  is installed for said region.
1095                                  */
1096                                 if (AE_NOT_EXIST == status) {
1097                                         status = AE_OK;
1098                                 }
1099                         }
1100                         break;
1101
1102                 case AML_NAME_OP:
1103
1104                         status = acpi_ds_create_node(walk_state, node, op);
1105                         break;
1106
1107                 case AML_METHOD_OP:
1108                         /*
1109                          * method_op pkg_length name_string method_flags term_list
1110                          *
1111                          * Note: We must create the method node/object pair as soon as we
1112                          * see the method declaration. This allows later pass1 parsing
1113                          * of invocations of the method (need to know the number of
1114                          * arguments.)
1115                          */
1116                         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
1117                                           "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
1118                                           walk_state, op, op->named.node));
1119
1120                         if (!acpi_ns_get_attached_object(op->named.node)) {
1121                                 walk_state->operands[0] =
1122                                     ACPI_CAST_PTR(void, op->named.node);
1123                                 walk_state->num_operands = 1;
1124
1125                                 status =
1126                                     acpi_ds_create_operands(walk_state,
1127                                                             op->common.value.
1128                                                             arg);
1129                                 if (ACPI_SUCCESS(status)) {
1130                                         status =
1131                                             acpi_ex_create_method(op->named.
1132                                                                   data,
1133                                                                   op->named.
1134                                                                   length,
1135                                                                   walk_state);
1136                                 }
1137                                 walk_state->operands[0] = NULL;
1138                                 walk_state->num_operands = 0;
1139
1140                                 if (ACPI_FAILURE(status)) {
1141                                         return_ACPI_STATUS(status);
1142                                 }
1143                         }
1144                         break;
1145
1146 #endif                          /* ACPI_NO_METHOD_EXECUTION */
1147
1148                 default:
1149                         /* All NAMED_COMPLEX opcodes must be handled above */
1150                         break;
1151                 }
1152                 break;
1153
1154         case AML_CLASS_INTERNAL:
1155
1156                 /* case AML_INT_NAMEPATH_OP: */
1157                 break;
1158
1159         case AML_CLASS_METHOD_CALL:
1160
1161                 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
1162                                   "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
1163                                   walk_state, op, node));
1164
1165                 /*
1166                  * Lookup the method name and save the Node
1167                  */
1168                 status =
1169                     acpi_ns_lookup(walk_state->scope_info,
1170                                    arg->common.value.string, ACPI_TYPE_ANY,
1171                                    ACPI_IMODE_LOAD_PASS2,
1172                                    ACPI_NS_SEARCH_PARENT |
1173                                    ACPI_NS_DONT_OPEN_SCOPE, walk_state,
1174                                    &(new_node));
1175                 if (ACPI_SUCCESS(status)) {
1176                         /*
1177                          * Make sure that what we found is indeed a method
1178                          * We didn't search for a method on purpose, to see if the name
1179                          * would resolve
1180                          */
1181                         if (new_node->type != ACPI_TYPE_METHOD) {
1182                                 status = AE_AML_OPERAND_TYPE;
1183                         }
1184
1185                         /* We could put the returned object (Node) on the object stack for
1186                          * later, but for now, we will put it in the "op" object that the
1187                          * parser uses, so we can get it again at the end of this scope
1188                          */
1189                         op->common.node = new_node;
1190                 } else {
1191                         ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
1192                 }
1193                 break;
1194
1195         default:
1196                 break;
1197         }
1198
1199       cleanup:
1200
1201         /* Remove the Node pushed at the very beginning */
1202
1203         walk_state->operands[0] = NULL;
1204         walk_state->num_operands = 0;
1205         return_ACPI_STATUS(status);
1206 }