diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-07-17 09:28:15 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-10 10:44:53 -0400 |
commit | c5d34528696acadc40d2ba7601dbf35d65b74ad5 (patch) | |
tree | e69922cdb5b7cd1e7b91ca820bf747e38de29bc5 /drivers/edac | |
parent | 310cbb7284fab9fc9cbb6bb893e51c414e15bba3 (diff) |
i7core: check if the memory error is fatal or non-fatal
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/i7core_edac.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index e2f6dfdca841..08149d5addff 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
@@ -1352,7 +1352,7 @@ static void check_mc_test_err(struct mem_ctl_info *mci, u8 socket) | |||
1352 | static void i7core_mce_output_error(struct mem_ctl_info *mci, | 1352 | static void i7core_mce_output_error(struct mem_ctl_info *mci, |
1353 | struct mce *m) | 1353 | struct mce *m) |
1354 | { | 1354 | { |
1355 | char *type="NON-FATAL"; | 1355 | char *type; |
1356 | char *err, *msg; | 1356 | char *err, *msg; |
1357 | unsigned long error = m->status & 0x1ff0000l; | 1357 | unsigned long error = m->status & 0x1ff0000l; |
1358 | u32 core_err_cnt = (m->status >> 38) && 0x7fff; | 1358 | u32 core_err_cnt = (m->status >> 38) && 0x7fff; |
@@ -1361,6 +1361,11 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, | |||
1361 | u32 syndrome = m->misc >> 32; | 1361 | u32 syndrome = m->misc >> 32; |
1362 | u32 errnum = find_first_bit(&error, 32); | 1362 | u32 errnum = find_first_bit(&error, 32); |
1363 | 1363 | ||
1364 | if (m->mcgstatus & 1) | ||
1365 | type = "FATAL"; | ||
1366 | else | ||
1367 | type = "NON_FATAL"; | ||
1368 | |||
1364 | switch (errnum) { | 1369 | switch (errnum) { |
1365 | case 16: | 1370 | case 16: |
1366 | err = "read ECC error"; | 1371 | err = "read ECC error"; |
@@ -1454,7 +1459,8 @@ static void i7core_check_error(struct mem_ctl_info *mci) | |||
1454 | */ | 1459 | */ |
1455 | static int i7core_mce_check_error(void *priv, struct mce *mce) | 1460 | static int i7core_mce_check_error(void *priv, struct mce *mce) |
1456 | { | 1461 | { |
1457 | struct i7core_pvt *pvt = priv; | 1462 | struct mem_ctl_info *mci = priv; |
1463 | struct i7core_pvt *pvt = mci->pvt_info; | ||
1458 | unsigned long flags; | 1464 | unsigned long flags; |
1459 | 1465 | ||
1460 | debugf0(__FILE__ ": %s()\n", __func__); | 1466 | debugf0(__FILE__ ": %s()\n", __func__); |
@@ -1477,6 +1483,10 @@ static int i7core_mce_check_error(void *priv, struct mce *mce) | |||
1477 | } | 1483 | } |
1478 | spin_unlock_irqrestore(&pvt->mce_lock, flags); | 1484 | spin_unlock_irqrestore(&pvt->mce_lock, flags); |
1479 | 1485 | ||
1486 | /* Handle fatal errors immediately */ | ||
1487 | if (mce->mcgstatus & 1) | ||
1488 | i7core_check_error(mci); | ||
1489 | |||
1480 | /* Advice mcelog that the error were handled */ | 1490 | /* Advice mcelog that the error were handled */ |
1481 | return 1; | 1491 | return 1; |
1482 | } | 1492 | } |
@@ -1601,7 +1611,7 @@ static int __devinit i7core_probe(struct pci_dev *pdev, | |||
1601 | pvt->inject.col = -1; | 1611 | pvt->inject.col = -1; |
1602 | 1612 | ||
1603 | /* Registers on edac_mce in order to receive memory errors */ | 1613 | /* Registers on edac_mce in order to receive memory errors */ |
1604 | pvt->edac_mce.priv = pvt; | 1614 | pvt->edac_mce.priv = mci; |
1605 | pvt->edac_mce.check_error = i7core_mce_check_error; | 1615 | pvt->edac_mce.check_error = i7core_mce_check_error; |
1606 | spin_lock_init(&pvt->mce_lock); | 1616 | spin_lock_init(&pvt->mce_lock); |
1607 | 1617 | ||