Skip to content

Commit 612c2ad

Browse files
yghannambp3tk0v
authored andcommitted
EDAC/mce_amd: Add support for FRU text in MCA
A new "FRU Text in MCA" feature is defined where the Field Replaceable Unit (FRU) Text for a device is represented by a string in the new MCA_SYND1 and MCA_SYND2 registers. This feature is supported per MCA bank, and it is advertised by the McaFruTextInMca bit (MCA_CONFIG[9]). The FRU Text is populated dynamically for each individual error state (MCA_STATUS, MCA_ADDR, et al.). Handle the case where an MCA bank covers multiple devices, for example, a Unified Memory Controller (UMC) bank that manages two DIMMs. [ Yazen: Add Avadhut as co-developer for wrapper changes. ] [ bp: Do not expose MCA_CONFIG to userspace yet. ] Signed-off-by: Yazen Ghannam <[email protected]> Co-developed-by: Avadhut Naik <[email protected]> Signed-off-by: Avadhut Naik <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent e9876da commit 612c2ad

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

arch/x86/include/asm/mce.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
* - TCC bit is present in MCx_STATUS.
6262
*/
6363
#define MCI_CONFIG_MCAX 0x1
64+
#define MCI_CONFIG_FRUTEXT BIT_ULL(9)
6465
#define MCI_IPID_MCATYPE 0xFFFF0000
6566
#define MCI_IPID_HWID 0xFFF
6667

drivers/edac/mce_amd.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
795795
struct mce *m = (struct mce *)data;
796796
struct mce_hw_err *err = to_mce_hw_err(m);
797797
unsigned int fam = x86_family(m->cpuid);
798+
u32 mca_config_lo = 0, dummy;
798799
int ecc;
799800

800801
if (m->kflags & MCE_HANDLED_CEC)
@@ -814,11 +815,9 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
814815
((m->status & MCI_STATUS_PCC) ? "PCC" : "-"));
815816

816817
if (boot_cpu_has(X86_FEATURE_SMCA)) {
817-
u32 low, high;
818-
u32 addr = MSR_AMD64_SMCA_MCx_CONFIG(m->bank);
818+
rdmsr_safe(MSR_AMD64_SMCA_MCx_CONFIG(m->bank), &mca_config_lo, &dummy);
819819

820-
if (!rdmsr_safe(addr, &low, &high) &&
821-
(low & MCI_CONFIG_MCAX))
820+
if (mca_config_lo & MCI_CONFIG_MCAX)
822821
pr_cont("|%s", ((m->status & MCI_STATUS_TCC) ? "TCC" : "-"));
823822

824823
pr_cont("|%s", ((m->status & MCI_STATUS_SYNDV) ? "SyndV" : "-"));
@@ -853,8 +852,15 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
853852

854853
if (m->status & MCI_STATUS_SYNDV) {
855854
pr_cont(", Syndrome: 0x%016llx\n", m->synd);
856-
pr_emerg(HW_ERR "Syndrome1: 0x%016llx, Syndrome2: 0x%016llx",
857-
err->vendor.amd.synd1, err->vendor.amd.synd2);
855+
if (mca_config_lo & MCI_CONFIG_FRUTEXT) {
856+
char frutext[17];
857+
858+
frutext[16] = '\0';
859+
memcpy(&frutext[0], &err->vendor.amd.synd1, 8);
860+
memcpy(&frutext[8], &err->vendor.amd.synd2, 8);
861+
862+
pr_emerg(HW_ERR "FRU Text: %s", frutext);
863+
}
858864
}
859865

860866
pr_cont("\n");

0 commit comments

Comments
 (0)