* [PATCH 00/12] EDAC, MCE: F15h MCE decoding
@ 2010-11-10 19:02 Borislav Petkov
2010-11-10 19:02 ` [PATCH 01/12] EDAC, MCE: Select extended error code mask Borislav Petkov
` (11 more replies)
0 siblings, 12 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Hi all,
this is the final set of MCE decoding changes. It adds support for MCE
signatures generated by the new BD core. I'll add them to the linux-next
mix in the following days and one fine day aim them at the next merge
window.
All suggestions are welcome, as always.
Thanks.
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 01/12] EDAC, MCE: Select extended error code mask
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:12 ` Luck, Tony
2010-11-10 19:02 ` [PATCH 02/12] EDAC, MCE: Add F15h DC MCE decoder Borislav Petkov
` (10 subsequent siblings)
11 siblings, 1 reply; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
F15h enlarges the extended error code of an MCE to a 5-bit field
(MCi_STATUS[20:16]). Add a mask variable which default 0xf is overridden
on F15h.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index c018109..01853ee 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -5,6 +5,7 @@
static struct amd_decoder_ops *fam_ops;
+static u8 xec_mask = 0xf;
static u8 nb_err_cpumask = 0xf;
static bool report_gart_errors;
@@ -172,7 +173,7 @@ static bool f14h_dc_mce(u16 ec)
static void amd_decode_dc_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & 0xf;
+ u8 xec = (m->status >> 16) & xec_mask;
pr_emerg(HW_ERR "Data Cache Error: ");
@@ -257,7 +258,7 @@ static bool f14h_ic_mce(u16 ec)
static void amd_decode_ic_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & 0xf;
+ u8 xec = (m->status >> 16) & xec_mask;
pr_emerg(HW_ERR "Instruction Cache Error: ");
@@ -277,7 +278,7 @@ static void amd_decode_ic_mce(struct mce *m)
static void amd_decode_bu_mce(struct mce *m)
{
u32 ec = m->status & 0xffff;
- u32 xec = (m->status >> 16) & 0xf;
+ u32 xec = (m->status >> 16) & xec_mask;
pr_emerg(HW_ERR "Bus Unit Error");
@@ -319,7 +320,7 @@ wrong_bu_mce:
static void amd_decode_ls_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & 0xf;
+ u8 xec = (m->status >> 16) & xec_mask;
if (boot_cpu_data.x86 == 0x14) {
pr_emerg("You shouldn't be seeing an LS MCE on this cpu family,"
@@ -651,6 +652,10 @@ static int __init mce_amd_init(void)
fam_ops->nb_mce = nb_noop_mce;
break;
+ case 0x15:
+ xec_mask = 0x1f;
+ break;
+
default:
printk(KERN_WARNING "Huh? What family is that: %d?!\n",
boot_cpu_data.x86);
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 02/12] EDAC, MCE: Add F15h DC MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
2010-11-10 19:02 ` [PATCH 01/12] EDAC, MCE: Select extended error code mask Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 03/12] EDAC, MCE: Add F15h IC " Borislav Petkov
` (9 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Add a decoder for F15h DC MCEs to support the new types of DC MCEs
introduced by the BD microarchitecture.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 79 +++++++++++++++++++++++++++++++++++++-----------
drivers/edac/mce_amd.h | 2 +-
2 files changed, 62 insertions(+), 19 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 01853ee..12bae3b 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -75,7 +75,7 @@ static const char *f10h_nb_mce_desc[] = {
"ECC Error in the Probe Filter directory"
};
-static bool f12h_dc_mce(u16 ec)
+static bool f12h_dc_mce(u16 ec, u8 xec)
{
bool ret = false;
@@ -93,7 +93,7 @@ static bool f12h_dc_mce(u16 ec)
return ret;
}
-static bool f10h_dc_mce(u16 ec)
+static bool f10h_dc_mce(u16 ec, u8 xec)
{
u8 r4 = (ec >> 4) & 0xf;
u8 ll = ec & 0x3;
@@ -102,20 +102,20 @@ static bool f10h_dc_mce(u16 ec)
pr_cont("during data scrub.\n");
return true;
}
- return f12h_dc_mce(ec);
+ return f12h_dc_mce(ec, xec);
}
-static bool k8_dc_mce(u16 ec)
+static bool k8_dc_mce(u16 ec, u8 xec)
{
if (BUS_ERROR(ec)) {
pr_cont("during system linefill.\n");
return true;
}
- return f10h_dc_mce(ec);
+ return f10h_dc_mce(ec, xec);
}
-static bool f14h_dc_mce(u16 ec)
+static bool f14h_dc_mce(u16 ec, u8 xec)
{
u8 r4 = (ec >> 4) & 0xf;
u8 ll = ec & 0x3;
@@ -170,6 +170,54 @@ static bool f14h_dc_mce(u16 ec)
return ret;
}
+static bool f15h_dc_mce(u16 ec, u8 xec)
+{
+ bool ret = true;
+
+ if (MEM_ERROR(ec)) {
+
+ switch (xec) {
+ case 0x0:
+ pr_cont("Data Array access error.\n");
+ break;
+
+ case 0x1:
+ pr_cont("UC error during a linefill from L2/NB.\n");
+ break;
+
+ case 0x2:
+ case 0x11:
+ pr_cont("STQ access error.\n");
+ break;
+
+ case 0x3:
+ pr_cont("SCB access error.\n");
+ break;
+
+ case 0x10:
+ pr_cont("Tag error.\n");
+ break;
+
+ case 0x12:
+ pr_cont("LDQ access error.\n");
+ break;
+
+ default:
+ ret = false;
+ }
+ } else if (BUS_ERROR(ec)) {
+
+ if (!xec)
+ pr_cont("during system linefill.\n");
+ else
+ pr_cont(" Internal %s condition.\n",
+ ((xec == 1) ? "livelock" : "deadlock"));
+ } else
+ ret = false;
+
+ return ret;
+}
+
static void amd_decode_dc_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
@@ -183,20 +231,14 @@ static void amd_decode_dc_mce(struct mce *m)
if (tt == TT_DATA) {
pr_cont("%s TLB %s.\n", LL_MSG(ec),
- (xec ? "multimatch" : "parity error"));
+ ((xec == 2) ? "locked miss"
+ : (xec ? "multimatch" : "parity")));
return;
}
- else
- goto wrong_dc_mce;
- }
-
- if (!fam_ops->dc_mce(ec))
- goto wrong_dc_mce;
-
- return;
-
-wrong_dc_mce:
- pr_emerg(HW_ERR "Corrupted DC MCE info?\n");
+ } else if (fam_ops->dc_mce(ec, xec))
+ ;
+ else
+ pr_emerg(HW_ERR "Corrupted DC MCE info?\n");
}
static bool k8_ic_mce(u16 ec)
@@ -654,6 +696,7 @@ static int __init mce_amd_init(void)
case 0x15:
xec_mask = 0x1f;
+ fam_ops->dc_mce = f15h_dc_mce;
break;
default:
diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h
index 35f6e0e..c12394d 100644
--- a/drivers/edac/mce_amd.h
+++ b/drivers/edac/mce_amd.h
@@ -100,7 +100,7 @@ struct err_regs {
* per-family decoder ops
*/
struct amd_decoder_ops {
- bool (*dc_mce)(u16);
+ bool (*dc_mce)(u16, u8);
bool (*ic_mce)(u16);
bool (*nb_mce)(u16, u8);
};
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 03/12] EDAC, MCE: Add F15h IC MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
2010-11-10 19:02 ` [PATCH 01/12] EDAC, MCE: Select extended error code mask Borislav Petkov
2010-11-10 19:02 ` [PATCH 02/12] EDAC, MCE: Add F15h DC MCE decoder Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 04/12] EDAC, MCE: Add F15h CU " Borislav Petkov
` (8 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Add support for decoding F15h IC MCEs.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--
drivers/edac/mce_amd.h | 2 +-
2 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 12bae3b..158cd5f 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -75,6 +75,26 @@ static const char *f10h_nb_mce_desc[] = {
"ECC Error in the Probe Filter directory"
};
+static const char * const f15h_ic_mce_desc[] = {
+ "UC during a demand linefill from L2",
+ "Parity error during data load from IC",
+ "Parity error for IC valid bit",
+ "Main tag parity error",
+ "Parity error in prediction queue",
+ "PFB data/address parity error",
+ "Parity error in the branch status reg",
+ "PFB promotion address error",
+ "Tag error during probe/victimization",
+ "Parity error for IC probe tag valid bit",
+ "PFB non-cacheable bit parity error",
+ "PFB valid bit parity error", /* xec = 0xd */
+ "patch RAM", /* xec = 010 */
+ "uop queue",
+ "insn buffer",
+ "predecode buffer",
+ "fetch address FIFO"
+};
+
static bool f12h_dc_mce(u16 ec, u8 xec)
{
bool ret = false;
@@ -241,7 +261,7 @@ static void amd_decode_dc_mce(struct mce *m)
pr_emerg(HW_ERR "Corrupted DC MCE info?\n");
}
-static bool k8_ic_mce(u16 ec)
+static bool k8_ic_mce(u16 ec, u8 xec)
{
u8 ll = ec & 0x3;
u8 r4 = (ec >> 4) & 0xf;
@@ -276,7 +296,7 @@ static bool k8_ic_mce(u16 ec)
return ret;
}
-static bool f14h_ic_mce(u16 ec)
+static bool f14h_ic_mce(u16 ec, u8 xec)
{
u8 ll = ec & 0x3;
u8 tt = (ec >> 2) & 0x3;
@@ -297,6 +317,32 @@ static bool f14h_ic_mce(u16 ec)
return ret;
}
+static bool f15h_ic_mce(u16 ec, u8 xec)
+{
+ bool ret = true;
+
+ if (!MEM_ERROR(ec))
+ return false;
+
+ switch (xec) {
+ case 0x0 ... 0xa:
+ pr_cont("%s.\n", f15h_ic_mce_desc[xec]);
+ break;
+
+ case 0xd:
+ pr_cont("%s.\n", f15h_ic_mce_desc[xec-2]);
+ break;
+
+ case 0x10 ... 0x14:
+ pr_cont("Decoder %s parity error.\n", f15h_ic_mce_desc[xec-4]);
+ break;
+
+ default:
+ ret = false;
+ }
+ return ret;
+}
+
static void amd_decode_ic_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
@@ -311,7 +357,7 @@ static void amd_decode_ic_mce(struct mce *m)
bool k8 = (boot_cpu_data.x86 == 0xf && (m->status & BIT_64(58)));
pr_cont("during %s.\n", (k8 ? "system linefill" : "NB data read"));
- } else if (fam_ops->ic_mce(ec))
+ } else if (fam_ops->ic_mce(ec, xec))
;
else
pr_emerg(HW_ERR "Corrupted IC MCE info?\n");
@@ -697,6 +743,7 @@ static int __init mce_amd_init(void)
case 0x15:
xec_mask = 0x1f;
fam_ops->dc_mce = f15h_dc_mce;
+ fam_ops->ic_mce = f15h_ic_mce;
break;
default:
diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h
index c12394d..8398847 100644
--- a/drivers/edac/mce_amd.h
+++ b/drivers/edac/mce_amd.h
@@ -101,7 +101,7 @@ struct err_regs {
*/
struct amd_decoder_ops {
bool (*dc_mce)(u16, u8);
- bool (*ic_mce)(u16);
+ bool (*ic_mce)(u16, u8);
bool (*nb_mce)(u16, u8);
};
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/12] EDAC, MCE: Add F15h CU MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (2 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 03/12] EDAC, MCE: Add F15h IC " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 05/12] EDAC, MCE: No F15h LS " Borislav Petkov
` (7 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
MCE bank 2 is redefined from a BU to a CU (Combined Unit) bank on F15h.
Add a decoder function for CU MCEs.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 61 insertions(+), 1 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 158cd5f..7eb2706 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -95,6 +95,23 @@ static const char * const f15h_ic_mce_desc[] = {
"fetch address FIFO"
};
+static const char * const f15h_cu_mce_desc[] = {
+ "Fill ECC error on data fills", /* xec = 0x4 */
+ "Fill parity error on insn fills",
+ "Prefetcher request FIFO parity error",
+ "PRQ address parity error",
+ "PRQ data parity error",
+ "WCC Tag ECC error",
+ "WCC Data ECC error",
+ "WCB Data parity error",
+ "VB Data/ECC error",
+ "L2 Tag ECC error", /* xec = 0x10 */
+ "Hard L2 Tag ECC error",
+ "Multiple hits on L2 tag",
+ "XAB parity error",
+ "PRB address parity error"
+};
+
static bool f12h_dc_mce(u16 ec, u8 xec)
{
bool ret = false;
@@ -405,6 +422,46 @@ wrong_bu_mce:
pr_emerg(HW_ERR "Corrupted BU MCE info?\n");
}
+static void amd_decode_cu_mce(struct mce *m)
+{
+ u16 ec = m->status & 0xffff;
+ u8 xec = (m->status >> 16) & xec_mask;
+
+ pr_emerg(HW_ERR "Combined Unit Error: ");
+
+ if (TLB_ERROR(ec)) {
+ if (xec == 0x0)
+ pr_cont("Data parity TLB read error.\n");
+ else if (xec == 0x1)
+ pr_cont("Poison data provided for TLB fill.\n");
+ else
+ goto wrong_cu_mce;
+ } else if (BUS_ERROR(ec)) {
+ if (xec > 2)
+ goto wrong_cu_mce;
+
+ pr_cont("Error during attempted NB data read.\n");
+ } else if (MEM_ERROR(ec)) {
+ switch (xec) {
+ case 0x4 ... 0xc:
+ pr_cont("%s.\n", f15h_cu_mce_desc[xec - 0x4]);
+ break;
+
+ case 0x10 ... 0x14:
+ pr_cont("%s.\n", f15h_cu_mce_desc[xec - 0x7]);
+ break;
+
+ default:
+ goto wrong_cu_mce;
+ }
+ }
+
+ return;
+
+wrong_cu_mce:
+ pr_emerg(HW_ERR "Corrupted CU MCE info?\n");
+}
+
static void amd_decode_ls_mce(struct mce *m)
{
u16 ec = m->status & 0xffff;
@@ -665,7 +722,10 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
break;
case 2:
- amd_decode_bu_mce(m);
+ if (boot_cpu_data.x86 == 0x15)
+ amd_decode_cu_mce(m);
+ else
+ amd_decode_bu_mce(m);
break;
case 3:
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/12] EDAC, MCE: No F15h LS MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (3 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 04/12] EDAC, MCE: Add F15h CU " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 06/12] EDAC, MCE: Add an F15h NB " Borislav Petkov
` (6 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
F15h BD doesn't generate LS MCEs so warn about it.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 7eb2706..44e6cda 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -467,7 +467,7 @@ static void amd_decode_ls_mce(struct mce *m)
u16 ec = m->status & 0xffff;
u8 xec = (m->status >> 16) & xec_mask;
- if (boot_cpu_data.x86 == 0x14) {
+ if (boot_cpu_data.x86 >= 0x14) {
pr_emerg("You shouldn't be seeing an LS MCE on this cpu family,"
" please report on LKML.\n");
return;
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/12] EDAC, MCE: Add an F15h NB MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (4 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 05/12] EDAC, MCE: No F15h LS " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 07/12] EDAC, MCE: Add F15 EX " Borislav Petkov
` (5 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
by (almost) reusing the F10h one since the signatures are the same.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 44e6cda..efbcb53 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -556,6 +556,15 @@ static bool f10h_nb_mce(u16 ec, u8 xec)
goto out;
break;
+ case 0x19:
+ if (boot_cpu_data.x86 == 0x15)
+ pr_cont("Compute Unit Data Error.\n");
+ else
+ ret = false;
+
+ goto out;
+ break;
+
case 0x1c ... 0x1f:
offset = 24;
break;
@@ -804,6 +813,7 @@ static int __init mce_amd_init(void)
xec_mask = 0x1f;
fam_ops->dc_mce = f15h_dc_mce;
fam_ops->ic_mce = f15h_ic_mce;
+ fam_ops->nb_mce = f10h_nb_mce;
break;
default:
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/12] EDAC, MCE: Add F15 EX MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (5 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 06/12] EDAC, MCE: Add an F15h NB " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 08/12] EDAC, MCE: Add F15h FP " Borislav Petkov
` (4 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
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>
---
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 efbcb53..afda6de5 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[] = {
"PRB address parity error"
};
+static const char * const fr_ex_mce_desc[] = {
+ "CPU Watchdog timer expire",
+ "Wakeup array dest tag",
+ "AG payload array",
+ "EX payload array",
+ "IDRF array",
+ "Retire dispatch queue",
+ "Mapper checkpoint array",
+ "Physical register file EX0 port",
+ "Physical register file EX1 port",
+ "Physical register file AG0 port",
+ "Physical register file AG1 port",
+ "Flag register file",
+ "DE correctable error could not be corrected"
+};
+
static bool f12h_dc_mce(u16 ec, u8 xec)
{
bool ret = false;
@@ -651,15 +667,26 @@ EXPORT_SYMBOL_GPL(amd_decode_nb_mce);
static void amd_decode_fr_mce(struct mce *m)
{
- if (boot_cpu_data.x86 == 0xf ||
- boot_cpu_data.x86 == 0x11)
+ struct cpuinfo_x86 *c = &boot_cpu_data;
+ u8 xec = (m->status >> 16) & xec_mask;
+
+ if (c->x86 == 0xf || c->x86 == 0x11)
goto wrong_fr_mce;
- /* we have only one error signature so match all fields at once. */
- if ((m->status & 0xffff) == 0x0f0f) {
- pr_emerg(HW_ERR "FR Error: CPU Watchdog timer expire.\n");
- return;
- }
+ if (c->x86 != 0x15 && xec != 0x0)
+ goto wrong_fr_mce;
+
+ pr_emerg(HW_ERR "%s Error: ",
+ (c->x86 == 0x15 ? "Execution Unit" : "FIROB"));
+
+ if (xec == 0x0 || xec == 0xc)
+ pr_cont("%s.\n", fr_ex_mce_desc[xec]);
+ else if (xec < 0xd)
+ pr_cont("%s parity error.\n", fr_ex_mce_desc[xec]);
+ else
+ goto wrong_fr_mce;
+
+ return;
wrong_fr_mce:
pr_emerg(HW_ERR "Corrupted FR MCE info?\n");
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/12] EDAC, MCE: Add F15h FP MCE decoder
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (6 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 07/12] EDAC, MCE: Add F15 EX " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 09/12] EDAC, MCE: Overhaul error fields extraction macros Borislav Petkov
` (3 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Add decoder for FP MCEs.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index afda6de5..c14abe3 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -692,6 +692,46 @@ wrong_fr_mce:
pr_emerg(HW_ERR "Corrupted FR MCE info?\n");
}
+static void amd_decode_fp_mce(struct mce *m)
+{
+ u8 xec = (m->status >> 16) & xec_mask;
+
+ pr_emerg(HW_ERR "Floating Point Unit Error: ");
+
+ switch (xec) {
+ case 0x1:
+ pr_cont("Free List");
+ break;
+
+ case 0x2:
+ pr_cont("Physical Register File");
+ break;
+
+ case 0x3:
+ pr_cont("Retire Queue");
+ break;
+
+ case 0x4:
+ pr_cont("Scheduler table");
+ break;
+
+ case 0x5:
+ pr_cont("Status Register File");
+ break;
+
+ default:
+ goto wrong_fp_mce;
+ break;
+ }
+
+ pr_cont(" parity error.\n");
+
+ return;
+
+wrong_fp_mce:
+ pr_emerg(HW_ERR "Corrupted FP MCE info?\n");
+}
+
static inline void amd_decode_err_code(u16 ec)
{
if (TLB_ERROR(ec)) {
@@ -777,6 +817,10 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
amd_decode_fr_mce(m);
break;
+ case 6:
+ amd_decode_fp_mce(m);
+ break;
+
default:
break;
}
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/12] EDAC, MCE: Overhaul error fields extraction macros
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (7 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 08/12] EDAC, MCE: Add F15h FP " Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 10/12] EDAC, MCE: Shorten error report formatting Borislav Petkov
` (2 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Make macro names shorter thus making code shorter and more clear.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/amd64_edac.c | 4 +-
drivers/edac/mce_amd.c | 83 +++++++++++++++++++-------------------------
drivers/edac/mce_amd.h | 10 +++---
3 files changed, 43 insertions(+), 54 deletions(-)
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 8521401..dfbaa97 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -2055,8 +2055,8 @@ static void amd64_handle_ue(struct mem_ctl_info *mci,
static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
struct err_regs *info)
{
- u32 ec = ERROR_CODE(info->nbsl);
- u32 xec = EXT_ERROR_CODE(info->nbsl);
+ u16 ec = EC(info->nbsl);
+ u8 xec = XEC(info->nbsl, 0x1f);
int ecc_type = (info->nbsh >> 13) & 0x3;
/* Bail early out if this was an 'observed' error */
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index c14abe3..53d4dc0 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -133,13 +133,13 @@ static bool f12h_dc_mce(u16 ec, u8 xec)
bool ret = false;
if (MEM_ERROR(ec)) {
- u8 ll = ec & 0x3;
+ u8 ll = LL(ec);
ret = true;
if (ll == LL_L2)
pr_cont("during L1 linefill from L2.\n");
else if (ll == LL_L1)
- pr_cont("Data/Tag %s error.\n", RRRR_MSG(ec));
+ pr_cont("Data/Tag %s error.\n", R4_MSG(ec));
else
ret = false;
}
@@ -148,10 +148,7 @@ static bool f12h_dc_mce(u16 ec, u8 xec)
static bool f10h_dc_mce(u16 ec, u8 xec)
{
- u8 r4 = (ec >> 4) & 0xf;
- u8 ll = ec & 0x3;
-
- if (r4 == R4_GEN && ll == LL_L1) {
+ if (R4(ec) == R4_GEN && LL(ec) == LL_L1) {
pr_cont("during data scrub.\n");
return true;
}
@@ -170,15 +167,12 @@ static bool k8_dc_mce(u16 ec, u8 xec)
static bool f14h_dc_mce(u16 ec, u8 xec)
{
- u8 r4 = (ec >> 4) & 0xf;
- u8 ll = ec & 0x3;
- u8 tt = (ec >> 2) & 0x3;
- u8 ii = tt;
+ u8 r4 = R4(ec);
bool ret = true;
if (MEM_ERROR(ec)) {
- if (tt != TT_DATA || ll != LL_L1)
+ if (TT(ec) != TT_DATA || LL(ec) != LL_L1)
return false;
switch (r4) {
@@ -198,7 +192,7 @@ static bool f14h_dc_mce(u16 ec, u8 xec)
}
} else if (BUS_ERROR(ec)) {
- if ((ii != II_MEM && ii != II_IO) || ll != LL_LG)
+ if ((II(ec) != II_MEM && II(ec) != II_IO) || LL(ec) != LL_LG)
return false;
pr_cont("System read data error on a ");
@@ -273,16 +267,14 @@ static bool f15h_dc_mce(u16 ec, u8 xec)
static void amd_decode_dc_mce(struct mce *m)
{
- u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & xec_mask;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, xec_mask);
pr_emerg(HW_ERR "Data Cache Error: ");
/* TLB error signatures are the same across families */
if (TLB_ERROR(ec)) {
- u8 tt = (ec >> 2) & 0x3;
-
- if (tt == TT_DATA) {
+ if (TT(ec) == TT_DATA) {
pr_cont("%s TLB %s.\n", LL_MSG(ec),
((xec == 2) ? "locked miss"
: (xec ? "multimatch" : "parity")));
@@ -296,8 +288,7 @@ static void amd_decode_dc_mce(struct mce *m)
static bool k8_ic_mce(u16 ec, u8 xec)
{
- u8 ll = ec & 0x3;
- u8 r4 = (ec >> 4) & 0xf;
+ u8 ll = LL(ec);
bool ret = true;
if (!MEM_ERROR(ec))
@@ -306,7 +297,7 @@ static bool k8_ic_mce(u16 ec, u8 xec)
if (ll == 0x2)
pr_cont("during a linefill from L2.\n");
else if (ll == 0x1) {
- switch (r4) {
+ switch (R4(ec)) {
case R4_IRD:
pr_cont("Parity error during data load.\n");
break;
@@ -331,13 +322,11 @@ static bool k8_ic_mce(u16 ec, u8 xec)
static bool f14h_ic_mce(u16 ec, u8 xec)
{
- u8 ll = ec & 0x3;
- u8 tt = (ec >> 2) & 0x3;
- u8 r4 = (ec >> 4) & 0xf;
+ u8 r4 = R4(ec);
bool ret = true;
if (MEM_ERROR(ec)) {
- if (tt != 0 || ll != 1)
+ if (TT(ec) != 0 || LL(ec) != 1)
ret = false;
if (r4 == R4_IRD)
@@ -378,8 +367,8 @@ static bool f15h_ic_mce(u16 ec, u8 xec)
static void amd_decode_ic_mce(struct mce *m)
{
- u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & xec_mask;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, xec_mask);
pr_emerg(HW_ERR "Instruction Cache Error: ");
@@ -398,8 +387,8 @@ static void amd_decode_ic_mce(struct mce *m)
static void amd_decode_bu_mce(struct mce *m)
{
- u32 ec = m->status & 0xffff;
- u32 xec = (m->status >> 16) & xec_mask;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, xec_mask);
pr_emerg(HW_ERR "Bus Unit Error");
@@ -408,23 +397,23 @@ static void amd_decode_bu_mce(struct mce *m)
else if (xec == 0x3)
pr_cont(" in the victim data buffers.\n");
else if (xec == 0x2 && MEM_ERROR(ec))
- pr_cont(": %s error in the L2 cache tags.\n", RRRR_MSG(ec));
+ pr_cont(": %s error in the L2 cache tags.\n", R4_MSG(ec));
else if (xec == 0x0) {
if (TLB_ERROR(ec))
pr_cont(": %s error in a Page Descriptor Cache or "
"Guest TLB.\n", TT_MSG(ec));
else if (BUS_ERROR(ec))
pr_cont(": %s/ECC error in data read from NB: %s.\n",
- RRRR_MSG(ec), PP_MSG(ec));
+ R4_MSG(ec), PP_MSG(ec));
else if (MEM_ERROR(ec)) {
- u8 rrrr = (ec >> 4) & 0xf;
+ u8 r4 = R4(ec);
- if (rrrr >= 0x7)
+ if (r4 >= 0x7)
pr_cont(": %s error during data copyback.\n",
- RRRR_MSG(ec));
- else if (rrrr <= 0x1)
+ R4_MSG(ec));
+ else if (r4 <= 0x1)
pr_cont(": %s parity/ECC error during data "
- "access from L2.\n", RRRR_MSG(ec));
+ "access from L2.\n", R4_MSG(ec));
else
goto wrong_bu_mce;
} else
@@ -440,8 +429,8 @@ wrong_bu_mce:
static void amd_decode_cu_mce(struct mce *m)
{
- u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & xec_mask;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, xec_mask);
pr_emerg(HW_ERR "Combined Unit Error: ");
@@ -480,8 +469,8 @@ wrong_cu_mce:
static void amd_decode_ls_mce(struct mce *m)
{
- u16 ec = m->status & 0xffff;
- u8 xec = (m->status >> 16) & xec_mask;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, xec_mask);
if (boot_cpu_data.x86 >= 0x14) {
pr_emerg("You shouldn't be seeing an LS MCE on this cpu family,"
@@ -492,12 +481,12 @@ static void amd_decode_ls_mce(struct mce *m)
pr_emerg(HW_ERR "Load Store Error");
if (xec == 0x0) {
- u8 r4 = (ec >> 4) & 0xf;
+ u8 r4 = R4(ec);
if (!BUS_ERROR(ec) || (r4 != R4_DRD && r4 != R4_DWR))
goto wrong_ls_mce;
- pr_cont(" during %s.\n", RRRR_MSG(ec));
+ pr_cont(" during %s.\n", R4_MSG(ec));
} else
goto wrong_ls_mce;
@@ -605,8 +594,8 @@ static bool nb_noop_mce(u16 ec, u8 xec)
void amd_decode_nb_mce(int node_id, struct mce *m, u32 nbcfg)
{
- u8 xec = (m->status >> 16) & 0x1f;
- u16 ec = m->status & 0xffff;
+ u16 ec = EC(m->status);
+ u8 xec = XEC(m->status, 0x1f);
u32 nbsh = (u32)(m->status >> 32);
pr_emerg(HW_ERR "Northbridge Error, node %d: ", node_id);
@@ -668,7 +657,7 @@ EXPORT_SYMBOL_GPL(amd_decode_nb_mce);
static void amd_decode_fr_mce(struct mce *m)
{
struct cpuinfo_x86 *c = &boot_cpu_data;
- u8 xec = (m->status >> 16) & xec_mask;
+ u8 xec = XEC(m->status, xec_mask);
if (c->x86 == 0xf || c->x86 == 0x11)
goto wrong_fr_mce;
@@ -694,7 +683,7 @@ wrong_fr_mce:
static void amd_decode_fp_mce(struct mce *m)
{
- u8 xec = (m->status >> 16) & xec_mask;
+ u8 xec = XEC(m->status, xec_mask);
pr_emerg(HW_ERR "Floating Point Unit Error: ");
@@ -739,11 +728,11 @@ static inline void amd_decode_err_code(u16 ec)
TT_MSG(ec), LL_MSG(ec));
} else if (MEM_ERROR(ec)) {
pr_emerg(HW_ERR "Transaction: %s, Type: %s, Cache Level: %s\n",
- RRRR_MSG(ec), TT_MSG(ec), LL_MSG(ec));
+ R4_MSG(ec), TT_MSG(ec), LL_MSG(ec));
} else if (BUS_ERROR(ec)) {
pr_emerg(HW_ERR "Transaction: %s (%s), %s, Cache Level: %s, "
"Participating Processor: %s\n",
- RRRR_MSG(ec), II_MSG(ec), TO_MSG(ec), LL_MSG(ec),
+ R4_MSG(ec), II_MSG(ec), TO_MSG(ec), LL_MSG(ec),
PP_MSG(ec));
} else
pr_emerg(HW_ERR "Huh? Unknown MCE error 0x%x\n", ec);
diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h
index 8398847..45dda47 100644
--- a/drivers/edac/mce_amd.h
+++ b/drivers/edac/mce_amd.h
@@ -7,8 +7,8 @@
#define BIT_64(n) (U64_C(1) << (n))
-#define ERROR_CODE(x) ((x) & 0xffff)
-#define EXT_ERROR_CODE(x) (((x) >> 16) & 0x1f)
+#define EC(x) ((x) & 0xffff)
+#define XEC(x, mask) (((x) >> 16) & mask)
#define LOW_SYNDROME(x) (((x) >> 15) & 0xff)
#define HIGH_SYNDROME(x) (((x) >> 24) & 0xff)
@@ -21,15 +21,15 @@
#define TT_MSG(x) tt_msgs[TT(x)]
#define II(x) (((x) >> 2) & 0x3)
#define II_MSG(x) ii_msgs[II(x)]
-#define LL(x) (((x) >> 0) & 0x3)
+#define LL(x) ((x) & 0x3)
#define LL_MSG(x) ll_msgs[LL(x)]
#define TO(x) (((x) >> 8) & 0x1)
#define TO_MSG(x) to_msgs[TO(x)]
#define PP(x) (((x) >> 9) & 0x3)
#define PP_MSG(x) pp_msgs[PP(x)]
-#define RRRR(x) (((x) >> 4) & 0xf)
-#define RRRR_MSG(x) ((RRRR(x) < 9) ? rrrr_msgs[RRRR(x)] : "Wrong R4!")
+#define R4(x) (((x) >> 4) & 0xf)
+#define R4_MSG(x) ((R4(x) < 9) ? rrrr_msgs[R4(x)] : "Wrong R4!")
#define K8_NBSH 0x4C
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/12] EDAC, MCE: Shorten error report formatting
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (8 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 09/12] EDAC, MCE: Overhaul error fields extraction macros Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 11/12] EDAC, MCE: Allow F15h bank 6 MCE injection Borislav Petkov
2010-11-10 19:02 ` [PATCH 12/12] EDAC, MCE: Enable MCE decoding on F15h Borislav Petkov
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Shorten up MCi_STATUS flags and add BD's new deferred and poison types.
Also, simplify formatting.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 54 ++++++++++++++++++++++++++++-------------------
1 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 53d4dc0..0a19d26 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -723,19 +723,22 @@ wrong_fp_mce:
static inline void amd_decode_err_code(u16 ec)
{
- if (TLB_ERROR(ec)) {
- pr_emerg(HW_ERR "Transaction: %s, Cache Level: %s\n",
- TT_MSG(ec), LL_MSG(ec));
- } else if (MEM_ERROR(ec)) {
- pr_emerg(HW_ERR "Transaction: %s, Type: %s, Cache Level: %s\n",
- R4_MSG(ec), TT_MSG(ec), LL_MSG(ec));
- } else if (BUS_ERROR(ec)) {
- pr_emerg(HW_ERR "Transaction: %s (%s), %s, Cache Level: %s, "
- "Participating Processor: %s\n",
- R4_MSG(ec), II_MSG(ec), TO_MSG(ec), LL_MSG(ec),
- PP_MSG(ec));
- } else
- pr_emerg(HW_ERR "Huh? Unknown MCE error 0x%x\n", ec);
+
+ pr_emerg(HW_ERR "cache level: %s", LL_MSG(ec));
+
+ if (BUS_ERROR(ec))
+ pr_cont(", mem/io: %s", II_MSG(ec));
+ else
+ pr_cont(", tx: %s", TT_MSG(ec));
+
+ if (MEM_ERROR(ec) || BUS_ERROR(ec)) {
+ pr_cont(", mem-tx: %s", R4_MSG(ec));
+
+ if (BUS_ERROR(ec))
+ pr_cont(", part-proc: %s (%s)", PP_MSG(ec), TO_MSG(ec));
+ }
+
+ pr_cont("\n");
}
/*
@@ -757,25 +760,32 @@ static bool amd_filter_mce(struct mce *m)
int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
{
struct mce *m = (struct mce *)data;
+ struct cpuinfo_x86 *c = &boot_cpu_data;
int node, ecc;
if (amd_filter_mce(m))
return NOTIFY_STOP;
- pr_emerg(HW_ERR "MC%d_STATUS: ", m->bank);
+ pr_emerg(HW_ERR "MC%d_STATUS[%s|%s|%s|%s|%s",
+ m->bank,
+ ((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
+ ((m->status & MCI_STATUS_UC) ? "UE" : "CE"),
+ ((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
+ ((m->status & MCI_STATUS_PCC) ? "PCC" : "-"),
+ ((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
- pr_cont("%sorrected error, other errors lost: %s, "
- "CPU context corrupt: %s",
- ((m->status & MCI_STATUS_UC) ? "Unc" : "C"),
- ((m->status & MCI_STATUS_OVER) ? "yes" : "no"),
- ((m->status & MCI_STATUS_PCC) ? "yes" : "no"));
+ if (c->x86 == 0x15)
+ pr_cont("|%s|%s",
+ ((m->status & BIT(44)) ? "Deferred" : "-"),
+ ((m->status & BIT(43)) ? "Poison" : "-"));
/* do the two bits[14:13] together */
ecc = (m->status >> 45) & 0x3;
if (ecc)
- pr_cont(", %sECC Error", ((ecc == 2) ? "C" : "U"));
+ pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
+
+ pr_cont("]: 0x%016llx\n", m->status);
- pr_cont("\n");
switch (m->bank) {
case 0:
@@ -787,7 +797,7 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
break;
case 2:
- if (boot_cpu_data.x86 == 0x15)
+ if (c->x86 == 0x15)
amd_decode_cu_mce(m);
else
amd_decode_bu_mce(m);
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 11/12] EDAC, MCE: Allow F15h bank 6 MCE injection
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (9 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 10/12] EDAC, MCE: Shorten error report formatting Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 12/12] EDAC, MCE: Enable MCE decoding on F15h Borislav Petkov
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
F15h adds a sixth MCE bank: adjust bank number check in the injection
code.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd_inj.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c
index 8d0688f..6db494f 100644
--- a/drivers/edac/mce_amd_inj.c
+++ b/drivers/edac/mce_amd_inj.c
@@ -88,10 +88,11 @@ static ssize_t edac_inject_bank_store(struct kobject *kobj,
return -EINVAL;
}
- if (value > 5) {
- printk(KERN_ERR "Non-existant MCE bank: %lu\n", value);
- return -EINVAL;
- }
+ if (value > 5)
+ if (boot_cpu_data.x86 != 0x15 || value > 6) {
+ printk(KERN_ERR "Non-existant MCE bank: %lu\n", value);
+ return -EINVAL;
+ }
i_mce.bank = value;
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 12/12] EDAC, MCE: Enable MCE decoding on F15h
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
` (10 preceding siblings ...)
2010-11-10 19:02 ` [PATCH 11/12] EDAC, MCE: Allow F15h bank 6 MCE injection Borislav Petkov
@ 2010-11-10 19:02 ` Borislav Petkov
11 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:02 UTC (permalink / raw)
To: linux-edac; +Cc: linux-kernel, x86, Borislav Petkov
From: Borislav Petkov <borislav.petkov@amd.com>
Now that everything is inplace, enable MCE decoding on F15h. Make
initcall routine a bit more readable.
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
---
drivers/edac/mce_amd.c | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 0a19d26..59ad34c 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -836,18 +836,21 @@ static struct notifier_block amd_mce_dec_nb = {
static int __init mce_amd_init(void)
{
- if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
+ struct cpuinfo_x86 *c = &boot_cpu_data;
+
+ if (c->x86_vendor != X86_VENDOR_AMD)
return 0;
- if ((boot_cpu_data.x86 < 0xf || boot_cpu_data.x86 > 0x12) &&
- (boot_cpu_data.x86 != 0x14 || boot_cpu_data.x86_model > 0xf))
+ if ((c->x86 < 0xf || c->x86 > 0x12) &&
+ (c->x86 != 0x14 || c->x86_model > 0xf) &&
+ (c->x86 != 0x15 || c->x86_model > 0xf))
return 0;
fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
if (!fam_ops)
return -ENOMEM;
- switch (boot_cpu_data.x86) {
+ switch (c->x86) {
case 0xf:
fam_ops->dc_mce = k8_dc_mce;
fam_ops->ic_mce = k8_ic_mce;
@@ -887,8 +890,7 @@ static int __init mce_amd_init(void)
break;
default:
- printk(KERN_WARNING "Huh? What family is that: %d?!\n",
- boot_cpu_data.x86);
+ printk(KERN_WARNING "Huh? What family is that: %d?!\n", c->x86);
kfree(fam_ops);
return -EINVAL;
}
--
1.7.3.1.50.g1e633
^ permalink raw reply related [flat|nested] 16+ messages in thread
* RE: [PATCH 01/12] EDAC, MCE: Select extended error code mask
2010-11-10 19:02 ` [PATCH 01/12] EDAC, MCE: Select extended error code mask Borislav Petkov
@ 2010-11-10 19:12 ` Luck, Tony
2010-11-10 19:15 ` Luck, Tony
0 siblings, 1 reply; 16+ messages in thread
From: Luck, Tony @ 2010-11-10 19:12 UTC (permalink / raw)
To: Borislav Petkov, linux-edac@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, x86@kernel.org, Borislav Petkov
> F15h enlarges the extended error code of an MCE to a 5-bit field
> (MCi_STATUS[20:16]). Add a mask variable which default 0xf is overridden
> on F15h.
> +static u8 xec_mask = 0xf;
If the field is 5 bits, shouldn't this mask be 0x1f?
-Tony
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 01/12] EDAC, MCE: Select extended error code mask
2010-11-10 19:12 ` Luck, Tony
@ 2010-11-10 19:15 ` Luck, Tony
2010-11-10 19:23 ` Borislav Petkov
0 siblings, 1 reply; 16+ messages in thread
From: Luck, Tony @ 2010-11-10 19:15 UTC (permalink / raw)
To: Luck, Tony, Borislav Petkov, linux-edac@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, x86@kernel.org, Borislav Petkov
> (MCi_STATUS[20:16]). Add a mask variable which default 0xf is overridden
> on F15h.
I failed to read the "overridden" part ...
Ignore the noise - I blame the cold medication I'm taking.
-Tony
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/12] EDAC, MCE: Select extended error code mask
2010-11-10 19:15 ` Luck, Tony
@ 2010-11-10 19:23 ` Borislav Petkov
0 siblings, 0 replies; 16+ messages in thread
From: Borislav Petkov @ 2010-11-10 19:23 UTC (permalink / raw)
To: Luck, Tony
Cc: linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org,
x86@kernel.org, Petkov, Borislav
On Wed, Nov 10, 2010 at 02:15:48PM -0500, Luck, Tony wrote:
> > (MCi_STATUS[20:16]). Add a mask variable which default 0xf is overridden
> > on F15h.
>
> I failed to read the "overridden" part ...
> Ignore the noise - I blame the cold medication I'm taking.
And yet it doesn't stop you from looking at my wobbly decoding stuff.
Wait a sec, shouldn't you be relaxing instead? Ah well, kernel people...
Thanks for looking into it.
--
Regards/Gruss,
Boris.
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
General Managers: Alberto Bozzo, Andrew Bowd
Registration: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2010-11-10 19:24 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-10 19:02 [PATCH 00/12] EDAC, MCE: F15h MCE decoding Borislav Petkov
2010-11-10 19:02 ` [PATCH 01/12] EDAC, MCE: Select extended error code mask Borislav Petkov
2010-11-10 19:12 ` Luck, Tony
2010-11-10 19:15 ` Luck, Tony
2010-11-10 19:23 ` Borislav Petkov
2010-11-10 19:02 ` [PATCH 02/12] EDAC, MCE: Add F15h DC MCE decoder Borislav Petkov
2010-11-10 19:02 ` [PATCH 03/12] EDAC, MCE: Add F15h IC " Borislav Petkov
2010-11-10 19:02 ` [PATCH 04/12] EDAC, MCE: Add F15h CU " Borislav Petkov
2010-11-10 19:02 ` [PATCH 05/12] EDAC, MCE: No F15h LS " Borislav Petkov
2010-11-10 19:02 ` [PATCH 06/12] EDAC, MCE: Add an F15h NB " Borislav Petkov
2010-11-10 19:02 ` [PATCH 07/12] EDAC, MCE: Add F15 EX " Borislav Petkov
2010-11-10 19:02 ` [PATCH 08/12] EDAC, MCE: Add F15h FP " Borislav Petkov
2010-11-10 19:02 ` [PATCH 09/12] EDAC, MCE: Overhaul error fields extraction macros Borislav Petkov
2010-11-10 19:02 ` [PATCH 10/12] EDAC, MCE: Shorten error report formatting Borislav Petkov
2010-11-10 19:02 ` [PATCH 11/12] EDAC, MCE: Allow F15h bank 6 MCE injection Borislav Petkov
2010-11-10 19:02 ` [PATCH 12/12] EDAC, MCE: Enable MCE decoding on F15h Borislav Petkov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.