diff options
Diffstat (limited to 'drivers/acpi/namespace/nssearch.c')
-rw-r--r-- | drivers/acpi/namespace/nssearch.c | 205 |
1 files changed, 98 insertions, 107 deletions
diff --git a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c index af8aaa9cc4f3..50a3ca5470ed 100644 --- a/drivers/acpi/namespace/nssearch.c +++ b/drivers/acpi/namespace/nssearch.c | |||
@@ -41,23 +41,18 @@ | |||
41 | * POSSIBILITY OF SUCH DAMAGES. | 41 | * POSSIBILITY OF SUCH DAMAGES. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | |||
45 | #include <acpi/acpi.h> | 44 | #include <acpi/acpi.h> |
46 | #include <acpi/acnamesp.h> | 45 | #include <acpi/acnamesp.h> |
47 | 46 | ||
48 | |||
49 | #define _COMPONENT ACPI_NAMESPACE | 47 | #define _COMPONENT ACPI_NAMESPACE |
50 | ACPI_MODULE_NAME ("nssearch") | 48 | ACPI_MODULE_NAME("nssearch") |
51 | 49 | ||
52 | /* Local prototypes */ | 50 | /* Local prototypes */ |
53 | |||
54 | static acpi_status | 51 | static acpi_status |
55 | acpi_ns_search_parent_tree ( | 52 | acpi_ns_search_parent_tree(u32 target_name, |
56 | u32 target_name, | 53 | struct acpi_namespace_node *node, |
57 | struct acpi_namespace_node *node, | 54 | acpi_object_type type, |
58 | acpi_object_type type, | 55 | struct acpi_namespace_node **return_node); |
59 | struct acpi_namespace_node **return_node); | ||
60 | |||
61 | 56 | ||
62 | /******************************************************************************* | 57 | /******************************************************************************* |
63 | * | 58 | * |
@@ -87,30 +82,28 @@ acpi_ns_search_parent_tree ( | |||
87 | ******************************************************************************/ | 82 | ******************************************************************************/ |
88 | 83 | ||
89 | acpi_status | 84 | acpi_status |
90 | acpi_ns_search_node ( | 85 | acpi_ns_search_node(u32 target_name, |
91 | u32 target_name, | 86 | struct acpi_namespace_node *node, |
92 | struct acpi_namespace_node *node, | 87 | acpi_object_type type, |
93 | acpi_object_type type, | 88 | struct acpi_namespace_node **return_node) |
94 | struct acpi_namespace_node **return_node) | ||
95 | { | 89 | { |
96 | struct acpi_namespace_node *next_node; | 90 | struct acpi_namespace_node *next_node; |
97 | |||
98 | |||
99 | ACPI_FUNCTION_TRACE ("ns_search_node"); | ||
100 | 91 | ||
92 | ACPI_FUNCTION_TRACE("ns_search_node"); | ||
101 | 93 | ||
102 | #ifdef ACPI_DEBUG_OUTPUT | 94 | #ifdef ACPI_DEBUG_OUTPUT |
103 | if (ACPI_LV_NAMES & acpi_dbg_level) { | 95 | if (ACPI_LV_NAMES & acpi_dbg_level) { |
104 | char *scope_name; | 96 | char *scope_name; |
105 | 97 | ||
106 | scope_name = acpi_ns_get_external_pathname (node); | 98 | scope_name = acpi_ns_get_external_pathname(node); |
107 | if (scope_name) { | 99 | if (scope_name) { |
108 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 100 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
109 | "Searching %s (%p) For [%4.4s] (%s)\n", | 101 | "Searching %s (%p) For [%4.4s] (%s)\n", |
110 | scope_name, node, (char *) &target_name, | 102 | scope_name, node, |
111 | acpi_ut_get_type_name (type))); | 103 | (char *)&target_name, |
104 | acpi_ut_get_type_name(type))); | ||
112 | 105 | ||
113 | ACPI_MEM_FREE (scope_name); | 106 | ACPI_MEM_FREE(scope_name); |
114 | } | 107 | } |
115 | } | 108 | } |
116 | #endif | 109 | #endif |
@@ -126,20 +119,26 @@ acpi_ns_search_node ( | |||
126 | if (next_node->name.integer == target_name) { | 119 | if (next_node->name.integer == target_name) { |
127 | /* Resolve a control method alias if any */ | 120 | /* Resolve a control method alias if any */ |
128 | 121 | ||
129 | if (acpi_ns_get_type (next_node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) { | 122 | if (acpi_ns_get_type(next_node) == |
130 | next_node = ACPI_CAST_PTR (struct acpi_namespace_node, next_node->object); | 123 | ACPI_TYPE_LOCAL_METHOD_ALIAS) { |
124 | next_node = | ||
125 | ACPI_CAST_PTR(struct acpi_namespace_node, | ||
126 | next_node->object); | ||
131 | } | 127 | } |
132 | 128 | ||
133 | /* | 129 | /* |
134 | * Found matching entry. | 130 | * Found matching entry. |
135 | */ | 131 | */ |
136 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 132 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
137 | "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n", | 133 | "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n", |
138 | (char *) &target_name, acpi_ut_get_type_name (next_node->type), | 134 | (char *)&target_name, |
139 | next_node, acpi_ut_get_node_name (node), node)); | 135 | acpi_ut_get_type_name(next_node-> |
136 | type), | ||
137 | next_node, | ||
138 | acpi_ut_get_node_name(node), node)); | ||
140 | 139 | ||
141 | *return_node = next_node; | 140 | *return_node = next_node; |
142 | return_ACPI_STATUS (AE_OK); | 141 | return_ACPI_STATUS(AE_OK); |
143 | } | 142 | } |
144 | 143 | ||
145 | /* | 144 | /* |
@@ -159,15 +158,14 @@ acpi_ns_search_node ( | |||
159 | 158 | ||
160 | /* Searched entire namespace level, not found */ | 159 | /* Searched entire namespace level, not found */ |
161 | 160 | ||
162 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 161 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
163 | "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n", | 162 | "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n", |
164 | (char *) &target_name, acpi_ut_get_type_name (type), | 163 | (char *)&target_name, acpi_ut_get_type_name(type), |
165 | acpi_ut_get_node_name (node), node, node->child)); | 164 | acpi_ut_get_node_name(node), node, node->child)); |
166 | 165 | ||
167 | return_ACPI_STATUS (AE_NOT_FOUND); | 166 | return_ACPI_STATUS(AE_NOT_FOUND); |
168 | } | 167 | } |
169 | 168 | ||
170 | |||
171 | /******************************************************************************* | 169 | /******************************************************************************* |
172 | * | 170 | * |
173 | * FUNCTION: acpi_ns_search_parent_tree | 171 | * FUNCTION: acpi_ns_search_parent_tree |
@@ -194,43 +192,42 @@ acpi_ns_search_node ( | |||
194 | ******************************************************************************/ | 192 | ******************************************************************************/ |
195 | 193 | ||
196 | static acpi_status | 194 | static acpi_status |
197 | acpi_ns_search_parent_tree ( | 195 | acpi_ns_search_parent_tree(u32 target_name, |
198 | u32 target_name, | 196 | struct acpi_namespace_node *node, |
199 | struct acpi_namespace_node *node, | 197 | acpi_object_type type, |
200 | acpi_object_type type, | 198 | struct acpi_namespace_node **return_node) |
201 | struct acpi_namespace_node **return_node) | ||
202 | { | 199 | { |
203 | acpi_status status; | 200 | acpi_status status; |
204 | struct acpi_namespace_node *parent_node; | 201 | struct acpi_namespace_node *parent_node; |
205 | 202 | ||
203 | ACPI_FUNCTION_TRACE("ns_search_parent_tree"); | ||
206 | 204 | ||
207 | ACPI_FUNCTION_TRACE ("ns_search_parent_tree"); | 205 | parent_node = acpi_ns_get_parent_node(node); |
208 | |||
209 | |||
210 | parent_node = acpi_ns_get_parent_node (node); | ||
211 | 206 | ||
212 | /* | 207 | /* |
213 | * If there is no parent (i.e., we are at the root) or type is "local", | 208 | * If there is no parent (i.e., we are at the root) or type is "local", |
214 | * we won't be searching the parent tree. | 209 | * we won't be searching the parent tree. |
215 | */ | 210 | */ |
216 | if (!parent_node) { | 211 | if (!parent_node) { |
217 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", | 212 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n", |
218 | (char *) &target_name)); | 213 | (char *)&target_name)); |
219 | return_ACPI_STATUS (AE_NOT_FOUND); | 214 | return_ACPI_STATUS(AE_NOT_FOUND); |
220 | } | 215 | } |
221 | 216 | ||
222 | if (acpi_ns_local (type)) { | 217 | if (acpi_ns_local(type)) { |
223 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 218 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
224 | "[%4.4s] type [%s] must be local to this scope (no parent search)\n", | 219 | "[%4.4s] type [%s] must be local to this scope (no parent search)\n", |
225 | (char *) &target_name, acpi_ut_get_type_name (type))); | 220 | (char *)&target_name, |
226 | return_ACPI_STATUS (AE_NOT_FOUND); | 221 | acpi_ut_get_type_name(type))); |
222 | return_ACPI_STATUS(AE_NOT_FOUND); | ||
227 | } | 223 | } |
228 | 224 | ||
229 | /* Search the parent tree */ | 225 | /* Search the parent tree */ |
230 | 226 | ||
231 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 227 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
232 | "Searching parent [%4.4s] for [%4.4s]\n", | 228 | "Searching parent [%4.4s] for [%4.4s]\n", |
233 | acpi_ut_get_node_name (parent_node), (char *) &target_name)); | 229 | acpi_ut_get_node_name(parent_node), |
230 | (char *)&target_name)); | ||
234 | 231 | ||
235 | /* | 232 | /* |
236 | * Search parents until target is found or we have backed up to the root | 233 | * Search parents until target is found or we have backed up to the root |
@@ -241,25 +238,24 @@ acpi_ns_search_parent_tree ( | |||
241 | * object type at this point, we only care about the existence of | 238 | * object type at this point, we only care about the existence of |
242 | * the actual name we are searching for. Typechecking comes later. | 239 | * the actual name we are searching for. Typechecking comes later. |
243 | */ | 240 | */ |
244 | status = acpi_ns_search_node (target_name, parent_node, | 241 | status = acpi_ns_search_node(target_name, parent_node, |
245 | ACPI_TYPE_ANY, return_node); | 242 | ACPI_TYPE_ANY, return_node); |
246 | if (ACPI_SUCCESS (status)) { | 243 | if (ACPI_SUCCESS(status)) { |
247 | return_ACPI_STATUS (status); | 244 | return_ACPI_STATUS(status); |
248 | } | 245 | } |
249 | 246 | ||
250 | /* | 247 | /* |
251 | * Not found here, go up another level | 248 | * Not found here, go up another level |
252 | * (until we reach the root) | 249 | * (until we reach the root) |
253 | */ | 250 | */ |
254 | parent_node = acpi_ns_get_parent_node (parent_node); | 251 | parent_node = acpi_ns_get_parent_node(parent_node); |
255 | } | 252 | } |
256 | 253 | ||
257 | /* Not found in parent tree */ | 254 | /* Not found in parent tree */ |
258 | 255 | ||
259 | return_ACPI_STATUS (AE_NOT_FOUND); | 256 | return_ACPI_STATUS(AE_NOT_FOUND); |
260 | } | 257 | } |
261 | 258 | ||
262 | |||
263 | /******************************************************************************* | 259 | /******************************************************************************* |
264 | * | 260 | * |
265 | * FUNCTION: acpi_ns_search_and_enter | 261 | * FUNCTION: acpi_ns_search_and_enter |
@@ -286,52 +282,46 @@ acpi_ns_search_parent_tree ( | |||
286 | ******************************************************************************/ | 282 | ******************************************************************************/ |
287 | 283 | ||
288 | acpi_status | 284 | acpi_status |
289 | acpi_ns_search_and_enter ( | 285 | acpi_ns_search_and_enter(u32 target_name, |
290 | u32 target_name, | 286 | struct acpi_walk_state *walk_state, |
291 | struct acpi_walk_state *walk_state, | 287 | struct acpi_namespace_node *node, |
292 | struct acpi_namespace_node *node, | 288 | acpi_interpreter_mode interpreter_mode, |
293 | acpi_interpreter_mode interpreter_mode, | 289 | acpi_object_type type, |
294 | acpi_object_type type, | 290 | u32 flags, struct acpi_namespace_node **return_node) |
295 | u32 flags, | ||
296 | struct acpi_namespace_node **return_node) | ||
297 | { | 291 | { |
298 | acpi_status status; | 292 | acpi_status status; |
299 | struct acpi_namespace_node *new_node; | 293 | struct acpi_namespace_node *new_node; |
300 | |||
301 | |||
302 | ACPI_FUNCTION_TRACE ("ns_search_and_enter"); | ||
303 | 294 | ||
295 | ACPI_FUNCTION_TRACE("ns_search_and_enter"); | ||
304 | 296 | ||
305 | /* Parameter validation */ | 297 | /* Parameter validation */ |
306 | 298 | ||
307 | if (!node || !target_name || !return_node) { | 299 | if (!node || !target_name || !return_node) { |
308 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 300 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
309 | "Null param: Node %p Name %X return_node %p\n", | 301 | "Null param: Node %p Name %X return_node %p\n", |
310 | node, target_name, return_node)); | 302 | node, target_name, return_node)); |
311 | 303 | ||
312 | ACPI_REPORT_ERROR (("ns_search_and_enter: Null parameter\n")); | 304 | ACPI_REPORT_ERROR(("ns_search_and_enter: Null parameter\n")); |
313 | return_ACPI_STATUS (AE_BAD_PARAMETER); | 305 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
314 | } | 306 | } |
315 | 307 | ||
316 | /* Name must consist of printable characters */ | 308 | /* Name must consist of printable characters */ |
317 | 309 | ||
318 | if (!acpi_ut_valid_acpi_name (target_name)) { | 310 | if (!acpi_ut_valid_acpi_name(target_name)) { |
319 | ACPI_REPORT_ERROR (("ns_search_and_enter: Bad character in ACPI Name: %X\n", | 311 | ACPI_REPORT_ERROR(("ns_search_and_enter: Bad character in ACPI Name: %X\n", target_name)); |
320 | target_name)); | 312 | return_ACPI_STATUS(AE_BAD_CHARACTER); |
321 | return_ACPI_STATUS (AE_BAD_CHARACTER); | ||
322 | } | 313 | } |
323 | 314 | ||
324 | /* Try to find the name in the namespace level specified by the caller */ | 315 | /* Try to find the name in the namespace level specified by the caller */ |
325 | 316 | ||
326 | *return_node = ACPI_ENTRY_NOT_FOUND; | 317 | *return_node = ACPI_ENTRY_NOT_FOUND; |
327 | status = acpi_ns_search_node (target_name, node, type, return_node); | 318 | status = acpi_ns_search_node(target_name, node, type, return_node); |
328 | if (status != AE_NOT_FOUND) { | 319 | if (status != AE_NOT_FOUND) { |
329 | /* | 320 | /* |
330 | * If we found it AND the request specifies that a find is an error, | 321 | * If we found it AND the request specifies that a find is an error, |
331 | * return the error | 322 | * return the error |
332 | */ | 323 | */ |
333 | if ((status == AE_OK) && | 324 | if ((status == AE_OK) && (flags & ACPI_NS_ERROR_IF_FOUND)) { |
334 | (flags & ACPI_NS_ERROR_IF_FOUND)) { | ||
335 | status = AE_ALREADY_EXISTS; | 325 | status = AE_ALREADY_EXISTS; |
336 | } | 326 | } |
337 | 327 | ||
@@ -339,7 +329,7 @@ acpi_ns_search_and_enter ( | |||
339 | * Either found it or there was an error | 329 | * Either found it or there was an error |
340 | * -- finished either way | 330 | * -- finished either way |
341 | */ | 331 | */ |
342 | return_ACPI_STATUS (status); | 332 | return_ACPI_STATUS(status); |
343 | } | 333 | } |
344 | 334 | ||
345 | /* | 335 | /* |
@@ -351,14 +341,16 @@ acpi_ns_search_and_enter ( | |||
351 | * and during the execution phase. | 341 | * and during the execution phase. |
352 | */ | 342 | */ |
353 | if ((interpreter_mode != ACPI_IMODE_LOAD_PASS1) && | 343 | if ((interpreter_mode != ACPI_IMODE_LOAD_PASS1) && |
354 | (flags & ACPI_NS_SEARCH_PARENT)) { | 344 | (flags & ACPI_NS_SEARCH_PARENT)) { |
355 | /* | 345 | /* |
356 | * Not found at this level - search parent tree according to the | 346 | * Not found at this level - search parent tree according to the |
357 | * ACPI specification | 347 | * ACPI specification |
358 | */ | 348 | */ |
359 | status = acpi_ns_search_parent_tree (target_name, node, type, return_node); | 349 | status = |
360 | if (ACPI_SUCCESS (status)) { | 350 | acpi_ns_search_parent_tree(target_name, node, type, |
361 | return_ACPI_STATUS (status); | 351 | return_node); |
352 | if (ACPI_SUCCESS(status)) { | ||
353 | return_ACPI_STATUS(status); | ||
362 | } | 354 | } |
363 | } | 355 | } |
364 | 356 | ||
@@ -366,25 +358,24 @@ acpi_ns_search_and_enter ( | |||
366 | * In execute mode, just search, never add names. Exit now. | 358 | * In execute mode, just search, never add names. Exit now. |
367 | */ | 359 | */ |
368 | if (interpreter_mode == ACPI_IMODE_EXECUTE) { | 360 | if (interpreter_mode == ACPI_IMODE_EXECUTE) { |
369 | ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, | 361 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, |
370 | "%4.4s Not found in %p [Not adding]\n", | 362 | "%4.4s Not found in %p [Not adding]\n", |
371 | (char *) &target_name, node)); | 363 | (char *)&target_name, node)); |
372 | 364 | ||
373 | return_ACPI_STATUS (AE_NOT_FOUND); | 365 | return_ACPI_STATUS(AE_NOT_FOUND); |
374 | } | 366 | } |
375 | 367 | ||
376 | /* Create the new named object */ | 368 | /* Create the new named object */ |
377 | 369 | ||
378 | new_node = acpi_ns_create_node (target_name); | 370 | new_node = acpi_ns_create_node(target_name); |
379 | if (!new_node) { | 371 | if (!new_node) { |
380 | return_ACPI_STATUS (AE_NO_MEMORY); | 372 | return_ACPI_STATUS(AE_NO_MEMORY); |
381 | } | 373 | } |
382 | 374 | ||
383 | /* Install the new object into the parent's list of children */ | 375 | /* Install the new object into the parent's list of children */ |
384 | 376 | ||
385 | acpi_ns_install_node (walk_state, node, new_node, type); | 377 | acpi_ns_install_node(walk_state, node, new_node, type); |
386 | *return_node = new_node; | 378 | *return_node = new_node; |
387 | 379 | ||
388 | return_ACPI_STATUS (AE_OK); | 380 | return_ACPI_STATUS(AE_OK); |
389 | } | 381 | } |
390 | |||