Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[linux-6.6.y] efi: cper: Add Zhaoxin/Centaur ZDI/ZPI error decode #288

Merged
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
53 changes: 53 additions & 0 deletions drivers/firmware/efi/cper.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,54 @@ static const char * const proc_flag_strs[] = {
"corrected",
};

static const char * const zdi_zpi_err_type_strs[] = {
"No Error",
"Training Error Status (PHY)",
"Data Link Protocol Error Status (DLL)",
"Surprise Down Error Status",
"Flow Control Protocol Error Status (TL)",
"Receiver Overflow Status (TL)",
"Receiver Error Status (PHY)",
"Bad TLP Status (DLL)",
"Bad Data Link Layer Packet (DLLP) Status (DLL)",
"REPLAY_NUM Rollover Status (DLL)",
"Replay Timer Timeout Status (DLL)",
"X16 Link Width Unreliable Status",
"ZPI X8 Link Width Unreliable Status",
"ZPI X4 Link Width Unreliable Status",
"ZPI X2 Link Width Unreliable Status",
"ZPI Gen3 Link Speed Unreliable Status",
"ZPI Gen2 Link Speed Unreliable Status",
"ZDI Gen3 Link Speed Unreliable Status",
"ZDI Gen4 Link Speed Unreliable Status",
};

const char *cper_zdi_zpi_err_type_str(unsigned int etype)
{
return etype < ARRAY_SIZE(zdi_zpi_err_type_strs) ?
zdi_zpi_err_type_strs[etype] : "unknown error";
}
EXPORT_SYMBOL_GPL(cper_zdi_zpi_err_type_str);

static void __maybe_unused
cper_print_proc_generic_zdi_zpi(const char *pfx, const struct cper_sec_proc_generic *zdi_zpi)
{
u8 etype = zdi_zpi->responder_id;

if ((zdi_zpi->requestor_id & 0xff) == 7) {
pr_info("%s general processor error(zpi error)\n", pfx);
} else if ((zdi_zpi->requestor_id & 0xff) == 6) {
pr_info("%s general processor error(zdi error)\n", pfx);
} else {
pr_info("%s general processor error(unknown error)\n", pfx);
return;
}
pr_info("%s bus number %llx device number %llx function number 0\n", pfx,
((zdi_zpi->requestor_id)>>8) & 0xff, zdi_zpi->requestor_id & 0xff);
pr_info("%s apic id %lld error_type: %s\n", pfx, zdi_zpi->proc_id,
cper_zdi_zpi_err_type_str(etype));
}

static void cper_print_proc_generic(const char *pfx,
const struct cper_sec_proc_generic *proc)
{
Expand Down Expand Up @@ -184,6 +232,11 @@ static void cper_print_proc_generic(const char *pfx,
pfx, proc->responder_id);
if (proc->validation_bits & CPER_PROC_VALID_IP)
printk("%s""IP: 0x%016llx\n", pfx, proc->ip);
#if IS_ENABLED(CONFIG_X86)
if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN ||
boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR)
cper_print_proc_generic_zdi_zpi(pfx, proc);
#endif
}

static const char * const mem_err_type_strs[] = {
Expand Down
1 change: 1 addition & 0 deletions include/linux/cper.h
Original file line number Diff line number Diff line change
Expand Up @@ -578,4 +578,5 @@ void cper_estatus_print(const char *pfx,
int cper_estatus_check_header(const struct acpi_hest_generic_status *estatus);
int cper_estatus_check(const struct acpi_hest_generic_status *estatus);

const char *cper_zdi_zpi_err_type_str(unsigned int etype);
#endif
Loading