0001
0002
0003
0004
0005
0006
0007
0008 #include <acpi/acpi.h>
0009 #include "accommon.h"
0010 #include "acnamesp.h"
0011
0012 #ifdef ACPI_ASL_COMPILER
0013 #include "amlcode.h"
0014 #endif
0015
0016 #define _COMPONENT ACPI_NAMESPACE
0017 ACPI_MODULE_NAME("nssearch")
0018
0019
0020 static acpi_status
0021 acpi_ns_search_parent_tree(u32 target_name,
0022 struct acpi_namespace_node *node,
0023 acpi_object_type type,
0024 struct acpi_namespace_node **return_node);
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 acpi_status
0059 acpi_ns_search_one_scope(u32 target_name,
0060 struct acpi_namespace_node *parent_node,
0061 acpi_object_type type,
0062 struct acpi_namespace_node **return_node)
0063 {
0064 struct acpi_namespace_node *node;
0065
0066 ACPI_FUNCTION_TRACE(ns_search_one_scope);
0067
0068 #ifdef ACPI_DEBUG_OUTPUT
0069 if (ACPI_LV_NAMES & acpi_dbg_level) {
0070 char *scope_name;
0071
0072 scope_name = acpi_ns_get_normalized_pathname(parent_node, TRUE);
0073 if (scope_name) {
0074 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0075 "Searching %s (%p) For [%4.4s] (%s)\n",
0076 scope_name, parent_node,
0077 ACPI_CAST_PTR(char, &target_name),
0078 acpi_ut_get_type_name(type)));
0079
0080 ACPI_FREE(scope_name);
0081 }
0082 }
0083 #endif
0084
0085
0086
0087
0088
0089 node = parent_node->child;
0090 while (node) {
0091
0092
0093
0094 if (node->name.integer == target_name) {
0095
0096
0097
0098 if (acpi_ns_get_type(node) ==
0099 ACPI_TYPE_LOCAL_METHOD_ALIAS) {
0100 node =
0101 ACPI_CAST_PTR(struct acpi_namespace_node,
0102 node->object);
0103 }
0104
0105
0106
0107 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0108 "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
0109 ACPI_CAST_PTR(char, &target_name),
0110 acpi_ut_get_type_name(node->type),
0111 node,
0112 acpi_ut_get_node_name(parent_node),
0113 parent_node));
0114
0115 *return_node = node;
0116 return_ACPI_STATUS(AE_OK);
0117 }
0118
0119
0120
0121 node = node->peer;
0122 }
0123
0124
0125
0126 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0127 "Name [%4.4s] (%s) not found in search in scope [%4.4s] "
0128 "%p first child %p\n",
0129 ACPI_CAST_PTR(char, &target_name),
0130 acpi_ut_get_type_name(type),
0131 acpi_ut_get_node_name(parent_node), parent_node,
0132 parent_node->child));
0133
0134 return_ACPI_STATUS(AE_NOT_FOUND);
0135 }
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 static acpi_status
0163 acpi_ns_search_parent_tree(u32 target_name,
0164 struct acpi_namespace_node *node,
0165 acpi_object_type type,
0166 struct acpi_namespace_node **return_node)
0167 {
0168 acpi_status status;
0169 struct acpi_namespace_node *parent_node;
0170
0171 ACPI_FUNCTION_TRACE(ns_search_parent_tree);
0172
0173 parent_node = node->parent;
0174
0175
0176
0177
0178
0179 if (!parent_node) {
0180 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
0181 ACPI_CAST_PTR(char, &target_name)));
0182 return_ACPI_STATUS(AE_NOT_FOUND);
0183 }
0184
0185 if (acpi_ns_local(type)) {
0186 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0187 "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
0188 ACPI_CAST_PTR(char, &target_name),
0189 acpi_ut_get_type_name(type)));
0190 return_ACPI_STATUS(AE_NOT_FOUND);
0191 }
0192
0193
0194
0195 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0196 "Searching parent [%4.4s] for [%4.4s]\n",
0197 acpi_ut_get_node_name(parent_node),
0198 ACPI_CAST_PTR(char, &target_name)));
0199
0200
0201
0202 while (parent_node) {
0203
0204
0205
0206
0207
0208 status =
0209 acpi_ns_search_one_scope(target_name, parent_node,
0210 ACPI_TYPE_ANY, return_node);
0211 if (ACPI_SUCCESS(status)) {
0212 return_ACPI_STATUS(status);
0213 }
0214
0215
0216
0217 parent_node = parent_node->parent;
0218 }
0219
0220
0221
0222 return_ACPI_STATUS(AE_NOT_FOUND);
0223 }
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250 acpi_status
0251 acpi_ns_search_and_enter(u32 target_name,
0252 struct acpi_walk_state *walk_state,
0253 struct acpi_namespace_node *node,
0254 acpi_interpreter_mode interpreter_mode,
0255 acpi_object_type type,
0256 u32 flags, struct acpi_namespace_node **return_node)
0257 {
0258 acpi_status status;
0259 struct acpi_namespace_node *new_node;
0260
0261 ACPI_FUNCTION_TRACE(ns_search_and_enter);
0262
0263
0264
0265 if (!node || !target_name || !return_node) {
0266 ACPI_ERROR((AE_INFO,
0267 "Null parameter: Node %p Name 0x%X ReturnNode %p",
0268 node, target_name, return_node));
0269 return_ACPI_STATUS(AE_BAD_PARAMETER);
0270 }
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 acpi_ut_repair_name(ACPI_CAST_PTR(char, &target_name));
0282
0283
0284
0285 *return_node = ACPI_ENTRY_NOT_FOUND;
0286 status = acpi_ns_search_one_scope(target_name, node, type, return_node);
0287 if (status != AE_NOT_FOUND) {
0288
0289
0290
0291
0292 if (status == AE_OK) {
0293
0294
0295
0296
0297
0298
0299
0300
0301 if (flags & ACPI_NS_OVERRIDE_IF_FOUND) {
0302 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0303 "Namespace override: %4.4s pass %u type %X Owner %X\n",
0304 ACPI_CAST_PTR(char,
0305 &target_name),
0306 interpreter_mode,
0307 (*return_node)->type,
0308 walk_state->owner_id));
0309
0310 acpi_ns_delete_children(*return_node);
0311 if (acpi_gbl_runtime_namespace_override) {
0312 acpi_ut_remove_reference((*return_node)->object);
0313 (*return_node)->object = NULL;
0314 (*return_node)->owner_id =
0315 walk_state->owner_id;
0316 } else {
0317 acpi_ns_remove_node(*return_node);
0318 *return_node = ACPI_ENTRY_NOT_FOUND;
0319 }
0320 }
0321
0322
0323
0324 else if (flags & ACPI_NS_ERROR_IF_FOUND) {
0325 status = AE_ALREADY_EXISTS;
0326 }
0327 }
0328 #ifdef ACPI_ASL_COMPILER
0329 if (*return_node && (*return_node)->type == ACPI_TYPE_ANY) {
0330 (*return_node)->flags |= ANOBJ_IS_EXTERNAL;
0331 }
0332 #endif
0333
0334
0335
0336 return_ACPI_STATUS(status);
0337 }
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347 if ((interpreter_mode != ACPI_IMODE_LOAD_PASS1) &&
0348 (flags & ACPI_NS_SEARCH_PARENT)) {
0349
0350
0351
0352
0353 status =
0354 acpi_ns_search_parent_tree(target_name, node, type,
0355 return_node);
0356 if (ACPI_SUCCESS(status)) {
0357 return_ACPI_STATUS(status);
0358 }
0359 }
0360
0361
0362
0363 if (interpreter_mode == ACPI_IMODE_EXECUTE) {
0364 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
0365 "%4.4s Not found in %p [Not adding]\n",
0366 ACPI_CAST_PTR(char, &target_name), node));
0367
0368 return_ACPI_STATUS(AE_NOT_FOUND);
0369 }
0370
0371
0372
0373 new_node = acpi_ns_create_node(target_name);
0374 if (!new_node) {
0375 return_ACPI_STATUS(AE_NO_MEMORY);
0376 }
0377 #ifdef ACPI_ASL_COMPILER
0378
0379
0380
0381 if (flags & ACPI_NS_EXTERNAL ||
0382 (walk_state && walk_state->opcode == AML_SCOPE_OP)) {
0383 new_node->flags |= ANOBJ_IS_EXTERNAL;
0384 }
0385 #endif
0386
0387 if (flags & ACPI_NS_TEMPORARY) {
0388 new_node->flags |= ANOBJ_TEMPORARY;
0389 }
0390
0391
0392
0393 acpi_ns_install_node(walk_state, node, new_node, type);
0394 *return_node = new_node;
0395 return_ACPI_STATUS(AE_OK);
0396 }