mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 01:51:34 +00:00
4a24d80b8c
The kernel uses ACPI Boot Error Record Table (BERT) to report fatal errors that occurred in a previous boot. The MCA errors in the BERT are reported using the x86 Processor Error Common Platform Error Record (CPER) format. Currently, the record prints out the raw MSR values and AMD relies on the raw record to provide MCA information. Extract the raw MSR values of MCA registers from the BERT and feed them into mce_log() to decode them properly. The implementation is SMCA-specific as the raw MCA register values are given in the register offset order of the SMCA address space. [ bp: Massage. ] [ Fix a build breakage in patch v1. ] Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Punit Agrawal <punit1.agrawal@toshiba.co.jp> Acked-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lkml.kernel.org/r/20201119182938.151155-1-Smita.KoralahalliChannabasappa@amd.com
51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Arch-specific APEI-related functions.
|
|
*/
|
|
|
|
#include <acpi/apei.h>
|
|
|
|
#include <asm/mce.h>
|
|
#include <asm/tlbflush.h>
|
|
|
|
int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data)
|
|
{
|
|
#ifdef CONFIG_X86_MCE
|
|
int i;
|
|
struct acpi_hest_ia_corrected *cmc;
|
|
struct acpi_hest_ia_error_bank *mc_bank;
|
|
|
|
cmc = (struct acpi_hest_ia_corrected *)hest_hdr;
|
|
if (!cmc->enabled)
|
|
return 0;
|
|
|
|
/*
|
|
* We expect HEST to provide a list of MC banks that report errors
|
|
* in firmware first mode. Otherwise, return non-zero value to
|
|
* indicate that we are done parsing HEST.
|
|
*/
|
|
if (!(cmc->flags & ACPI_HEST_FIRMWARE_FIRST) ||
|
|
!cmc->num_hardware_banks)
|
|
return 1;
|
|
|
|
pr_info("HEST: Enabling Firmware First mode for corrected errors.\n");
|
|
|
|
mc_bank = (struct acpi_hest_ia_error_bank *)(cmc + 1);
|
|
for (i = 0; i < cmc->num_hardware_banks; i++, mc_bank++)
|
|
mce_disable_bank(mc_bank->bank_number);
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
|
|
{
|
|
#ifdef CONFIG_X86_MCE
|
|
apei_mce_report_mem_error(sev, mem_err);
|
|
#endif
|
|
}
|
|
|
|
int arch_apei_report_x86_error(struct cper_ia_proc_ctx *ctx_info, u64 lapic_id)
|
|
{
|
|
return apei_smca_report_x86_error(ctx_info, lapic_id);
|
|
}
|