[RFC/RFT PATCH 2/2] ACPI / APEI: Add DMI matching quirks for platforms that require hest_disable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Some RAS errors are related to an invalid hardware access that was
made by software. Sometimes this happens before the kernel runs.

For example, HPE's ProLiant m400 Server (aka moonshot) trips the
platforms RAS mechanism during UEFI's ExitBootServices. Once the
kernel probes the RAS error descriptor regions, it finds a stale
'fatal error', and hits the deck.

Add a table of DMI matches to allow platforms like this to be
quirked. For moonshot we also want to know the UEFI firmware
version, as this appears to be where the faulting access happens.

This quirk causes the following to be printed during boot:
| [    2.491990] HEST: disabled due to firmware quirk
| [    2.496659] HEST: Table parsing disabled.
[...]
| [    6.341314] GHES: HEST is not enabled!

Link: https://bugzilla.redhat.com/show_bug.cgi?id=1574718
Link: https://www.spinics.net/lists/arm-kernel/msg660956.html
Signed-off-by: James Morse <james.morse@xxxxxxx>
CC: Mark Salter <msalter@xxxxxxxxxx>
CC: Geoff Levand <geoff@xxxxxxxxxxxxx>
---
 drivers/acpi/apei/hest.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c
index b1e9f81ebeea..d0e49f0cd353 100644
--- a/drivers/acpi/apei/hest.c
+++ b/drivers/acpi/apei/hest.c
@@ -23,6 +23,8 @@
  * GNU General Public License for more details.
  */
 
+#include <linux/efi.h>
+#include <linux/dmi.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -212,6 +214,40 @@ err:
 	goto out;
 }
 
+static int __init quirk_hpe_moonshot_m400(const struct dmi_system_id *d)
+{
+	/* Only 'EFI v2.60 by HPE' is known to be affected */
+	unsigned int affected_version = (2<<16) | 60;
+
+	if (!IS_ENABLED(CONFIG_EFI))
+		return 0;
+
+	if (efi_get_runtime_version() == affected_version) {
+		pr_info(HEST_PFX "disabled due to firmware quirk\n");
+		hest_disable = HEST_DISABLED;
+	}
+
+	return 0;
+}
+
+static const struct dmi_system_id hest_quirk_dmi_table[]  __initconst = {
+	{
+		.callback = quirk_hpe_moonshot_m400,
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR,	"HPE"),
+			DMI_MATCH(DMI_PRODUCT_NAME,	"ProLiant m400 Server"),
+			DMI_MATCH(DMI_BOARD_NAME,	"ProLiant m400 Server"),
+			DMI_MATCH(DMI_BIOS_VERSION,	"U02"),
+		},
+	},
+	{},
+};
+
+static void __init acpi_hest_quirks(void)
+{
+	dmi_check_system(hest_quirk_dmi_table);
+}
+
 static int __init setup_hest_disable(char *str)
 {
 	hest_disable = HEST_DISABLED;
@@ -226,6 +262,8 @@ void __init acpi_hest_init(void)
 	int rc = -ENODEV;
 	unsigned int ghes_count = 0;
 
+	acpi_hest_quirks();
+
 	if (hest_disable) {
 		pr_info(HEST_PFX "Table parsing disabled.\n");
 		return;
-- 
2.17.1

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux