This source file includes following definitions.
- ACPI_MODULE_NAME
- acpi_ns_search_parent_tree
- acpi_ns_search_and_enter
1
2
3
4
5
6
7
8 #include <acpi/acpi.h>
9 #include "accommon.h"
10 #include "acnamesp.h"
11
12 #ifdef ACPI_ASL_COMPILER
13 #include "amlcode.h"
14 #endif
15
16 #define _COMPONENT ACPI_NAMESPACE
17 ACPI_MODULE_NAME("nssearch")
18
19
20 static acpi_status
21 acpi_ns_search_parent_tree(u32 target_name,
22 struct acpi_namespace_node *node,
23 acpi_object_type type,
24 struct acpi_namespace_node **return_node);
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 acpi_status
59 acpi_ns_search_one_scope(u32 target_name,
60 struct acpi_namespace_node *parent_node,
61 acpi_object_type type,
62 struct acpi_namespace_node **return_node)
63 {
64 struct acpi_namespace_node *node;
65
66 ACPI_FUNCTION_TRACE(ns_search_one_scope);
67
68 #ifdef ACPI_DEBUG_OUTPUT
69 if (ACPI_LV_NAMES & acpi_dbg_level) {
70 char *scope_name;
71
72 scope_name = acpi_ns_get_normalized_pathname(parent_node, TRUE);
73 if (scope_name) {
74 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
75 "Searching %s (%p) For [%4.4s] (%s)\n",
76 scope_name, parent_node,
77 ACPI_CAST_PTR(char, &target_name),
78 acpi_ut_get_type_name(type)));
79
80 ACPI_FREE(scope_name);
81 }
82 }
83 #endif
84
85
86
87
88
89 node = parent_node->child;
90 while (node) {
91
92
93
94 if (node->name.integer == target_name) {
95
96
97
98 if (acpi_ns_get_type(node) ==
99 ACPI_TYPE_LOCAL_METHOD_ALIAS) {
100 node =
101 ACPI_CAST_PTR(struct acpi_namespace_node,
102 node->object);
103 }
104
105
106
107 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
108 "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
109 ACPI_CAST_PTR(char, &target_name),
110 acpi_ut_get_type_name(node->type),
111 node,
112 acpi_ut_get_node_name(parent_node),
113 parent_node));
114
115 *return_node = node;
116 return_ACPI_STATUS(AE_OK);
117 }
118
119
120
121 node = node->peer;
122 }
123
124
125
126 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
127 "Name [%4.4s] (%s) not found in search in scope [%4.4s] "
128 "%p first child %p\n",
129 ACPI_CAST_PTR(char, &target_name),
130 acpi_ut_get_type_name(type),
131 acpi_ut_get_node_name(parent_node), parent_node,
132 parent_node->child));
133
134 return_ACPI_STATUS(AE_NOT_FOUND);
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162 static acpi_status
163 acpi_ns_search_parent_tree(u32 target_name,
164 struct acpi_namespace_node *node,
165 acpi_object_type type,
166 struct acpi_namespace_node **return_node)
167 {
168 acpi_status status;
169 struct acpi_namespace_node *parent_node;
170
171 ACPI_FUNCTION_TRACE(ns_search_parent_tree);
172
173 parent_node = node->parent;
174
175
176
177
178
179 if (!parent_node) {
180 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
181 ACPI_CAST_PTR(char, &target_name)));
182 return_ACPI_STATUS(AE_NOT_FOUND);
183 }
184
185 if (acpi_ns_local(type)) {
186 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
187 "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
188 ACPI_CAST_PTR(char, &target_name),
189 acpi_ut_get_type_name(type)));
190 return_ACPI_STATUS(AE_NOT_FOUND);
191 }
192
193
194
195 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
196 "Searching parent [%4.4s] for [%4.4s]\n",
197 acpi_ut_get_node_name(parent_node),
198 ACPI_CAST_PTR(char, &target_name)));
199
200
201
202 while (parent_node) {
203
204
205
206
207
208 status =
209 acpi_ns_search_one_scope(target_name, parent_node,
210 ACPI_TYPE_ANY, return_node);
211 if (ACPI_SUCCESS(status)) {
212 return_ACPI_STATUS(status);
213 }
214
215
216
217 parent_node = parent_node->parent;
218 }
219
220
221
222 return_ACPI_STATUS(AE_NOT_FOUND);
223 }
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250 acpi_status
251 acpi_ns_search_and_enter(u32 target_name,
252 struct acpi_walk_state *walk_state,
253 struct acpi_namespace_node *node,
254 acpi_interpreter_mode interpreter_mode,
255 acpi_object_type type,
256 u32 flags, struct acpi_namespace_node **return_node)
257 {
258 acpi_status status;
259 struct acpi_namespace_node *new_node;
260
261 ACPI_FUNCTION_TRACE(ns_search_and_enter);
262
263
264
265 if (!node || !target_name || !return_node) {
266 ACPI_ERROR((AE_INFO,
267 "Null parameter: Node %p Name 0x%X ReturnNode %p",
268 node, target_name, return_node));
269 return_ACPI_STATUS(AE_BAD_PARAMETER);
270 }
271
272
273
274
275
276
277
278
279
280
281 acpi_ut_repair_name(ACPI_CAST_PTR(char, &target_name));
282
283
284
285 *return_node = ACPI_ENTRY_NOT_FOUND;
286 status = acpi_ns_search_one_scope(target_name, node, type, return_node);
287 if (status != AE_NOT_FOUND) {
288
289
290
291
292 if (status == AE_OK) {
293
294
295
296
297
298
299
300
301 if (flags & ACPI_NS_OVERRIDE_IF_FOUND) {
302 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
303 "Namespace override: %4.4s pass %u type %X Owner %X\n",
304 ACPI_CAST_PTR(char,
305 &target_name),
306 interpreter_mode,
307 (*return_node)->type,
308 walk_state->owner_id));
309
310 acpi_ns_delete_children(*return_node);
311 if (acpi_gbl_runtime_namespace_override) {
312 acpi_ut_remove_reference((*return_node)->object);
313 (*return_node)->object = NULL;
314 (*return_node)->owner_id =
315 walk_state->owner_id;
316 } else {
317 acpi_ns_remove_node(*return_node);
318 *return_node = ACPI_ENTRY_NOT_FOUND;
319 }
320 }
321
322
323
324 else if (flags & ACPI_NS_ERROR_IF_FOUND) {
325 status = AE_ALREADY_EXISTS;
326 }
327 }
328 #ifdef ACPI_ASL_COMPILER
329 if (*return_node && (*return_node)->type == ACPI_TYPE_ANY) {
330 (*return_node)->flags |= ANOBJ_IS_EXTERNAL;
331 }
332 #endif
333
334
335
336 return_ACPI_STATUS(status);
337 }
338
339
340
341
342
343
344
345
346
347 if ((interpreter_mode != ACPI_IMODE_LOAD_PASS1) &&
348 (flags & ACPI_NS_SEARCH_PARENT)) {
349
350
351
352
353 status =
354 acpi_ns_search_parent_tree(target_name, node, type,
355 return_node);
356 if (ACPI_SUCCESS(status)) {
357 return_ACPI_STATUS(status);
358 }
359 }
360
361
362
363 if (interpreter_mode == ACPI_IMODE_EXECUTE) {
364 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
365 "%4.4s Not found in %p [Not adding]\n",
366 ACPI_CAST_PTR(char, &target_name), node));
367
368 return_ACPI_STATUS(AE_NOT_FOUND);
369 }
370
371
372
373 new_node = acpi_ns_create_node(target_name);
374 if (!new_node) {
375 return_ACPI_STATUS(AE_NO_MEMORY);
376 }
377 #ifdef ACPI_ASL_COMPILER
378
379
380
381 if (flags & ACPI_NS_EXTERNAL ||
382 (walk_state && walk_state->opcode == AML_SCOPE_OP)) {
383 new_node->flags |= ANOBJ_IS_EXTERNAL;
384 }
385 #endif
386
387 if (flags & ACPI_NS_TEMPORARY) {
388 new_node->flags |= ANOBJ_TEMPORARY;
389 }
390
391
392
393 acpi_ns_install_node(walk_state, node, new_node, type);
394 *return_node = new_node;
395 return_ACPI_STATUS(AE_OK);
396 }