aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/acpica/aclocal.h1
-rw-r--r--drivers/acpi/acpica/acnamesp.h17
-rw-r--r--drivers/acpi/acpica/dsfield.c35
-rw-r--r--drivers/acpi/acpica/nsaccess.c13
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
19ACPI_MODULE_NAME("dsfield") 23ACPI_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 *)&current_node->name, 558 (char *)&current_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);