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