aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/i5100_edac.c
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ericsson.com>2011-12-09 11:12:15 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-03-21 14:22:49 -0400
commitdf95e42e1f20a561f2fe0a632d5b8fd6c26f1bb9 (patch)
treefb323ff0928be60180c0fa6e069111de9361bb4b /drivers/edac/i5100_edac.c
parentb6378cb3e545912a19e6355aa9171326fdc004d8 (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.c11
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,
535static void i5100_check_error(struct mem_ctl_info *mci) 535static 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