diff options
| -rw-r--r-- | drivers/acpi/acpica/aclocal.h | 1 | ||||
| -rw-r--r-- | drivers/acpi/acpica/acnamesp.h | 17 | ||||
| -rw-r--r-- | drivers/acpi/acpica/dsfield.c | 35 | ||||
| -rw-r--r-- | drivers/acpi/acpica/nsaccess.c | 13 |
4 files changed, 57 insertions, 9 deletions
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index c5367bf5487f..0f28a38a43ea 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
| @@ -164,6 +164,7 @@ struct acpi_namespace_node { | |||
| 164 | #define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */ | 164 | #define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */ |
| 165 | #define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */ | 165 | #define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */ |
| 166 | #define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (install_method) */ | 166 | #define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (install_method) */ |
| 167 | #define ANOBJ_NODE_EARLY_INIT 0x80 /* acpi_exec only: Node was create via init file (-fi) */ | ||
| 167 | 168 | ||
| 168 | #define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */ | 169 | #define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */ |
| 169 | #define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */ | 170 | #define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */ |
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h index 3825df923480..bbb3b4d1e796 100644 --- a/drivers/acpi/acpica/acnamesp.h +++ b/drivers/acpi/acpica/acnamesp.h | |||
| @@ -25,14 +25,15 @@ | |||
| 25 | /* Flags for acpi_ns_lookup, acpi_ns_search_and_enter */ | 25 | /* Flags for acpi_ns_lookup, acpi_ns_search_and_enter */ |
| 26 | 26 | ||
| 27 | #define ACPI_NS_NO_UPSEARCH 0 | 27 | #define ACPI_NS_NO_UPSEARCH 0 |
| 28 | #define ACPI_NS_SEARCH_PARENT 0x01 | 28 | #define ACPI_NS_SEARCH_PARENT 0x0001 |
| 29 | #define ACPI_NS_DONT_OPEN_SCOPE 0x02 | 29 | #define ACPI_NS_DONT_OPEN_SCOPE 0x0002 |
| 30 | #define ACPI_NS_NO_PEER_SEARCH 0x04 | 30 | #define ACPI_NS_NO_PEER_SEARCH 0x0004 |
| 31 | #define ACPI_NS_ERROR_IF_FOUND 0x08 | 31 | #define ACPI_NS_ERROR_IF_FOUND 0x0008 |
| 32 | #define ACPI_NS_PREFIX_IS_SCOPE 0x10 | 32 | #define ACPI_NS_PREFIX_IS_SCOPE 0x0010 |
| 33 | #define ACPI_NS_EXTERNAL 0x20 | 33 | #define ACPI_NS_EXTERNAL 0x0020 |
| 34 | #define ACPI_NS_TEMPORARY 0x40 | 34 | #define ACPI_NS_TEMPORARY 0x0040 |
| 35 | #define ACPI_NS_OVERRIDE_IF_FOUND 0x80 | 35 | #define ACPI_NS_OVERRIDE_IF_FOUND 0x0080 |
| 36 | #define ACPI_NS_EARLY_INIT 0x0100 | ||
| 36 | 37 | ||
| 37 | /* Flags for acpi_ns_walk_namespace */ | 38 | /* Flags for acpi_ns_walk_namespace */ |
| 38 | 39 | ||
diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c index 7c937595dfcb..5581300927de 100644 --- a/drivers/acpi/acpica/dsfield.c +++ b/drivers/acpi/acpica/dsfield.c | |||
| @@ -15,6 +15,10 @@ | |||
| 15 | #include "acnamesp.h" | 15 | #include "acnamesp.h" |
| 16 | #include "acparser.h" | 16 | #include "acparser.h" |
| 17 | 17 | ||
| 18 | #ifdef ACPI_EXEC_APP | ||
| 19 | #include "aecommon.h" | ||
| 20 | #endif | ||
| 21 | |||
| 18 | #define _COMPONENT ACPI_DISPATCHER | 22 | #define _COMPONENT ACPI_DISPATCHER |
| 19 | ACPI_MODULE_NAME("dsfield") | 23 | ACPI_MODULE_NAME("dsfield") |
| 20 | 24 | ||
| @@ -259,6 +263,13 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, | |||
| 259 | u64 position; | 263 | u64 position; |
| 260 | union acpi_parse_object *child; | 264 | union acpi_parse_object *child; |
| 261 | 265 | ||
| 266 | #ifdef ACPI_EXEC_APP | ||
| 267 | u64 value = 0; | ||
| 268 | union acpi_operand_object *result_desc; | ||
| 269 | union acpi_operand_object *obj_desc; | ||
| 270 | char *name_path; | ||
| 271 | #endif | ||
| 272 | |||
| 262 | ACPI_FUNCTION_TRACE_PTR(ds_get_field_names, info); | 273 | ACPI_FUNCTION_TRACE_PTR(ds_get_field_names, info); |
| 263 | 274 | ||
| 264 | /* First field starts at bit zero */ | 275 | /* First field starts at bit zero */ |
| @@ -391,6 +402,26 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, | |||
| 391 | if (ACPI_FAILURE(status)) { | 402 | if (ACPI_FAILURE(status)) { |
| 392 | return_ACPI_STATUS(status); | 403 | return_ACPI_STATUS(status); |
| 393 | } | 404 | } |
| 405 | #ifdef ACPI_EXEC_APP | ||
| 406 | name_path = | ||
| 407 | acpi_ns_get_external_pathname(info-> | ||
| 408 | field_node); | ||
| 409 | obj_desc = | ||
| 410 | acpi_ut_create_integer_object | ||
| 411 | (value); | ||
| 412 | if (ACPI_SUCCESS | ||
| 413 | (ae_lookup_init_file_entry | ||
| 414 | (name_path, &value))) { | ||
| 415 | acpi_ex_write_data_to_field | ||
| 416 | (obj_desc, | ||
| 417 | acpi_ns_get_attached_object | ||
| 418 | (info->field_node), | ||
| 419 | &result_desc); | ||
| 420 | ACPI_FREE(name_path); | ||
| 421 | acpi_ut_remove_reference | ||
| 422 | (obj_desc); | ||
| 423 | } | ||
| 424 | #endif | ||
| 394 | } | 425 | } |
| 395 | } | 426 | } |
| 396 | 427 | ||
| @@ -573,7 +604,9 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, | |||
| 573 | !(walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL)) { | 604 | !(walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL)) { |
| 574 | flags |= ACPI_NS_TEMPORARY; | 605 | flags |= ACPI_NS_TEMPORARY; |
| 575 | } | 606 | } |
| 576 | 607 | #ifdef ACPI_EXEC_APP | |
| 608 | flags |= ACPI_NS_OVERRIDE_IF_FOUND; | ||
| 609 | #endif | ||
| 577 | /* | 610 | /* |
| 578 | * Walk the list of entries in the field_list | 611 | * Walk the list of entries in the field_list |
| 579 | * Note: field_list can be of zero length. In this case, Arg will be NULL. | 612 | * Note: field_list can be of zero length. In this case, Arg will be NULL. |
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c index 83a593e2155d..e3f10afde5ff 100644 --- a/drivers/acpi/acpica/nsaccess.c +++ b/drivers/acpi/acpica/nsaccess.c | |||
| @@ -558,6 +558,14 @@ acpi_ns_lookup(union acpi_generic_state *scope_info, | |||
| 558 | (char *)¤t_node->name, | 558 | (char *)¤t_node->name, |
| 559 | current_node)); | 559 | current_node)); |
| 560 | } | 560 | } |
| 561 | #ifdef ACPI_EXEC_APP | ||
| 562 | if ((status == AE_ALREADY_EXISTS) && | ||
| 563 | (this_node->flags & ANOBJ_NODE_EARLY_INIT)) { | ||
| 564 | this_node->flags &= ~ANOBJ_NODE_EARLY_INIT; | ||
| 565 | status = AE_OK; | ||
| 566 | } | ||
| 567 | #endif | ||
| 568 | |||
| 561 | #ifdef ACPI_ASL_COMPILER | 569 | #ifdef ACPI_ASL_COMPILER |
| 562 | /* | 570 | /* |
| 563 | * If this ACPI name already exists within the namespace as an | 571 | * If this ACPI name already exists within the namespace as an |
| @@ -676,6 +684,11 @@ acpi_ns_lookup(union acpi_generic_state *scope_info, | |||
| 676 | } | 684 | } |
| 677 | } | 685 | } |
| 678 | } | 686 | } |
| 687 | #ifdef ACPI_EXEC_APP | ||
| 688 | if (flags & ACPI_NS_EARLY_INIT) { | ||
| 689 | this_node->flags |= ANOBJ_NODE_EARLY_INIT; | ||
| 690 | } | ||
| 691 | #endif | ||
| 679 | 692 | ||
| 680 | *return_node = this_node; | 693 | *return_node = this_node; |
| 681 | return_ACPI_STATUS(AE_OK); | 694 | return_ACPI_STATUS(AE_OK); |
