Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions arch/x86/include/asm/mce.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,11 +295,11 @@ struct cper_sec_mem_err;
extern void apei_mce_report_mem_error(int corrected,
struct cper_sec_mem_err *mem_err);

extern void zx_apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err);
extern void zx_apei_mce_report_mem_error(struct cper_sec_mem_err *mem_err);
struct cper_sec_pcie;
extern void zx_apei_mce_report_pcie_error(int corrected, struct cper_sec_pcie *pcie_err);
struct cper_sec_proc_generic;
extern void zx_apei_mce_report_zdi_error(int corrected, struct cper_sec_proc_generic *zdi_err);
extern void zx_apei_mce_report_zdi_error(struct cper_sec_proc_generic *zdi_err);

/*
* Enumerate new IP types and HWID values in AMD processors which support
Expand Down
14 changes: 9 additions & 5 deletions arch/x86/kernel/acpi/apei.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
#ifdef CONFIG_X86_MCE
if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN ||
boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR)
zx_apei_mce_report_mem_error(sev, mem_err);
zx_apei_mce_report_mem_error(mem_err);
else
apei_mce_report_mem_error(sev, mem_err);
#endif
Expand All @@ -57,13 +57,17 @@ void arch_apei_report_pcie_error(int sev, struct cper_sec_pcie *pcie_err)
#endif
}

void arch_apei_report_zdi_error(int sev, struct cper_sec_proc_generic *zdi_err)
bool arch_apei_report_zdi_error(guid_t *sec_type, struct cper_sec_proc_generic *zdi_err)
{
#ifdef CONFIG_X86_MCE
if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN ||
boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR)
zx_apei_mce_report_zdi_error(sev, zdi_err);
if ((boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR ||
boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN) &&
(guid_equal(sec_type, &CPER_SEC_PROC_GENERIC))) {
zx_apei_mce_report_zdi_error(zdi_err);
return true;
}
#endif
return false;
}

int arch_apei_report_x86_error(struct cper_ia_proc_ctx *ctx_info, u64 lapic_id)
Expand Down
18 changes: 10 additions & 8 deletions arch/x86/kernel/cpu/mce/apei.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err)
}
EXPORT_SYMBOL_GPL(apei_mce_report_mem_error);

void zx_apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err)
void zx_apei_mce_report_mem_error(struct cper_sec_mem_err *mem_err)
{
struct mce m;
int apei_error = 0;
Expand Down Expand Up @@ -92,18 +92,19 @@ void zx_apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err
apei_error = apei_write_mce(&m);
break;
case 8:
if (mem_err->requestor_id == 2)
if (mem_err->requestor_id == 2) {
m.status = 0x98200040000400b0;
else if (mem_err->requestor_id == 3) {
} else if (mem_err->requestor_id == 3) {
m.status = 0xba400000000600a0;
apei_error = apei_write_mce(&m);
} else if (mem_err->requestor_id == 4)
} else if (mem_err->requestor_id == 4) {
m.status = 0x98200100000300b0;
else if (mem_err->requestor_id == 5) {
} else if (mem_err->requestor_id == 5) {
m.status = 0xba000000000500b0;
apei_error = apei_write_mce(&m);
} else
} else {
pr_info("Undefined Parity error\n");
}
break;
case 10:
if (mem_err->requestor_id == 6) {
Expand All @@ -112,8 +113,9 @@ void zx_apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err
} else if (mem_err->requestor_id == 7) {
m.status = 0xba000000000800b0;
apei_error = apei_write_mce(&m);
} else
} else {
pr_info("Undefined dvad error\n");
}
break;
case 13:
m.status = 0x9c200040000100c0;
Expand Down Expand Up @@ -163,7 +165,7 @@ void zx_apei_mce_report_pcie_error(int severity, struct cper_sec_pcie *pcie_err)
}
EXPORT_SYMBOL_GPL(zx_apei_mce_report_pcie_error);

void zx_apei_mce_report_zdi_error(int severity, struct cper_sec_proc_generic *zdi_err)
void zx_apei_mce_report_zdi_error(struct cper_sec_proc_generic *zdi_err)
{
struct mce m;
int apei_error = 0;
Expand Down
3 changes: 2 additions & 1 deletion drivers/acpi/apei/apei-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -778,8 +778,9 @@ void __weak arch_apei_report_pcie_error(int sev, struct cper_sec_pcie *pcie_err)
}
EXPORT_SYMBOL_GPL(arch_apei_report_pcie_error);

void __weak arch_apei_report_zdi_error(int sev, struct cper_sec_proc_generic *zdi_err)
bool __weak arch_apei_report_zdi_error(guid_t *sec_type, struct cper_sec_proc_generic *zdi_err)
{
return false;
}
EXPORT_SYMBOL_GPL(arch_apei_report_zdi_error);

Expand Down
19 changes: 9 additions & 10 deletions drivers/acpi/apei/ghes.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,7 @@ static bool ghes_do_proc(struct ghes *ghes,

atomic_notifier_call_chain(&ghes_report_chain, sev, mem_err);

arch_apei_report_mem_error(sec_sev, mem_err);
arch_apei_report_mem_error(sev, mem_err);
queued = ghes_handle_memory_failure(gdata, sev, sync);
}
else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
Expand All @@ -710,17 +710,16 @@ static bool ghes_do_proc(struct ghes *ghes,
}
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
queued = ghes_handle_arm_hw_error(gdata, sev, sync);
} else if (guid_equal(sec_type, &CPER_SEC_PROC_GENERIC)) {
struct cper_sec_proc_generic *zdi_err = acpi_hest_get_payload(gdata);

arch_apei_report_zdi_error(sec_sev, zdi_err);
} else {
void *err = acpi_hest_get_payload(gdata);

ghes_defer_non_standard_event(gdata, sev);
log_non_standard_event(sec_type, fru_id, fru_text,
sec_sev, err,
gdata->error_data_length);
if (!arch_apei_report_zdi_error(sec_type,
(struct cper_sec_proc_generic *)err)) {
ghes_defer_non_standard_event(gdata, sev);
log_non_standard_event(sec_type, fru_id, fru_text,
sec_sev, err,
gdata->error_data_length);
}
}
}

Expand Down Expand Up @@ -1149,7 +1148,7 @@ static int ghes_in_nmi_queue_one_entry(struct ghes *ghes,
struct cper_sec_proc_generic *zdi_err =
acpi_hest_get_payload(gdata);

arch_apei_report_zdi_error(sev, zdi_err);
arch_apei_report_zdi_error(sec_type, zdi_err);
}
}
ghes_print_queued_estatus();
Expand Down
2 changes: 1 addition & 1 deletion include/acpi/apei.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ int erst_clear(u64 record_id);
int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data);
void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err);
void arch_apei_report_pcie_error(int sev, struct cper_sec_pcie *pcie_err);
void arch_apei_report_zdi_error(int sev, struct cper_sec_proc_generic *zdi_err);
bool arch_apei_report_zdi_error(guid_t *sec_type, struct cper_sec_proc_generic *zdi_err);

#endif
#endif