diff options
author | Niklas Söderlund <niklas.soderlund@ericsson.com> | 2011-12-09 11:12:15 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-03-21 14:22:49 -0400 |
commit | df95e42e1f20a561f2fe0a632d5b8fd6c26f1bb9 (patch) | |
tree | fb323ff0928be60180c0fa6e069111de9361bb4b /drivers/edac/i5100_edac.c | |
parent | b6378cb3e545912a19e6355aa9171326fdc004d8 (diff) |
edac: i5100 ack error detection register after each read
If I only ack the detection register after a error have been detected
I'm unable to reliably detect errors. I have verified this behavior
using both an error injection DIMM and software to inject errors.
I can't find any documentation supporting this behavior in Intel 5100
Memory Controller Hub Chipset, see 1. So this is all based on
experimentation.
[1] Intel® 5100 Memory Controller Hub Chipset
http://www.intel.com/content/dam/doc/datasheet/5100-
memory-controller-hub-chipset-datasheet.pdf
Signed-off-by: Niklas Söderlund <niklas.soderlund@ericsson.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/edac/i5100_edac.c')
-rw-r--r-- | drivers/edac/i5100_edac.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c index ab2f90619821..2a6e7ff1f020 100644 --- a/drivers/edac/i5100_edac.c +++ b/drivers/edac/i5100_edac.c | |||
@@ -535,23 +535,20 @@ static void i5100_read_log(struct mem_ctl_info *mci, int chan, | |||
535 | static void i5100_check_error(struct mem_ctl_info *mci) | 535 | static void i5100_check_error(struct mem_ctl_info *mci) |
536 | { | 536 | { |
537 | struct i5100_priv *priv = mci->pvt_info; | 537 | struct i5100_priv *priv = mci->pvt_info; |
538 | u32 dw; | 538 | u32 dw, dw2; |
539 | |||
540 | 539 | ||
541 | pci_read_config_dword(priv->mc, I5100_FERR_NF_MEM, &dw); | 540 | pci_read_config_dword(priv->mc, I5100_FERR_NF_MEM, &dw); |
542 | if (i5100_ferr_nf_mem_any(dw)) { | 541 | if (i5100_ferr_nf_mem_any(dw)) { |
543 | u32 dw2; | ||
544 | 542 | ||
545 | pci_read_config_dword(priv->mc, I5100_NERR_NF_MEM, &dw2); | 543 | pci_read_config_dword(priv->mc, I5100_NERR_NF_MEM, &dw2); |
546 | if (dw2) | ||
547 | pci_write_config_dword(priv->mc, I5100_NERR_NF_MEM, | ||
548 | dw2); | ||
549 | pci_write_config_dword(priv->mc, I5100_FERR_NF_MEM, dw); | ||
550 | 544 | ||
551 | i5100_read_log(mci, i5100_ferr_nf_mem_chan_indx(dw), | 545 | i5100_read_log(mci, i5100_ferr_nf_mem_chan_indx(dw), |
552 | i5100_ferr_nf_mem_any(dw), | 546 | i5100_ferr_nf_mem_any(dw), |
553 | i5100_nerr_nf_mem_any(dw2)); | 547 | i5100_nerr_nf_mem_any(dw2)); |
548 | |||
549 | pci_write_config_dword(priv->mc, I5100_NERR_NF_MEM, dw2); | ||
554 | } | 550 | } |
551 | pci_write_config_dword(priv->mc, I5100_FERR_NF_MEM, dw); | ||
555 | } | 552 | } |
556 | 553 | ||
557 | /* The i5100 chipset will scrub the entire memory once, then | 554 | /* The i5100 chipset will scrub the entire memory once, then |