diff options
Diffstat (limited to 'drivers/acpi/hardware')
-rw-r--r-- | drivers/acpi/hardware/hwacpi.c | 22 | ||||
-rw-r--r-- | drivers/acpi/hardware/hwregs.c | 64 | ||||
-rw-r--r-- | drivers/acpi/hardware/hwsleep.c | 57 | ||||
-rw-r--r-- | drivers/acpi/hardware/hwtimer.c | 7 |
4 files changed, 88 insertions, 62 deletions
diff --git a/drivers/acpi/hardware/hwacpi.c b/drivers/acpi/hardware/hwacpi.c index de50fab2a910..14e8111769a3 100644 --- a/drivers/acpi/hardware/hwacpi.c +++ b/drivers/acpi/hardware/hwacpi.c | |||
@@ -65,13 +65,6 @@ acpi_status acpi_hw_initialize(void) | |||
65 | 65 | ||
66 | ACPI_FUNCTION_TRACE(hw_initialize); | 66 | ACPI_FUNCTION_TRACE(hw_initialize); |
67 | 67 | ||
68 | /* We must have the ACPI tables by the time we get here */ | ||
69 | |||
70 | if (!acpi_gbl_FADT) { | ||
71 | ACPI_ERROR((AE_INFO, "No FADT is present")); | ||
72 | return_ACPI_STATUS(AE_NO_ACPI_TABLES); | ||
73 | } | ||
74 | |||
75 | /* Sanity check the FADT for valid values */ | 68 | /* Sanity check the FADT for valid values */ |
76 | 69 | ||
77 | status = acpi_ut_validate_fadt(); | 70 | status = acpi_ut_validate_fadt(); |
@@ -106,7 +99,7 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
106 | * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, | 99 | * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, |
107 | * system does not support mode transition. | 100 | * system does not support mode transition. |
108 | */ | 101 | */ |
109 | if (!acpi_gbl_FADT->smi_cmd) { | 102 | if (!acpi_gbl_FADT.smi_command) { |
110 | ACPI_ERROR((AE_INFO, | 103 | ACPI_ERROR((AE_INFO, |
111 | "No SMI_CMD in FADT, mode transition failed")); | 104 | "No SMI_CMD in FADT, mode transition failed")); |
112 | return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); | 105 | return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); |
@@ -119,7 +112,7 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
119 | * we make sure both the numbers are zero to determine these | 112 | * we make sure both the numbers are zero to determine these |
120 | * transitions are not supported. | 113 | * transitions are not supported. |
121 | */ | 114 | */ |
122 | if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) { | 115 | if (!acpi_gbl_FADT.acpi_enable && !acpi_gbl_FADT.acpi_disable) { |
123 | ACPI_ERROR((AE_INFO, | 116 | ACPI_ERROR((AE_INFO, |
124 | "No ACPI mode transition supported in this system (enable/disable both zero)")); | 117 | "No ACPI mode transition supported in this system (enable/disable both zero)")); |
125 | return_ACPI_STATUS(AE_OK); | 118 | return_ACPI_STATUS(AE_OK); |
@@ -130,9 +123,8 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
130 | 123 | ||
131 | /* BIOS should have disabled ALL fixed and GP events */ | 124 | /* BIOS should have disabled ALL fixed and GP events */ |
132 | 125 | ||
133 | status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd, | 126 | status = acpi_os_write_port(acpi_gbl_FADT.smi_command, |
134 | (u32) acpi_gbl_FADT->acpi_enable, | 127 | (u32) acpi_gbl_FADT.acpi_enable, 8); |
135 | 8); | ||
136 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 128 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
137 | "Attempting to enable ACPI mode\n")); | 129 | "Attempting to enable ACPI mode\n")); |
138 | break; | 130 | break; |
@@ -143,8 +135,8 @@ acpi_status acpi_hw_set_mode(u32 mode) | |||
143 | * BIOS should clear all fixed status bits and restore fixed event | 135 | * BIOS should clear all fixed status bits and restore fixed event |
144 | * enable bits to default | 136 | * enable bits to default |
145 | */ | 137 | */ |
146 | status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd, | 138 | status = acpi_os_write_port(acpi_gbl_FADT.smi_command, |
147 | (u32) acpi_gbl_FADT->acpi_disable, | 139 | (u32) acpi_gbl_FADT.acpi_disable, |
148 | 8); | 140 | 8); |
149 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 141 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
150 | "Attempting to enable Legacy (non-ACPI) mode\n")); | 142 | "Attempting to enable Legacy (non-ACPI) mode\n")); |
@@ -204,7 +196,7 @@ u32 acpi_hw_get_mode(void) | |||
204 | * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, | 196 | * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, |
205 | * system does not support mode transition. | 197 | * system does not support mode transition. |
206 | */ | 198 | */ |
207 | if (!acpi_gbl_FADT->smi_cmd) { | 199 | if (!acpi_gbl_FADT.smi_command) { |
208 | return_UINT32(ACPI_SYS_MODE_ACPI); | 200 | return_UINT32(ACPI_SYS_MODE_ACPI); |
209 | } | 201 | } |
210 | 202 | ||
diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c index fa58c1edce1e..9fe7adf21f8b 100644 --- a/drivers/acpi/hardware/hwregs.c +++ b/drivers/acpi/hardware/hwregs.c | |||
@@ -73,7 +73,7 @@ acpi_status acpi_hw_clear_acpi_status(u32 flags) | |||
73 | 73 | ||
74 | ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %04X\n", | 74 | ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %04X\n", |
75 | ACPI_BITMASK_ALL_FIXED_STATUS, | 75 | ACPI_BITMASK_ALL_FIXED_STATUS, |
76 | (u16) acpi_gbl_FADT->xpm1a_evt_blk.address)); | 76 | (u16) acpi_gbl_FADT.xpm1a_event_block.address)); |
77 | 77 | ||
78 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); | 78 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); |
79 | 79 | ||
@@ -86,10 +86,10 @@ acpi_status acpi_hw_clear_acpi_status(u32 flags) | |||
86 | 86 | ||
87 | /* Clear the fixed events */ | 87 | /* Clear the fixed events */ |
88 | 88 | ||
89 | if (acpi_gbl_FADT->xpm1b_evt_blk.address) { | 89 | if (acpi_gbl_FADT.xpm1b_event_block.address) { |
90 | status = | 90 | status = |
91 | acpi_hw_low_level_write(16, ACPI_BITMASK_ALL_FIXED_STATUS, | 91 | acpi_hw_low_level_write(16, ACPI_BITMASK_ALL_FIXED_STATUS, |
92 | &acpi_gbl_FADT->xpm1b_evt_blk); | 92 | &acpi_gbl_FADT.xpm1b_event_block); |
93 | if (ACPI_FAILURE(status)) { | 93 | if (ACPI_FAILURE(status)) { |
94 | goto unlock_and_exit; | 94 | goto unlock_and_exit; |
95 | } | 95 | } |
@@ -422,8 +422,9 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) | |||
422 | ACPI_DEBUG_PRINT((ACPI_DB_IO, | 422 | ACPI_DEBUG_PRINT((ACPI_DB_IO, |
423 | "PM2 control: Read %X from %8.8X%8.8X\n", | 423 | "PM2 control: Read %X from %8.8X%8.8X\n", |
424 | register_value, | 424 | register_value, |
425 | ACPI_FORMAT_UINT64(acpi_gbl_FADT-> | 425 | ACPI_FORMAT_UINT64(acpi_gbl_FADT. |
426 | xpm2_cnt_blk.address))); | 426 | xpm2_control_block. |
427 | address))); | ||
427 | 428 | ||
428 | ACPI_REGISTER_INSERT_VALUE(register_value, | 429 | ACPI_REGISTER_INSERT_VALUE(register_value, |
429 | bit_reg_info->bit_position, | 430 | bit_reg_info->bit_position, |
@@ -433,8 +434,9 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) | |||
433 | ACPI_DEBUG_PRINT((ACPI_DB_IO, | 434 | ACPI_DEBUG_PRINT((ACPI_DB_IO, |
434 | "About to write %4.4X to %8.8X%8.8X\n", | 435 | "About to write %4.4X to %8.8X%8.8X\n", |
435 | register_value, | 436 | register_value, |
436 | ACPI_FORMAT_UINT64(acpi_gbl_FADT-> | 437 | ACPI_FORMAT_UINT64(acpi_gbl_FADT. |
437 | xpm2_cnt_blk.address))); | 438 | xpm2_control_block. |
439 | address))); | ||
438 | 440 | ||
439 | status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | 441 | status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, |
440 | ACPI_REGISTER_PM2_CONTROL, | 442 | ACPI_REGISTER_PM2_CONTROL, |
@@ -495,7 +497,7 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
495 | 497 | ||
496 | status = | 498 | status = |
497 | acpi_hw_low_level_read(16, &value1, | 499 | acpi_hw_low_level_read(16, &value1, |
498 | &acpi_gbl_FADT->xpm1a_evt_blk); | 500 | &acpi_gbl_FADT.xpm1a_event_block); |
499 | if (ACPI_FAILURE(status)) { | 501 | if (ACPI_FAILURE(status)) { |
500 | goto unlock_and_exit; | 502 | goto unlock_and_exit; |
501 | } | 503 | } |
@@ -504,7 +506,7 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
504 | 506 | ||
505 | status = | 507 | status = |
506 | acpi_hw_low_level_read(16, &value2, | 508 | acpi_hw_low_level_read(16, &value2, |
507 | &acpi_gbl_FADT->xpm1b_evt_blk); | 509 | &acpi_gbl_FADT.xpm1b_event_block); |
508 | value1 |= value2; | 510 | value1 |= value2; |
509 | break; | 511 | break; |
510 | 512 | ||
@@ -527,14 +529,14 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
527 | 529 | ||
528 | status = | 530 | status = |
529 | acpi_hw_low_level_read(16, &value1, | 531 | acpi_hw_low_level_read(16, &value1, |
530 | &acpi_gbl_FADT->xpm1a_cnt_blk); | 532 | &acpi_gbl_FADT.xpm1a_control_block); |
531 | if (ACPI_FAILURE(status)) { | 533 | if (ACPI_FAILURE(status)) { |
532 | goto unlock_and_exit; | 534 | goto unlock_and_exit; |
533 | } | 535 | } |
534 | 536 | ||
535 | status = | 537 | status = |
536 | acpi_hw_low_level_read(16, &value2, | 538 | acpi_hw_low_level_read(16, &value2, |
537 | &acpi_gbl_FADT->xpm1b_cnt_blk); | 539 | &acpi_gbl_FADT.xpm1b_control_block); |
538 | value1 |= value2; | 540 | value1 |= value2; |
539 | break; | 541 | break; |
540 | 542 | ||
@@ -542,19 +544,20 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
542 | 544 | ||
543 | status = | 545 | status = |
544 | acpi_hw_low_level_read(8, &value1, | 546 | acpi_hw_low_level_read(8, &value1, |
545 | &acpi_gbl_FADT->xpm2_cnt_blk); | 547 | &acpi_gbl_FADT.xpm2_control_block); |
546 | break; | 548 | break; |
547 | 549 | ||
548 | case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ | 550 | case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ |
549 | 551 | ||
550 | status = | 552 | status = |
551 | acpi_hw_low_level_read(32, &value1, | 553 | acpi_hw_low_level_read(32, &value1, |
552 | &acpi_gbl_FADT->xpm_tmr_blk); | 554 | &acpi_gbl_FADT.xpm_timer_block); |
553 | break; | 555 | break; |
554 | 556 | ||
555 | case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ | 557 | case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ |
556 | 558 | ||
557 | status = acpi_os_read_port(acpi_gbl_FADT->smi_cmd, &value1, 8); | 559 | status = |
560 | acpi_os_read_port(acpi_gbl_FADT.smi_command, &value1, 8); | ||
558 | break; | 561 | break; |
559 | 562 | ||
560 | default: | 563 | default: |
@@ -635,7 +638,7 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) | |||
635 | 638 | ||
636 | status = | 639 | status = |
637 | acpi_hw_low_level_write(16, value, | 640 | acpi_hw_low_level_write(16, value, |
638 | &acpi_gbl_FADT->xpm1a_evt_blk); | 641 | &acpi_gbl_FADT.xpm1a_event_block); |
639 | if (ACPI_FAILURE(status)) { | 642 | if (ACPI_FAILURE(status)) { |
640 | goto unlock_and_exit; | 643 | goto unlock_and_exit; |
641 | } | 644 | } |
@@ -644,7 +647,7 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) | |||
644 | 647 | ||
645 | status = | 648 | status = |
646 | acpi_hw_low_level_write(16, value, | 649 | acpi_hw_low_level_write(16, value, |
647 | &acpi_gbl_FADT->xpm1b_evt_blk); | 650 | &acpi_gbl_FADT.xpm1b_event_block); |
648 | break; | 651 | break; |
649 | 652 | ||
650 | case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */ | 653 | case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */ |
@@ -682,49 +685,50 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) | |||
682 | 685 | ||
683 | status = | 686 | status = |
684 | acpi_hw_low_level_write(16, value, | 687 | acpi_hw_low_level_write(16, value, |
685 | &acpi_gbl_FADT->xpm1a_cnt_blk); | 688 | &acpi_gbl_FADT.xpm1a_control_block); |
686 | if (ACPI_FAILURE(status)) { | 689 | if (ACPI_FAILURE(status)) { |
687 | goto unlock_and_exit; | 690 | goto unlock_and_exit; |
688 | } | 691 | } |
689 | 692 | ||
690 | status = | 693 | status = |
691 | acpi_hw_low_level_write(16, value, | 694 | acpi_hw_low_level_write(16, value, |
692 | &acpi_gbl_FADT->xpm1b_cnt_blk); | 695 | &acpi_gbl_FADT.xpm1b_control_block); |
693 | break; | 696 | break; |
694 | 697 | ||
695 | case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */ | 698 | case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */ |
696 | 699 | ||
697 | status = | 700 | status = |
698 | acpi_hw_low_level_write(16, value, | 701 | acpi_hw_low_level_write(16, value, |
699 | &acpi_gbl_FADT->xpm1a_cnt_blk); | 702 | &acpi_gbl_FADT.xpm1a_control_block); |
700 | break; | 703 | break; |
701 | 704 | ||
702 | case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */ | 705 | case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */ |
703 | 706 | ||
704 | status = | 707 | status = |
705 | acpi_hw_low_level_write(16, value, | 708 | acpi_hw_low_level_write(16, value, |
706 | &acpi_gbl_FADT->xpm1b_cnt_blk); | 709 | &acpi_gbl_FADT.xpm1b_control_block); |
707 | break; | 710 | break; |
708 | 711 | ||
709 | case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ | 712 | case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ |
710 | 713 | ||
711 | status = | 714 | status = |
712 | acpi_hw_low_level_write(8, value, | 715 | acpi_hw_low_level_write(8, value, |
713 | &acpi_gbl_FADT->xpm2_cnt_blk); | 716 | &acpi_gbl_FADT.xpm2_control_block); |
714 | break; | 717 | break; |
715 | 718 | ||
716 | case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ | 719 | case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ |
717 | 720 | ||
718 | status = | 721 | status = |
719 | acpi_hw_low_level_write(32, value, | 722 | acpi_hw_low_level_write(32, value, |
720 | &acpi_gbl_FADT->xpm_tmr_blk); | 723 | &acpi_gbl_FADT.xpm_timer_block); |
721 | break; | 724 | break; |
722 | 725 | ||
723 | case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ | 726 | case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ |
724 | 727 | ||
725 | /* SMI_CMD is currently always in IO space */ | 728 | /* SMI_CMD is currently always in IO space */ |
726 | 729 | ||
727 | status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd, value, 8); | 730 | status = |
731 | acpi_os_write_port(acpi_gbl_FADT.smi_command, value, 8); | ||
728 | break; | 732 | break; |
729 | 733 | ||
730 | default: | 734 | default: |
@@ -783,7 +787,7 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg) | |||
783 | * Two address spaces supported: Memory or IO. | 787 | * Two address spaces supported: Memory or IO. |
784 | * PCI_Config is not supported here because the GAS struct is insufficient | 788 | * PCI_Config is not supported here because the GAS struct is insufficient |
785 | */ | 789 | */ |
786 | switch (reg->address_space_id) { | 790 | switch (reg->space_id) { |
787 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 791 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
788 | 792 | ||
789 | status = acpi_os_read_memory((acpi_physical_address) address, | 793 | status = acpi_os_read_memory((acpi_physical_address) address, |
@@ -798,8 +802,7 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg) | |||
798 | 802 | ||
799 | default: | 803 | default: |
800 | ACPI_ERROR((AE_INFO, | 804 | ACPI_ERROR((AE_INFO, |
801 | "Unsupported address space: %X", | 805 | "Unsupported address space: %X", reg->space_id)); |
802 | reg->address_space_id)); | ||
803 | return (AE_BAD_PARAMETER); | 806 | return (AE_BAD_PARAMETER); |
804 | } | 807 | } |
805 | 808 | ||
@@ -807,7 +810,7 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg) | |||
807 | "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", | 810 | "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", |
808 | *value, width, | 811 | *value, width, |
809 | ACPI_FORMAT_UINT64(address), | 812 | ACPI_FORMAT_UINT64(address), |
810 | acpi_ut_get_region_name(reg->address_space_id))); | 813 | acpi_ut_get_region_name(reg->space_id))); |
811 | 814 | ||
812 | return (status); | 815 | return (status); |
813 | } | 816 | } |
@@ -854,7 +857,7 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg) | |||
854 | * Two address spaces supported: Memory or IO. | 857 | * Two address spaces supported: Memory or IO. |
855 | * PCI_Config is not supported here because the GAS struct is insufficient | 858 | * PCI_Config is not supported here because the GAS struct is insufficient |
856 | */ | 859 | */ |
857 | switch (reg->address_space_id) { | 860 | switch (reg->space_id) { |
858 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: | 861 | case ACPI_ADR_SPACE_SYSTEM_MEMORY: |
859 | 862 | ||
860 | status = acpi_os_write_memory((acpi_physical_address) address, | 863 | status = acpi_os_write_memory((acpi_physical_address) address, |
@@ -869,8 +872,7 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg) | |||
869 | 872 | ||
870 | default: | 873 | default: |
871 | ACPI_ERROR((AE_INFO, | 874 | ACPI_ERROR((AE_INFO, |
872 | "Unsupported address space: %X", | 875 | "Unsupported address space: %X", reg->space_id)); |
873 | reg->address_space_id)); | ||
874 | return (AE_BAD_PARAMETER); | 876 | return (AE_BAD_PARAMETER); |
875 | } | 877 | } |
876 | 878 | ||
@@ -878,7 +880,7 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg) | |||
878 | "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", | 880 | "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", |
879 | value, width, | 881 | value, width, |
880 | ACPI_FORMAT_UINT64(address), | 882 | ACPI_FORMAT_UINT64(address), |
881 | acpi_ut_get_region_name(reg->address_space_id))); | 883 | acpi_ut_get_region_name(reg->space_id))); |
882 | 884 | ||
883 | return (status); | 885 | return (status); |
884 | } | 886 | } |
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c index 8bb43cae60c2..6faa76bdc3d5 100644 --- a/drivers/acpi/hardware/hwsleep.c +++ b/drivers/acpi/hardware/hwsleep.c | |||
@@ -43,6 +43,7 @@ | |||
43 | */ | 43 | */ |
44 | 44 | ||
45 | #include <acpi/acpi.h> | 45 | #include <acpi/acpi.h> |
46 | #include <acpi/actables.h> | ||
46 | 47 | ||
47 | #define _COMPONENT ACPI_HARDWARE | 48 | #define _COMPONENT ACPI_HARDWARE |
48 | ACPI_MODULE_NAME("hwsleep") | 49 | ACPI_MODULE_NAME("hwsleep") |
@@ -62,17 +63,32 @@ ACPI_MODULE_NAME("hwsleep") | |||
62 | acpi_status | 63 | acpi_status |
63 | acpi_set_firmware_waking_vector(acpi_physical_address physical_address) | 64 | acpi_set_firmware_waking_vector(acpi_physical_address physical_address) |
64 | { | 65 | { |
66 | struct acpi_table_facs *facs; | ||
67 | acpi_status status; | ||
65 | 68 | ||
66 | ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector); | 69 | ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector); |
67 | 70 | ||
71 | /* Get the FACS */ | ||
72 | |||
73 | status = | ||
74 | acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS, | ||
75 | (struct acpi_table_header **)&facs); | ||
76 | if (ACPI_FAILURE(status)) { | ||
77 | return_ACPI_STATUS(status); | ||
78 | } | ||
79 | |||
68 | /* Set the vector */ | 80 | /* Set the vector */ |
69 | 81 | ||
70 | if (acpi_gbl_common_fACS.vector_width == 32) { | 82 | if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) { |
71 | *(ACPI_CAST_PTR | 83 | /* |
72 | (u32, acpi_gbl_common_fACS.firmware_waking_vector)) | 84 | * ACPI 1.0 FACS or short table or optional X_ field is zero |
73 | = (u32) physical_address; | 85 | */ |
86 | facs->firmware_waking_vector = (u32) physical_address; | ||
74 | } else { | 87 | } else { |
75 | *acpi_gbl_common_fACS.firmware_waking_vector = physical_address; | 88 | /* |
89 | * ACPI 2.0 FACS with valid X_ field | ||
90 | */ | ||
91 | facs->xfirmware_waking_vector = physical_address; | ||
76 | } | 92 | } |
77 | 93 | ||
78 | return_ACPI_STATUS(AE_OK); | 94 | return_ACPI_STATUS(AE_OK); |
@@ -97,6 +113,8 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector) | |||
97 | acpi_status | 113 | acpi_status |
98 | acpi_get_firmware_waking_vector(acpi_physical_address * physical_address) | 114 | acpi_get_firmware_waking_vector(acpi_physical_address * physical_address) |
99 | { | 115 | { |
116 | struct acpi_table_facs *facs; | ||
117 | acpi_status status; | ||
100 | 118 | ||
101 | ACPI_FUNCTION_TRACE(acpi_get_firmware_waking_vector); | 119 | ACPI_FUNCTION_TRACE(acpi_get_firmware_waking_vector); |
102 | 120 | ||
@@ -104,16 +122,29 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address) | |||
104 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 122 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
105 | } | 123 | } |
106 | 124 | ||
125 | /* Get the FACS */ | ||
126 | |||
127 | status = | ||
128 | acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS, | ||
129 | (struct acpi_table_header **)&facs); | ||
130 | if (ACPI_FAILURE(status)) { | ||
131 | return_ACPI_STATUS(status); | ||
132 | } | ||
133 | |||
107 | /* Get the vector */ | 134 | /* Get the vector */ |
108 | 135 | ||
109 | if (acpi_gbl_common_fACS.vector_width == 32) { | 136 | if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) { |
110 | *physical_address = (acpi_physical_address) | 137 | /* |
111 | * | 138 | * ACPI 1.0 FACS or short table or optional X_ field is zero |
112 | (ACPI_CAST_PTR | 139 | */ |
113 | (u32, acpi_gbl_common_fACS.firmware_waking_vector)); | 140 | *physical_address = |
141 | (acpi_physical_address) facs->firmware_waking_vector; | ||
114 | } else { | 142 | } else { |
143 | /* | ||
144 | * ACPI 2.0 FACS with valid X_ field | ||
145 | */ | ||
115 | *physical_address = | 146 | *physical_address = |
116 | *acpi_gbl_common_fACS.firmware_waking_vector; | 147 | (acpi_physical_address) facs->xfirmware_waking_vector; |
117 | } | 148 | } |
118 | 149 | ||
119 | return_ACPI_STATUS(AE_OK); | 150 | return_ACPI_STATUS(AE_OK); |
@@ -429,8 +460,8 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void) | |||
429 | 460 | ||
430 | ACPI_FLUSH_CPU_CACHE(); | 461 | ACPI_FLUSH_CPU_CACHE(); |
431 | 462 | ||
432 | status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd, | 463 | status = acpi_os_write_port(acpi_gbl_FADT.smi_command, |
433 | (u32) acpi_gbl_FADT->S4bios_req, 8); | 464 | (u32) acpi_gbl_FADT.S4bios_request, 8); |
434 | 465 | ||
435 | do { | 466 | do { |
436 | acpi_os_stall(1000); | 467 | acpi_os_stall(1000); |
diff --git a/drivers/acpi/hardware/hwtimer.c b/drivers/acpi/hardware/hwtimer.c index c4ec47c939fd..abd86e8d6287 100644 --- a/drivers/acpi/hardware/hwtimer.c +++ b/drivers/acpi/hardware/hwtimer.c | |||
@@ -66,7 +66,7 @@ acpi_status acpi_get_timer_resolution(u32 * resolution) | |||
66 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 66 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
67 | } | 67 | } |
68 | 68 | ||
69 | if (acpi_gbl_FADT->tmr_val_ext == 0) { | 69 | if ((acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) == 0) { |
70 | *resolution = 24; | 70 | *resolution = 24; |
71 | } else { | 71 | } else { |
72 | *resolution = 32; | 72 | *resolution = 32; |
@@ -98,7 +98,8 @@ acpi_status acpi_get_timer(u32 * ticks) | |||
98 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 98 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
99 | } | 99 | } |
100 | 100 | ||
101 | status = acpi_hw_low_level_read(32, ticks, &acpi_gbl_FADT->xpm_tmr_blk); | 101 | status = |
102 | acpi_hw_low_level_read(32, ticks, &acpi_gbl_FADT.xpm_timer_block); | ||
102 | 103 | ||
103 | return_ACPI_STATUS(status); | 104 | return_ACPI_STATUS(status); |
104 | } | 105 | } |
@@ -153,7 +154,7 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed) | |||
153 | if (start_ticks < end_ticks) { | 154 | if (start_ticks < end_ticks) { |
154 | delta_ticks = end_ticks - start_ticks; | 155 | delta_ticks = end_ticks - start_ticks; |
155 | } else if (start_ticks > end_ticks) { | 156 | } else if (start_ticks > end_ticks) { |
156 | if (acpi_gbl_FADT->tmr_val_ext == 0) { | 157 | if ((acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) == 0) { |
157 | 158 | ||
158 | /* 24-bit Timer */ | 159 | /* 24-bit Timer */ |
159 | 160 | ||