|
@@ -74,16 +74,10 @@ static const char *f10h_nb_mce_desc[] = {
|
|
"ECC Error in the Probe Filter directory"
|
|
"ECC Error in the Probe Filter directory"
|
|
};
|
|
};
|
|
|
|
|
|
-static bool f10h_dc_mce(u16 ec)
|
|
|
|
|
|
+static bool f12h_dc_mce(u16 ec)
|
|
{
|
|
{
|
|
- u8 r4 = (ec >> 4) & 0xf;
|
|
|
|
bool ret = false;
|
|
bool ret = false;
|
|
|
|
|
|
- if (r4 == R4_GEN) {
|
|
|
|
- pr_cont("during data scrub.\n");
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (MEM_ERROR(ec)) {
|
|
if (MEM_ERROR(ec)) {
|
|
u8 ll = ec & 0x3;
|
|
u8 ll = ec & 0x3;
|
|
ret = true;
|
|
ret = true;
|
|
@@ -98,6 +92,18 @@ static bool f10h_dc_mce(u16 ec)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool f10h_dc_mce(u16 ec)
|
|
|
|
+{
|
|
|
|
+ u8 r4 = (ec >> 4) & 0xf;
|
|
|
|
+ u8 ll = ec & 0x3;
|
|
|
|
+
|
|
|
|
+ if (r4 == R4_GEN && ll == LL_L1) {
|
|
|
|
+ pr_cont("during data scrub.\n");
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ return f12h_dc_mce(ec);
|
|
|
|
+}
|
|
|
|
+
|
|
static bool k8_dc_mce(u16 ec)
|
|
static bool k8_dc_mce(u16 ec)
|
|
{
|
|
{
|
|
if (BUS_ERROR(ec)) {
|
|
if (BUS_ERROR(ec)) {
|
|
@@ -632,6 +638,10 @@ static int __init mce_amd_init(void)
|
|
fam_ops->nb_mce = f10h_nb_mce;
|
|
fam_ops->nb_mce = f10h_nb_mce;
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case 0x12:
|
|
|
|
+ fam_ops->dc_mce = f12h_dc_mce;
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 0x14:
|
|
case 0x14:
|
|
nb_err_cpumask = 0x3;
|
|
nb_err_cpumask = 0x3;
|
|
fam_ops->dc_mce = f14h_dc_mce;
|
|
fam_ops->dc_mce = f14h_dc_mce;
|