aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/executer/exprep.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2006-04-21 17:15:00 -0400
committerLen Brown <len.brown@intel.com>2006-06-14 02:30:55 -0400
commitb229cf92eee616c7cb5ad8cdb35a19b119f00bc8 (patch)
tree74b52bec6ec029859c2320aba227290a503af31a /drivers/acpi/executer/exprep.c
parent793c2388cae3fd023b3b5166354931752d42353c (diff)
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in 20051216 where the _STA method was not run unless an _INI was also present for the same device. This optimization could cause problems because it could allow _INI methods to be run within a not-present device subtree (If a not-present device had no _INI, _STA would not be run, the not-present status would not be discovered, and the children of the device would be incorrectly traversed.) Implemented a new _STA optimization where namespace subtrees that do not contain _INI are identified and ignored during device initialization. Selectively running _STA can significantly improve boot time on large machines (with assistance from Len Brown.) Implemented support for the device initialization case where the returned _STA flags indicate a device not-present but functioning. In this case, _INI is not run, but the device children are examined for presence, as per the ACPI specification. Implemented an additional change to the IndexField support in order to conform to MS behavior. The value written to the Index Register is not simply a byte offset, it is a byte offset in units of the access width of the parent Index Field. (Fiodor Suietov) Defined and deployed a new OSL interface, acpi_os_validate_address(). This interface is called during the creation of all AML operation regions, and allows the host OS to exert control over what addresses it will allow the AML code to access. Operation Regions whose addresses are disallowed will cause a runtime exception when they are actually accessed (will not affect or abort table loading.) Defined and deployed a new OSL interface, acpi_os_validate_interface(). This interface allows the host OS to match the various "optional" interface/behavior strings for the _OSI predefined control method as appropriate (with assistance from Bjorn Helgaas.) Restructured and corrected various problems in the exception handling code paths within DsCallControlMethod and DsTerminateControlMethod in dsmethod (with assistance from Takayoshi Kochi.) Modified the Linux source converter to ignore quoted string literals while converting identifiers from mixed to lower case. This will correct problems with the disassembler and other areas where such strings must not be modified. The ACPI_FUNCTION_* macros no longer require quotes around the function name. This allows the Linux source converter to convert the names, now that the converter ignores quoted strings. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/executer/exprep.c')
-rw-r--r--drivers/acpi/executer/exprep.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c
index 916234bf811..44d064f427b 100644
--- a/drivers/acpi/executer/exprep.c
+++ b/drivers/acpi/executer/exprep.c
@@ -97,7 +97,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
97 u32 minimum_accesses = 0xFFFFFFFF; 97 u32 minimum_accesses = 0xFFFFFFFF;
98 u32 accesses; 98 u32 accesses;
99 99
100 ACPI_FUNCTION_TRACE("ex_generate_access"); 100 ACPI_FUNCTION_TRACE(ex_generate_access);
101 101
102 /* Round Field start offset and length to "minimal" byte boundaries */ 102 /* Round Field start offset and length to "minimal" byte boundaries */
103 103
@@ -146,7 +146,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
146 accesses = field_end_offset - field_start_offset; 146 accesses = field_end_offset - field_start_offset;
147 147
148 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 148 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
149 "access_width %d end is within region\n", 149 "AccessWidth %d end is within region\n",
150 access_byte_width)); 150 access_byte_width));
151 151
152 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 152 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
@@ -173,7 +173,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
173 } 173 }
174 } else { 174 } else {
175 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 175 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
176 "access_width %d end is NOT within region\n", 176 "AccessWidth %d end is NOT within region\n",
177 access_byte_width)); 177 access_byte_width));
178 if (access_byte_width == 1) { 178 if (access_byte_width == 1) {
179 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 179 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
@@ -228,7 +228,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
228 u32 byte_alignment; 228 u32 byte_alignment;
229 u32 bit_length; 229 u32 bit_length;
230 230
231 ACPI_FUNCTION_TRACE("ex_decode_field_access"); 231 ACPI_FUNCTION_TRACE(ex_decode_field_access);
232 232
233 access = (field_flags & AML_FIELD_ACCESS_TYPE_MASK); 233 access = (field_flags & AML_FIELD_ACCESS_TYPE_MASK);
234 234
@@ -322,7 +322,7 @@ acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,
322 u32 byte_alignment; 322 u32 byte_alignment;
323 u32 nearest_byte_address; 323 u32 nearest_byte_address;
324 324
325 ACPI_FUNCTION_TRACE("ex_prep_common_field_object"); 325 ACPI_FUNCTION_TRACE(ex_prep_common_field_object);
326 326
327 /* 327 /*
328 * Note: the structure being initialized is the 328 * Note: the structure being initialized is the
@@ -415,13 +415,13 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
415 u32 type; 415 u32 type;
416 acpi_status status; 416 acpi_status status;
417 417
418 ACPI_FUNCTION_TRACE("ex_prep_field_value"); 418 ACPI_FUNCTION_TRACE(ex_prep_field_value);
419 419
420 /* Parameter validation */ 420 /* Parameter validation */
421 421
422 if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { 422 if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) {
423 if (!info->region_node) { 423 if (!info->region_node) {
424 ACPI_ERROR((AE_INFO, "Null region_node")); 424 ACPI_ERROR((AE_INFO, "Null RegionNode"));
425 return_ACPI_STATUS(AE_AML_NO_OPERAND); 425 return_ACPI_STATUS(AE_AML_NO_OPERAND);
426 } 426 }
427 427
@@ -467,7 +467,7 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
467 acpi_ut_add_reference(obj_desc->field.region_obj); 467 acpi_ut_add_reference(obj_desc->field.region_obj);
468 468
469 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 469 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
470 "region_field: bit_off %X, Off %X, Gran %X, Region %p\n", 470 "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n",
471 obj_desc->field.start_field_bit_offset, 471 obj_desc->field.start_field_bit_offset,
472 obj_desc->field.base_byte_offset, 472 obj_desc->field.base_byte_offset,
473 obj_desc->field.access_byte_width, 473 obj_desc->field.access_byte_width,
@@ -488,7 +488,7 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
488 acpi_ut_add_reference(obj_desc->bank_field.bank_obj); 488 acpi_ut_add_reference(obj_desc->bank_field.bank_obj);
489 489
490 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 490 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
491 "Bank Field: bit_off %X, Off %X, Gran %X, Region %p, bank_reg %p\n", 491 "Bank Field: BitOff %X, Off %X, Gran %X, Region %p, BankReg %p\n",
492 obj_desc->bank_field.start_field_bit_offset, 492 obj_desc->bank_field.start_field_bit_offset,
493 obj_desc->bank_field.base_byte_offset, 493 obj_desc->bank_field.base_byte_offset,
494 obj_desc->field.access_byte_width, 494 obj_desc->field.access_byte_width,
@@ -519,23 +519,29 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
519 acpi_ut_add_reference(obj_desc->index_field.index_obj); 519 acpi_ut_add_reference(obj_desc->index_field.index_obj);
520 520
521 /* 521 /*
522 * February 2006: Changed to match MS behavior 522 * April 2006: Changed to match MS behavior
523 * 523 *
524 * The value written to the Index register is the byte offset of the 524 * The value written to the Index register is the byte offset of the
525 * target field. 525 * target field in units of the granularity of the index_field
526 * 526 *
527 * Previously, the value was calculated as an index in terms of the 527 * Previously, the value was calculated as an index in terms of the
528 * width of the Data register, as below: 528 * width of the Data register, as below:
529 * 529 *
530 * obj_desc->index_field.Value = (u32) 530 * obj_desc->index_field.Value = (u32)
531 * (Info->field_bit_position / ACPI_MUL_8 ( 531 * (Info->field_bit_position / ACPI_MUL_8 (
532 * obj_desc->Field.access_byte_width)); 532 * obj_desc->Field.access_byte_width));
533 *
534 * February 2006: Tried value as a byte offset:
535 * obj_desc->index_field.Value = (u32)
536 * ACPI_DIV_8 (Info->field_bit_position);
533 */ 537 */
534 obj_desc->index_field.value = 538 obj_desc->index_field.value =
535 (u32) ACPI_DIV_8(info->field_bit_position); 539 (u32) ACPI_ROUND_DOWN(ACPI_DIV_8(info->field_bit_position),
540 obj_desc->index_field.
541 access_byte_width);
536 542
537 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 543 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
538 "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", 544 "IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",
539 obj_desc->index_field.start_field_bit_offset, 545 obj_desc->index_field.start_field_bit_offset,
540 obj_desc->index_field.base_byte_offset, 546 obj_desc->index_field.base_byte_offset,
541 obj_desc->index_field.value, 547 obj_desc->index_field.value,
@@ -557,7 +563,7 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
557 acpi_ns_get_type(info->field_node)); 563 acpi_ns_get_type(info->field_node));
558 564
559 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 565 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
560 "Set named_obj %p [%4.4s], obj_desc %p\n", 566 "Set NamedObj %p [%4.4s], ObjDesc %p\n",
561 info->field_node, 567 info->field_node,
562 acpi_ut_get_node_name(info->field_node), obj_desc)); 568 acpi_ut_get_node_name(info->field_node), obj_desc));
563 569