View | Details | Raw Unified | Return to bug 136990
Collapse All | Expand All

(-)orig/drivers/char/ecc.c (-17 / +10 lines)
Lines 10-15 Link Here
10
 */
10
 */
11
#define DEBUG	0
11
#define DEBUG	0
12
12
13
13
#include <linux/config.h>
14
#include <linux/config.h>
14
#include <linux/version.h>
15
#include <linux/version.h>
15
#include <linux/module.h>
16
#include <linux/module.h>
Lines 22-28 Link Here
22
#include <asm/io.h>
23
#include <asm/io.h>
23
#include <linux/proc_fs.h>
24
#include <linux/proc_fs.h>
24
25
25
#define	ECC_VER	"0.14 (Oct 10 2001)"
26
#define	ECC_VER	"0.15 (Dec 1 2005)"
26
#define KERN_ECC KERN_ALERT 
27
#define KERN_ECC KERN_ALERT 
27
28
28
static struct timer_list ecctimer;
29
static struct timer_list ecctimer;
Lines 1102-1116 Link Here
1102
	}
1103
	}
1103
}
1104
}
1104
1105
1106
1107
// Spec source: AMD 761 System Controller/BIOS Guide, 24081D-February 2002
1108
// http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/24081.pdf
1105
void check_amd76x(void)
1109
void check_amd76x(void)
1106
{
1110
{
1107
	unsigned long eccstat = pci_dword(0x48);
1111
	u32 eccstat;
1112
	pci_read_config_dword(bridge, 0x48, &eccstat);
1113
	if(eccstat & 0x30)
1114
	{
1108
	if(eccstat & 0x10)
1115
	if(eccstat & 0x10)
1109
	{
1116
	{
1110
		/* bits 7-4 of eccstat indicate the row the MBE occurred. */
1117
		/* bits 7-4 of eccstat indicate the row the MBE occurred. */
1111
		int row = (eccstat >> 4) & 0xf;
1118
		int row = (eccstat >> 4) & 0xf;
1112
		printk("<1>ECC: MBE Detected in DRAM row %d\n", row);
1119
		printk("<1>ECC: MBE Detected in DRAM row %d\n", row);
1113
		scrub_needed |= 2;
1114
		bank[row].mbecount++;
1120
		bank[row].mbecount++;
1115
	}
1121
	}
1116
	if(eccstat & 0x20)
1122
	if(eccstat & 0x20)
Lines 1118-1139 Link Here
1118
		/* bits 3-0 of eccstat indicate the row the SBE occurred. */
1124
		/* bits 3-0 of eccstat indicate the row the SBE occurred. */
1119
		int row = eccstat & 0xf;
1125
		int row = eccstat & 0xf;
1120
		printk("<1>ECC: SBE Detected in DRAM row %d\n", row);
1126
		printk("<1>ECC: SBE Detected in DRAM row %d\n", row);
1121
		scrub_needed |= 1;
1122
		bank[row].sbecount++;
1127
		bank[row].sbecount++;
1123
	}
1128
	}
1124
	if (scrub_needed)
1129
		pci_write_config_dword(bridge, 0x48, eccstat);	// clear by writing a 1
1125
	{
1126
		/*
1127
		 * clear error flag bits that were set by writing 0 to them
1128
		 * we hope the error was a fluke or something :)
1129
		 */
1130
		unsigned long value = eccstat;
1131
		if (scrub_needed & 1)
1132
			value &= 0xFFFFFDFF;
1133
		if (scrub_needed & 2)
1134
			value &= 0xFFFFFEFF;
1135
		pci_write_config_dword(bridge, 0x48, value);
1136
		scrub_needed = 0;
1137
	}
1130
	}
1138
}
1131
}
1139
1132

Return to bug 136990