summaryrefslogtreecommitdiff
path: root/drivers/acpi/reboot.c
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2020-10-13 15:35:57 +0800
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2020-10-16 18:04:52 +0200
commit9a4888888cc09b0ff3d0a1dd32df88742d29a293 (patch)
tree996376bd71c8900dd92afe2b656dae284ac609ee /drivers/acpi/reboot.c
parentcf1d2b44f6c701ffff58606b5b8a8996190d6e7d (diff)
ACPI: reboot: Avoid racing after writing to ACPI RESET_REG
According to the ACPI spec, "The system must reset immediately following the write to the ACPI RESET_REG register.", but there are cases that the system does not follow this and results in racing with the subsequetial reboot mechanism, which brings unexpected behavior. Fix this by adding a 15ms delay after writing to the ACPI RESET_REG. Reported-by: Ghorai, Sukumar <sukumar.ghorai@intel.com> Signed-off-by: Zhang Rui <rui.zhang@intel.com> [ rjw: Edit comment in the code and subject ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/reboot.c')
-rw-r--r--drivers/acpi/reboot.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c
index ca707f5b521d..2a61f884e222 100644
--- a/drivers/acpi/reboot.c
+++ b/drivers/acpi/reboot.c
@@ -3,6 +3,7 @@
#include <linux/pci.h>
#include <linux/acpi.h>
#include <acpi/reboot.h>
+#include <linux/delay.h>
#ifdef CONFIG_PCI
static void acpi_pci_reboot(struct acpi_generic_address *rr, u8 reset_value)
@@ -66,4 +67,14 @@ void acpi_reboot(void)
acpi_reset();
break;
}
+
+ /*
+ * Some platforms do not shut down immediately after writing to the
+ * ACPI reset register, and this results in racing with the
+ * subsequent reboot mechanism.
+ *
+ * The 15ms delay has been found to be long enough for the system
+ * to reboot on the affected platforms.
+ */
+ mdelay(15);
}