1/*
2 * Intel e752x Memory Controller kernel module
3 * (C) 2004 Linux Networx (http://lnxi.com)
4 * This file may be distributed under the terms of the
5 * GNU General Public License.
6 *
7 * Implement support for the e7520, E7525, e7320 and i3100 memory controllers.
8 *
9 * Datasheets:
10 *	http://www.intel.in/content/www/in/en/chipsets/e7525-memory-controller-hub-datasheet.html
11 *	ftp://download.intel.com/design/intarch/datashts/31345803.pdf
12 *
13 * Written by Tom Zimmerman
14 *
15 * Contributors:
16 * 	Thayne Harbaugh at realmsys.com (?)
17 * 	Wang Zhenyu at intel.com
18 * 	Dave Jiang at mvista.com
19 *
20 */
21
22#include <linux/module.h>
23#include <linux/init.h>
24#include <linux/pci.h>
25#include <linux/pci_ids.h>
26#include <linux/edac.h>
27#include "edac_core.h"
28
29#define E752X_REVISION	" Ver: 2.0.2"
30#define EDAC_MOD_STR	"e752x_edac"
31
32static int report_non_memory_errors;
33static int force_function_unhide;
34static int sysbus_parity = -1;
35
36static struct edac_pci_ctl_info *e752x_pci;
37
38#define e752x_printk(level, fmt, arg...) \
39	edac_printk(level, "e752x", fmt, ##arg)
40
41#define e752x_mc_printk(mci, level, fmt, arg...) \
42	edac_mc_chipset_printk(mci, level, "e752x", fmt, ##arg)
43
44#ifndef PCI_DEVICE_ID_INTEL_7520_0
45#define PCI_DEVICE_ID_INTEL_7520_0      0x3590
46#endif				/* PCI_DEVICE_ID_INTEL_7520_0      */
47
48#ifndef PCI_DEVICE_ID_INTEL_7520_1_ERR
49#define PCI_DEVICE_ID_INTEL_7520_1_ERR  0x3591
50#endif				/* PCI_DEVICE_ID_INTEL_7520_1_ERR  */
51
52#ifndef PCI_DEVICE_ID_INTEL_7525_0
53#define PCI_DEVICE_ID_INTEL_7525_0      0x359E
54#endif				/* PCI_DEVICE_ID_INTEL_7525_0      */
55
56#ifndef PCI_DEVICE_ID_INTEL_7525_1_ERR
57#define PCI_DEVICE_ID_INTEL_7525_1_ERR  0x3593
58#endif				/* PCI_DEVICE_ID_INTEL_7525_1_ERR  */
59
60#ifndef PCI_DEVICE_ID_INTEL_7320_0
61#define PCI_DEVICE_ID_INTEL_7320_0	0x3592
62#endif				/* PCI_DEVICE_ID_INTEL_7320_0 */
63
64#ifndef PCI_DEVICE_ID_INTEL_7320_1_ERR
65#define PCI_DEVICE_ID_INTEL_7320_1_ERR	0x3593
66#endif				/* PCI_DEVICE_ID_INTEL_7320_1_ERR */
67
68#ifndef PCI_DEVICE_ID_INTEL_3100_0
69#define PCI_DEVICE_ID_INTEL_3100_0	0x35B0
70#endif				/* PCI_DEVICE_ID_INTEL_3100_0 */
71
72#ifndef PCI_DEVICE_ID_INTEL_3100_1_ERR
73#define PCI_DEVICE_ID_INTEL_3100_1_ERR	0x35B1
74#endif				/* PCI_DEVICE_ID_INTEL_3100_1_ERR */
75
76#define E752X_NR_CSROWS		8	/* number of csrows */
77
78/* E752X register addresses - device 0 function 0 */
79#define E752X_MCHSCRB		0x52	/* Memory Scrub register (16b) */
80					/*
81					 * 6:5     Scrub Completion Count
82					 * 3:2     Scrub Rate (i3100 only)
83					 *      01=fast 10=normal
84					 * 1:0     Scrub Mode enable
85					 *      00=off 10=on
86					 */
87#define E752X_DRB		0x60	/* DRAM row boundary register (8b) */
88#define E752X_DRA		0x70	/* DRAM row attribute register (8b) */
89					/*
90					 * 31:30   Device width row 7
91					 *      01=x8 10=x4 11=x8 DDR2
92					 * 27:26   Device width row 6
93					 * 23:22   Device width row 5
94					 * 19:20   Device width row 4
95					 * 15:14   Device width row 3
96					 * 11:10   Device width row 2
97					 *  7:6    Device width row 1
98					 *  3:2    Device width row 0
99					 */
100#define E752X_DRC		0x7C	/* DRAM controller mode reg (32b) */
101					/* FIXME:IS THIS RIGHT? */
102					/*
103					 * 22    Number channels 0=1,1=2
104					 * 19:18 DRB Granularity 32/64MB
105					 */
106#define E752X_DRM		0x80	/* Dimm mapping register */
107#define E752X_DDRCSR		0x9A	/* DDR control and status reg (16b) */
108					/*
109					 * 14:12 1 single A, 2 single B, 3 dual
110					 */
111#define E752X_TOLM		0xC4	/* DRAM top of low memory reg (16b) */
112#define E752X_REMAPBASE		0xC6	/* DRAM remap base address reg (16b) */
113#define E752X_REMAPLIMIT	0xC8	/* DRAM remap limit address reg (16b) */
114#define E752X_REMAPOFFSET	0xCA	/* DRAM remap limit offset reg (16b) */
115
116/* E752X register addresses - device 0 function 1 */
117#define E752X_FERR_GLOBAL	0x40	/* Global first error register (32b) */
118#define E752X_NERR_GLOBAL	0x44	/* Global next error register (32b) */
119#define E752X_HI_FERR		0x50	/* Hub interface first error reg (8b) */
120#define E752X_HI_NERR		0x52	/* Hub interface next error reg (8b) */
121#define E752X_HI_ERRMASK	0x54	/* Hub interface error mask reg (8b) */
122#define E752X_HI_SMICMD		0x5A	/* Hub interface SMI command reg (8b) */
123#define E752X_SYSBUS_FERR	0x60	/* System buss first error reg (16b) */
124#define E752X_SYSBUS_NERR	0x62	/* System buss next error reg (16b) */
125#define E752X_SYSBUS_ERRMASK	0x64	/* System buss error mask reg (16b) */
126#define E752X_SYSBUS_SMICMD	0x6A	/* System buss SMI command reg (16b) */
127#define E752X_BUF_FERR		0x70	/* Memory buffer first error reg (8b) */
128#define E752X_BUF_NERR		0x72	/* Memory buffer next error reg (8b) */
129#define E752X_BUF_ERRMASK	0x74	/* Memory buffer error mask reg (8b) */
130#define E752X_BUF_SMICMD	0x7A	/* Memory buffer SMI cmd reg (8b) */
131#define E752X_DRAM_FERR		0x80	/* DRAM first error register (16b) */
132#define E752X_DRAM_NERR		0x82	/* DRAM next error register (16b) */
133#define E752X_DRAM_ERRMASK	0x84	/* DRAM error mask register (8b) */
134#define E752X_DRAM_SMICMD	0x8A	/* DRAM SMI command register (8b) */
135#define E752X_DRAM_RETR_ADD	0xAC	/* DRAM Retry address register (32b) */
136#define E752X_DRAM_SEC1_ADD	0xA0	/* DRAM first correctable memory */
137					/*     error address register (32b) */
138					/*
139					 * 31    Reserved
140					 * 30:2  CE address (64 byte block 34:6
141					 * 1     Reserved
142					 * 0     HiLoCS
143					 */
144#define E752X_DRAM_SEC2_ADD	0xC8	/* DRAM first correctable memory */
145					/*     error address register (32b) */
146					/*
147					 * 31    Reserved
148					 * 30:2  CE address (64 byte block 34:6)
149					 * 1     Reserved
150					 * 0     HiLoCS
151					 */
152#define E752X_DRAM_DED_ADD	0xA4	/* DRAM first uncorrectable memory */
153					/*     error address register (32b) */
154					/*
155					 * 31    Reserved
156					 * 30:2  CE address (64 byte block 34:6)
157					 * 1     Reserved
158					 * 0     HiLoCS
159					 */
160#define E752X_DRAM_SCRB_ADD	0xA8	/* DRAM 1st uncorrectable scrub mem */
161					/*     error address register (32b) */
162					/*
163					 * 31    Reserved
164					 * 30:2  CE address (64 byte block 34:6
165					 * 1     Reserved
166					 * 0     HiLoCS
167					 */
168#define E752X_DRAM_SEC1_SYNDROME 0xC4	/* DRAM first correctable memory */
169					/*     error syndrome register (16b) */
170#define E752X_DRAM_SEC2_SYNDROME 0xC6	/* DRAM second correctable memory */
171					/*     error syndrome register (16b) */
172#define E752X_DEVPRES1		0xF4	/* Device Present 1 register (8b) */
173
174/* 3100 IMCH specific register addresses - device 0 function 1 */
175#define I3100_NSI_FERR		0x48	/* NSI first error reg (32b) */
176#define I3100_NSI_NERR		0x4C	/* NSI next error reg (32b) */
177#define I3100_NSI_SMICMD	0x54	/* NSI SMI command register (32b) */
178#define I3100_NSI_EMASK		0x90	/* NSI error mask register (32b) */
179
180/* ICH5R register addresses - device 30 function 0 */
181#define ICH5R_PCI_STAT		0x06	/* PCI status register (16b) */
182#define ICH5R_PCI_2ND_STAT	0x1E	/* PCI status secondary reg (16b) */
183#define ICH5R_PCI_BRIDGE_CTL	0x3E	/* PCI bridge control register (16b) */
184
185enum e752x_chips {
186	E7520 = 0,
187	E7525 = 1,
188	E7320 = 2,
189	I3100 = 3
190};
191
192/*
193 * Those chips Support single-rank and dual-rank memories only.
194 *
195 * On e752x chips, the odd rows are present only on dual-rank memories.
196 * Dividing the rank by two will provide the dimm#
197 *
198 * i3100 MC has a different mapping: it supports only 4 ranks.
199 *
200 * The mapping is (from 1 to n):
201 *	slot	   single-ranked	double-ranked
202 *	dimm #1 -> rank #4		NA
203 *	dimm #2 -> rank #3		NA
204 *	dimm #3 -> rank #2		Ranks 2 and 3
205 *	dimm #4 -> rank $1		Ranks 1 and 4
206 *
207 * FIXME: The current mapping for i3100 considers that it supports up to 8
208 *	  ranks/chanel, but datasheet says that the MC supports only 4 ranks.
209 */
210
211struct e752x_pvt {
212	struct pci_dev *dev_d0f0;
213	struct pci_dev *dev_d0f1;
214	u32 tolm;
215	u32 remapbase;
216	u32 remaplimit;
217	int mc_symmetric;
218	u8 map[8];
219	int map_type;
220	const struct e752x_dev_info *dev_info;
221};
222
223struct e752x_dev_info {
224	u16 err_dev;
225	u16 ctl_dev;
226	const char *ctl_name;
227};
228
229struct e752x_error_info {
230	u32 ferr_global;
231	u32 nerr_global;
232	u32 nsi_ferr;	/* 3100 only */
233	u32 nsi_nerr;	/* 3100 only */
234	u8 hi_ferr;	/* all but 3100 */
235	u8 hi_nerr;	/* all but 3100 */
236	u16 sysbus_ferr;
237	u16 sysbus_nerr;
238	u8 buf_ferr;
239	u8 buf_nerr;
240	u16 dram_ferr;
241	u16 dram_nerr;
242	u32 dram_sec1_add;
243	u32 dram_sec2_add;
244	u16 dram_sec1_syndrome;
245	u16 dram_sec2_syndrome;
246	u32 dram_ded_add;
247	u32 dram_scrb_add;
248	u32 dram_retr_add;
249};
250
251static const struct e752x_dev_info e752x_devs[] = {
252	[E7520] = {
253		.err_dev = PCI_DEVICE_ID_INTEL_7520_1_ERR,
254		.ctl_dev = PCI_DEVICE_ID_INTEL_7520_0,
255		.ctl_name = "E7520"},
256	[E7525] = {
257		.err_dev = PCI_DEVICE_ID_INTEL_7525_1_ERR,
258		.ctl_dev = PCI_DEVICE_ID_INTEL_7525_0,
259		.ctl_name = "E7525"},
260	[E7320] = {
261		.err_dev = PCI_DEVICE_ID_INTEL_7320_1_ERR,
262		.ctl_dev = PCI_DEVICE_ID_INTEL_7320_0,
263		.ctl_name = "E7320"},
264	[I3100] = {
265		.err_dev = PCI_DEVICE_ID_INTEL_3100_1_ERR,
266		.ctl_dev = PCI_DEVICE_ID_INTEL_3100_0,
267		.ctl_name = "3100"},
268};
269
270/* Valid scrub rates for the e752x/3100 hardware memory scrubber. We
271 * map the scrubbing bandwidth to a hardware register value. The 'set'
272 * operation finds the 'matching or higher value'.  Note that scrubbing
273 * on the e752x can only be enabled/disabled.  The 3100 supports
274 * a normal and fast mode.
275 */
276
277#define SDRATE_EOT 0xFFFFFFFF
278
279struct scrubrate {
280	u32 bandwidth;	/* bandwidth consumed by scrubbing in bytes/sec */
281	u16 scrubval;	/* register value for scrub rate */
282};
283
284/* Rate below assumes same performance as i3100 using PC3200 DDR2 in
285 * normal mode.  e752x bridges don't support choosing normal or fast mode,
286 * so the scrubbing bandwidth value isn't all that important - scrubbing is
287 * either on or off.
288 */
289static const struct scrubrate scrubrates_e752x[] = {
290	{0,		0x00},	/* Scrubbing Off */
291	{500000,	0x02},	/* Scrubbing On */
292	{SDRATE_EOT,	0x00}	/* End of Table */
293};
294
295/* Fast mode: 2 GByte PC3200 DDR2 scrubbed in 33s = 63161283 bytes/s
296 * Normal mode: 125 (32000 / 256) times slower than fast mode.
297 */
298static const struct scrubrate scrubrates_i3100[] = {
299	{0,		0x00},	/* Scrubbing Off */
300	{500000,	0x0a},	/* Normal mode - 32k clocks */
301	{62500000,	0x06},	/* Fast mode - 256 clocks */
302	{SDRATE_EOT,	0x00}	/* End of Table */
303};
304
305static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci,
306				unsigned long page)
307{
308	u32 remap;
309	struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
310
311	edac_dbg(3, "\n");
312
313	if (page < pvt->tolm)
314		return page;
315
316	if ((page >= 0x100000) && (page < pvt->remapbase))
317		return page;
318
319	remap = (page - pvt->tolm) + pvt->remapbase;
320
321	if (remap < pvt->remaplimit)
322		return remap;
323
324	e752x_printk(KERN_ERR, "Invalid page %lx - out of range\n", page);
325	return pvt->tolm - 1;
326}
327
328static void do_process_ce(struct mem_ctl_info *mci, u16 error_one,
329			u32 sec1_add, u16 sec1_syndrome)
330{
331	u32 page;
332	int row;
333	int channel;
334	int i;
335	struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
336
337	edac_dbg(3, "\n");
338
339	/* convert the addr to 4k page */
340	page = sec1_add >> (PAGE_SHIFT - 4);
341
342	/* FIXME - check for -1 */
343	if (pvt->mc_symmetric) {
344		/* chip select are bits 14 & 13 */
345		row = ((page >> 1) & 3);
346		e752x_printk(KERN_WARNING,
347			"Test row %d Table %d %d %d %d %d %d %d %d\n", row,
348			pvt->map[0], pvt->map[1], pvt->map[2], pvt->map[3],
349			pvt->map[4], pvt->map[5], pvt->map[6],
350			pvt->map[7]);
351
352		/* test for channel remapping */
353		for (i = 0; i < 8; i++) {
354			if (pvt->map[i] == row)
355				break;
356		}
357
358		e752x_printk(KERN_WARNING, "Test computed row %d\n", i);
359
360		if (i < 8)
361			row = i;
362		else
363			e752x_mc_printk(mci, KERN_WARNING,
364					"row %d not found in remap table\n",
365					row);
366	} else
367		row = edac_mc_find_csrow_by_page(mci, page);
368
369	/* 0 = channel A, 1 = channel B */
370	channel = !(error_one & 1);
371
372	/* e752x mc reads 34:6 of the DRAM linear address */
373	edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
374			     page, offset_in_page(sec1_add << 4), sec1_syndrome,
375			     row, channel, -1,
376			     "e752x CE", "");
377}
378
379static inline void process_ce(struct mem_ctl_info *mci, u16 error_one,
380			u32 sec1_add, u16 sec1_syndrome, int *error_found,
381			int handle_error)
382{
383	*error_found = 1;
384
385	if (handle_error)
386		do_process_ce(mci, error_one, sec1_add, sec1_syndrome);
387}
388
389static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
390			u32 ded_add, u32 scrb_add)
391{
392	u32 error_2b, block_page;
393	int row;
394	struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
395
396	edac_dbg(3, "\n");
397
398	if (error_one & 0x0202) {
399		error_2b = ded_add;
400
401		/* convert to 4k address */
402		block_page = error_2b >> (PAGE_SHIFT - 4);
403
404		row = pvt->mc_symmetric ?
405		/* chip select are bits 14 & 13 */
406			((block_page >> 1) & 3) :
407			edac_mc_find_csrow_by_page(mci, block_page);
408
409		/* e752x mc reads 34:6 of the DRAM linear address */
410		edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
411					block_page,
412					offset_in_page(error_2b << 4), 0,
413					 row, -1, -1,
414					"e752x UE from Read", "");
415
416	}
417	if (error_one & 0x0404) {
418		error_2b = scrb_add;
419
420		/* convert to 4k address */
421		block_page = error_2b >> (PAGE_SHIFT - 4);
422
423		row = pvt->mc_symmetric ?
424		/* chip select are bits 14 & 13 */
425			((block_page >> 1) & 3) :
426			edac_mc_find_csrow_by_page(mci, block_page);
427
428		/* e752x mc reads 34:6 of the DRAM linear address */
429		edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
430					block_page,
431					offset_in_page(error_2b << 4), 0,
432					row, -1, -1,
433					"e752x UE from Scruber", "");
434	}
435}
436
437static inline void process_ue(struct mem_ctl_info *mci, u16 error_one,
438			u32 ded_add, u32 scrb_add, int *error_found,
439			int handle_error)
440{
441	*error_found = 1;
442
443	if (handle_error)
444		do_process_ue(mci, error_one, ded_add, scrb_add);
445}
446
447static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,
448					 int *error_found, int handle_error)
449{
450	*error_found = 1;
451
452	if (!handle_error)
453		return;
454
455	edac_dbg(3, "\n");
456	edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
457			     -1, -1, -1,
458			     "e752x UE log memory write", "");
459}
460
461static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error,
462				 u32 retry_add)
463{
464	u32 error_1b, page;
465	int row;
466	struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
467
468	error_1b = retry_add;
469	page = error_1b >> (PAGE_SHIFT - 4);  /* convert the addr to 4k page */
470
471	/* chip select are bits 14 & 13 */
472	row = pvt->mc_symmetric ? ((page >> 1) & 3) :
473		edac_mc_find_csrow_by_page(mci, page);
474
475	e752x_mc_printk(mci, KERN_WARNING,
476			"CE page 0x%lx, row %d : Memory read retry\n",
477			(long unsigned int)page, row);
478}
479
480static inline void process_ded_retry(struct mem_ctl_info *mci, u16 error,
481				u32 retry_add, int *error_found,
482				int handle_error)
483{
484	*error_found = 1;
485
486	if (handle_error)
487		do_process_ded_retry(mci, error, retry_add);
488}
489
490static inline void process_threshold_ce(struct mem_ctl_info *mci, u16 error,
491					int *error_found, int handle_error)
492{
493	*error_found = 1;
494
495	if (handle_error)
496		e752x_mc_printk(mci, KERN_WARNING, "Memory threshold CE\n");
497}
498
499static char *global_message[11] = {
500	"PCI Express C1",
501	"PCI Express C",
502	"PCI Express B1",
503	"PCI Express B",
504	"PCI Express A1",
505	"PCI Express A",
506	"DMA Controller",
507	"HUB or NS Interface",
508	"System Bus",
509	"DRAM Controller",  /* 9th entry */
510	"Internal Buffer"
511};
512
513#define DRAM_ENTRY	9
514
515static char *fatal_message[2] = { "Non-Fatal ", "Fatal " };
516
517static void do_global_error(int fatal, u32 errors)
518{
519	int i;
520
521	for (i = 0; i < 11; i++) {
522		if (errors & (1 << i)) {
523			/* If the error is from DRAM Controller OR
524			 * we are to report ALL errors, then
525			 * report the error
526			 */
527			if ((i == DRAM_ENTRY) || report_non_memory_errors)
528				e752x_printk(KERN_WARNING, "%sError %s\n",
529					fatal_message[fatal],
530					global_message[i]);
531		}
532	}
533}
534
535static inline void global_error(int fatal, u32 errors, int *error_found,
536				int handle_error)
537{
538	*error_found = 1;
539
540	if (handle_error)
541		do_global_error(fatal, errors);
542}
543
544static char *hub_message[7] = {
545	"HI Address or Command Parity", "HI Illegal Access",
546	"HI Internal Parity", "Out of Range Access",
547	"HI Data Parity", "Enhanced Config Access",
548	"Hub Interface Target Abort"
549};
550
551static void do_hub_error(int fatal, u8 errors)
552{
553	int i;
554
555	for (i = 0; i < 7; i++) {
556		if (errors & (1 << i))
557			e752x_printk(KERN_WARNING, "%sError %s\n",
558				fatal_message[fatal], hub_message[i]);
559	}
560}
561
562static inline void hub_error(int fatal, u8 errors, int *error_found,
563			int handle_error)
564{
565	*error_found = 1;
566
567	if (handle_error)
568		do_hub_error(fatal, errors);
569}
570
571#define NSI_FATAL_MASK		0x0c080081
572#define NSI_NON_FATAL_MASK	0x23a0ba64
573#define NSI_ERR_MASK		(NSI_FATAL_MASK | NSI_NON_FATAL_MASK)
574
575static char *nsi_message[30] = {
576	"NSI Link Down",	/* NSI_FERR/NSI_NERR bit 0, fatal error */
577	"",						/* reserved */
578	"NSI Parity Error",				/* bit 2, non-fatal */
579	"",						/* reserved */
580	"",						/* reserved */
581	"Correctable Error Message",			/* bit 5, non-fatal */
582	"Non-Fatal Error Message",			/* bit 6, non-fatal */
583	"Fatal Error Message",				/* bit 7, fatal */
584	"",						/* reserved */
585	"Receiver Error",				/* bit 9, non-fatal */
586	"",						/* reserved */
587	"Bad TLP",					/* bit 11, non-fatal */
588	"Bad DLLP",					/* bit 12, non-fatal */
589	"REPLAY_NUM Rollover",				/* bit 13, non-fatal */
590	"",						/* reserved */
591	"Replay Timer Timeout",				/* bit 15, non-fatal */
592	"",						/* reserved */
593	"",						/* reserved */
594	"",						/* reserved */
595	"Data Link Protocol Error",			/* bit 19, fatal */
596	"",						/* reserved */
597	"Poisoned TLP",					/* bit 21, non-fatal */
598	"",						/* reserved */
599	"Completion Timeout",				/* bit 23, non-fatal */
600	"Completer Abort",				/* bit 24, non-fatal */
601	"Unexpected Completion",			/* bit 25, non-fatal */
602	"Receiver Overflow",				/* bit 26, fatal */
603	"Malformed TLP",				/* bit 27, fatal */
604	"",						/* reserved */
605	"Unsupported Request"				/* bit 29, non-fatal */
606};
607
608static void do_nsi_error(int fatal, u32 errors)
609{
610	int i;
611
612	for (i = 0; i < 30; i++) {
613		if (errors & (1 << i))
614			printk(KERN_WARNING "%sError %s\n",
615			       fatal_message[fatal], nsi_message[i]);
616	}
617}
618
619static inline void nsi_error(int fatal, u32 errors, int *error_found,
620		int handle_error)
621{
622	*error_found = 1;
623
624	if (handle_error)
625		do_nsi_error(fatal, errors);
626}
627
628static char *membuf_message[4] = {
629	"Internal PMWB to DRAM parity",
630	"Internal PMWB to System Bus Parity",
631	"Internal System Bus or IO to PMWB Parity",
632	"Internal DRAM to PMWB Parity"
633};
634
635static void do_membuf_error(u8 errors)
636{
637	int i;
638
639	for (i = 0; i < 4; i++) {
640		if (errors & (1 << i))
641			e752x_printk(KERN_WARNING, "Non-Fatal Error %s\n",
642				membuf_message[i]);
643	}
644}
645
646static inline void membuf_error(u8 errors, int *error_found, int handle_error)
647{
648	*error_found = 1;
649
650	if (handle_error)
651		do_membuf_error(errors);
652}
653
654static char *sysbus_message[10] = {
655	"Addr or Request Parity",
656	"Data Strobe Glitch",
657	"Addr Strobe Glitch",
658	"Data Parity",
659	"Addr Above TOM",
660	"Non DRAM Lock Error",
661	"MCERR", "BINIT",
662	"Memory Parity",
663	"IO Subsystem Parity"
664};
665
666static void do_sysbus_error(int fatal, u32 errors)
667{
668	int i;
669
670	for (i = 0; i < 10; i++) {
671		if (errors & (1 << i))
672			e752x_printk(KERN_WARNING, "%sError System Bus %s\n",
673				fatal_message[fatal], sysbus_message[i]);
674	}
675}
676
677static inline void sysbus_error(int fatal, u32 errors, int *error_found,
678				int handle_error)
679{
680	*error_found = 1;
681
682	if (handle_error)
683		do_sysbus_error(fatal, errors);
684}
685
686static void e752x_check_hub_interface(struct e752x_error_info *info,
687				int *error_found, int handle_error)
688{
689	u8 stat8;
690
691	//pci_read_config_byte(dev,E752X_HI_FERR,&stat8);
692
693	stat8 = info->hi_ferr;
694
695	if (stat8 & 0x7f) {	/* Error, so process */
696		stat8 &= 0x7f;
697
698		if (stat8 & 0x2b)
699			hub_error(1, stat8 & 0x2b, error_found, handle_error);
700
701		if (stat8 & 0x54)
702			hub_error(0, stat8 & 0x54, error_found, handle_error);
703	}
704	//pci_read_config_byte(dev,E752X_HI_NERR,&stat8);
705
706	stat8 = info->hi_nerr;
707
708	if (stat8 & 0x7f) {	/* Error, so process */
709		stat8 &= 0x7f;
710
711		if (stat8 & 0x2b)
712			hub_error(1, stat8 & 0x2b, error_found, handle_error);
713
714		if (stat8 & 0x54)
715			hub_error(0, stat8 & 0x54, error_found, handle_error);
716	}
717}
718
719static void e752x_check_ns_interface(struct e752x_error_info *info,
720				int *error_found, int handle_error)
721{
722	u32 stat32;
723
724	stat32 = info->nsi_ferr;
725	if (stat32 & NSI_ERR_MASK) { /* Error, so process */
726		if (stat32 & NSI_FATAL_MASK)	/* check for fatal errors */
727			nsi_error(1, stat32 & NSI_FATAL_MASK, error_found,
728				  handle_error);
729		if (stat32 & NSI_NON_FATAL_MASK) /* check for non-fatal ones */
730			nsi_error(0, stat32 & NSI_NON_FATAL_MASK, error_found,
731				  handle_error);
732	}
733	stat32 = info->nsi_nerr;
734	if (stat32 & NSI_ERR_MASK) {
735		if (stat32 & NSI_FATAL_MASK)
736			nsi_error(1, stat32 & NSI_FATAL_MASK, error_found,
737				  handle_error);
738		if (stat32 & NSI_NON_FATAL_MASK)
739			nsi_error(0, stat32 & NSI_NON_FATAL_MASK, error_found,
740				  handle_error);
741	}
742}
743
744static void e752x_check_sysbus(struct e752x_error_info *info,
745			int *error_found, int handle_error)
746{
747	u32 stat32, error32;
748
749	//pci_read_config_dword(dev,E752X_SYSBUS_FERR,&stat32);
750	stat32 = info->sysbus_ferr + (info->sysbus_nerr << 16);
751
752	if (stat32 == 0)
753		return;		/* no errors */
754
755	error32 = (stat32 >> 16) & 0x3ff;
756	stat32 = stat32 & 0x3ff;
757
758	if (stat32 & 0x087)
759		sysbus_error(1, stat32 & 0x087, error_found, handle_error);
760
761	if (stat32 & 0x378)
762		sysbus_error(0, stat32 & 0x378, error_found, handle_error);
763
764	if (error32 & 0x087)
765		sysbus_error(1, error32 & 0x087, error_found, handle_error);
766
767	if (error32 & 0x378)
768		sysbus_error(0, error32 & 0x378, error_found, handle_error);
769}
770
771static void e752x_check_membuf(struct e752x_error_info *info,
772			int *error_found, int handle_error)
773{
774	u8 stat8;
775
776	stat8 = info->buf_ferr;
777
778	if (stat8 & 0x0f) {	/* Error, so process */
779		stat8 &= 0x0f;
780		membuf_error(stat8, error_found, handle_error);
781	}
782
783	stat8 = info->buf_nerr;
784
785	if (stat8 & 0x0f) {	/* Error, so process */
786		stat8 &= 0x0f;
787		membuf_error(stat8, error_found, handle_error);
788	}
789}
790
791static void e752x_check_dram(struct mem_ctl_info *mci,
792			struct e752x_error_info *info, int *error_found,
793			int handle_error)
794{
795	u16 error_one, error_next;
796
797	error_one = info->dram_ferr;
798	error_next = info->dram_nerr;
799
800	/* decode and report errors */
801	if (error_one & 0x0101)	/* check first error correctable */
802		process_ce(mci, error_one, info->dram_sec1_add,
803			info->dram_sec1_syndrome, error_found, handle_error);
804
805	if (error_next & 0x0101)	/* check next error correctable */
806		process_ce(mci, error_next, info->dram_sec2_add,
807			info->dram_sec2_syndrome, error_found, handle_error);
808
809	if (error_one & 0x4040)
810		process_ue_no_info_wr(mci, error_found, handle_error);
811
812	if (error_next & 0x4040)
813		process_ue_no_info_wr(mci, error_found, handle_error);
814
815	if (error_one & 0x2020)
816		process_ded_retry(mci, error_one, info->dram_retr_add,
817				error_found, handle_error);
818
819	if (error_next & 0x2020)
820		process_ded_retry(mci, error_next, info->dram_retr_add,
821				error_found, handle_error);
822
823	if (error_one & 0x0808)
824		process_threshold_ce(mci, error_one, error_found, handle_error);
825
826	if (error_next & 0x0808)
827		process_threshold_ce(mci, error_next, error_found,
828				handle_error);
829
830	if (error_one & 0x0606)
831		process_ue(mci, error_one, info->dram_ded_add,
832			info->dram_scrb_add, error_found, handle_error);
833
834	if (error_next & 0x0606)
835		process_ue(mci, error_next, info->dram_ded_add,
836			info->dram_scrb_add, error_found, handle_error);
837}
838
839static void e752x_get_error_info(struct mem_ctl_info *mci,
840				 struct e752x_error_info *info)
841{
842	struct pci_dev *dev;
843	struct e752x_pvt *pvt;
844
845	memset(info, 0, sizeof(*info));
846	pvt = (struct e752x_pvt *)mci->pvt_info;
847	dev = pvt->dev_d0f1;
848	pci_read_config_dword(dev, E752X_FERR_GLOBAL, &info->ferr_global);
849
850	if (info->ferr_global) {
851		if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
852			pci_read_config_dword(dev, I3100_NSI_FERR,
853					     &info->nsi_ferr);
854			info->hi_ferr = 0;
855		} else {
856			pci_read_config_byte(dev, E752X_HI_FERR,
857					     &info->hi_ferr);
858			info->nsi_ferr = 0;
859		}
860		pci_read_config_word(dev, E752X_SYSBUS_FERR,
861				&info->sysbus_ferr);
862		pci_read_config_byte(dev, E752X_BUF_FERR, &info->buf_ferr);
863		pci_read_config_word(dev, E752X_DRAM_FERR, &info->dram_ferr);
864		pci_read_config_dword(dev, E752X_DRAM_SEC1_ADD,
865				&info->dram_sec1_add);
866		pci_read_config_word(dev, E752X_DRAM_SEC1_SYNDROME,
867				&info->dram_sec1_syndrome);
868		pci_read_config_dword(dev, E752X_DRAM_DED_ADD,
869				&info->dram_ded_add);
870		pci_read_config_dword(dev, E752X_DRAM_SCRB_ADD,
871				&info->dram_scrb_add);
872		pci_read_config_dword(dev, E752X_DRAM_RETR_ADD,
873				&info->dram_retr_add);
874
875		/* ignore the reserved bits just in case */
876		if (info->hi_ferr & 0x7f)
877			pci_write_config_byte(dev, E752X_HI_FERR,
878					info->hi_ferr);
879
880		if (info->nsi_ferr & NSI_ERR_MASK)
881			pci_write_config_dword(dev, I3100_NSI_FERR,
882					info->nsi_ferr);
883
884		if (info->sysbus_ferr)
885			pci_write_config_word(dev, E752X_SYSBUS_FERR,
886					info->sysbus_ferr);
887
888		if (info->buf_ferr & 0x0f)
889			pci_write_config_byte(dev, E752X_BUF_FERR,
890					info->buf_ferr);
891
892		if (info->dram_ferr)
893			pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_FERR,
894					 info->dram_ferr, info->dram_ferr);
895
896		pci_write_config_dword(dev, E752X_FERR_GLOBAL,
897				info->ferr_global);
898	}
899
900	pci_read_config_dword(dev, E752X_NERR_GLOBAL, &info->nerr_global);
901
902	if (info->nerr_global) {
903		if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
904			pci_read_config_dword(dev, I3100_NSI_NERR,
905					     &info->nsi_nerr);
906			info->hi_nerr = 0;
907		} else {
908			pci_read_config_byte(dev, E752X_HI_NERR,
909					     &info->hi_nerr);
910			info->nsi_nerr = 0;
911		}
912		pci_read_config_word(dev, E752X_SYSBUS_NERR,
913				&info->sysbus_nerr);
914		pci_read_config_byte(dev, E752X_BUF_NERR, &info->buf_nerr);
915		pci_read_config_word(dev, E752X_DRAM_NERR, &info->dram_nerr);
916		pci_read_config_dword(dev, E752X_DRAM_SEC2_ADD,
917				&info->dram_sec2_add);
918		pci_read_config_word(dev, E752X_DRAM_SEC2_SYNDROME,
919				&info->dram_sec2_syndrome);
920
921		if (info->hi_nerr & 0x7f)
922			pci_write_config_byte(dev, E752X_HI_NERR,
923					info->hi_nerr);
924
925		if (info->nsi_nerr & NSI_ERR_MASK)
926			pci_write_config_dword(dev, I3100_NSI_NERR,
927					info->nsi_nerr);
928
929		if (info->sysbus_nerr)
930			pci_write_config_word(dev, E752X_SYSBUS_NERR,
931					info->sysbus_nerr);
932
933		if (info->buf_nerr & 0x0f)
934			pci_write_config_byte(dev, E752X_BUF_NERR,
935					info->buf_nerr);
936
937		if (info->dram_nerr)
938			pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_NERR,
939					 info->dram_nerr, info->dram_nerr);
940
941		pci_write_config_dword(dev, E752X_NERR_GLOBAL,
942				info->nerr_global);
943	}
944}
945
946static int e752x_process_error_info(struct mem_ctl_info *mci,
947				struct e752x_error_info *info,
948				int handle_errors)
949{
950	u32 error32, stat32;
951	int error_found;
952
953	error_found = 0;
954	error32 = (info->ferr_global >> 18) & 0x3ff;
955	stat32 = (info->ferr_global >> 4) & 0x7ff;
956
957	if (error32)
958		global_error(1, error32, &error_found, handle_errors);
959
960	if (stat32)
961		global_error(0, stat32, &error_found, handle_errors);
962
963	error32 = (info->nerr_global >> 18) & 0x3ff;
964	stat32 = (info->nerr_global >> 4) & 0x7ff;
965
966	if (error32)
967		global_error(1, error32, &error_found, handle_errors);
968
969	if (stat32)
970		global_error(0, stat32, &error_found, handle_errors);
971
972	e752x_check_hub_interface(info, &error_found, handle_errors);
973	e752x_check_ns_interface(info, &error_found, handle_errors);
974	e752x_check_sysbus(info, &error_found, handle_errors);
975	e752x_check_membuf(info, &error_found, handle_errors);
976	e752x_check_dram(mci, info, &error_found, handle_errors);
977	return error_found;
978}
979
980static void e752x_check(struct mem_ctl_info *mci)
981{
982	struct e752x_error_info info;
983
984	edac_dbg(3, "\n");
985	e752x_get_error_info(mci, &info);
986	e752x_process_error_info(mci, &info, 1);
987}
988
989/* Program byte/sec bandwidth scrub rate to hardware */
990static int set_sdram_scrub_rate(struct mem_ctl_info *mci, u32 new_bw)
991{
992	const struct scrubrate *scrubrates;
993	struct e752x_pvt *pvt = (struct e752x_pvt *) mci->pvt_info;
994	struct pci_dev *pdev = pvt->dev_d0f0;
995	int i;
996
997	if (pvt->dev_info->ctl_dev == PCI_DEVICE_ID_INTEL_3100_0)
998		scrubrates = scrubrates_i3100;
999	else
1000		scrubrates = scrubrates_e752x;
1001
1002	/* Translate the desired scrub rate to a e752x/3100 register value.
1003	 * Search for the bandwidth that is equal or greater than the
1004	 * desired rate and program the cooresponding register value.
1005	 */
1006	for (i = 0; scrubrates[i].bandwidth != SDRATE_EOT; i++)
1007		if (scrubrates[i].bandwidth >= new_bw)
1008			break;
1009
1010	if (scrubrates[i].bandwidth == SDRATE_EOT)
1011		return -1;
1012
1013	pci_write_config_word(pdev, E752X_MCHSCRB, scrubrates[i].scrubval);
1014
1015	return scrubrates[i].bandwidth;
1016}
1017
1018/* Convert current scrub rate value into byte/sec bandwidth */
1019static int get_sdram_scrub_rate(struct mem_ctl_info *mci)
1020{
1021	const struct scrubrate *scrubrates;
1022	struct e752x_pvt *pvt = (struct e752x_pvt *) mci->pvt_info;
1023	struct pci_dev *pdev = pvt->dev_d0f0;
1024	u16 scrubval;
1025	int i;
1026
1027	if (pvt->dev_info->ctl_dev == PCI_DEVICE_ID_INTEL_3100_0)
1028		scrubrates = scrubrates_i3100;
1029	else
1030		scrubrates = scrubrates_e752x;
1031
1032	/* Find the bandwidth matching the memory scrubber configuration */
1033	pci_read_config_word(pdev, E752X_MCHSCRB, &scrubval);
1034	scrubval = scrubval & 0x0f;
1035
1036	for (i = 0; scrubrates[i].bandwidth != SDRATE_EOT; i++)
1037		if (scrubrates[i].scrubval == scrubval)
1038			break;
1039
1040	if (scrubrates[i].bandwidth == SDRATE_EOT) {
1041		e752x_printk(KERN_WARNING,
1042			"Invalid sdram scrub control value: 0x%x\n", scrubval);
1043		return -1;
1044	}
1045	return scrubrates[i].bandwidth;
1046
1047}
1048
1049/* Return 1 if dual channel mode is active.  Else return 0. */
1050static inline int dual_channel_active(u16 ddrcsr)
1051{
1052	return (((ddrcsr >> 12) & 3) == 3);
1053}
1054
1055/* Remap csrow index numbers if map_type is "reverse"
1056 */
1057static inline int remap_csrow_index(struct mem_ctl_info *mci, int index)
1058{
1059	struct e752x_pvt *pvt = mci->pvt_info;
1060
1061	if (!pvt->map_type)
1062		return (7 - index);
1063
1064	return (index);
1065}
1066
1067static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev,
1068			u16 ddrcsr)
1069{
1070	struct csrow_info *csrow;
1071	enum edac_type edac_mode;
1072	unsigned long last_cumul_size;
1073	int index, mem_dev, drc_chan;
1074	int drc_drbg;		/* DRB granularity 0=64mb, 1=128mb */
1075	int drc_ddim;		/* DRAM Data Integrity Mode 0=none, 2=edac */
1076	u8 value;
1077	u32 dra, drc, cumul_size, i, nr_pages;
1078
1079	dra = 0;
1080	for (index = 0; index < 4; index++) {
1081		u8 dra_reg;
1082		pci_read_config_byte(pdev, E752X_DRA + index, &dra_reg);
1083		dra |= dra_reg << (index * 8);
1084	}
1085	pci_read_config_dword(pdev, E752X_DRC, &drc);
1086	drc_chan = dual_channel_active(ddrcsr) ? 1 : 0;
1087	drc_drbg = drc_chan + 1;	/* 128 in dual mode, 64 in single */
1088	drc_ddim = (drc >> 20) & 0x3;
1089
1090	/* The dram row boundary (DRB) reg values are boundary address for
1091	 * each DRAM row with a granularity of 64 or 128MB (single/dual
1092	 * channel operation).  DRB regs are cumulative; therefore DRB7 will
1093	 * contain the total memory contained in all eight rows.
1094	 */
1095	for (last_cumul_size = index = 0; index < mci->nr_csrows; index++) {
1096		/* mem_dev 0=x8, 1=x4 */
1097		mem_dev = (dra >> (index * 4 + 2)) & 0x3;
1098		csrow = mci->csrows[remap_csrow_index(mci, index)];
1099
1100		mem_dev = (mem_dev == 2);
1101		pci_read_config_byte(pdev, E752X_DRB + index, &value);
1102		/* convert a 128 or 64 MiB DRB to a page size. */
1103		cumul_size = value << (25 + drc_drbg - PAGE_SHIFT);
1104		edac_dbg(3, "(%d) cumul_size 0x%x\n", index, cumul_size);
1105		if (cumul_size == last_cumul_size)
1106			continue;	/* not populated */
1107
1108		csrow->first_page = last_cumul_size;
1109		csrow->last_page = cumul_size - 1;
1110		nr_pages = cumul_size - last_cumul_size;
1111		last_cumul_size = cumul_size;
1112
1113		/*
1114		* if single channel or x8 devices then SECDED
1115		* if dual channel and x4 then S4ECD4ED
1116		*/
1117		if (drc_ddim) {
1118			if (drc_chan && mem_dev) {
1119				edac_mode = EDAC_S4ECD4ED;
1120				mci->edac_cap |= EDAC_FLAG_S4ECD4ED;
1121			} else {
1122				edac_mode = EDAC_SECDED;
1123				mci->edac_cap |= EDAC_FLAG_SECDED;
1124			}
1125		} else
1126			edac_mode = EDAC_NONE;
1127		for (i = 0; i < csrow->nr_channels; i++) {
1128			struct dimm_info *dimm = csrow->channels[i]->dimm;
1129
1130			edac_dbg(3, "Initializing rank at (%i,%i)\n", index, i);
1131			dimm->nr_pages = nr_pages / csrow->nr_channels;
1132			dimm->grain = 1 << 12;	/* 4KiB - resolution of CELOG */
1133			dimm->mtype = MEM_RDDR;	/* only one type supported */
1134			dimm->dtype = mem_dev ? DEV_X4 : DEV_X8;
1135			dimm->edac_mode = edac_mode;
1136		}
1137	}
1138}
1139
1140static void e752x_init_mem_map_table(struct pci_dev *pdev,
1141				struct e752x_pvt *pvt)
1142{
1143	int index;
1144	u8 value, last, row;
1145
1146	last = 0;
1147	row = 0;
1148
1149	for (index = 0; index < 8; index += 2) {
1150		pci_read_config_byte(pdev, E752X_DRB + index, &value);
1151		/* test if there is a dimm in this slot */
1152		if (value == last) {
1153			/* no dimm in the slot, so flag it as empty */
1154			pvt->map[index] = 0xff;
1155			pvt->map[index + 1] = 0xff;
1156		} else {	/* there is a dimm in the slot */
1157			pvt->map[index] = row;
1158			row++;
1159			last = value;
1160			/* test the next value to see if the dimm is double
1161			 * sided
1162			 */
1163			pci_read_config_byte(pdev, E752X_DRB + index + 1,
1164					&value);
1165
1166			/* the dimm is single sided, so flag as empty */
1167			/* this is a double sided dimm to save the next row #*/
1168			pvt->map[index + 1] = (value == last) ? 0xff :	row;
1169			row++;
1170			last = value;
1171		}
1172	}
1173}
1174
1175/* Return 0 on success or 1 on failure. */
1176static int e752x_get_devs(struct pci_dev *pdev, int dev_idx,
1177			struct e752x_pvt *pvt)
1178{
1179	pvt->dev_d0f1 = pci_get_device(PCI_VENDOR_ID_INTEL,
1180				pvt->dev_info->err_dev, NULL);
1181
1182	if (pvt->dev_d0f1 == NULL) {
1183		pvt->dev_d0f1 = pci_scan_single_device(pdev->bus,
1184							PCI_DEVFN(0, 1));
1185		pci_dev_get(pvt->dev_d0f1);
1186	}
1187
1188	if (pvt->dev_d0f1 == NULL) {
1189		e752x_printk(KERN_ERR, "error reporting device not found:"
1190			"vendor %x device 0x%x (broken BIOS?)\n",
1191			PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev);
1192		return 1;
1193	}
1194
1195	pvt->dev_d0f0 = pci_get_device(PCI_VENDOR_ID_INTEL,
1196				e752x_devs[dev_idx].ctl_dev,
1197				NULL);
1198
1199	if (pvt->dev_d0f0 == NULL)
1200		goto fail;
1201
1202	return 0;
1203
1204fail:
1205	pci_dev_put(pvt->dev_d0f1);
1206	return 1;
1207}
1208
1209/* Setup system bus parity mask register.
1210 * Sysbus parity supported on:
1211 * e7320/e7520/e7525 + Xeon
1212 */
1213static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt)
1214{
1215	char *cpu_id = cpu_data(0).x86_model_id;
1216	struct pci_dev *dev = pvt->dev_d0f1;
1217	int enable = 1;
1218
1219	/* Allow module parameter override, else see if CPU supports parity */
1220	if (sysbus_parity != -1) {
1221		enable = sysbus_parity;
1222	} else if (cpu_id[0] && !strstr(cpu_id, "Xeon")) {
1223		e752x_printk(KERN_INFO, "System Bus Parity not "
1224			     "supported by CPU, disabling\n");
1225		enable = 0;
1226	}
1227
1228	if (enable)
1229		pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0000);
1230	else
1231		pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0309);
1232}
1233
1234static void e752x_init_error_reporting_regs(struct e752x_pvt *pvt)
1235{
1236	struct pci_dev *dev;
1237
1238	dev = pvt->dev_d0f1;
1239	/* Turn off error disable & SMI in case the BIOS turned it on */
1240	if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
1241		pci_write_config_dword(dev, I3100_NSI_EMASK, 0);
1242		pci_write_config_dword(dev, I3100_NSI_SMICMD, 0);
1243	} else {
1244		pci_write_config_byte(dev, E752X_HI_ERRMASK, 0x00);
1245		pci_write_config_byte(dev, E752X_HI_SMICMD, 0x00);
1246	}
1247
1248	e752x_init_sysbus_parity_mask(pvt);
1249
1250	pci_write_config_word(dev, E752X_SYSBUS_SMICMD, 0x00);
1251	pci_write_config_byte(dev, E752X_BUF_ERRMASK, 0x00);
1252	pci_write_config_byte(dev, E752X_BUF_SMICMD, 0x00);
1253	pci_write_config_byte(dev, E752X_DRAM_ERRMASK, 0x00);
1254	pci_write_config_byte(dev, E752X_DRAM_SMICMD, 0x00);
1255}
1256
1257static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
1258{
1259	u16 pci_data;
1260	u8 stat8;
1261	struct mem_ctl_info *mci;
1262	struct edac_mc_layer layers[2];
1263	struct e752x_pvt *pvt;
1264	u16 ddrcsr;
1265	int drc_chan;		/* Number of channels 0=1chan,1=2chan */
1266	struct e752x_error_info discard;
1267
1268	edac_dbg(0, "mci\n");
1269	edac_dbg(0, "Starting Probe1\n");
1270
1271	/* check to see if device 0 function 1 is enabled; if it isn't, we
1272	 * assume the BIOS has reserved it for a reason and is expecting
1273	 * exclusive access, we take care not to violate that assumption and
1274	 * fail the probe. */
1275	pci_read_config_byte(pdev, E752X_DEVPRES1, &stat8);
1276	if (!force_function_unhide && !(stat8 & (1 << 5))) {
1277		printk(KERN_INFO "Contact your BIOS vendor to see if the "
1278			"E752x error registers can be safely un-hidden\n");
1279		return -ENODEV;
1280	}
1281	stat8 |= (1 << 5);
1282	pci_write_config_byte(pdev, E752X_DEVPRES1, stat8);
1283
1284	pci_read_config_word(pdev, E752X_DDRCSR, &ddrcsr);
1285	/* FIXME: should check >>12 or 0xf, true for all? */
1286	/* Dual channel = 1, Single channel = 0 */
1287	drc_chan = dual_channel_active(ddrcsr);
1288
1289	layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
1290	layers[0].size = E752X_NR_CSROWS;
1291	layers[0].is_virt_csrow = true;
1292	layers[1].type = EDAC_MC_LAYER_CHANNEL;
1293	layers[1].size = drc_chan + 1;
1294	layers[1].is_virt_csrow = false;
1295	mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt));
1296	if (mci == NULL)
1297		return -ENOMEM;
1298
1299	edac_dbg(3, "init mci\n");
1300	mci->mtype_cap = MEM_FLAG_RDDR;
1301	/* 3100 IMCH supports SECDEC only */
1302	mci->edac_ctl_cap = (dev_idx == I3100) ? EDAC_FLAG_SECDED :
1303		(EDAC_FLAG_NONE | EDAC_FLAG_SECDED | EDAC_FLAG_S4ECD4ED);
1304	/* FIXME - what if different memory types are in different csrows? */
1305	mci->mod_name = EDAC_MOD_STR;
1306	mci->mod_ver = E752X_REVISION;
1307	mci->pdev = &pdev->dev;
1308
1309	edac_dbg(3, "init pvt\n");
1310	pvt = (struct e752x_pvt *)mci->pvt_info;
1311	pvt->dev_info = &e752x_devs[dev_idx];
1312	pvt->mc_symmetric = ((ddrcsr & 0x10) != 0);
1313
1314	if (e752x_get_devs(pdev, dev_idx, pvt)) {
1315		edac_mc_free(mci);
1316		return -ENODEV;
1317	}
1318
1319	edac_dbg(3, "more mci init\n");
1320	mci->ctl_name = pvt->dev_info->ctl_name;
1321	mci->dev_name = pci_name(pdev);
1322	mci->edac_check = e752x_check;
1323	mci->ctl_page_to_phys = ctl_page_to_phys;
1324	mci->set_sdram_scrub_rate = set_sdram_scrub_rate;
1325	mci->get_sdram_scrub_rate = get_sdram_scrub_rate;
1326
1327	/* set the map type.  1 = normal, 0 = reversed
1328	 * Must be set before e752x_init_csrows in case csrow mapping
1329	 * is reversed.
1330	 */
1331	pci_read_config_byte(pdev, E752X_DRM, &stat8);
1332	pvt->map_type = ((stat8 & 0x0f) > ((stat8 >> 4) & 0x0f));
1333
1334	e752x_init_csrows(mci, pdev, ddrcsr);
1335	e752x_init_mem_map_table(pdev, pvt);
1336
1337	if (dev_idx == I3100)
1338		mci->edac_cap = EDAC_FLAG_SECDED; /* the only mode supported */
1339	else
1340		mci->edac_cap |= EDAC_FLAG_NONE;
1341	edac_dbg(3, "tolm, remapbase, remaplimit\n");
1342
1343	/* load the top of low memory, remap base, and remap limit vars */
1344	pci_read_config_word(pdev, E752X_TOLM, &pci_data);
1345	pvt->tolm = ((u32) pci_data) << 4;
1346	pci_read_config_word(pdev, E752X_REMAPBASE, &pci_data);
1347	pvt->remapbase = ((u32) pci_data) << 14;
1348	pci_read_config_word(pdev, E752X_REMAPLIMIT, &pci_data);
1349	pvt->remaplimit = ((u32) pci_data) << 14;
1350	e752x_printk(KERN_INFO,
1351			"tolm = %x, remapbase = %x, remaplimit = %x\n",
1352			pvt->tolm, pvt->remapbase, pvt->remaplimit);
1353
1354	/* Here we assume that we will never see multiple instances of this
1355	 * type of memory controller.  The ID is therefore hardcoded to 0.
1356	 */
1357	if (edac_mc_add_mc(mci)) {
1358		edac_dbg(3, "failed edac_mc_add_mc()\n");
1359		goto fail;
1360	}
1361
1362	e752x_init_error_reporting_regs(pvt);
1363	e752x_get_error_info(mci, &discard);	/* clear other MCH errors */
1364
1365	/* allocating generic PCI control info */
1366	e752x_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR);
1367	if (!e752x_pci) {
1368		printk(KERN_WARNING
1369			"%s(): Unable to create PCI control\n", __func__);
1370		printk(KERN_WARNING
1371			"%s(): PCI error report via EDAC not setup\n",
1372			__func__);
1373	}
1374
1375	/* get this far and it's successful */
1376	edac_dbg(3, "success\n");
1377	return 0;
1378
1379fail:
1380	pci_dev_put(pvt->dev_d0f0);
1381	pci_dev_put(pvt->dev_d0f1);
1382	edac_mc_free(mci);
1383
1384	return -ENODEV;
1385}
1386
1387/* returns count (>= 0), or negative on error */
1388static int e752x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1389{
1390	edac_dbg(0, "\n");
1391
1392	/* wake up and enable device */
1393	if (pci_enable_device(pdev) < 0)
1394		return -EIO;
1395
1396	return e752x_probe1(pdev, ent->driver_data);
1397}
1398
1399static void e752x_remove_one(struct pci_dev *pdev)
1400{
1401	struct mem_ctl_info *mci;
1402	struct e752x_pvt *pvt;
1403
1404	edac_dbg(0, "\n");
1405
1406	if (e752x_pci)
1407		edac_pci_release_generic_ctl(e752x_pci);
1408
1409	if ((mci = edac_mc_del_mc(&pdev->dev)) == NULL)
1410		return;
1411
1412	pvt = (struct e752x_pvt *)mci->pvt_info;
1413	pci_dev_put(pvt->dev_d0f0);
1414	pci_dev_put(pvt->dev_d0f1);
1415	edac_mc_free(mci);
1416}
1417
1418static const struct pci_device_id e752x_pci_tbl[] = {
1419	{
1420	 PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1421	 E7520},
1422	{
1423	 PCI_VEND_DEV(INTEL, 7525_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1424	 E7525},
1425	{
1426	 PCI_VEND_DEV(INTEL, 7320_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1427	 E7320},
1428	{
1429	 PCI_VEND_DEV(INTEL, 3100_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1430	 I3100},
1431	{
1432	 0,
1433	 }			/* 0 terminated list. */
1434};
1435
1436MODULE_DEVICE_TABLE(pci, e752x_pci_tbl);
1437
1438static struct pci_driver e752x_driver = {
1439	.name = EDAC_MOD_STR,
1440	.probe = e752x_init_one,
1441	.remove = e752x_remove_one,
1442	.id_table = e752x_pci_tbl,
1443};
1444
1445static int __init e752x_init(void)
1446{
1447	int pci_rc;
1448
1449	edac_dbg(3, "\n");
1450
1451       /* Ensure that the OPSTATE is set correctly for POLL or NMI */
1452       opstate_init();
1453
1454	pci_rc = pci_register_driver(&e752x_driver);
1455	return (pci_rc < 0) ? pci_rc : 0;
1456}
1457
1458static void __exit e752x_exit(void)
1459{
1460	edac_dbg(3, "\n");
1461	pci_unregister_driver(&e752x_driver);
1462}
1463
1464module_init(e752x_init);
1465module_exit(e752x_exit);
1466
1467MODULE_LICENSE("GPL");
1468MODULE_AUTHOR("Linux Networx (http://lnxi.com) Tom Zimmerman\n");
1469MODULE_DESCRIPTION("MC support for Intel e752x/3100 memory controllers");
1470
1471module_param(force_function_unhide, int, 0444);
1472MODULE_PARM_DESC(force_function_unhide, "if BIOS sets Dev0:Fun1 up as hidden:"
1473		 " 1=force unhide and hope BIOS doesn't fight driver for "
1474		"Dev0:Fun1 access");
1475
1476module_param(edac_op_state, int, 0444);
1477MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
1478
1479module_param(sysbus_parity, int, 0444);
1480MODULE_PARM_DESC(sysbus_parity, "0=disable system bus parity checking,"
1481		" 1=enable system bus parity checking, default=auto-detect");
1482module_param(report_non_memory_errors, int, 0644);
1483MODULE_PARM_DESC(report_non_memory_errors, "0=disable non-memory error "
1484		"reporting, 1=enable non-memory error reporting");
1485