• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/acpi/acpica/
1/******************************************************************************
2 *
3 * Module Name: dswload - Dispatcher namespace load callbacks
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2010, 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
58ACPI_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 ******************************************************************************/
72acpi_status
73acpi_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
120acpi_status
121acpi_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
391acpi_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
554acpi_status
555acpi_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
844acpi_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}
1207