1 /* Intel i7 core/Nehalem Memory Controller kernel module
3 * This driver supports the memory controllers found on the Intel
4 * processor families i7core, i7core 7xx/8xx, i5core, Xeon 35xx,
5 * Xeon 55xx and Xeon 56xx also known as Nehalem, Nehalem-EP, Lynnfield
8 * This file may be distributed under the terms of the
9 * GNU General Public License version 2 only.
11 * Copyright (c) 2009-2010 by:
12 * Mauro Carvalho Chehab <mchehab@redhat.com>
14 * Red Hat Inc. http://www.redhat.com
16 * Forked and adapted from the i5400_edac driver
18 * Based on the following public Intel datasheets:
19 * Intel Core i7 Processor Extreme Edition and Intel Core i7 Processor
20 * Datasheet, Volume 2:
21 * http://download.intel.com/design/processor/datashts/320835.pdf
22 * Intel Xeon Processor 5500 Series Datasheet Volume 2
23 * http://www.intel.com/Assets/PDF/datasheet/321322.pdf
25 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
28 #include <linux/module.h>
29 #include <linux/init.h>
30 #include <linux/pci.h>
31 #include <linux/pci_ids.h>
32 #include <linux/slab.h>
33 #include <linux/delay.h>
34 #include <linux/dmi.h>
35 #include <linux/edac.h>
36 #include <linux/mmzone.h>
37 #include <linux/smp.h>
39 #include <asm/processor.h>
40 #include <asm/div64.h>
42 #include "edac_core.h"
45 static LIST_HEAD(i7core_edac_list);
46 static DEFINE_MUTEX(i7core_edac_lock);
49 static int use_pci_fixup;
50 module_param(use_pci_fixup, int, 0444);
51 MODULE_PARM_DESC(use_pci_fixup, "Enable PCI fixup to seek for hidden devices");
53 * This is used for Nehalem-EP and Nehalem-EX devices, where the non-core
54 * registers start at bus 255, and are not reported by BIOS.
55 * We currently find devices with only 2 sockets. In order to support more QPI
56 * Quick Path Interconnect, just increment this number.
58 #define MAX_SOCKET_BUSES 2
62 * Alter this version for the module when modifications are made
64 #define I7CORE_REVISION " Ver: 1.0.0"
65 #define EDAC_MOD_STR "i7core_edac"
70 #define i7core_printk(level, fmt, arg...) \
71 edac_printk(level, "i7core", fmt, ##arg)
73 #define i7core_mc_printk(mci, level, fmt, arg...) \
74 edac_mc_chipset_printk(mci, level, "i7core", fmt, ##arg)
77 * i7core Memory Controller Registers
80 /* OFFSETS for Device 0 Function 0 */
82 #define MC_CFG_CONTROL 0x90
83 #define MC_CFG_UNLOCK 0x02
84 #define MC_CFG_LOCK 0x00
86 /* OFFSETS for Device 3 Function 0 */
88 #define MC_CONTROL 0x48
89 #define MC_STATUS 0x4c
90 #define MC_MAX_DOD 0x64
93 * OFFSETS for Device 3 Function 4, as inicated on Xeon 5500 datasheet:
94 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
97 #define MC_TEST_ERR_RCV1 0x60
98 #define DIMM2_COR_ERR(r) ((r) & 0x7fff)
100 #define MC_TEST_ERR_RCV0 0x64
101 #define DIMM1_COR_ERR(r) (((r) >> 16) & 0x7fff)
102 #define DIMM0_COR_ERR(r) ((r) & 0x7fff)
104 /* OFFSETS for Device 3 Function 2, as inicated on Xeon 5500 datasheet */
105 #define MC_SSRCONTROL 0x48
106 #define SSR_MODE_DISABLE 0x00
107 #define SSR_MODE_ENABLE 0x01
108 #define SSR_MODE_MASK 0x03
110 #define MC_SCRUB_CONTROL 0x4c
111 #define STARTSCRUB (1 << 24)
112 #define SCRUBINTERVAL_MASK 0xffffff
114 #define MC_COR_ECC_CNT_0 0x80
115 #define MC_COR_ECC_CNT_1 0x84
116 #define MC_COR_ECC_CNT_2 0x88
117 #define MC_COR_ECC_CNT_3 0x8c
118 #define MC_COR_ECC_CNT_4 0x90
119 #define MC_COR_ECC_CNT_5 0x94
121 #define DIMM_TOP_COR_ERR(r) (((r) >> 16) & 0x7fff)
122 #define DIMM_BOT_COR_ERR(r) ((r) & 0x7fff)
125 /* OFFSETS for Devices 4,5 and 6 Function 0 */
127 #define MC_CHANNEL_DIMM_INIT_PARAMS 0x58
128 #define THREE_DIMMS_PRESENT (1 << 24)
129 #define SINGLE_QUAD_RANK_PRESENT (1 << 23)
130 #define QUAD_RANK_PRESENT (1 << 22)
131 #define REGISTERED_DIMM (1 << 15)
133 #define MC_CHANNEL_MAPPER 0x60
134 #define RDLCH(r, ch) ((((r) >> (3 + (ch * 6))) & 0x07) - 1)
135 #define WRLCH(r, ch) ((((r) >> (ch * 6)) & 0x07) - 1)
137 #define MC_CHANNEL_RANK_PRESENT 0x7c
138 #define RANK_PRESENT_MASK 0xffff
140 #define MC_CHANNEL_ADDR_MATCH 0xf0
141 #define MC_CHANNEL_ERROR_MASK 0xf8
142 #define MC_CHANNEL_ERROR_INJECT 0xfc
143 #define INJECT_ADDR_PARITY 0x10
144 #define INJECT_ECC 0x08
145 #define MASK_CACHELINE 0x06
146 #define MASK_FULL_CACHELINE 0x06
147 #define MASK_MSB32_CACHELINE 0x04
148 #define MASK_LSB32_CACHELINE 0x02
149 #define NO_MASK_CACHELINE 0x00
150 #define REPEAT_EN 0x01
152 /* OFFSETS for Devices 4,5 and 6 Function 1 */
154 #define MC_DOD_CH_DIMM0 0x48
155 #define MC_DOD_CH_DIMM1 0x4c
156 #define MC_DOD_CH_DIMM2 0x50
157 #define RANKOFFSET_MASK ((1 << 12) | (1 << 11) | (1 << 10))
158 #define RANKOFFSET(x) ((x & RANKOFFSET_MASK) >> 10)
159 #define DIMM_PRESENT_MASK (1 << 9)
160 #define DIMM_PRESENT(x) (((x) & DIMM_PRESENT_MASK) >> 9)
161 #define MC_DOD_NUMBANK_MASK ((1 << 8) | (1 << 7))
162 #define MC_DOD_NUMBANK(x) (((x) & MC_DOD_NUMBANK_MASK) >> 7)
163 #define MC_DOD_NUMRANK_MASK ((1 << 6) | (1 << 5))
164 #define MC_DOD_NUMRANK(x) (((x) & MC_DOD_NUMRANK_MASK) >> 5)
165 #define MC_DOD_NUMROW_MASK ((1 << 4) | (1 << 3) | (1 << 2))
166 #define MC_DOD_NUMROW(x) (((x) & MC_DOD_NUMROW_MASK) >> 2)
167 #define MC_DOD_NUMCOL_MASK 3
168 #define MC_DOD_NUMCOL(x) ((x) & MC_DOD_NUMCOL_MASK)
170 #define MC_RANK_PRESENT 0x7c
172 #define MC_SAG_CH_0 0x80
173 #define MC_SAG_CH_1 0x84
174 #define MC_SAG_CH_2 0x88
175 #define MC_SAG_CH_3 0x8c
176 #define MC_SAG_CH_4 0x90
177 #define MC_SAG_CH_5 0x94
178 #define MC_SAG_CH_6 0x98
179 #define MC_SAG_CH_7 0x9c
181 #define MC_RIR_LIMIT_CH_0 0x40
182 #define MC_RIR_LIMIT_CH_1 0x44
183 #define MC_RIR_LIMIT_CH_2 0x48
184 #define MC_RIR_LIMIT_CH_3 0x4C
185 #define MC_RIR_LIMIT_CH_4 0x50
186 #define MC_RIR_LIMIT_CH_5 0x54
187 #define MC_RIR_LIMIT_CH_6 0x58
188 #define MC_RIR_LIMIT_CH_7 0x5C
189 #define MC_RIR_LIMIT_MASK ((1 << 10) - 1)
191 #define MC_RIR_WAY_CH 0x80
192 #define MC_RIR_WAY_OFFSET_MASK (((1 << 14) - 1) & ~0x7)
193 #define MC_RIR_WAY_RANK_MASK 0x7
200 #define MAX_DIMMS 3 /* Max DIMMS per channel */
201 #define MAX_MCR_FUNC 4
202 #define MAX_CHAN_FUNC 3
212 struct i7core_inject {
219 /* Error address mask */
220 int channel, dimm, rank, bank, page, col;
223 struct i7core_channel {
224 bool is_3dimms_present;
225 bool is_single_4rank;
230 struct pci_id_descr {
237 struct pci_id_table {
238 const struct pci_id_descr *descr;
243 struct list_head list;
245 struct pci_dev **pdev;
247 struct mem_ctl_info *mci;
251 struct device *addrmatch_dev, *chancounts_dev;
253 struct pci_dev *pci_noncore;
254 struct pci_dev *pci_mcr[MAX_MCR_FUNC + 1];
255 struct pci_dev *pci_ch[NUM_CHANS][MAX_CHAN_FUNC + 1];
257 struct i7core_dev *i7core_dev;
259 struct i7core_info info;
260 struct i7core_inject inject;
261 struct i7core_channel channel[NUM_CHANS];
263 int ce_count_available;
265 /* ECC corrected errors counts per udimm */
266 unsigned long udimm_ce_count[MAX_DIMMS];
267 int udimm_last_ce_count[MAX_DIMMS];
268 /* ECC corrected errors counts per rdimm */
269 unsigned long rdimm_ce_count[NUM_CHANS][MAX_DIMMS];
270 int rdimm_last_ce_count[NUM_CHANS][MAX_DIMMS];
272 bool is_registered, enable_scrub;
274 /* Fifo double buffers */
275 struct mce mce_entry[MCE_LOG_LEN];
276 struct mce mce_outentry[MCE_LOG_LEN];
278 /* Fifo in/out counters */
279 unsigned mce_in, mce_out;
281 /* Count indicator to show errors not got */
282 unsigned mce_overrun;
284 /* DCLK Frequency used for computing scrub rate */
287 /* Struct to control EDAC polling */
288 struct edac_pci_ctl_info *i7core_pci;
291 #define PCI_DESCR(device, function, device_id) \
293 .func = (function), \
294 .dev_id = (device_id)
296 static const struct pci_id_descr pci_dev_descr_i7core_nehalem[] = {
297 /* Memory controller */
298 { PCI_DESCR(3, 0, PCI_DEVICE_ID_INTEL_I7_MCR) },
299 { PCI_DESCR(3, 1, PCI_DEVICE_ID_INTEL_I7_MC_TAD) },
300 /* Exists only for RDIMM */
301 { PCI_DESCR(3, 2, PCI_DEVICE_ID_INTEL_I7_MC_RAS), .optional = 1 },
302 { PCI_DESCR(3, 4, PCI_DEVICE_ID_INTEL_I7_MC_TEST) },
305 { PCI_DESCR(4, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH0_CTRL) },
306 { PCI_DESCR(4, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH0_ADDR) },
307 { PCI_DESCR(4, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH0_RANK) },
308 { PCI_DESCR(4, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH0_TC) },
311 { PCI_DESCR(5, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH1_CTRL) },
312 { PCI_DESCR(5, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH1_ADDR) },
313 { PCI_DESCR(5, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH1_RANK) },
314 { PCI_DESCR(5, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH1_TC) },
317 { PCI_DESCR(6, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH2_CTRL) },
318 { PCI_DESCR(6, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH2_ADDR) },
319 { PCI_DESCR(6, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH2_RANK) },
320 { PCI_DESCR(6, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH2_TC) },
322 /* Generic Non-core registers */
324 * This is the PCI device on i7core and on Xeon 35xx (8086:2c41)
325 * On Xeon 55xx, however, it has a different id (8086:2c40). So,
326 * the probing code needs to test for the other address in case of
327 * failure of this one
329 { PCI_DESCR(0, 0, PCI_DEVICE_ID_INTEL_I7_NONCORE) },
333 static const struct pci_id_descr pci_dev_descr_lynnfield[] = {
334 { PCI_DESCR( 3, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MCR) },
335 { PCI_DESCR( 3, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_TAD) },
336 { PCI_DESCR( 3, 4, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_TEST) },
338 { PCI_DESCR( 4, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_CTRL) },
339 { PCI_DESCR( 4, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_ADDR) },
340 { PCI_DESCR( 4, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_RANK) },
341 { PCI_DESCR( 4, 3, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_TC) },
343 { PCI_DESCR( 5, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_CTRL) },
344 { PCI_DESCR( 5, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_ADDR) },
345 { PCI_DESCR( 5, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_RANK) },
346 { PCI_DESCR( 5, 3, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_TC) },
349 * This is the PCI device has an alternate address on some
350 * processors like Core i7 860
352 { PCI_DESCR( 0, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE) },
355 static const struct pci_id_descr pci_dev_descr_i7core_westmere[] = {
356 /* Memory controller */
357 { PCI_DESCR(3, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MCR_REV2) },
358 { PCI_DESCR(3, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_TAD_REV2) },
359 /* Exists only for RDIMM */
360 { PCI_DESCR(3, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_RAS_REV2), .optional = 1 },
361 { PCI_DESCR(3, 4, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_TEST_REV2) },
364 { PCI_DESCR(4, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_CTRL_REV2) },
365 { PCI_DESCR(4, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_ADDR_REV2) },
366 { PCI_DESCR(4, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_RANK_REV2) },
367 { PCI_DESCR(4, 3, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH0_TC_REV2) },
370 { PCI_DESCR(5, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_CTRL_REV2) },
371 { PCI_DESCR(5, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_ADDR_REV2) },
372 { PCI_DESCR(5, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_RANK_REV2) },
373 { PCI_DESCR(5, 3, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH1_TC_REV2) },
376 { PCI_DESCR(6, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH2_CTRL_REV2) },
377 { PCI_DESCR(6, 1, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH2_ADDR_REV2) },
378 { PCI_DESCR(6, 2, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH2_RANK_REV2) },
379 { PCI_DESCR(6, 3, PCI_DEVICE_ID_INTEL_LYNNFIELD_MC_CH2_TC_REV2) },
381 /* Generic Non-core registers */
382 { PCI_DESCR(0, 0, PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_REV2) },
386 #define PCI_ID_TABLE_ENTRY(A) { .descr=A, .n_devs = ARRAY_SIZE(A) }
387 static const struct pci_id_table pci_dev_table[] = {
388 PCI_ID_TABLE_ENTRY(pci_dev_descr_i7core_nehalem),
389 PCI_ID_TABLE_ENTRY(pci_dev_descr_lynnfield),
390 PCI_ID_TABLE_ENTRY(pci_dev_descr_i7core_westmere),
391 {0,} /* 0 terminated list. */
395 * pci_device_id table for which devices we are looking for
397 static DEFINE_PCI_DEVICE_TABLE(i7core_pci_tbl) = {
398 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)},
399 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNNFIELD_QPI_LINK0)},
400 {0,} /* 0 terminated list. */
403 /****************************************************************************
404 Anciliary status routines
405 ****************************************************************************/
407 /* MC_CONTROL bits */
408 #define CH_ACTIVE(pvt, ch) ((pvt)->info.mc_control & (1 << (8 + ch)))
409 #define ECCx8(pvt) ((pvt)->info.mc_control & (1 << 1))
412 #define ECC_ENABLED(pvt) ((pvt)->info.mc_status & (1 << 4))
413 #define CH_DISABLED(pvt, ch) ((pvt)->info.mc_status & (1 << ch))
415 /* MC_MAX_DOD read functions */
416 static inline int numdimms(u32 dimms)
418 return (dimms & 0x3) + 1;
421 static inline int numrank(u32 rank)
423 static int ranks[4] = { 1, 2, 4, -EINVAL };
425 return ranks[rank & 0x3];
428 static inline int numbank(u32 bank)
430 static int banks[4] = { 4, 8, 16, -EINVAL };
432 return banks[bank & 0x3];
435 static inline int numrow(u32 row)
437 static int rows[8] = {
438 1 << 12, 1 << 13, 1 << 14, 1 << 15,
439 1 << 16, -EINVAL, -EINVAL, -EINVAL,
442 return rows[row & 0x7];
445 static inline int numcol(u32 col)
447 static int cols[8] = {
448 1 << 10, 1 << 11, 1 << 12, -EINVAL,
450 return cols[col & 0x3];
453 static struct i7core_dev *get_i7core_dev(u8 socket)
455 struct i7core_dev *i7core_dev;
457 list_for_each_entry(i7core_dev, &i7core_edac_list, list) {
458 if (i7core_dev->socket == socket)
465 static struct i7core_dev *alloc_i7core_dev(u8 socket,
466 const struct pci_id_table *table)
468 struct i7core_dev *i7core_dev;
470 i7core_dev = kzalloc(sizeof(*i7core_dev), GFP_KERNEL);
474 i7core_dev->pdev = kzalloc(sizeof(*i7core_dev->pdev) * table->n_devs,
476 if (!i7core_dev->pdev) {
481 i7core_dev->socket = socket;
482 i7core_dev->n_devs = table->n_devs;
483 list_add_tail(&i7core_dev->list, &i7core_edac_list);
488 static void free_i7core_dev(struct i7core_dev *i7core_dev)
490 list_del(&i7core_dev->list);
491 kfree(i7core_dev->pdev);
495 /****************************************************************************
496 Memory check routines
497 ****************************************************************************/
499 static int get_dimm_config(struct mem_ctl_info *mci)
501 struct i7core_pvt *pvt = mci->pvt_info;
502 struct pci_dev *pdev;
506 struct dimm_info *dimm;
508 /* Get data from the MC register, function 0 */
509 pdev = pvt->pci_mcr[0];
513 /* Device 3 function 0 reads */
514 pci_read_config_dword(pdev, MC_CONTROL, &pvt->info.mc_control);
515 pci_read_config_dword(pdev, MC_STATUS, &pvt->info.mc_status);
516 pci_read_config_dword(pdev, MC_MAX_DOD, &pvt->info.max_dod);
517 pci_read_config_dword(pdev, MC_CHANNEL_MAPPER, &pvt->info.ch_map);
519 debugf0("QPI %d control=0x%08x status=0x%08x dod=0x%08x map=0x%08x\n",
520 pvt->i7core_dev->socket, pvt->info.mc_control, pvt->info.mc_status,
521 pvt->info.max_dod, pvt->info.ch_map);
523 if (ECC_ENABLED(pvt)) {
524 debugf0("ECC enabled with x%d SDCC\n", ECCx8(pvt) ? 8 : 4);
526 mode = EDAC_S8ECD8ED;
528 mode = EDAC_S4ECD4ED;
530 debugf0("ECC disabled\n");
534 /* FIXME: need to handle the error codes */
535 debugf0("DOD Max limits: DIMMS: %d, %d-ranked, %d-banked "
537 numdimms(pvt->info.max_dod),
538 numrank(pvt->info.max_dod >> 2),
539 numbank(pvt->info.max_dod >> 4),
540 numrow(pvt->info.max_dod >> 6),
541 numcol(pvt->info.max_dod >> 9));
543 for (i = 0; i < NUM_CHANS; i++) {
544 u32 data, dimm_dod[3], value[8];
546 if (!pvt->pci_ch[i][0])
549 if (!CH_ACTIVE(pvt, i)) {
550 debugf0("Channel %i is not active\n", i);
553 if (CH_DISABLED(pvt, i)) {
554 debugf0("Channel %i is disabled\n", i);
558 /* Devices 4-6 function 0 */
559 pci_read_config_dword(pvt->pci_ch[i][0],
560 MC_CHANNEL_DIMM_INIT_PARAMS, &data);
563 if (data & THREE_DIMMS_PRESENT)
564 pvt->channel[i].is_3dimms_present = true;
566 if (data & SINGLE_QUAD_RANK_PRESENT)
567 pvt->channel[i].is_single_4rank = true;
569 if (data & QUAD_RANK_PRESENT)
570 pvt->channel[i].has_4rank = true;
572 if (data & REGISTERED_DIMM)
577 /* Devices 4-6 function 1 */
578 pci_read_config_dword(pvt->pci_ch[i][1],
579 MC_DOD_CH_DIMM0, &dimm_dod[0]);
580 pci_read_config_dword(pvt->pci_ch[i][1],
581 MC_DOD_CH_DIMM1, &dimm_dod[1]);
582 pci_read_config_dword(pvt->pci_ch[i][1],
583 MC_DOD_CH_DIMM2, &dimm_dod[2]);
585 debugf0("Ch%d phy rd%d, wr%d (0x%08x): "
588 RDLCH(pvt->info.ch_map, i), WRLCH(pvt->info.ch_map, i),
590 pvt->channel[i].is_3dimms_present ? "3DIMMS " : "",
591 pvt->channel[i].is_3dimms_present ? "SINGLE_4R " : "",
592 pvt->channel[i].has_4rank ? "HAS_4R " : "",
593 (data & REGISTERED_DIMM) ? 'R' : 'U');
595 for (j = 0; j < 3; j++) {
596 u32 banks, ranks, rows, cols;
599 if (!DIMM_PRESENT(dimm_dod[j]))
602 dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, mci->n_layers,
604 banks = numbank(MC_DOD_NUMBANK(dimm_dod[j]));
605 ranks = numrank(MC_DOD_NUMRANK(dimm_dod[j]));
606 rows = numrow(MC_DOD_NUMROW(dimm_dod[j]));
607 cols = numcol(MC_DOD_NUMCOL(dimm_dod[j]));
609 /* DDR3 has 8 I/O banks */
610 size = (rows * cols * banks * ranks) >> (20 - 3);
612 debugf0("\tdimm %d %d Mb offset: %x, "
613 "bank: %d, rank: %d, row: %#x, col: %#x\n",
615 RANKOFFSET(dimm_dod[j]),
616 banks, ranks, rows, cols);
618 npages = MiB_TO_PAGES(size);
620 dimm->nr_pages = npages;
624 dimm->dtype = DEV_X4;
627 dimm->dtype = DEV_X8;
630 dimm->dtype = DEV_X16;
633 dimm->dtype = DEV_UNKNOWN;
636 snprintf(dimm->label, sizeof(dimm->label),
637 "CPU#%uChannel#%u_DIMM#%u",
638 pvt->i7core_dev->socket, i, j);
640 dimm->edac_mode = mode;
644 pci_read_config_dword(pdev, MC_SAG_CH_0, &value[0]);
645 pci_read_config_dword(pdev, MC_SAG_CH_1, &value[1]);
646 pci_read_config_dword(pdev, MC_SAG_CH_2, &value[2]);
647 pci_read_config_dword(pdev, MC_SAG_CH_3, &value[3]);
648 pci_read_config_dword(pdev, MC_SAG_CH_4, &value[4]);
649 pci_read_config_dword(pdev, MC_SAG_CH_5, &value[5]);
650 pci_read_config_dword(pdev, MC_SAG_CH_6, &value[6]);
651 pci_read_config_dword(pdev, MC_SAG_CH_7, &value[7]);
652 debugf1("\t[%i] DIVBY3\tREMOVED\tOFFSET\n", i);
653 for (j = 0; j < 8; j++)
654 debugf1("\t\t%#x\t%#x\t%#x\n",
655 (value[j] >> 27) & 0x1,
656 (value[j] >> 24) & 0x7,
657 (value[j] & ((1 << 24) - 1)));
663 /****************************************************************************
664 Error insertion routines
665 ****************************************************************************/
667 #define to_mci(k) container_of(k, struct mem_ctl_info, dev)
669 /* The i7core has independent error injection features per channel.
670 However, to have a simpler code, we don't allow enabling error injection
671 on more than one channel.
672 Also, since a change at an inject parameter will be applied only at enable,
673 we're disabling error injection on all write calls to the sysfs nodes that
674 controls the error code injection.
676 static int disable_inject(const struct mem_ctl_info *mci)
678 struct i7core_pvt *pvt = mci->pvt_info;
680 pvt->inject.enable = 0;
682 if (!pvt->pci_ch[pvt->inject.channel][0])
685 pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
686 MC_CHANNEL_ERROR_INJECT, 0);
692 * i7core inject inject.section
694 * accept and store error injection inject.section value
695 * bit 0 - refers to the lower 32-byte half cacheline
696 * bit 1 - refers to the upper 32-byte half cacheline
698 static ssize_t i7core_inject_section_store(struct device *dev,
699 struct device_attribute *mattr,
700 const char *data, size_t count)
702 struct mem_ctl_info *mci = to_mci(dev);
703 struct i7core_pvt *pvt = mci->pvt_info;
707 if (pvt->inject.enable)
710 rc = strict_strtoul(data, 10, &value);
711 if ((rc < 0) || (value > 3))
714 pvt->inject.section = (u32) value;
718 static ssize_t i7core_inject_section_show(struct device *dev,
719 struct device_attribute *mattr,
722 struct mem_ctl_info *mci = to_mci(dev);
723 struct i7core_pvt *pvt = mci->pvt_info;
724 return sprintf(data, "0x%08x\n", pvt->inject.section);
730 * accept and store error injection inject.section value
731 * bit 0 - repeat enable - Enable error repetition
732 * bit 1 - inject ECC error
733 * bit 2 - inject parity error
735 static ssize_t i7core_inject_type_store(struct device *dev,
736 struct device_attribute *mattr,
737 const char *data, size_t count)
739 struct mem_ctl_info *mci = to_mci(dev);
740 struct i7core_pvt *pvt = mci->pvt_info;
744 if (pvt->inject.enable)
747 rc = strict_strtoul(data, 10, &value);
748 if ((rc < 0) || (value > 7))
751 pvt->inject.type = (u32) value;
755 static ssize_t i7core_inject_type_show(struct device *dev,
756 struct device_attribute *mattr,
759 struct mem_ctl_info *mci = to_mci(dev);
760 struct i7core_pvt *pvt = mci->pvt_info;
762 return sprintf(data, "0x%08x\n", pvt->inject.type);
766 * i7core_inject_inject.eccmask_store
768 * The type of error (UE/CE) will depend on the inject.eccmask value:
769 * Any bits set to a 1 will flip the corresponding ECC bit
770 * Correctable errors can be injected by flipping 1 bit or the bits within
771 * a symbol pair (2 consecutive aligned 8-bit pairs - i.e. 7:0 and 15:8 or
772 * 23:16 and 31:24). Flipping bits in two symbol pairs will cause an
773 * uncorrectable error to be injected.
775 static ssize_t i7core_inject_eccmask_store(struct device *dev,
776 struct device_attribute *mattr,
777 const char *data, size_t count)
779 struct mem_ctl_info *mci = to_mci(dev);
780 struct i7core_pvt *pvt = mci->pvt_info;
784 if (pvt->inject.enable)
787 rc = strict_strtoul(data, 10, &value);
791 pvt->inject.eccmask = (u32) value;
795 static ssize_t i7core_inject_eccmask_show(struct device *dev,
796 struct device_attribute *mattr,
799 struct mem_ctl_info *mci = to_mci(dev);
800 struct i7core_pvt *pvt = mci->pvt_info;
802 return sprintf(data, "0x%08x\n", pvt->inject.eccmask);
808 * The type of error (UE/CE) will depend on the inject.eccmask value:
809 * Any bits set to a 1 will flip the corresponding ECC bit
810 * Correctable errors can be injected by flipping 1 bit or the bits within
811 * a symbol pair (2 consecutive aligned 8-bit pairs - i.e. 7:0 and 15:8 or
812 * 23:16 and 31:24). Flipping bits in two symbol pairs will cause an
813 * uncorrectable error to be injected.
816 #define DECLARE_ADDR_MATCH(param, limit) \
817 static ssize_t i7core_inject_store_##param( \
818 struct device *dev, \
819 struct device_attribute *mattr, \
820 const char *data, size_t count) \
822 struct mem_ctl_info *mci = to_mci(dev); \
823 struct i7core_pvt *pvt; \
827 debugf1("%s()\n", __func__); \
828 pvt = mci->pvt_info; \
830 if (pvt->inject.enable) \
831 disable_inject(mci); \
833 if (!strcasecmp(data, "any") || !strcasecmp(data, "any\n"))\
836 rc = strict_strtoul(data, 10, &value); \
837 if ((rc < 0) || (value >= limit)) \
841 pvt->inject.param = value; \
846 static ssize_t i7core_inject_show_##param( \
847 struct device *dev, \
848 struct device_attribute *mattr, \
851 struct mem_ctl_info *mci = to_mci(dev); \
852 struct i7core_pvt *pvt; \
854 pvt = mci->pvt_info; \
855 debugf1("%s() pvt=%p\n", __func__, pvt); \
856 if (pvt->inject.param < 0) \
857 return sprintf(data, "any\n"); \
859 return sprintf(data, "%d\n", pvt->inject.param);\
862 #define ATTR_ADDR_MATCH(param) \
863 static DEVICE_ATTR(param, S_IRUGO | S_IWUSR, \
864 i7core_inject_show_##param, \
865 i7core_inject_store_##param)
867 DECLARE_ADDR_MATCH(channel, 3);
868 DECLARE_ADDR_MATCH(dimm, 3);
869 DECLARE_ADDR_MATCH(rank, 4);
870 DECLARE_ADDR_MATCH(bank, 32);
871 DECLARE_ADDR_MATCH(page, 0x10000);
872 DECLARE_ADDR_MATCH(col, 0x4000);
874 ATTR_ADDR_MATCH(channel);
875 ATTR_ADDR_MATCH(dimm);
876 ATTR_ADDR_MATCH(rank);
877 ATTR_ADDR_MATCH(bank);
878 ATTR_ADDR_MATCH(page);
879 ATTR_ADDR_MATCH(col);
881 static int write_and_test(struct pci_dev *dev, const int where, const u32 val)
886 debugf0("setting pci %02x:%02x.%x reg=%02x value=%08x\n",
887 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
890 for (count = 0; count < 10; count++) {
893 pci_write_config_dword(dev, where, val);
894 pci_read_config_dword(dev, where, &read);
900 i7core_printk(KERN_ERR, "Error during set pci %02x:%02x.%x reg=%02x "
901 "write=%08x. Read=%08x\n",
902 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
909 * This routine prepares the Memory Controller for error injection.
910 * The error will be injected when some process tries to write to the
911 * memory that matches the given criteria.
912 * The criteria can be set in terms of a mask where dimm, rank, bank, page
913 * and col can be specified.
914 * A -1 value for any of the mask items will make the MCU to ignore
915 * that matching criteria for error injection.
917 * It should be noticed that the error will only happen after a write operation
918 * on a memory that matches the condition. if REPEAT_EN is not enabled at
919 * inject mask, then it will produce just one error. Otherwise, it will repeat
920 * until the injectmask would be cleaned.
922 * FIXME: This routine assumes that MAXNUMDIMMS value of MC_MAX_DOD
923 * is reliable enough to check if the MC is using the
924 * three channels. However, this is not clear at the datasheet.
926 static ssize_t i7core_inject_enable_store(struct device *dev,
927 struct device_attribute *mattr,
928 const char *data, size_t count)
930 struct mem_ctl_info *mci = to_mci(dev);
931 struct i7core_pvt *pvt = mci->pvt_info;
937 if (!pvt->pci_ch[pvt->inject.channel][0])
940 rc = strict_strtoul(data, 10, &enable);
945 pvt->inject.enable = 1;
951 /* Sets pvt->inject.dimm mask */
952 if (pvt->inject.dimm < 0)
955 if (pvt->channel[pvt->inject.channel].dimms > 2)
956 mask |= (pvt->inject.dimm & 0x3LL) << 35;
958 mask |= (pvt->inject.dimm & 0x1LL) << 36;
961 /* Sets pvt->inject.rank mask */
962 if (pvt->inject.rank < 0)
965 if (pvt->channel[pvt->inject.channel].dimms > 2)
966 mask |= (pvt->inject.rank & 0x1LL) << 34;
968 mask |= (pvt->inject.rank & 0x3LL) << 34;
971 /* Sets pvt->inject.bank mask */
972 if (pvt->inject.bank < 0)
975 mask |= (pvt->inject.bank & 0x15LL) << 30;
977 /* Sets pvt->inject.page mask */
978 if (pvt->inject.page < 0)
981 mask |= (pvt->inject.page & 0xffff) << 14;
983 /* Sets pvt->inject.column mask */
984 if (pvt->inject.col < 0)
987 mask |= (pvt->inject.col & 0x3fff);
991 * bits 1-2: MASK_HALF_CACHELINE
993 * bit 4: INJECT_ADDR_PARITY
996 injectmask = (pvt->inject.type & 1) |
997 (pvt->inject.section & 0x3) << 1 |
998 (pvt->inject.type & 0x6) << (3 - 1);
1000 /* Unlock writes to registers - this register is write only */
1001 pci_write_config_dword(pvt->pci_noncore,
1002 MC_CFG_CONTROL, 0x2);
1004 write_and_test(pvt->pci_ch[pvt->inject.channel][0],
1005 MC_CHANNEL_ADDR_MATCH, mask);
1006 write_and_test(pvt->pci_ch[pvt->inject.channel][0],
1007 MC_CHANNEL_ADDR_MATCH + 4, mask >> 32L);
1009 write_and_test(pvt->pci_ch[pvt->inject.channel][0],
1010 MC_CHANNEL_ERROR_MASK, pvt->inject.eccmask);
1012 write_and_test(pvt->pci_ch[pvt->inject.channel][0],
1013 MC_CHANNEL_ERROR_INJECT, injectmask);
1016 * This is something undocumented, based on my tests
1017 * Without writing 8 to this register, errors aren't injected. Not sure
1020 pci_write_config_dword(pvt->pci_noncore,
1023 debugf0("Error inject addr match 0x%016llx, ecc 0x%08x,"
1025 mask, pvt->inject.eccmask, injectmask);
1031 static ssize_t i7core_inject_enable_show(struct device *dev,
1032 struct device_attribute *mattr,
1035 struct mem_ctl_info *mci = to_mci(dev);
1036 struct i7core_pvt *pvt = mci->pvt_info;
1039 if (!pvt->pci_ch[pvt->inject.channel][0])
1042 pci_read_config_dword(pvt->pci_ch[pvt->inject.channel][0],
1043 MC_CHANNEL_ERROR_INJECT, &injectmask);
1045 debugf0("Inject error read: 0x%018x\n", injectmask);
1047 if (injectmask & 0x0c)
1048 pvt->inject.enable = 1;
1050 return sprintf(data, "%d\n", pvt->inject.enable);
1053 #define DECLARE_COUNTER(param) \
1054 static ssize_t i7core_show_counter_##param( \
1055 struct device *dev, \
1056 struct device_attribute *mattr, \
1059 struct mem_ctl_info *mci = to_mci(dev); \
1060 struct i7core_pvt *pvt = mci->pvt_info; \
1062 debugf1("%s()\n", __func__); \
1063 if (!pvt->ce_count_available || (pvt->is_registered)) \
1064 return sprintf(data, "data unavailable\n"); \
1065 return sprintf(data, "%lu\n", \
1066 pvt->udimm_ce_count[param]); \
1069 #define ATTR_COUNTER(param) \
1070 static DEVICE_ATTR(udimm##param, S_IRUGO | S_IWUSR, \
1071 i7core_show_counter_##param, \
1083 * inject_addrmatch device sysfs struct
1086 static struct attribute *i7core_addrmatch_attrs[] = {
1087 &dev_attr_channel.attr,
1088 &dev_attr_dimm.attr,
1089 &dev_attr_rank.attr,
1090 &dev_attr_bank.attr,
1091 &dev_attr_page.attr,
1096 static struct attribute_group addrmatch_grp = {
1097 .attrs = i7core_addrmatch_attrs,
1100 static const struct attribute_group *addrmatch_groups[] = {
1105 static void addrmatch_release(struct device *device)
1107 debugf1("Releasing device %s\n", dev_name(device));
1111 static struct device_type addrmatch_type = {
1112 .groups = addrmatch_groups,
1113 .release = addrmatch_release,
1117 * all_channel_counts sysfs struct
1120 static struct attribute *i7core_udimm_counters_attrs[] = {
1121 &dev_attr_udimm0.attr,
1122 &dev_attr_udimm1.attr,
1123 &dev_attr_udimm2.attr,
1127 static struct attribute_group all_channel_counts_grp = {
1128 .attrs = i7core_udimm_counters_attrs,
1131 static const struct attribute_group *all_channel_counts_groups[] = {
1132 &all_channel_counts_grp,
1136 static void all_channel_counts_release(struct device *device)
1138 debugf1("Releasing device %s\n", dev_name(device));
1142 static struct device_type all_channel_counts_type = {
1143 .groups = all_channel_counts_groups,
1144 .release = all_channel_counts_release,
1148 * inject sysfs attributes
1151 static DEVICE_ATTR(inject_section, S_IRUGO | S_IWUSR,
1152 i7core_inject_section_show, i7core_inject_section_store);
1154 static DEVICE_ATTR(inject_type, S_IRUGO | S_IWUSR,
1155 i7core_inject_type_show, i7core_inject_type_store);
1158 static DEVICE_ATTR(inject_eccmask, S_IRUGO | S_IWUSR,
1159 i7core_inject_eccmask_show, i7core_inject_eccmask_store);
1161 static DEVICE_ATTR(inject_enable, S_IRUGO | S_IWUSR,
1162 i7core_inject_enable_show, i7core_inject_enable_store);
1164 static int i7core_create_sysfs_devices(struct mem_ctl_info *mci)
1166 struct i7core_pvt *pvt = mci->pvt_info;
1169 rc = device_create_file(&mci->dev, &dev_attr_inject_section);
1172 rc = device_create_file(&mci->dev, &dev_attr_inject_type);
1175 rc = device_create_file(&mci->dev, &dev_attr_inject_eccmask);
1178 rc = device_create_file(&mci->dev, &dev_attr_inject_enable);
1182 pvt->addrmatch_dev = kzalloc(sizeof(*pvt->addrmatch_dev), GFP_KERNEL);
1183 if (!pvt->addrmatch_dev)
1186 pvt->addrmatch_dev->type = &addrmatch_type;
1187 pvt->addrmatch_dev->bus = mci->dev.bus;
1188 device_initialize(pvt->addrmatch_dev);
1189 pvt->addrmatch_dev->parent = &mci->dev;
1190 dev_set_name(pvt->addrmatch_dev, "inject_addrmatch");
1191 dev_set_drvdata(pvt->addrmatch_dev, mci);
1193 debugf1("%s(): creating %s\n", __func__,
1194 dev_name(pvt->addrmatch_dev));
1196 rc = device_add(pvt->addrmatch_dev);
1200 if (!pvt->is_registered) {
1201 pvt->chancounts_dev = kzalloc(sizeof(*pvt->chancounts_dev),
1203 if (!pvt->chancounts_dev) {
1204 put_device(pvt->addrmatch_dev);
1205 device_del(pvt->addrmatch_dev);
1209 pvt->chancounts_dev->type = &all_channel_counts_type;
1210 pvt->chancounts_dev->bus = mci->dev.bus;
1211 device_initialize(pvt->chancounts_dev);
1212 pvt->chancounts_dev->parent = &mci->dev;
1213 dev_set_name(pvt->chancounts_dev, "all_channel_counts");
1214 dev_set_drvdata(pvt->chancounts_dev, mci);
1216 debugf1("%s(): creating %s\n", __func__,
1217 dev_name(pvt->chancounts_dev));
1219 rc = device_add(pvt->chancounts_dev);
1226 static void i7core_delete_sysfs_devices(struct mem_ctl_info *mci)
1228 struct i7core_pvt *pvt = mci->pvt_info;
1232 device_remove_file(&mci->dev, &dev_attr_inject_section);
1233 device_remove_file(&mci->dev, &dev_attr_inject_type);
1234 device_remove_file(&mci->dev, &dev_attr_inject_eccmask);
1235 device_remove_file(&mci->dev, &dev_attr_inject_enable);
1237 if (!pvt->is_registered) {
1238 put_device(pvt->chancounts_dev);
1239 device_del(pvt->chancounts_dev);
1241 put_device(pvt->addrmatch_dev);
1242 device_del(pvt->addrmatch_dev);
1245 /****************************************************************************
1246 Device initialization routines: put/get, init/exit
1247 ****************************************************************************/
1250 * i7core_put_all_devices 'put' all the devices that we have
1251 * reserved via 'get'
1253 static void i7core_put_devices(struct i7core_dev *i7core_dev)
1257 debugf0(__FILE__ ": %s()\n", __func__);
1258 for (i = 0; i < i7core_dev->n_devs; i++) {
1259 struct pci_dev *pdev = i7core_dev->pdev[i];
1262 debugf0("Removing dev %02x:%02x.%d\n",
1264 PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
1269 static void i7core_put_all_devices(void)
1271 struct i7core_dev *i7core_dev, *tmp;
1273 list_for_each_entry_safe(i7core_dev, tmp, &i7core_edac_list, list) {
1274 i7core_put_devices(i7core_dev);
1275 free_i7core_dev(i7core_dev);
1279 static void __init i7core_xeon_pci_fixup(const struct pci_id_table *table)
1281 struct pci_dev *pdev = NULL;
1285 * On Xeon 55xx, the Intel Quick Path Arch Generic Non-core pci buses
1286 * aren't announced by acpi. So, we need to use a legacy scan probing
1289 while (table && table->descr) {
1290 pdev = pci_get_device(PCI_VENDOR_ID_INTEL, table->descr[0].dev_id, NULL);
1291 if (unlikely(!pdev)) {
1292 for (i = 0; i < MAX_SOCKET_BUSES; i++)
1293 pcibios_scan_specific_bus(255-i);
1300 static unsigned i7core_pci_lastbus(void)
1302 int last_bus = 0, bus;
1303 struct pci_bus *b = NULL;
1305 while ((b = pci_find_next_bus(b)) != NULL) {
1307 debugf0("Found bus %d\n", bus);
1312 debugf0("Last bus %d\n", last_bus);
1318 * i7core_get_all_devices Find and perform 'get' operation on the MCH's
1319 * device/functions we want to reference for this driver
1321 * Need to 'get' device 16 func 1 and func 2
1323 static int i7core_get_onedevice(struct pci_dev **prev,
1324 const struct pci_id_table *table,
1325 const unsigned devno,
1326 const unsigned last_bus)
1328 struct i7core_dev *i7core_dev;
1329 const struct pci_id_descr *dev_descr = &table->descr[devno];
1331 struct pci_dev *pdev = NULL;
1335 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1336 dev_descr->dev_id, *prev);
1339 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core regs
1340 * is at addr 8086:2c40, instead of 8086:2c41. So, we need
1341 * to probe for the alternate address in case of failure
1343 if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev)
1344 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1345 PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev);
1347 if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && !pdev)
1348 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1349 PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT,
1358 if (dev_descr->optional)
1364 i7core_printk(KERN_INFO,
1365 "Device not found: dev %02x.%d PCI ID %04x:%04x\n",
1366 dev_descr->dev, dev_descr->func,
1367 PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
1369 /* End of list, leave */
1372 bus = pdev->bus->number;
1374 socket = last_bus - bus;
1376 i7core_dev = get_i7core_dev(socket);
1378 i7core_dev = alloc_i7core_dev(socket, table);
1385 if (i7core_dev->pdev[devno]) {
1386 i7core_printk(KERN_ERR,
1387 "Duplicated device for "
1388 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1389 bus, dev_descr->dev, dev_descr->func,
1390 PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
1395 i7core_dev->pdev[devno] = pdev;
1398 if (unlikely(PCI_SLOT(pdev->devfn) != dev_descr->dev ||
1399 PCI_FUNC(pdev->devfn) != dev_descr->func)) {
1400 i7core_printk(KERN_ERR,
1401 "Device PCI ID %04x:%04x "
1402 "has dev %02x:%02x.%d instead of dev %02x:%02x.%d\n",
1403 PCI_VENDOR_ID_INTEL, dev_descr->dev_id,
1404 bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
1405 bus, dev_descr->dev, dev_descr->func);
1409 /* Be sure that the device is enabled */
1410 if (unlikely(pci_enable_device(pdev) < 0)) {
1411 i7core_printk(KERN_ERR,
1413 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1414 bus, dev_descr->dev, dev_descr->func,
1415 PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
1419 debugf0("Detected socket %d dev %02x:%02x.%d PCI ID %04x:%04x\n",
1420 socket, bus, dev_descr->dev,
1422 PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
1425 * As stated on drivers/pci/search.c, the reference count for
1426 * @from is always decremented if it is not %NULL. So, as we need
1427 * to get all devices up to null, we need to do a get for the device
1436 static int i7core_get_all_devices(void)
1438 int i, rc, last_bus;
1439 struct pci_dev *pdev = NULL;
1440 const struct pci_id_table *table = pci_dev_table;
1442 last_bus = i7core_pci_lastbus();
1444 while (table && table->descr) {
1445 for (i = 0; i < table->n_devs; i++) {
1448 rc = i7core_get_onedevice(&pdev, table, i,
1455 i7core_put_all_devices();
1466 static int mci_bind_devs(struct mem_ctl_info *mci,
1467 struct i7core_dev *i7core_dev)
1469 struct i7core_pvt *pvt = mci->pvt_info;
1470 struct pci_dev *pdev;
1474 pvt->is_registered = false;
1475 pvt->enable_scrub = false;
1476 for (i = 0; i < i7core_dev->n_devs; i++) {
1477 pdev = i7core_dev->pdev[i];
1481 func = PCI_FUNC(pdev->devfn);
1482 slot = PCI_SLOT(pdev->devfn);
1484 if (unlikely(func > MAX_MCR_FUNC))
1486 pvt->pci_mcr[func] = pdev;
1487 } else if (likely(slot >= 4 && slot < 4 + NUM_CHANS)) {
1488 if (unlikely(func > MAX_CHAN_FUNC))
1490 pvt->pci_ch[slot - 4][func] = pdev;
1491 } else if (!slot && !func) {
1492 pvt->pci_noncore = pdev;
1494 /* Detect the processor family */
1495 switch (pdev->device) {
1496 case PCI_DEVICE_ID_INTEL_I7_NONCORE:
1497 family = "Xeon 35xx/ i7core";
1498 pvt->enable_scrub = false;
1500 case PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT:
1501 family = "i7-800/i5-700";
1502 pvt->enable_scrub = false;
1504 case PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE:
1505 family = "Xeon 34xx";
1506 pvt->enable_scrub = false;
1508 case PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT:
1509 family = "Xeon 55xx";
1510 pvt->enable_scrub = true;
1512 case PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_REV2:
1513 family = "Xeon 56xx / i7-900";
1514 pvt->enable_scrub = true;
1518 pvt->enable_scrub = false;
1520 debugf0("Detected a processor type %s\n", family);
1524 debugf0("Associated fn %d.%d, dev = %p, socket %d\n",
1525 PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
1526 pdev, i7core_dev->socket);
1528 if (PCI_SLOT(pdev->devfn) == 3 &&
1529 PCI_FUNC(pdev->devfn) == 2)
1530 pvt->is_registered = true;
1536 i7core_printk(KERN_ERR, "Device %d, function %d "
1537 "is out of the expected range\n",
1542 /****************************************************************************
1543 Error check routines
1544 ****************************************************************************/
1545 static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,
1552 for (i = 0; i < add; i++) {
1553 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 0,
1554 chan, dimm, -1, "error", "", NULL);
1558 static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci,
1564 struct i7core_pvt *pvt = mci->pvt_info;
1565 int add0 = 0, add1 = 0, add2 = 0;
1566 /* Updates CE counters if it is not the first time here */
1567 if (pvt->ce_count_available) {
1568 /* Updates CE counters */
1570 add2 = new2 - pvt->rdimm_last_ce_count[chan][2];
1571 add1 = new1 - pvt->rdimm_last_ce_count[chan][1];
1572 add0 = new0 - pvt->rdimm_last_ce_count[chan][0];
1576 pvt->rdimm_ce_count[chan][2] += add2;
1580 pvt->rdimm_ce_count[chan][1] += add1;
1584 pvt->rdimm_ce_count[chan][0] += add0;
1586 pvt->ce_count_available = 1;
1588 /* Store the new values */
1589 pvt->rdimm_last_ce_count[chan][2] = new2;
1590 pvt->rdimm_last_ce_count[chan][1] = new1;
1591 pvt->rdimm_last_ce_count[chan][0] = new0;
1593 /*updated the edac core */
1595 i7core_rdimm_update_errcount(mci, chan, 0, add0);
1597 i7core_rdimm_update_errcount(mci, chan, 1, add1);
1599 i7core_rdimm_update_errcount(mci, chan, 2, add2);
1603 static void i7core_rdimm_check_mc_ecc_err(struct mem_ctl_info *mci)
1605 struct i7core_pvt *pvt = mci->pvt_info;
1607 int i, new0, new1, new2;
1609 /*Read DEV 3: FUN 2: MC_COR_ECC_CNT regs directly*/
1610 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_0,
1612 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_1,
1614 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_2,
1616 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_3,
1618 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_4,
1620 pci_read_config_dword(pvt->pci_mcr[2], MC_COR_ECC_CNT_5,
1622 for (i = 0 ; i < 3; i++) {
1623 debugf3("MC_COR_ECC_CNT%d = 0x%x; MC_COR_ECC_CNT%d = 0x%x\n",
1624 (i * 2), rcv[i][0], (i * 2) + 1, rcv[i][1]);
1625 /*if the channel has 3 dimms*/
1626 if (pvt->channel[i].dimms > 2) {
1627 new0 = DIMM_BOT_COR_ERR(rcv[i][0]);
1628 new1 = DIMM_TOP_COR_ERR(rcv[i][0]);
1629 new2 = DIMM_BOT_COR_ERR(rcv[i][1]);
1631 new0 = DIMM_TOP_COR_ERR(rcv[i][0]) +
1632 DIMM_BOT_COR_ERR(rcv[i][0]);
1633 new1 = DIMM_TOP_COR_ERR(rcv[i][1]) +
1634 DIMM_BOT_COR_ERR(rcv[i][1]);
1638 i7core_rdimm_update_ce_count(mci, i, new0, new1, new2);
1642 /* This function is based on the device 3 function 4 registers as described on:
1643 * Intel Xeon Processor 5500 Series Datasheet Volume 2
1644 * http://www.intel.com/Assets/PDF/datasheet/321322.pdf
1645 * also available at:
1646 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
1648 static void i7core_udimm_check_mc_ecc_err(struct mem_ctl_info *mci)
1650 struct i7core_pvt *pvt = mci->pvt_info;
1652 int new0, new1, new2;
1654 if (!pvt->pci_mcr[4]) {
1655 debugf0("%s MCR registers not found\n", __func__);
1659 /* Corrected test errors */
1660 pci_read_config_dword(pvt->pci_mcr[4], MC_TEST_ERR_RCV1, &rcv1);
1661 pci_read_config_dword(pvt->pci_mcr[4], MC_TEST_ERR_RCV0, &rcv0);
1663 /* Store the new values */
1664 new2 = DIMM2_COR_ERR(rcv1);
1665 new1 = DIMM1_COR_ERR(rcv0);
1666 new0 = DIMM0_COR_ERR(rcv0);
1668 /* Updates CE counters if it is not the first time here */
1669 if (pvt->ce_count_available) {
1670 /* Updates CE counters */
1671 int add0, add1, add2;
1673 add2 = new2 - pvt->udimm_last_ce_count[2];
1674 add1 = new1 - pvt->udimm_last_ce_count[1];
1675 add0 = new0 - pvt->udimm_last_ce_count[0];
1679 pvt->udimm_ce_count[2] += add2;
1683 pvt->udimm_ce_count[1] += add1;
1687 pvt->udimm_ce_count[0] += add0;
1689 if (add0 | add1 | add2)
1690 i7core_printk(KERN_ERR, "New Corrected error(s): "
1691 "dimm0: +%d, dimm1: +%d, dimm2 +%d\n",
1694 pvt->ce_count_available = 1;
1696 /* Store the new values */
1697 pvt->udimm_last_ce_count[2] = new2;
1698 pvt->udimm_last_ce_count[1] = new1;
1699 pvt->udimm_last_ce_count[0] = new0;
1703 * According with tables E-11 and E-12 of chapter E.3.3 of Intel 64 and IA-32
1704 * Architectures Software Developer’s Manual Volume 3B.
1705 * Nehalem are defined as family 0x06, model 0x1a
1707 * The MCA registers used here are the following ones:
1708 * struct mce field MCA Register
1709 * m->status MSR_IA32_MC8_STATUS
1710 * m->addr MSR_IA32_MC8_ADDR
1711 * m->misc MSR_IA32_MC8_MISC
1712 * In the case of Nehalem, the error information is masked at .status and .misc
1715 static void i7core_mce_output_error(struct mem_ctl_info *mci,
1716 const struct mce *m)
1718 struct i7core_pvt *pvt = mci->pvt_info;
1719 char *type, *optype, *err, msg[80];
1720 enum hw_event_mc_err_type tp_event;
1721 unsigned long error = m->status & 0x1ff0000l;
1722 bool uncorrected_error = m->mcgstatus & 1ll << 61;
1723 bool ripv = m->mcgstatus & 1;
1724 u32 optypenum = (m->status >> 4) & 0x07;
1725 u32 core_err_cnt = (m->status >> 38) & 0x7fff;
1726 u32 dimm = (m->misc >> 16) & 0x3;
1727 u32 channel = (m->misc >> 18) & 0x3;
1728 u32 syndrome = m->misc >> 32;
1729 u32 errnum = find_first_bit(&error, 32);
1731 if (uncorrected_error) {
1734 tp_event = HW_EVENT_ERR_FATAL;
1737 tp_event = HW_EVENT_ERR_UNCORRECTED;
1741 tp_event = HW_EVENT_ERR_CORRECTED;
1744 switch (optypenum) {
1746 optype = "generic undef request";
1749 optype = "read error";
1752 optype = "write error";
1755 optype = "addr/cmd error";
1758 optype = "scrubbing error";
1761 optype = "reserved";
1767 err = "read ECC error";
1770 err = "RAS ECC error";
1773 err = "write parity error";
1776 err = "redundacy loss";
1782 err = "memory range error";
1785 err = "RTID out of range";
1788 err = "address parity error";
1791 err = "byte enable parity error";
1797 snprintf(msg, sizeof(msg), "count=%d %s", core_err_cnt, optype);
1800 * Call the helper to output message
1801 * FIXME: what to do if core_err_cnt > 1? Currently, it generates
1804 if (uncorrected_error || !pvt->is_registered)
1805 edac_mc_handle_error(tp_event, mci,
1806 m->addr >> PAGE_SHIFT,
1807 m->addr & ~PAGE_MASK,
1814 * i7core_check_error Retrieve and process errors reported by the
1815 * hardware. Called by the Core module.
1817 static void i7core_check_error(struct mem_ctl_info *mci)
1819 struct i7core_pvt *pvt = mci->pvt_info;
1825 * MCE first step: Copy all mce errors into a temporary buffer
1826 * We use a double buffering here, to reduce the risk of
1830 count = (pvt->mce_out + MCE_LOG_LEN - pvt->mce_in)
1833 goto check_ce_error;
1835 m = pvt->mce_outentry;
1836 if (pvt->mce_in + count > MCE_LOG_LEN) {
1837 unsigned l = MCE_LOG_LEN - pvt->mce_in;
1839 memcpy(m, &pvt->mce_entry[pvt->mce_in], sizeof(*m) * l);
1845 memcpy(m, &pvt->mce_entry[pvt->mce_in], sizeof(*m) * count);
1847 pvt->mce_in += count;
1850 if (pvt->mce_overrun) {
1851 i7core_printk(KERN_ERR, "Lost %d memory errors\n",
1854 pvt->mce_overrun = 0;
1858 * MCE second step: parse errors and display
1860 for (i = 0; i < count; i++)
1861 i7core_mce_output_error(mci, &pvt->mce_outentry[i]);
1864 * Now, let's increment CE error counts
1867 if (!pvt->is_registered)
1868 i7core_udimm_check_mc_ecc_err(mci);
1870 i7core_rdimm_check_mc_ecc_err(mci);
1874 * i7core_mce_check_error Replicates mcelog routine to get errors
1875 * This routine simply queues mcelog errors, and
1876 * return. The error itself should be handled later
1877 * by i7core_check_error.
1878 * WARNING: As this routine should be called at NMI time, extra care should
1879 * be taken to avoid deadlocks, and to be as fast as possible.
1881 static int i7core_mce_check_error(struct notifier_block *nb, unsigned long val,
1884 struct mce *mce = (struct mce *)data;
1885 struct i7core_dev *i7_dev;
1886 struct mem_ctl_info *mci;
1887 struct i7core_pvt *pvt;
1889 i7_dev = get_i7core_dev(mce->socketid);
1894 pvt = mci->pvt_info;
1897 * Just let mcelog handle it if the error is
1898 * outside the memory controller
1900 if (((mce->status & 0xffff) >> 7) != 1)
1903 /* Bank 8 registers are the only ones that we know how to handle */
1908 /* Only handle if it is the right mc controller */
1909 if (mce->socketid != pvt->i7core_dev->socket)
1914 if ((pvt->mce_out + 1) % MCE_LOG_LEN == pvt->mce_in) {
1920 /* Copy memory error at the ringbuffer */
1921 memcpy(&pvt->mce_entry[pvt->mce_out], mce, sizeof(*mce));
1923 pvt->mce_out = (pvt->mce_out + 1) % MCE_LOG_LEN;
1925 /* Handle fatal errors immediately */
1926 if (mce->mcgstatus & 1)
1927 i7core_check_error(mci);
1929 /* Advise mcelog that the errors were handled */
1933 static struct notifier_block i7_mce_dec = {
1934 .notifier_call = i7core_mce_check_error,
1937 struct memdev_dmi_entry {
1941 u16 phys_mem_array_handle;
1942 u16 mem_err_info_handle;
1959 u16 conf_mem_clk_speed;
1960 } __attribute__((__packed__));
1964 * Decode the DRAM Clock Frequency, be paranoid, make sure that all
1965 * memory devices show the same speed, and if they don't then consider
1966 * all speeds to be invalid.
1968 static void decode_dclk(const struct dmi_header *dh, void *_dclk_freq)
1970 int *dclk_freq = _dclk_freq;
1971 u16 dmi_mem_clk_speed;
1973 if (*dclk_freq == -1)
1976 if (dh->type == DMI_ENTRY_MEM_DEVICE) {
1977 struct memdev_dmi_entry *memdev_dmi_entry =
1978 (struct memdev_dmi_entry *)dh;
1979 unsigned long conf_mem_clk_speed_offset =
1980 (unsigned long)&memdev_dmi_entry->conf_mem_clk_speed -
1981 (unsigned long)&memdev_dmi_entry->type;
1982 unsigned long speed_offset =
1983 (unsigned long)&memdev_dmi_entry->speed -
1984 (unsigned long)&memdev_dmi_entry->type;
1986 /* Check that a DIMM is present */
1987 if (memdev_dmi_entry->size == 0)
1991 * Pick the configured speed if it's available, otherwise
1992 * pick the DIMM speed, or we don't have a speed.
1994 if (memdev_dmi_entry->length > conf_mem_clk_speed_offset) {
1996 memdev_dmi_entry->conf_mem_clk_speed;
1997 } else if (memdev_dmi_entry->length > speed_offset) {
1998 dmi_mem_clk_speed = memdev_dmi_entry->speed;
2004 if (*dclk_freq == 0) {
2005 /* First pass, speed was 0 */
2006 if (dmi_mem_clk_speed > 0) {
2007 /* Set speed if a valid speed is read */
2008 *dclk_freq = dmi_mem_clk_speed;
2010 /* Otherwise we don't have a valid speed */
2013 } else if (*dclk_freq > 0 &&
2014 *dclk_freq != dmi_mem_clk_speed) {
2016 * If we have a speed, check that all DIMMS are the same
2017 * speed, otherwise set the speed as invalid.
2025 * The default DCLK frequency is used as a fallback if we
2026 * fail to find anything reliable in the DMI. The value
2027 * is taken straight from the datasheet.
2029 #define DEFAULT_DCLK_FREQ 800
2031 static int get_dclk_freq(void)
2035 dmi_walk(decode_dclk, (void *)&dclk_freq);
2038 return DEFAULT_DCLK_FREQ;
2044 * set_sdram_scrub_rate This routine sets byte/sec bandwidth scrub rate
2045 * to hardware according to SCRUBINTERVAL formula
2046 * found in datasheet.
2048 static int set_sdram_scrub_rate(struct mem_ctl_info *mci, u32 new_bw)
2050 struct i7core_pvt *pvt = mci->pvt_info;
2051 struct pci_dev *pdev;
2055 /* Get data from the MC register, function 2 */
2056 pdev = pvt->pci_mcr[2];
2060 pci_read_config_dword(pdev, MC_SCRUB_CONTROL, &dw_scrub);
2063 /* Prepare to disable petrol scrub */
2064 dw_scrub &= ~STARTSCRUB;
2065 /* Stop the patrol scrub engine */
2066 write_and_test(pdev, MC_SCRUB_CONTROL,
2067 dw_scrub & ~SCRUBINTERVAL_MASK);
2069 /* Get current status of scrub rate and set bit to disable */
2070 pci_read_config_dword(pdev, MC_SSRCONTROL, &dw_ssr);
2071 dw_ssr &= ~SSR_MODE_MASK;
2072 dw_ssr |= SSR_MODE_DISABLE;
2074 const int cache_line_size = 64;
2075 const u32 freq_dclk_mhz = pvt->dclk_freq;
2076 unsigned long long scrub_interval;
2078 * Translate the desired scrub rate to a register value and
2079 * program the corresponding register value.
2081 scrub_interval = (unsigned long long)freq_dclk_mhz *
2082 cache_line_size * 1000000;
2083 do_div(scrub_interval, new_bw);
2085 if (!scrub_interval || scrub_interval > SCRUBINTERVAL_MASK)
2088 dw_scrub = SCRUBINTERVAL_MASK & scrub_interval;
2090 /* Start the patrol scrub engine */
2091 pci_write_config_dword(pdev, MC_SCRUB_CONTROL,
2092 STARTSCRUB | dw_scrub);
2094 /* Get current status of scrub rate and set bit to enable */
2095 pci_read_config_dword(pdev, MC_SSRCONTROL, &dw_ssr);
2096 dw_ssr &= ~SSR_MODE_MASK;
2097 dw_ssr |= SSR_MODE_ENABLE;
2099 /* Disable or enable scrubbing */
2100 pci_write_config_dword(pdev, MC_SSRCONTROL, dw_ssr);
2106 * get_sdram_scrub_rate This routine convert current scrub rate value
2107 * into byte/sec bandwidth accourding to
2108 * SCRUBINTERVAL formula found in datasheet.
2110 static int get_sdram_scrub_rate(struct mem_ctl_info *mci)
2112 struct i7core_pvt *pvt = mci->pvt_info;
2113 struct pci_dev *pdev;
2114 const u32 cache_line_size = 64;
2115 const u32 freq_dclk_mhz = pvt->dclk_freq;
2116 unsigned long long scrub_rate;
2119 /* Get data from the MC register, function 2 */
2120 pdev = pvt->pci_mcr[2];
2124 /* Get current scrub control data */
2125 pci_read_config_dword(pdev, MC_SCRUB_CONTROL, &scrubval);
2127 /* Mask highest 8-bits to 0 */
2128 scrubval &= SCRUBINTERVAL_MASK;
2132 /* Calculate scrub rate value into byte/sec bandwidth */
2133 scrub_rate = (unsigned long long)freq_dclk_mhz *
2134 1000000 * cache_line_size;
2135 do_div(scrub_rate, scrubval);
2136 return (int)scrub_rate;
2139 static void enable_sdram_scrub_setting(struct mem_ctl_info *mci)
2141 struct i7core_pvt *pvt = mci->pvt_info;
2144 /* Unlock writes to pci registers */
2145 pci_read_config_dword(pvt->pci_noncore, MC_CFG_CONTROL, &pci_lock);
2147 pci_write_config_dword(pvt->pci_noncore, MC_CFG_CONTROL,
2148 pci_lock | MC_CFG_UNLOCK);
2150 mci->set_sdram_scrub_rate = set_sdram_scrub_rate;
2151 mci->get_sdram_scrub_rate = get_sdram_scrub_rate;
2154 static void disable_sdram_scrub_setting(struct mem_ctl_info *mci)
2156 struct i7core_pvt *pvt = mci->pvt_info;
2159 /* Lock writes to pci registers */
2160 pci_read_config_dword(pvt->pci_noncore, MC_CFG_CONTROL, &pci_lock);
2162 pci_write_config_dword(pvt->pci_noncore, MC_CFG_CONTROL,
2163 pci_lock | MC_CFG_LOCK);
2166 static void i7core_pci_ctl_create(struct i7core_pvt *pvt)
2168 pvt->i7core_pci = edac_pci_create_generic_ctl(
2169 &pvt->i7core_dev->pdev[0]->dev,
2171 if (unlikely(!pvt->i7core_pci))
2172 i7core_printk(KERN_WARNING,
2173 "Unable to setup PCI error report via EDAC\n");
2176 static void i7core_pci_ctl_release(struct i7core_pvt *pvt)
2178 if (likely(pvt->i7core_pci))
2179 edac_pci_release_generic_ctl(pvt->i7core_pci);
2181 i7core_printk(KERN_ERR,
2182 "Couldn't find mem_ctl_info for socket %d\n",
2183 pvt->i7core_dev->socket);
2184 pvt->i7core_pci = NULL;
2187 static void i7core_unregister_mci(struct i7core_dev *i7core_dev)
2189 struct mem_ctl_info *mci = i7core_dev->mci;
2190 struct i7core_pvt *pvt;
2192 if (unlikely(!mci || !mci->pvt_info)) {
2193 debugf0("MC: " __FILE__ ": %s(): dev = %p\n",
2194 __func__, &i7core_dev->pdev[0]->dev);
2196 i7core_printk(KERN_ERR, "Couldn't find mci handler\n");
2200 pvt = mci->pvt_info;
2202 debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",
2203 __func__, mci, &i7core_dev->pdev[0]->dev);
2205 /* Disable scrubrate setting */
2206 if (pvt->enable_scrub)
2207 disable_sdram_scrub_setting(mci);
2209 mce_unregister_decode_chain(&i7_mce_dec);
2211 /* Disable EDAC polling */
2212 i7core_pci_ctl_release(pvt);
2214 /* Remove MC sysfs nodes */
2215 i7core_delete_sysfs_devices(mci);
2216 edac_mc_del_mc(mci->pdev);
2218 debugf1("%s: free mci struct\n", mci->ctl_name);
2219 kfree(mci->ctl_name);
2221 i7core_dev->mci = NULL;
2224 static int i7core_register_mci(struct i7core_dev *i7core_dev)
2226 struct mem_ctl_info *mci;
2227 struct i7core_pvt *pvt;
2229 struct edac_mc_layer layers[2];
2231 /* allocate a new MC control structure */
2233 layers[0].type = EDAC_MC_LAYER_CHANNEL;
2234 layers[0].size = NUM_CHANS;
2235 layers[0].is_virt_csrow = false;
2236 layers[1].type = EDAC_MC_LAYER_SLOT;
2237 layers[1].size = MAX_DIMMS;
2238 layers[1].is_virt_csrow = true;
2239 mci = edac_mc_alloc(i7core_dev->socket, ARRAY_SIZE(layers), layers,
2244 debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",
2245 __func__, mci, &i7core_dev->pdev[0]->dev);
2247 pvt = mci->pvt_info;
2248 memset(pvt, 0, sizeof(*pvt));
2250 /* Associates i7core_dev and mci for future usage */
2251 pvt->i7core_dev = i7core_dev;
2252 i7core_dev->mci = mci;
2255 * FIXME: how to handle RDDR3 at MCI level? It is possible to have
2256 * Mixed RDDR3/UDDR3 with Nehalem, provided that they are on different
2259 mci->mtype_cap = MEM_FLAG_DDR3;
2260 mci->edac_ctl_cap = EDAC_FLAG_NONE;
2261 mci->edac_cap = EDAC_FLAG_NONE;
2262 mci->mod_name = "i7core_edac.c";
2263 mci->mod_ver = I7CORE_REVISION;
2264 mci->ctl_name = kasprintf(GFP_KERNEL, "i7 core #%d",
2265 i7core_dev->socket);
2266 mci->dev_name = pci_name(i7core_dev->pdev[0]);
2267 mci->ctl_page_to_phys = NULL;
2269 /* Store pci devices at mci for faster access */
2270 rc = mci_bind_devs(mci, i7core_dev);
2271 if (unlikely(rc < 0))
2275 /* Get dimm basic config */
2276 get_dimm_config(mci);
2277 /* record ptr to the generic device */
2278 mci->pdev = &i7core_dev->pdev[0]->dev;
2279 /* Set the function pointer to an actual operation function */
2280 mci->edac_check = i7core_check_error;
2282 /* Enable scrubrate setting */
2283 if (pvt->enable_scrub)
2284 enable_sdram_scrub_setting(mci);
2286 /* add this new MC control structure to EDAC's list of MCs */
2287 if (unlikely(edac_mc_add_mc(mci))) {
2288 debugf0("MC: " __FILE__
2289 ": %s(): failed edac_mc_add_mc()\n", __func__);
2290 /* FIXME: perhaps some code should go here that disables error
2291 * reporting if we just enabled it
2297 if (i7core_create_sysfs_devices(mci)) {
2298 debugf0("MC: " __FILE__
2299 ": %s(): failed to create sysfs nodes\n", __func__);
2300 edac_mc_del_mc(mci->pdev);
2305 /* Default error mask is any memory */
2306 pvt->inject.channel = 0;
2307 pvt->inject.dimm = -1;
2308 pvt->inject.rank = -1;
2309 pvt->inject.bank = -1;
2310 pvt->inject.page = -1;
2311 pvt->inject.col = -1;
2313 /* allocating generic PCI control info */
2314 i7core_pci_ctl_create(pvt);
2316 /* DCLK for scrub rate setting */
2317 pvt->dclk_freq = get_dclk_freq();
2319 mce_register_decode_chain(&i7_mce_dec);
2324 kfree(mci->ctl_name);
2326 i7core_dev->mci = NULL;
2331 * i7core_probe Probe for ONE instance of device to see if it is
2334 * 0 for FOUND a device
2335 * < 0 for error code
2338 static int __devinit i7core_probe(struct pci_dev *pdev,
2339 const struct pci_device_id *id)
2342 struct i7core_dev *i7core_dev;
2344 /* get the pci devices we want to reserve for our use */
2345 mutex_lock(&i7core_edac_lock);
2348 * All memory controllers are allocated at the first pass.
2350 if (unlikely(probed >= 1)) {
2351 mutex_unlock(&i7core_edac_lock);
2356 rc = i7core_get_all_devices();
2357 if (unlikely(rc < 0))
2360 list_for_each_entry(i7core_dev, &i7core_edac_list, list) {
2362 rc = i7core_register_mci(i7core_dev);
2363 if (unlikely(rc < 0))
2368 * Nehalem-EX uses a different memory controller. However, as the
2369 * memory controller is not visible on some Nehalem/Nehalem-EP, we
2370 * need to indirectly probe via a X58 PCI device. The same devices
2371 * are found on (some) Nehalem-EX. So, on those machines, the
2372 * probe routine needs to return -ENODEV, as the actual Memory
2373 * Controller registers won't be detected.
2380 i7core_printk(KERN_INFO,
2381 "Driver loaded, %d memory controller(s) found.\n",
2384 mutex_unlock(&i7core_edac_lock);
2388 list_for_each_entry(i7core_dev, &i7core_edac_list, list)
2389 i7core_unregister_mci(i7core_dev);
2391 i7core_put_all_devices();
2393 mutex_unlock(&i7core_edac_lock);
2398 * i7core_remove destructor for one instance of device
2401 static void __devexit i7core_remove(struct pci_dev *pdev)
2403 struct i7core_dev *i7core_dev;
2405 debugf0(__FILE__ ": %s()\n", __func__);
2408 * we have a trouble here: pdev value for removal will be wrong, since
2409 * it will point to the X58 register used to detect that the machine
2410 * is a Nehalem or upper design. However, due to the way several PCI
2411 * devices are grouped together to provide MC functionality, we need
2412 * to use a different method for releasing the devices
2415 mutex_lock(&i7core_edac_lock);
2417 if (unlikely(!probed)) {
2418 mutex_unlock(&i7core_edac_lock);
2422 list_for_each_entry(i7core_dev, &i7core_edac_list, list)
2423 i7core_unregister_mci(i7core_dev);
2425 /* Release PCI resources */
2426 i7core_put_all_devices();
2430 mutex_unlock(&i7core_edac_lock);
2433 MODULE_DEVICE_TABLE(pci, i7core_pci_tbl);
2436 * i7core_driver pci_driver structure for this module
2439 static struct pci_driver i7core_driver = {
2440 .name = "i7core_edac",
2441 .probe = i7core_probe,
2442 .remove = __devexit_p(i7core_remove),
2443 .id_table = i7core_pci_tbl,
2447 * i7core_init Module entry function
2448 * Try to initialize this module for its devices
2450 static int __init i7core_init(void)
2454 debugf2("MC: " __FILE__ ": %s()\n", __func__);
2456 /* Ensure that the OPSTATE is set correctly for POLL or NMI */
2460 i7core_xeon_pci_fixup(pci_dev_table);
2462 pci_rc = pci_register_driver(&i7core_driver);
2467 i7core_printk(KERN_ERR, "Failed to register device with error %d.\n",
2474 * i7core_exit() Module exit function
2475 * Unregister the driver
2477 static void __exit i7core_exit(void)
2479 debugf2("MC: " __FILE__ ": %s()\n", __func__);
2480 pci_unregister_driver(&i7core_driver);
2483 module_init(i7core_init);
2484 module_exit(i7core_exit);
2486 MODULE_LICENSE("GPL");
2487 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
2488 MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
2489 MODULE_DESCRIPTION("MC Driver for Intel i7 Core memory controllers - "
2492 module_param(edac_op_state, int, 0444);
2493 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");