summary refs log tree commit diff
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
parentcf1d2b44f6c701ffff58606b5b8a8996190d6e7d (diff)
downloadlinux-9a4888888cc09b0ff3d0a1dd32df88742d29a293.tar.gz
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>
-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);
 }