edac: i5100 fix enable ecc hardware
authorArthur Jones <ajones@riverbed.com>
Fri, 25 Jul 2008 08:49:06 +0000 (01:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Jul 2008 17:53:48 +0000 (10:53 -0700)
It is possible that the BIOS did not enable ECC at boot time.  We check
for that case and fail to load if it is true.

Signed-off-by: Arthur Jones <ajones@riverbed.com>
Signed-off-by: Doug Thompson <dougthompson@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/edac/i5100_edac.c

index a8767a6c1481db3dca8cd17dc16dcccb929fcb99..509eec860c37d437c1f1b09a548f26a1ecb76595 100644 (file)
@@ -24,6 +24,8 @@
 /* register addresses and bit field accessors... */
 
 /* device 16, func 1 */
+#define I5100_MC               0x40    /* Memory Control Register */
+#define                I5100_MC_ERRDETEN(a)    ((a) >> 5 & 1)
 #define I5100_MS               0x44    /* Memory Status Register */
 #define I5100_SPDDATA          0x48    /* Serial Presence Detect Status Reg */
 #define                I5100_SPDDATA_RDO(a)    ((a) >> 15 & 1)
@@ -688,6 +690,14 @@ static int __devinit i5100_init_one(struct pci_dev *pdev,
                goto bail;
        }
 
+       /* ECC enabled? */
+       pci_read_config_dword(pdev, I5100_MC, &dw);
+       if (!I5100_MC_ERRDETEN(dw)) {
+               printk(KERN_INFO "i5100_edac: ECC not enabled.\n");
+               ret = -ENODEV;
+               goto bail;
+       }
+
        /* figure out how many ranks, from strapped state of 48GB_Mode input */
        pci_read_config_dword(pdev, I5100_MS, &dw);
        ranksperch = !!(dw & (1 << 8)) * 2 + 4;