|
@@ -414,14 +414,26 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static void ghes_handle_aer(struct acpi_hest_generic_data *gdata, int sev, int sec_sev)
|
|
|
+/*
|
|
|
+ * PCIe AER errors need to be sent to the AER driver for reporting and
|
|
|
+ * recovery. The GHES severities map to the following AER severities and
|
|
|
+ * require the following handling:
|
|
|
+ *
|
|
|
+ * GHES_SEV_CORRECTABLE -> AER_CORRECTABLE
|
|
|
+ * These need to be reported by the AER driver but no recovery is
|
|
|
+ * necessary.
|
|
|
+ * GHES_SEV_RECOVERABLE -> AER_NONFATAL
|
|
|
+ * GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL
|
|
|
+ * These both need to be reported and recovered from by the AER driver.
|
|
|
+ * GHES_SEV_PANIC does not make it to this handling since the kernel must
|
|
|
+ * panic.
|
|
|
+ */
|
|
|
+static void ghes_handle_aer(struct acpi_hest_generic_data *gdata)
|
|
|
{
|
|
|
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
|
|
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
|
|
|
|
|
|
- if (sev == GHES_SEV_RECOVERABLE &&
|
|
|
- sec_sev == GHES_SEV_RECOVERABLE &&
|
|
|
- pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
|
|
+ if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
|
|
pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
|
|
|
unsigned int devfn;
|
|
|
int aer_severity;
|
|
@@ -475,7 +487,7 @@ static void ghes_do_proc(struct ghes *ghes,
|
|
|
ghes_handle_memory_failure(gdata, sev);
|
|
|
}
|
|
|
else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
|
|
|
- ghes_handle_aer(gdata, sev, sec_sev);
|
|
|
+ ghes_handle_aer(gdata);
|
|
|
}
|
|
|
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
|
|
|
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
|