OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [acpi/] [namespace/] [nsaccess.c] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.