aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/mce_amd.c
diff options
context:
space:
mode:
authorBorislav Petkov <borislav.petkov@amd.com>2010-09-22 09:28:59 -0400
committerBorislav Petkov <borislav.petkov@amd.com>2011-01-07 05:54:19 -0500
commit8259a7e5724c42c89d927b92cda3e0ab15b9ade9 (patch)
tree9b6f55194f8566c4a13350059d61562c6e116b5b /drivers/edac/mce_amd.c
parent05cd667d668eb08845dd49c02130e5223121b715 (diff)
EDAC, MCE: Add F15 EX MCE decoder
Integrate the single FIROB signature into an expanded table along with the new BD MCE types. Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Diffstat (limited to 'drivers/edac/mce_amd.c')
-rw-r--r--drivers/edac/mce_amd.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index efbcb5389e80..afda6de5d7e3 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -112,6 +112,22 @@ static const char * const f15h_cu_mce_desc[] = {
112 "PRB address parity error" 112 "PRB address parity error"
113}; 113};
114 114
115static const char * const fr_ex_mce_desc[] = {
116 "CPU Watchdog timer expire",
117 "Wakeup array dest tag",
118 "AG payload array",
119 "EX payload array",
120 "IDRF array",
121 "Retire dispatch queue",
122 "Mapper checkpoint array",
123 "Physical register file EX0 port",
124 "Physical register file EX1 port",
125 "Physical register file AG0 port",
126 "Physical register file AG1 port",
127 "Flag register file",
128 "DE correctable error could not be corrected"
129};
130
115static bool f12h_dc_mce(u16 ec, u8 xec) 131static bool f12h_dc_mce(u16 ec, u8 xec)
116{ 132{
117 bool ret = false; 133 bool ret = false;
@@ -651,15 +667,26 @@ EXPORT_SYMBOL_GPL(amd_decode_nb_mce);
651 667
652static void amd_decode_fr_mce(struct mce *m) 668static void amd_decode_fr_mce(struct mce *m)
653{ 669{
654 if (boot_cpu_data.x86 == 0xf || 670 struct cpuinfo_x86 *c = &boot_cpu_data;
655 boot_cpu_data.x86 == 0x11) 671 u8 xec = (m->status >> 16) & xec_mask;
672
673 if (c->x86 == 0xf || c->x86 == 0x11)
656 goto wrong_fr_mce; 674 goto wrong_fr_mce;
657 675
658 /* we have only one error signature so match all fields at once. */ 676 if (c->x86 != 0x15 && xec != 0x0)
659 if ((m->status & 0xffff) == 0x0f0f) { 677 goto wrong_fr_mce;
660 pr_emerg(HW_ERR "FR Error: CPU Watchdog timer expire.\n"); 678
661 return; 679 pr_emerg(HW_ERR "%s Error: ",
662 } 680 (c->x86 == 0x15 ? "Execution Unit" : "FIROB"));
681
682 if (xec == 0x0 || xec == 0xc)
683 pr_cont("%s.\n", fr_ex_mce_desc[xec]);
684 else if (xec < 0xd)
685 pr_cont("%s parity error.\n", fr_ex_mce_desc[xec]);
686 else
687 goto wrong_fr_mce;
688
689 return;
663 690
664wrong_fr_mce: 691wrong_fr_mce:
665 pr_emerg(HW_ERR "Corrupted FR MCE info?\n"); 692 pr_emerg(HW_ERR "Corrupted FR MCE info?\n");