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