diff options
author | Borislav Petkov <borislav.petkov@amd.com> | 2010-09-22 09:28:59 -0400 |
---|---|---|
committer | Borislav Petkov <borislav.petkov@amd.com> | 2011-01-07 05:54:19 -0500 |
commit | 8259a7e5724c42c89d927b92cda3e0ab15b9ade9 (patch) | |
tree | 9b6f55194f8566c4a13350059d61562c6e116b5b /drivers/edac/mce_amd.c | |
parent | 05cd667d668eb08845dd49c02130e5223121b715 (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.c | 41 |
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 | ||
115 | static 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 | |||
115 | static bool f12h_dc_mce(u16 ec, u8 xec) | 131 | static 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 | ||
652 | static void amd_decode_fr_mce(struct mce *m) | 668 | static 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 | ||
664 | wrong_fr_mce: | 691 | wrong_fr_mce: |
665 | pr_emerg(HW_ERR "Corrupted FR MCE info?\n"); | 692 | pr_emerg(HW_ERR "Corrupted FR MCE info?\n"); |