From f17d9cbf20c4734c4199caa6dee87047f2f8278f Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 11 Mar 2011 16:12:18 -0500 Subject: [PATCH 1/3] ACPICA: Fix access width for reset vector Section 4.7.3.6 of the ACPI specification requires that the register width of the reset vector be 8 bits. Windows simply hardcodes the access to be a byte and ignores the width provided in the FADT, so make sure that we do the same. Signed-off-by: Matthew Garrett Signed-off-by: Len Brown --- drivers/acpi/acpica/hwxface.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c index 6f98d210e71c..f75f81ad15c9 100644 --- a/drivers/acpi/acpica/hwxface.c +++ b/drivers/acpi/acpica/hwxface.c @@ -80,14 +80,14 @@ acpi_status acpi_reset(void) if (reset_reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { /* - * For I/O space, write directly to the OSL. This bypasses the port - * validation mechanism, which may block a valid write to the reset - * register. + * For I/O space, write directly to the OSL. This + * bypasses the port validation mechanism, which may + * block a valid write to the reset register. Spec + * section 4.7.3.6 requires register width to be 8. */ status = acpi_os_write_port((acpi_io_address) reset_reg->address, - acpi_gbl_FADT.reset_value, - reset_reg->bit_width); + acpi_gbl_FADT.reset_value, 8); } else { /* Write the reset value to the reset register */ From 6734fe57a07b2dd23ef1ef2ac1f790747e53eefc Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 11 Mar 2011 16:12:19 -0500 Subject: [PATCH 2/3] ACPI: Bug compatibility for Windows on the ACPI reboot vector Windows ignores the bit_offset and bit_width, despite the spec requiring that they be validated. Drop the checks so that we match this behaviour. Windows also goes straight for the keyboard controller if the ACPI reboot fails, so we shouldn't sleep if we're still alive. Signed-off-by: Matthew Garrett Signed-off-by: Len Brown --- drivers/acpi/reboot.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c index 93f91142d7ad..4870aaaa2ae1 100644 --- a/drivers/acpi/reboot.c +++ b/drivers/acpi/reboot.c @@ -15,9 +15,10 @@ void acpi_reboot(void) rr = &acpi_gbl_FADT.reset_register; - /* Is the reset register supported? */ - if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) || - rr->bit_width != 8 || rr->bit_offset != 0) + /* Is the reset register supported? The spec says we should be + * checking the bit width and bit offset, but Windows ignores + * these fields */ + if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER)) return; reset_value = acpi_gbl_FADT.reset_value; @@ -45,6 +46,4 @@ void acpi_reboot(void) acpi_reset(); break; } - /* Wait ten seconds */ - acpi_os_stall(10000000); } From 95cf3e12e7f659e536215b37c67d46f3e2ce95cc Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Fri, 11 Mar 2011 16:12:20 -0500 Subject: [PATCH 3/3] ACPI: Make sure the FADT is at least rev 2 before using the reset register The reset register was only introduced with version 2 of the FADT, so we should check that the FADT revision before trusting its contents. Signed-off-by: Matthew Garrett Signed-off-by: Len Brown --- drivers/acpi/reboot.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c index 4870aaaa2ae1..a6c77e8b37bd 100644 --- a/drivers/acpi/reboot.c +++ b/drivers/acpi/reboot.c @@ -15,6 +15,11 @@ void acpi_reboot(void) rr = &acpi_gbl_FADT.reset_register; + /* ACPI reset register was only introduced with v2 of the FADT */ + + if (acpi_gbl_FADT.header.revision < 2) + return; + /* Is the reset register supported? The spec says we should be * checking the bit width and bit offset, but Windows ignores * these fields */