aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTyler Baicar <tbaicar@codeaurora.org>2017-11-28 16:48:09 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-12-04 20:10:13 -0500
commit9852ce9ae213d39a98f161db84b90b047fbdc436 (patch)
tree4c872e8a78f3a08bf40200e82555f39c6831ac84
parent3c5b977f06b754b00a49ee7bf1595491afab7de6 (diff)
ACPI: APEI: call into AER handling regardless of severity
Currently the GHES code only calls into the AER driver for recoverable type errors. This is incorrect because errors of other severities do not get logged by the AER driver and do not get exposed to user space via the AER trace event. So, call into the AER driver for PCIe errors regardless of the severity Signed-off-by: Tyler Baicar <tbaicar@codeaurora.org> Reviewed-by: Borislav Petkov <bp@suse.de> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/apei/ghes.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index f67eb763e950..cc65d1992635 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -414,14 +414,26 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
414#endif 414#endif
415} 415}
416 416
417static void ghes_handle_aer(struct acpi_hest_generic_data *gdata, int sev, int sec_sev) 417/*
418 * PCIe AER errors need to be sent to the AER driver for reporting and
419 * recovery. The GHES severities map to the following AER severities and
420 * require the following handling:
421 *
422 * GHES_SEV_CORRECTABLE -> AER_CORRECTABLE
423 * These need to be reported by the AER driver but no recovery is
424 * necessary.
425 * GHES_SEV_RECOVERABLE -> AER_NONFATAL
426 * GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL
427 * These both need to be reported and recovered from by the AER driver.
428 * GHES_SEV_PANIC does not make it to this handling since the kernel must
429 * panic.
430 */
431static void ghes_handle_aer(struct acpi_hest_generic_data *gdata)
418{ 432{
419#ifdef CONFIG_ACPI_APEI_PCIEAER 433#ifdef CONFIG_ACPI_APEI_PCIEAER
420 struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata); 434 struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
421 435
422 if (sev == GHES_SEV_RECOVERABLE && 436 if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
423 sec_sev == GHES_SEV_RECOVERABLE &&
424 pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
425 pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) { 437 pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
426 unsigned int devfn; 438 unsigned int devfn;
427 int aer_severity; 439 int aer_severity;
@@ -475,7 +487,7 @@ static void ghes_do_proc(struct ghes *ghes,
475 ghes_handle_memory_failure(gdata, sev); 487 ghes_handle_memory_failure(gdata, sev);
476 } 488 }
477 else if (guid_equal(sec_type, &CPER_SEC_PCIE)) { 489 else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
478 ghes_handle_aer(gdata, sev, sec_sev); 490 ghes_handle_aer(gdata);
479 } 491 }
480 else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) { 492 else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
481 struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata); 493 struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);