diff options
Diffstat (limited to 'drivers/acpi/executer/exprep.c')
| -rw-r--r-- | drivers/acpi/executer/exprep.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c index 7719ae5d4f16..44d064f427b9 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,16 +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 | * April 2006: Changed to match MS behavior | ||
| 523 | * | ||
| 522 | * 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 |
| 523 | * target field | 525 | * target field in units of the granularity of the index_field |
| 524 | * Note: may change code to: ACPI_DIV_8 (Info->field_bit_position) | 526 | * |
| 527 | * Previously, the value was calculated as an index in terms of the | ||
| 528 | * width of the Data register, as below: | ||
| 529 | * | ||
| 530 | * obj_desc->index_field.Value = (u32) | ||
| 531 | * (Info->field_bit_position / ACPI_MUL_8 ( | ||
| 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); | ||
| 525 | */ | 537 | */ |
| 526 | obj_desc->index_field.value = (u32) | 538 | obj_desc->index_field.value = |
| 527 | (info->field_bit_position / | 539 | (u32) ACPI_ROUND_DOWN(ACPI_DIV_8(info->field_bit_position), |
| 528 | ACPI_MUL_8(obj_desc->field.access_byte_width)); | 540 | obj_desc->index_field. |
| 541 | access_byte_width); | ||
| 529 | 542 | ||
| 530 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, | 543 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
| 531 | "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", |
| 532 | obj_desc->index_field.start_field_bit_offset, | 545 | obj_desc->index_field.start_field_bit_offset, |
| 533 | obj_desc->index_field.base_byte_offset, | 546 | obj_desc->index_field.base_byte_offset, |
| 534 | obj_desc->index_field.value, | 547 | obj_desc->index_field.value, |
| @@ -550,7 +563,7 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
| 550 | acpi_ns_get_type(info->field_node)); | 563 | acpi_ns_get_type(info->field_node)); |
| 551 | 564 | ||
| 552 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, | 565 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
| 553 | "Set named_obj %p [%4.4s], obj_desc %p\n", | 566 | "Set NamedObj %p [%4.4s], ObjDesc %p\n", |
| 554 | info->field_node, | 567 | info->field_node, |
| 555 | acpi_ut_get_node_name(info->field_node), obj_desc)); | 568 | acpi_ut_get_node_name(info->field_node), obj_desc)); |
| 556 | 569 | ||
