[PATCH] Re: [BUG] acpi_hw_[enable|disable]_non_wakeup_gpe_block

Alexander Malysh
2004-02-15T15:47:19Z

[-- Attachment #1: Type: text/plain, Size: 5006 bytes --]

Hi again,

after some more testing, I have found a cause for this.
We disable non wakeup gpes (and store those values) with interrupts disabled,
but enable those with interrupts enabled which were already overwritten while
handling of wakeup interrupt[1]. So we must restore non wakeup gpes as long
interrupts are disabled. Attached patch should fix it.

P.S. With patch attached sleep button works after S1 resume...

[1] Debug log w/o a patch:
Feb 15 15:49:24 rose kernel: acpi_enter_sleep_state
Feb 15 15:49:24 rose kernel:
acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
gpe_register_info(0xcefec548) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1022 gpe_register_info->enable=0x11
Feb 15 15:49:24 rose kernel:
acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
gpe_register_info(0xcefec564) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1023 gpe_register_info->enable=0x5d
Feb 15 15:49:24 rose kernel:
acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
gpe_register_info(0xcefec4c8) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1032 gpe_register_info->enable=0x0
Feb 15 15:49:24 rose kernel:
acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
gpe_register_info(0xcefec4e4) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1033 gpe_register_info->enable=0x0
Feb 15 15:49:24 rose kernel: Back to C!
Feb 15 15:49:24 rose kernel: evevent-0229 [20] ev_fixed_event_detect : Fixed
Event Block: Enable 00000120 Status 00008100
Feb 15 15:49:24 rose kernel: evgpe-0191 [20] ev_gpe_detect : GPE
pair: Status 0000000000001020 = 80, Enable 0000000000001022 = 00
Feb 15 15:49:24 rose kernel: evgpe-0191 [20] ev_gpe_detect : GPE
pair: Status 0000000000001021 = 00, Enable 0000000000001023 = 00
Feb 15 15:49:24 rose kernel: evgpe-0191 [20] ev_gpe_detect : GPE
pair: Status 0000000000001030 = F8, Enable 0000000000001032 = 00
Feb 15 15:49:24 rose kernel: evgpe-0191 [20] ev_gpe_detect : GPE
pair: Status 0000000000001031 = A7, Enable 0000000000001033 = 00
Feb 15 15:49:24 rose kernel: acpi_leave_sleep_state
acpi_hw_enable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
gpe_register_info(0xcefec548) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1022 gpe_register_info->enable=0x0
Feb 15 15:49:24 rose kernel:
acpi_hw_enable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
gpe_register_info(0xcefec564) gpe_register_info->wake_enable=0x0
gpe_register_info->enable_address=0x1023 gpe_register_info->enable=0x0

On Saturday 14 February 2004 23:17, Alexander Malysh wrote:
> Hi all,
>
> I have found a bug? in linux acpi that values within gpe_register_info are
> overwritten. Please see these values (note: only system_io gpe_register
> were dumped):
>
> 1) system go into S1
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
> gpe_register_info(0xcefec548) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1022 gpe_register_info->enable=0x11
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
> gpe_register_info(0xcefec564) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1023 gpe_register_info->enable=0x5d
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
> gpe_register_info(0xcefec4c8) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1032 gpe_register_info->enable=0x0
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
> gpe_register_info(0xcefec4e4) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1033 gpe_register_info->enable=0x0
>
> 2) system wakeup
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
> gpe_register_info(0xcefec548) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1022 gpe_register_info->enable=0x0
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef335c8)
> gpe_register_info(0xcefec564) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1023 gpe_register_info->enable=0x0
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
> gpe_register_info(0xcefec4c8) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1032 gpe_register_info->enable=0x0
> Feb 14 23:01:08 rose kernel:
> acpi_hw_disable_non_wakeup_gpe_block:gpe_block(0xcef33568)
> gpe_register_info(0xcefec4e4) gpe_register_info->wake_enable=0x0
> gpe_register_info->enable_address=0x1033 gpe_register_info->enable=0x0
>
> As you can see, io_addr 0x1022 and 0x1023 were restored with wrong values.
>
> any thoughts or patches to try?

--
Please avoid sending me Word, Excel or PowerPoint attachments.
See http://www.fsf.org/philosophy/no-word-attachments.html

[-- Attachment #2: acpi_hw_enable_non_wakeup_gpes.diff --]
[-- Type: text/x-diff, Size: 747 bytes --]

--- linux-2.6.2-linus/drivers/acpi/hardware/hwsleep.c~orig 2004-02-15 16:31:50.928455040 +0100
+++ linux-2.6.2-linus/drivers/acpi/hardware/hwsleep.c 2004-02-15 16:35:30.030146520 +0100
@@ -342,6 +342,12 @@

} while (!in_value);

+ /* Enable non_wakeup_gpes as long interrupts are disabled */
+ status = acpi_hw_enable_non_wakeup_gpes ();
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+
return_ACPI_STATUS (AE_OK);
}

@@ -496,11 +502,6 @@

/* _WAK returns stuff - do we want to look at it? */

- status = acpi_hw_enable_non_wakeup_gpes ();
- if (ACPI_FAILURE (status)) {
- return_ACPI_STATUS (status);
- }
-
/* Enable BM arbitration */

status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK);