1 /* Intel 7 core Memory Controller kernel module (Nehalem)
3 * This file may be distributed under the terms of the
4 * GNU General Public License version 2 only.
6 * Copyright (c) 2009 by:
7 * Mauro Carvalho Chehab <mchehab@redhat.com>
9 * Red Hat Inc. http://www.redhat.com
11 * Forked and adapted from the i5400_edac driver
13 * Based on the following public Intel datasheets:
14 * Intel Core i7 Processor Extreme Edition and Intel Core i7 Processor
15 * Datasheet, Volume 2:
16 * http://download.intel.com/design/processor/datashts/320835.pdf
17 * Intel Xeon Processor 5500 Series Datasheet Volume 2
18 * http://www.intel.com/Assets/PDF/datasheet/321322.pdf
20 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/pci.h>
26 #include <linux/pci_ids.h>
27 #include <linux/slab.h>
28 #include <linux/edac.h>
29 #include <linux/mmzone.h>
30 #include <linux/edac_mce.h>
31 #include <linux/spinlock.h>
32 #include <asm/processor.h>
34 #include "edac_core.h"
37 * Alter this version for the module when modifications are made
39 #define I7CORE_REVISION " Ver: 1.0.0 " __DATE__
40 #define EDAC_MOD_STR "i7core_edac"
45 #define i7core_printk(level, fmt, arg...) \
46 edac_printk(level, "i7core", fmt, ##arg)
48 #define i7core_mc_printk(mci, level, fmt, arg...) \
49 edac_mc_chipset_printk(mci, level, "i7core", fmt, ##arg)
52 * i7core Memory Controller Registers
55 /* OFFSETS for Device 0 Function 0 */
57 #define MC_CFG_CONTROL 0x90
59 /* OFFSETS for Device 3 Function 0 */
61 #define MC_CONTROL 0x48
62 #define MC_STATUS 0x4c
63 #define MC_MAX_DOD 0x64
66 * OFFSETS for Device 3 Function 4, as inicated on Xeon 5500 datasheet:
67 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
70 #define MC_TEST_ERR_RCV1 0x60
71 #define DIMM2_COR_ERR(r) ((r) & 0x7fff)
73 #define MC_TEST_ERR_RCV0 0x64
74 #define DIMM1_COR_ERR(r) (((r) >> 16) & 0x7fff)
75 #define DIMM0_COR_ERR(r) ((r) & 0x7fff)
77 /* OFFSETS for Device 3 Function 2, as inicated on Xeon 5500 datasheet */
78 #define MC_COR_ECC_CNT_0 0x80
79 #define MC_COR_ECC_CNT_1 0x84
80 #define MC_COR_ECC_CNT_2 0x88
81 #define MC_COR_ECC_CNT_3 0x8c
82 #define MC_COR_ECC_CNT_4 0x90
83 #define MC_COR_ECC_CNT_5 0x94
85 #define DIMM_TOP_COR_ERR(r) (((r) >> 16) & 0x7fff)
86 #define DIMM_BOT_COR_ERR(r) ((r) & 0x7fff)
89 /* OFFSETS for Devices 4,5 and 6 Function 0 */
91 #define MC_CHANNEL_DIMM_INIT_PARAMS 0x58
92 #define THREE_DIMMS_PRESENT (1 << 24)
93 #define SINGLE_QUAD_RANK_PRESENT (1 << 23)
94 #define QUAD_RANK_PRESENT (1 << 22)
95 #define REGISTERED_DIMM (1 << 15)
97 #define MC_CHANNEL_MAPPER 0x60
98 #define RDLCH(r, ch) ((((r) >> (3 + (ch * 6))) & 0x07) - 1)
99 #define WRLCH(r, ch) ((((r) >> (ch * 6)) & 0x07) - 1)
101 #define MC_CHANNEL_RANK_PRESENT 0x7c
102 #define RANK_PRESENT_MASK 0xffff
104 #define MC_CHANNEL_ADDR_MATCH 0xf0
105 #define MC_CHANNEL_ERROR_MASK 0xf8
106 #define MC_CHANNEL_ERROR_INJECT 0xfc
107 #define INJECT_ADDR_PARITY 0x10
108 #define INJECT_ECC 0x08
109 #define MASK_CACHELINE 0x06
110 #define MASK_FULL_CACHELINE 0x06
111 #define MASK_MSB32_CACHELINE 0x04
112 #define MASK_LSB32_CACHELINE 0x02
113 #define NO_MASK_CACHELINE 0x00
114 #define REPEAT_EN 0x01
116 /* OFFSETS for Devices 4,5 and 6 Function 1 */
118 #define MC_DOD_CH_DIMM0 0x48
119 #define MC_DOD_CH_DIMM1 0x4c
120 #define MC_DOD_CH_DIMM2 0x50
121 #define RANKOFFSET_MASK ((1 << 12) | (1 << 11) | (1 << 10))
122 #define RANKOFFSET(x) ((x & RANKOFFSET_MASK) >> 10)
123 #define DIMM_PRESENT_MASK (1 << 9)
124 #define DIMM_PRESENT(x) (((x) & DIMM_PRESENT_MASK) >> 9)
125 #define MC_DOD_NUMBANK_MASK ((1 << 8) | (1 << 7))
126 #define MC_DOD_NUMBANK(x) (((x) & MC_DOD_NUMBANK_MASK) >> 7)
127 #define MC_DOD_NUMRANK_MASK ((1 << 6) | (1 << 5))
128 #define MC_DOD_NUMRANK(x) (((x) & MC_DOD_NUMRANK_MASK) >> 5)
129 #define MC_DOD_NUMROW_MASK ((1 << 4) | (1 << 3) | (1 << 2))
130 #define MC_DOD_NUMROW(x) (((x) & MC_DOD_NUMROW_MASK) >> 2)
131 #define MC_DOD_NUMCOL_MASK 3
132 #define MC_DOD_NUMCOL(x) ((x) & MC_DOD_NUMCOL_MASK)
134 #define MC_RANK_PRESENT 0x7c
136 #define MC_SAG_CH_0 0x80
137 #define MC_SAG_CH_1 0x84
138 #define MC_SAG_CH_2 0x88
139 #define MC_SAG_CH_3 0x8c
140 #define MC_SAG_CH_4 0x90
141 #define MC_SAG_CH_5 0x94
142 #define MC_SAG_CH_6 0x98
143 #define MC_SAG_CH_7 0x9c
145 #define MC_RIR_LIMIT_CH_0 0x40
146 #define MC_RIR_LIMIT_CH_1 0x44
147 #define MC_RIR_LIMIT_CH_2 0x48
148 #define MC_RIR_LIMIT_CH_3 0x4C
149 #define MC_RIR_LIMIT_CH_4 0x50
150 #define MC_RIR_LIMIT_CH_5 0x54
151 #define MC_RIR_LIMIT_CH_6 0x58
152 #define MC_RIR_LIMIT_CH_7 0x5C
153 #define MC_RIR_LIMIT_MASK ((1 << 10) - 1)
155 #define MC_RIR_WAY_CH 0x80
156 #define MC_RIR_WAY_OFFSET_MASK (((1 << 14) - 1) & ~0x7)
157 #define MC_RIR_WAY_RANK_MASK 0x7
164 #define MAX_DIMMS 3 /* Max DIMMS per channel */
165 #define NUM_SOCKETS 2 /* Max number of MC sockets */
166 #define MAX_MCR_FUNC 4
167 #define MAX_CHAN_FUNC 3
177 struct i7core_inject {
185 /* Error address mask */
186 int channel, dimm, rank, bank, page, col;
189 struct i7core_channel {
194 struct pci_id_descr {
198 struct pci_dev *pdev[NUM_SOCKETS];
202 struct pci_dev *pci_noncore[NUM_SOCKETS];
203 struct pci_dev *pci_mcr[NUM_SOCKETS][MAX_MCR_FUNC + 1];
204 struct pci_dev *pci_ch[NUM_SOCKETS][NUM_CHANS][MAX_CHAN_FUNC + 1];
206 struct i7core_info info;
207 struct i7core_inject inject;
208 struct i7core_channel channel[NUM_SOCKETS][NUM_CHANS];
210 int sockets; /* Number of sockets */
211 int channels; /* Number of active channels */
213 int ce_count_available[NUM_SOCKETS];
214 int csrow_map[NUM_SOCKETS][NUM_CHANS][MAX_DIMMS];
216 /* ECC corrected errors counts per udimm */
217 unsigned long udimm_ce_count[NUM_SOCKETS][MAX_DIMMS];
218 int udimm_last_ce_count[NUM_SOCKETS][MAX_DIMMS];
219 /* ECC corrected errors counts per rdimm */
220 unsigned long rdimm_ce_count[NUM_SOCKETS][NUM_CHANS][MAX_DIMMS];
221 int rdimm_last_ce_count[NUM_SOCKETS][NUM_CHANS][MAX_DIMMS];
223 unsigned int is_registered[NUM_SOCKETS];
226 struct edac_mce edac_mce;
227 struct mce mce_entry[MCE_LOG_LEN];
232 /* Device name and register DID (Device ID) */
233 struct i7core_dev_info {
234 const char *ctl_name; /* name for this device */
235 u16 fsb_mapping_errors; /* DID for the branchmap,control */
238 #define PCI_DESCR(device, function, device_id) \
240 .func = (function), \
241 .dev_id = (device_id)
243 struct pci_id_descr pci_devs[] = {
244 /* Memory controller */
245 { PCI_DESCR(3, 0, PCI_DEVICE_ID_INTEL_I7_MCR) },
246 { PCI_DESCR(3, 1, PCI_DEVICE_ID_INTEL_I7_MC_TAD) },
247 { PCI_DESCR(3, 2, PCI_DEVICE_ID_INTEL_I7_MC_RAS) }, /* if RDIMM */
248 { PCI_DESCR(3, 4, PCI_DEVICE_ID_INTEL_I7_MC_TEST) },
251 { PCI_DESCR(4, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH0_CTRL) },
252 { PCI_DESCR(4, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH0_ADDR) },
253 { PCI_DESCR(4, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH0_RANK) },
254 { PCI_DESCR(4, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH0_TC) },
257 { PCI_DESCR(5, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH1_CTRL) },
258 { PCI_DESCR(5, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH1_ADDR) },
259 { PCI_DESCR(5, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH1_RANK) },
260 { PCI_DESCR(5, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH1_TC) },
263 { PCI_DESCR(6, 0, PCI_DEVICE_ID_INTEL_I7_MC_CH2_CTRL) },
264 { PCI_DESCR(6, 1, PCI_DEVICE_ID_INTEL_I7_MC_CH2_ADDR) },
265 { PCI_DESCR(6, 2, PCI_DEVICE_ID_INTEL_I7_MC_CH2_RANK) },
266 { PCI_DESCR(6, 3, PCI_DEVICE_ID_INTEL_I7_MC_CH2_TC) },
268 /* Generic Non-core registers */
270 * This is the PCI device on i7core and on Xeon 35xx (8086:2c41)
271 * On Xeon 55xx, however, it has a different id (8086:2c40). So,
272 * the probing code needs to test for the other address in case of
273 * failure of this one
275 { PCI_DESCR(0, 0, PCI_DEVICE_ID_INTEL_I7_NOCORE) },
278 #define N_DEVS ARRAY_SIZE(pci_devs)
281 * pci_device_id table for which devices we are looking for
282 * This should match the first device at pci_devs table
284 static const struct pci_device_id i7core_pci_tbl[] __devinitdata = {
285 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)},
286 {0,} /* 0 terminated list. */
290 /* Table of devices attributes supported by this driver */
291 static const struct i7core_dev_info i7core_devs[] = {
293 .ctl_name = "i7 Core",
294 .fsb_mapping_errors = PCI_DEVICE_ID_INTEL_I7_MCR,
298 static struct edac_pci_ctl_info *i7core_pci;
300 /****************************************************************************
301 Anciliary status routines
302 ****************************************************************************/
304 /* MC_CONTROL bits */
305 #define CH_ACTIVE(pvt, ch) ((pvt)->info.mc_control & (1 << (8 + ch)))
306 #define ECCx8(pvt) ((pvt)->info.mc_control & (1 << 1))
309 #define ECC_ENABLED(pvt) ((pvt)->info.mc_status & (1 << 4))
310 #define CH_DISABLED(pvt, ch) ((pvt)->info.mc_status & (1 << ch))
312 /* MC_MAX_DOD read functions */
313 static inline int numdimms(u32 dimms)
315 return (dimms & 0x3) + 1;
318 static inline int numrank(u32 rank)
320 static int ranks[4] = { 1, 2, 4, -EINVAL };
322 return ranks[rank & 0x3];
325 static inline int numbank(u32 bank)
327 static int banks[4] = { 4, 8, 16, -EINVAL };
329 return banks[bank & 0x3];
332 static inline int numrow(u32 row)
334 static int rows[8] = {
335 1 << 12, 1 << 13, 1 << 14, 1 << 15,
336 1 << 16, -EINVAL, -EINVAL, -EINVAL,
339 return rows[row & 0x7];
342 static inline int numcol(u32 col)
344 static int cols[8] = {
345 1 << 10, 1 << 11, 1 << 12, -EINVAL,
347 return cols[col & 0x3];
350 /****************************************************************************
351 Memory check routines
352 ****************************************************************************/
353 static struct pci_dev *get_pdev_slot_func(u8 socket, unsigned slot,
358 for (i = 0; i < N_DEVS; i++) {
359 if (!pci_devs[i].pdev[socket])
362 if (PCI_SLOT(pci_devs[i].pdev[socket]->devfn) == slot &&
363 PCI_FUNC(pci_devs[i].pdev[socket]->devfn) == func) {
364 return pci_devs[i].pdev[socket];
372 * i7core_get_active_channels() - gets the number of channels and csrows
373 * @socket: Quick Path Interconnect socket
374 * @channels: Number of channels that will be returned
375 * @csrows: Number of csrows found
377 * Since EDAC core needs to know in advance the number of available channels
378 * and csrows, in order to allocate memory for csrows/channels, it is needed
379 * to run two similar steps. At the first step, implemented on this function,
380 * it checks the number of csrows/channels present at one socket.
381 * this is used in order to properly allocate the size of mci components.
383 * It should be noticed that none of the current available datasheets explain
384 * or even mention how csrows are seen by the memory controller. So, we need
385 * to add a fake description for csrows.
386 * So, this driver is attributing one DIMM memory for one csrow.
388 static int i7core_get_active_channels(u8 socket, unsigned *channels,
391 struct pci_dev *pdev = NULL;
398 pdev = get_pdev_slot_func(socket, 3, 0);
400 i7core_printk(KERN_ERR, "Couldn't find socket %d fn 3.0!!!\n",
405 /* Device 3 function 0 reads */
406 pci_read_config_dword(pdev, MC_STATUS, &status);
407 pci_read_config_dword(pdev, MC_CONTROL, &control);
409 for (i = 0; i < NUM_CHANS; i++) {
411 /* Check if the channel is active */
412 if (!(control & (1 << (8 + i))))
415 /* Check if the channel is disabled */
416 if (status & (1 << i))
419 pdev = get_pdev_slot_func(socket, i + 4, 1);
421 i7core_printk(KERN_ERR, "Couldn't find socket %d "
426 /* Devices 4-6 function 1 */
427 pci_read_config_dword(pdev,
428 MC_DOD_CH_DIMM0, &dimm_dod[0]);
429 pci_read_config_dword(pdev,
430 MC_DOD_CH_DIMM1, &dimm_dod[1]);
431 pci_read_config_dword(pdev,
432 MC_DOD_CH_DIMM2, &dimm_dod[2]);
436 for (j = 0; j < 3; j++) {
437 if (!DIMM_PRESENT(dimm_dod[j]))
443 debugf0("Number of active channels on socket %d: %d\n",
449 static int get_dimm_config(struct mem_ctl_info *mci, int *csrow, u8 socket)
451 struct i7core_pvt *pvt = mci->pvt_info;
452 struct csrow_info *csr;
453 struct pci_dev *pdev;
455 unsigned long last_page = 0;
459 /* Get data from the MC register, function 0 */
460 pdev = pvt->pci_mcr[socket][0];
464 /* Device 3 function 0 reads */
465 pci_read_config_dword(pdev, MC_CONTROL, &pvt->info.mc_control);
466 pci_read_config_dword(pdev, MC_STATUS, &pvt->info.mc_status);
467 pci_read_config_dword(pdev, MC_MAX_DOD, &pvt->info.max_dod);
468 pci_read_config_dword(pdev, MC_CHANNEL_MAPPER, &pvt->info.ch_map);
470 debugf0("QPI %d control=0x%08x status=0x%08x dod=0x%08x map=0x%08x\n",
471 socket, pvt->info.mc_control, pvt->info.mc_status,
472 pvt->info.max_dod, pvt->info.ch_map);
474 if (ECC_ENABLED(pvt)) {
475 debugf0("ECC enabled with x%d SDCC\n", ECCx8(pvt) ? 8 : 4);
477 mode = EDAC_S8ECD8ED;
479 mode = EDAC_S4ECD4ED;
481 debugf0("ECC disabled\n");
485 /* FIXME: need to handle the error codes */
486 debugf0("DOD Max limits: DIMMS: %d, %d-ranked, %d-banked "
488 numdimms(pvt->info.max_dod),
489 numrank(pvt->info.max_dod >> 2),
490 numbank(pvt->info.max_dod >> 4),
491 numrow(pvt->info.max_dod >> 6),
492 numcol(pvt->info.max_dod >> 9));
494 for (i = 0; i < NUM_CHANS; i++) {
495 u32 data, dimm_dod[3], value[8];
497 if (!CH_ACTIVE(pvt, i)) {
498 debugf0("Channel %i is not active\n", i);
501 if (CH_DISABLED(pvt, i)) {
502 debugf0("Channel %i is disabled\n", i);
506 /* Devices 4-6 function 0 */
507 pci_read_config_dword(pvt->pci_ch[socket][i][0],
508 MC_CHANNEL_DIMM_INIT_PARAMS, &data);
510 pvt->channel[socket][i].ranks = (data & QUAD_RANK_PRESENT) ?
513 if (data & REGISTERED_DIMM)
518 if (data & THREE_DIMMS_PRESENT)
519 pvt->channel[i].dimms = 3;
520 else if (data & SINGLE_QUAD_RANK_PRESENT)
521 pvt->channel[i].dimms = 1;
523 pvt->channel[i].dimms = 2;
526 /* Devices 4-6 function 1 */
527 pci_read_config_dword(pvt->pci_ch[socket][i][1],
528 MC_DOD_CH_DIMM0, &dimm_dod[0]);
529 pci_read_config_dword(pvt->pci_ch[socket][i][1],
530 MC_DOD_CH_DIMM1, &dimm_dod[1]);
531 pci_read_config_dword(pvt->pci_ch[socket][i][1],
532 MC_DOD_CH_DIMM2, &dimm_dod[2]);
534 debugf0("Ch%d phy rd%d, wr%d (0x%08x): "
535 "%d ranks, %cDIMMs\n",
537 RDLCH(pvt->info.ch_map, i), WRLCH(pvt->info.ch_map, i),
539 pvt->channel[socket][i].ranks,
540 (data & REGISTERED_DIMM) ? 'R' : 'U');
542 for (j = 0; j < 3; j++) {
543 u32 banks, ranks, rows, cols;
546 if (!DIMM_PRESENT(dimm_dod[j]))
549 banks = numbank(MC_DOD_NUMBANK(dimm_dod[j]));
550 ranks = numrank(MC_DOD_NUMRANK(dimm_dod[j]));
551 rows = numrow(MC_DOD_NUMROW(dimm_dod[j]));
552 cols = numcol(MC_DOD_NUMCOL(dimm_dod[j]));
554 /* DDR3 has 8 I/O banks */
555 size = (rows * cols * banks * ranks) >> (20 - 3);
557 pvt->channel[socket][i].dimms++;
559 debugf0("\tdimm %d %d Mb offset: %x, "
560 "bank: %d, rank: %d, row: %#x, col: %#x\n",
562 RANKOFFSET(dimm_dod[j]),
563 banks, ranks, rows, cols);
566 npages = size >> (PAGE_SHIFT - 20);
568 npages = size << (20 - PAGE_SHIFT);
571 csr = &mci->csrows[*csrow];
572 csr->first_page = last_page + 1;
574 csr->last_page = last_page;
575 csr->nr_pages = npages;
579 csr->csrow_idx = *csrow;
580 csr->nr_channels = 1;
582 csr->channels[0].chan_idx = i;
583 csr->channels[0].ce_count = 0;
585 pvt->csrow_map[socket][i][j] = *csrow;
595 csr->dtype = DEV_X16;
598 csr->dtype = DEV_UNKNOWN;
601 csr->edac_mode = mode;
607 pci_read_config_dword(pdev, MC_SAG_CH_0, &value[0]);
608 pci_read_config_dword(pdev, MC_SAG_CH_1, &value[1]);
609 pci_read_config_dword(pdev, MC_SAG_CH_2, &value[2]);
610 pci_read_config_dword(pdev, MC_SAG_CH_3, &value[3]);
611 pci_read_config_dword(pdev, MC_SAG_CH_4, &value[4]);
612 pci_read_config_dword(pdev, MC_SAG_CH_5, &value[5]);
613 pci_read_config_dword(pdev, MC_SAG_CH_6, &value[6]);
614 pci_read_config_dword(pdev, MC_SAG_CH_7, &value[7]);
615 debugf1("\t[%i] DIVBY3\tREMOVED\tOFFSET\n", i);
616 for (j = 0; j < 8; j++)
617 debugf1("\t\t%#x\t%#x\t%#x\n",
618 (value[j] >> 27) & 0x1,
619 (value[j] >> 24) & 0x7,
620 (value[j] && ((1 << 24) - 1)));
626 /****************************************************************************
627 Error insertion routines
628 ****************************************************************************/
630 /* The i7core has independent error injection features per channel.
631 However, to have a simpler code, we don't allow enabling error injection
632 on more than one channel.
633 Also, since a change at an inject parameter will be applied only at enable,
634 we're disabling error injection on all write calls to the sysfs nodes that
635 controls the error code injection.
637 static int disable_inject(struct mem_ctl_info *mci)
639 struct i7core_pvt *pvt = mci->pvt_info;
641 pvt->inject.enable = 0;
643 if (!pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0])
646 pci_write_config_dword(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
647 MC_CHANNEL_ERROR_INJECT, 0);
653 * i7core inject inject.socket
655 * accept and store error injection inject.socket value
657 static ssize_t i7core_inject_socket_store(struct mem_ctl_info *mci,
658 const char *data, size_t count)
660 struct i7core_pvt *pvt = mci->pvt_info;
664 rc = strict_strtoul(data, 10, &value);
665 if ((rc < 0) || (value >= pvt->sockets))
668 pvt->inject.socket = (u32) value;
672 static ssize_t i7core_inject_socket_show(struct mem_ctl_info *mci,
675 struct i7core_pvt *pvt = mci->pvt_info;
676 return sprintf(data, "%d\n", pvt->inject.socket);
680 * i7core inject inject.section
682 * accept and store error injection inject.section value
683 * bit 0 - refers to the lower 32-byte half cacheline
684 * bit 1 - refers to the upper 32-byte half cacheline
686 static ssize_t i7core_inject_section_store(struct mem_ctl_info *mci,
687 const char *data, size_t count)
689 struct i7core_pvt *pvt = mci->pvt_info;
693 if (pvt->inject.enable)
696 rc = strict_strtoul(data, 10, &value);
697 if ((rc < 0) || (value > 3))
700 pvt->inject.section = (u32) value;
704 static ssize_t i7core_inject_section_show(struct mem_ctl_info *mci,
707 struct i7core_pvt *pvt = mci->pvt_info;
708 return sprintf(data, "0x%08x\n", pvt->inject.section);
714 * accept and store error injection inject.section value
715 * bit 0 - repeat enable - Enable error repetition
716 * bit 1 - inject ECC error
717 * bit 2 - inject parity error
719 static ssize_t i7core_inject_type_store(struct mem_ctl_info *mci,
720 const char *data, size_t count)
722 struct i7core_pvt *pvt = mci->pvt_info;
726 if (pvt->inject.enable)
729 rc = strict_strtoul(data, 10, &value);
730 if ((rc < 0) || (value > 7))
733 pvt->inject.type = (u32) value;
737 static ssize_t i7core_inject_type_show(struct mem_ctl_info *mci,
740 struct i7core_pvt *pvt = mci->pvt_info;
741 return sprintf(data, "0x%08x\n", pvt->inject.type);
745 * i7core_inject_inject.eccmask_store
747 * The type of error (UE/CE) will depend on the inject.eccmask value:
748 * Any bits set to a 1 will flip the corresponding ECC bit
749 * Correctable errors can be injected by flipping 1 bit or the bits within
750 * a symbol pair (2 consecutive aligned 8-bit pairs - i.e. 7:0 and 15:8 or
751 * 23:16 and 31:24). Flipping bits in two symbol pairs will cause an
752 * uncorrectable error to be injected.
754 static ssize_t i7core_inject_eccmask_store(struct mem_ctl_info *mci,
755 const char *data, size_t count)
757 struct i7core_pvt *pvt = mci->pvt_info;
761 if (pvt->inject.enable)
764 rc = strict_strtoul(data, 10, &value);
768 pvt->inject.eccmask = (u32) value;
772 static ssize_t i7core_inject_eccmask_show(struct mem_ctl_info *mci,
775 struct i7core_pvt *pvt = mci->pvt_info;
776 return sprintf(data, "0x%08x\n", pvt->inject.eccmask);
782 * The type of error (UE/CE) will depend on the inject.eccmask value:
783 * Any bits set to a 1 will flip the corresponding ECC bit
784 * Correctable errors can be injected by flipping 1 bit or the bits within
785 * a symbol pair (2 consecutive aligned 8-bit pairs - i.e. 7:0 and 15:8 or
786 * 23:16 and 31:24). Flipping bits in two symbol pairs will cause an
787 * uncorrectable error to be injected.
789 static ssize_t i7core_inject_addrmatch_store(struct mem_ctl_info *mci,
790 const char *data, size_t count)
792 struct i7core_pvt *pvt = mci->pvt_info;
797 if (pvt->inject.enable)
801 cmd = strsep((char **) &data, ":");
804 val = strsep((char **) &data, " \n\t");
808 if (!strcasecmp(val, "any"))
811 rc = strict_strtol(val, 10, &value);
812 if ((rc < 0) || (value < 0))
816 if (!strcasecmp(cmd, "channel")) {
818 pvt->inject.channel = value;
821 } else if (!strcasecmp(cmd, "dimm")) {
823 pvt->inject.dimm = value;
826 } else if (!strcasecmp(cmd, "rank")) {
828 pvt->inject.rank = value;
831 } else if (!strcasecmp(cmd, "bank")) {
833 pvt->inject.bank = value;
836 } else if (!strcasecmp(cmd, "page")) {
838 pvt->inject.page = value;
841 } else if (!strcasecmp(cmd, "col") ||
842 !strcasecmp(cmd, "column")) {
844 pvt->inject.col = value;
853 static ssize_t i7core_inject_addrmatch_show(struct mem_ctl_info *mci,
856 struct i7core_pvt *pvt = mci->pvt_info;
857 char channel[4], dimm[4], bank[4], rank[4], page[7], col[7];
859 if (pvt->inject.channel < 0)
860 sprintf(channel, "any");
862 sprintf(channel, "%d", pvt->inject.channel);
863 if (pvt->inject.dimm < 0)
864 sprintf(dimm, "any");
866 sprintf(dimm, "%d", pvt->inject.dimm);
867 if (pvt->inject.bank < 0)
868 sprintf(bank, "any");
870 sprintf(bank, "%d", pvt->inject.bank);
871 if (pvt->inject.rank < 0)
872 sprintf(rank, "any");
874 sprintf(rank, "%d", pvt->inject.rank);
875 if (pvt->inject.page < 0)
876 sprintf(page, "any");
878 sprintf(page, "0x%04x", pvt->inject.page);
879 if (pvt->inject.col < 0)
882 sprintf(col, "0x%04x", pvt->inject.col);
884 return sprintf(data, "channel: %s\ndimm: %s\nbank: %s\n"
885 "rank: %s\npage: %s\ncolumn: %s\n",
886 channel, dimm, bank, rank, page, col);
889 static int write_and_test(struct pci_dev *dev, int where, u32 val)
894 debugf0("setting pci %02x:%02x.%x reg=%02x value=%08x\n",
895 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
898 for (count = 0; count < 10; count++) {
901 pci_write_config_dword(dev, where, val);
902 pci_read_config_dword(dev, where, &read);
908 i7core_printk(KERN_ERR, "Error during set pci %02x:%02x.%x reg=%02x "
909 "write=%08x. Read=%08x\n",
910 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
917 * This routine prepares the Memory Controller for error injection.
918 * The error will be injected when some process tries to write to the
919 * memory that matches the given criteria.
920 * The criteria can be set in terms of a mask where dimm, rank, bank, page
921 * and col can be specified.
922 * A -1 value for any of the mask items will make the MCU to ignore
923 * that matching criteria for error injection.
925 * It should be noticed that the error will only happen after a write operation
926 * on a memory that matches the condition. if REPEAT_EN is not enabled at
927 * inject mask, then it will produce just one error. Otherwise, it will repeat
928 * until the injectmask would be cleaned.
930 * FIXME: This routine assumes that MAXNUMDIMMS value of MC_MAX_DOD
931 * is reliable enough to check if the MC is using the
932 * three channels. However, this is not clear at the datasheet.
934 static ssize_t i7core_inject_enable_store(struct mem_ctl_info *mci,
935 const char *data, size_t count)
937 struct i7core_pvt *pvt = mci->pvt_info;
943 if (!pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0])
946 rc = strict_strtoul(data, 10, &enable);
951 pvt->inject.enable = 1;
957 /* Sets pvt->inject.dimm mask */
958 if (pvt->inject.dimm < 0)
961 if (pvt->channel[pvt->inject.socket][pvt->inject.channel].dimms > 2)
962 mask |= (pvt->inject.dimm & 0x3L) << 35;
964 mask |= (pvt->inject.dimm & 0x1L) << 36;
967 /* Sets pvt->inject.rank mask */
968 if (pvt->inject.rank < 0)
971 if (pvt->channel[pvt->inject.socket][pvt->inject.channel].dimms > 2)
972 mask |= (pvt->inject.rank & 0x1L) << 34;
974 mask |= (pvt->inject.rank & 0x3L) << 34;
977 /* Sets pvt->inject.bank mask */
978 if (pvt->inject.bank < 0)
981 mask |= (pvt->inject.bank & 0x15L) << 30;
983 /* Sets pvt->inject.page mask */
984 if (pvt->inject.page < 0)
987 mask |= (pvt->inject.page & 0xffffL) << 14;
989 /* Sets pvt->inject.column mask */
990 if (pvt->inject.col < 0)
993 mask |= (pvt->inject.col & 0x3fffL);
997 * bits 1-2: MASK_HALF_CACHELINE
999 * bit 4: INJECT_ADDR_PARITY
1002 injectmask = (pvt->inject.type & 1) |
1003 (pvt->inject.section & 0x3) << 1 |
1004 (pvt->inject.type & 0x6) << (3 - 1);
1006 /* Unlock writes to registers - this register is write only */
1007 pci_write_config_dword(pvt->pci_noncore[pvt->inject.socket],
1008 MC_CFG_CONTROL, 0x2);
1010 write_and_test(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
1011 MC_CHANNEL_ADDR_MATCH, mask);
1012 write_and_test(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
1013 MC_CHANNEL_ADDR_MATCH + 4, mask >> 32L);
1015 write_and_test(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
1016 MC_CHANNEL_ERROR_MASK, pvt->inject.eccmask);
1018 write_and_test(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
1019 MC_CHANNEL_ERROR_INJECT, injectmask);
1022 * This is something undocumented, based on my tests
1023 * Without writing 8 to this register, errors aren't injected. Not sure
1026 pci_write_config_dword(pvt->pci_noncore[pvt->inject.socket],
1029 debugf0("Error inject addr match 0x%016llx, ecc 0x%08x,"
1031 mask, pvt->inject.eccmask, injectmask);
1037 static ssize_t i7core_inject_enable_show(struct mem_ctl_info *mci,
1040 struct i7core_pvt *pvt = mci->pvt_info;
1043 pci_read_config_dword(pvt->pci_ch[pvt->inject.socket][pvt->inject.channel][0],
1044 MC_CHANNEL_ERROR_INJECT, &injectmask);
1046 debugf0("Inject error read: 0x%018x\n", injectmask);
1048 if (injectmask & 0x0c)
1049 pvt->inject.enable = 1;
1051 return sprintf(data, "%d\n", pvt->inject.enable);
1054 static ssize_t i7core_ce_regs_show(struct mem_ctl_info *mci, char *data)
1056 unsigned i, j, count, total = 0;
1057 struct i7core_pvt *pvt = mci->pvt_info;
1059 for (i = 0; i < pvt->sockets; i++) {
1060 if (!pvt->ce_count_available[i]) {
1061 count = sprintf(data, "socket 0 data unavailable\n");
1064 if (!pvt->is_registered[i])
1065 count = sprintf(data, "socket %d, dimm0: %lu\n"
1066 "dimm1: %lu\ndimm2: %lu\n",
1068 pvt->udimm_ce_count[i][0],
1069 pvt->udimm_ce_count[i][1],
1070 pvt->udimm_ce_count[i][2]);
1072 for (j = 0; j < NUM_CHANS; j++) {
1073 count = sprintf(data, "socket %d, channel %d"
1075 "dimm1: %lu\ndimm2: %lu\n",
1077 pvt->rdimm_ce_count[i][j][0],
1078 pvt->rdimm_ce_count[i][j][1],
1079 pvt->rdimm_ce_count[i][j][2]);
1091 static struct mcidev_sysfs_attribute i7core_inj_attrs[] = {
1094 .name = "inject_socket",
1095 .mode = (S_IRUGO | S_IWUSR)
1097 .show = i7core_inject_socket_show,
1098 .store = i7core_inject_socket_store,
1101 .name = "inject_section",
1102 .mode = (S_IRUGO | S_IWUSR)
1104 .show = i7core_inject_section_show,
1105 .store = i7core_inject_section_store,
1108 .name = "inject_type",
1109 .mode = (S_IRUGO | S_IWUSR)
1111 .show = i7core_inject_type_show,
1112 .store = i7core_inject_type_store,
1115 .name = "inject_eccmask",
1116 .mode = (S_IRUGO | S_IWUSR)
1118 .show = i7core_inject_eccmask_show,
1119 .store = i7core_inject_eccmask_store,
1122 .name = "inject_addrmatch",
1123 .mode = (S_IRUGO | S_IWUSR)
1125 .show = i7core_inject_addrmatch_show,
1126 .store = i7core_inject_addrmatch_store,
1129 .name = "inject_enable",
1130 .mode = (S_IRUGO | S_IWUSR)
1132 .show = i7core_inject_enable_show,
1133 .store = i7core_inject_enable_store,
1136 .name = "corrected_error_counts",
1137 .mode = (S_IRUGO | S_IWUSR)
1139 .show = i7core_ce_regs_show,
1144 /****************************************************************************
1145 Device initialization routines: put/get, init/exit
1146 ****************************************************************************/
1149 * i7core_put_devices 'put' all the devices that we have
1150 * reserved via 'get'
1152 static void i7core_put_devices(void)
1156 for (i = 0; i < NUM_SOCKETS; i++)
1157 for (j = 0; j < N_DEVS; j++)
1158 pci_dev_put(pci_devs[j].pdev[i]);
1162 * i7core_get_devices Find and perform 'get' operation on the MCH's
1163 * device/functions we want to reference for this driver
1165 * Need to 'get' device 16 func 1 and func 2
1167 int i7core_get_onedevice(struct pci_dev **prev, int devno)
1169 struct pci_dev *pdev = NULL;
1173 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1174 pci_devs[devno].dev_id, *prev);
1177 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core pci buses
1178 * aren't announced by acpi. So, we need to use a legacy scan probing
1181 if (unlikely(!pdev && !devno && !prev)) {
1182 pcibios_scan_specific_bus(254);
1183 pcibios_scan_specific_bus(255);
1185 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1186 pci_devs[devno].dev_id, *prev);
1190 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core regs
1191 * is at addr 8086:2c40, instead of 8086:2c41. So, we need
1192 * to probe for the alternate address in case of failure
1194 if (pci_devs[devno].dev_id == PCI_DEVICE_ID_INTEL_I7_NOCORE && !pdev)
1195 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1196 PCI_DEVICE_ID_INTEL_I7_NOCORE_ALT, *prev);
1205 * Dev 3 function 2 only exists on chips with RDIMMs
1206 * so, it is ok to not found it
1208 if ((pci_devs[devno].dev == 3) && (pci_devs[devno].func == 2)) {
1213 i7core_printk(KERN_ERR,
1214 "Device not found: dev %02x.%d PCI ID %04x:%04x\n",
1215 pci_devs[devno].dev, pci_devs[devno].func,
1216 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id);
1218 /* End of list, leave */
1221 bus = pdev->bus->number;
1228 if (socket >= NUM_SOCKETS) {
1229 i7core_printk(KERN_ERR,
1230 "Unexpected socket for "
1231 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1232 bus, pci_devs[devno].dev, pci_devs[devno].func,
1233 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id);
1238 if (pci_devs[devno].pdev[socket]) {
1239 i7core_printk(KERN_ERR,
1240 "Duplicated device for "
1241 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1242 bus, pci_devs[devno].dev, pci_devs[devno].func,
1243 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id);
1248 pci_devs[devno].pdev[socket] = pdev;
1251 if (unlikely(PCI_SLOT(pdev->devfn) != pci_devs[devno].dev ||
1252 PCI_FUNC(pdev->devfn) != pci_devs[devno].func)) {
1253 i7core_printk(KERN_ERR,
1254 "Device PCI ID %04x:%04x "
1255 "has dev %02x:%02x.%d instead of dev %02x:%02x.%d\n",
1256 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id,
1257 bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
1258 bus, pci_devs[devno].dev, pci_devs[devno].func);
1262 /* Be sure that the device is enabled */
1263 if (unlikely(pci_enable_device(pdev) < 0)) {
1264 i7core_printk(KERN_ERR,
1266 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1267 bus, pci_devs[devno].dev, pci_devs[devno].func,
1268 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id);
1272 i7core_printk(KERN_INFO,
1273 "Registered socket %d "
1274 "dev %02x:%02x.%d PCI ID %04x:%04x\n",
1275 socket, bus, pci_devs[devno].dev, pci_devs[devno].func,
1276 PCI_VENDOR_ID_INTEL, pci_devs[devno].dev_id);
1283 static int i7core_get_devices(void)
1286 struct pci_dev *pdev = NULL;
1288 for (i = 0; i < N_DEVS; i++) {
1291 if (i7core_get_onedevice(&pdev, i) < 0) {
1292 i7core_put_devices();
1300 static int mci_bind_devs(struct mem_ctl_info *mci)
1302 struct i7core_pvt *pvt = mci->pvt_info;
1303 struct pci_dev *pdev;
1304 int i, j, func, slot;
1307 for (i = 0; i < pvt->sockets; i++) {
1308 pvt->is_registered[i] = 0;
1309 for (j = 0; j < N_DEVS; j++) {
1310 pdev = pci_devs[j].pdev[i];
1314 func = PCI_FUNC(pdev->devfn);
1315 slot = PCI_SLOT(pdev->devfn);
1317 if (unlikely(func > MAX_MCR_FUNC))
1319 pvt->pci_mcr[i][func] = pdev;
1320 } else if (likely(slot >= 4 && slot < 4 + NUM_CHANS)) {
1321 if (unlikely(func > MAX_CHAN_FUNC))
1323 pvt->pci_ch[i][slot - 4][func] = pdev;
1324 } else if (!slot && !func)
1325 pvt->pci_noncore[i] = pdev;
1329 debugf0("Associated fn %d.%d, dev = %p, socket %d\n",
1330 PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
1333 if (PCI_SLOT(pdev->devfn) == 3 &&
1334 PCI_FUNC(pdev->devfn) == 2)
1335 pvt->is_registered[i] = 1;
1342 i7core_printk(KERN_ERR, "Device %d, function %d "
1343 "is out of the expected range\n",
1348 /****************************************************************************
1349 Error check routines
1350 ****************************************************************************/
1351 static void i7core_rdimm_update_csrow(struct mem_ctl_info *mci, int socket,
1352 int chan, int dimm, int add)
1355 struct i7core_pvt *pvt = mci->pvt_info;
1356 int row = pvt->csrow_map[socket][chan][dimm], i;
1358 for (i = 0; i < add; i++) {
1359 msg = kasprintf(GFP_KERNEL, "Corrected error "
1360 "(Socket=%d channel=%d dimm=%d",
1361 socket, chan, dimm);
1363 edac_mc_handle_fbd_ce(mci, row, 0, msg);
1368 static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci,
1369 int socket, int chan, int new0, int new1, int new2)
1371 struct i7core_pvt *pvt = mci->pvt_info;
1372 int add0 = 0, add1 = 0, add2 = 0;
1373 /* Updates CE counters if it is not the first time here */
1374 if (pvt->ce_count_available[socket]) {
1375 /* Updates CE counters */
1377 add2 = new2 - pvt->rdimm_last_ce_count[socket][chan][2];
1378 add1 = new1 - pvt->rdimm_last_ce_count[socket][chan][1];
1379 add0 = new0 - pvt->rdimm_last_ce_count[socket][chan][0];
1383 pvt->rdimm_ce_count[socket][chan][2] += add2;
1387 pvt->rdimm_ce_count[socket][chan][1] += add1;
1391 pvt->rdimm_ce_count[socket][chan][0] += add0;
1393 pvt->ce_count_available[socket] = 1;
1395 /* Store the new values */
1396 pvt->rdimm_last_ce_count[socket][chan][2] = new2;
1397 pvt->rdimm_last_ce_count[socket][chan][1] = new1;
1398 pvt->rdimm_last_ce_count[socket][chan][0] = new0;
1400 /*updated the edac core */
1402 i7core_rdimm_update_csrow(mci, socket, chan, 0, add0);
1404 i7core_rdimm_update_csrow(mci, socket, chan, 1, add1);
1406 i7core_rdimm_update_csrow(mci, socket, chan, 2, add2);
1410 static void i7core_rdimm_check_mc_ecc_err(struct mem_ctl_info *mci, u8 socket)
1412 struct i7core_pvt *pvt = mci->pvt_info;
1414 int i, new0, new1, new2;
1416 /*Read DEV 3: FUN 2: MC_COR_ECC_CNT regs directly*/
1417 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_0,
1419 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_1,
1421 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_2,
1423 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_3,
1425 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_4,
1427 pci_read_config_dword(pvt->pci_mcr[socket][2], MC_COR_ECC_CNT_5,
1429 for (i = 0 ; i < 3; i++) {
1430 debugf3("MC_COR_ECC_CNT%d = 0x%x; MC_COR_ECC_CNT%d = 0x%x\n",
1431 (i * 2), rcv[i][0], (i * 2) + 1, rcv[i][1]);
1432 /*if the channel has 3 dimms*/
1433 if (pvt->channel[socket][i].dimms > 2) {
1434 new0 = DIMM_BOT_COR_ERR(rcv[i][0]);
1435 new1 = DIMM_TOP_COR_ERR(rcv[i][0]);
1436 new2 = DIMM_BOT_COR_ERR(rcv[i][1]);
1438 new0 = DIMM_TOP_COR_ERR(rcv[i][0]) +
1439 DIMM_BOT_COR_ERR(rcv[i][0]);
1440 new1 = DIMM_TOP_COR_ERR(rcv[i][1]) +
1441 DIMM_BOT_COR_ERR(rcv[i][1]);
1445 i7core_rdimm_update_ce_count(mci, socket, i, new0, new1, new2);
1449 /* This function is based on the device 3 function 4 registers as described on:
1450 * Intel Xeon Processor 5500 Series Datasheet Volume 2
1451 * http://www.intel.com/Assets/PDF/datasheet/321322.pdf
1452 * also available at:
1453 * http://www.arrownac.com/manufacturers/intel/s/nehalem/5500-datasheet-v2.pdf
1455 static void i7core_udimm_check_mc_ecc_err(struct mem_ctl_info *mci, u8 socket)
1457 struct i7core_pvt *pvt = mci->pvt_info;
1459 int new0, new1, new2;
1461 if (!pvt->pci_mcr[socket][4]) {
1462 debugf0("%s MCR registers not found\n", __func__);
1466 /* Corrected test errors */
1467 pci_read_config_dword(pvt->pci_mcr[socket][4], MC_TEST_ERR_RCV1, &rcv1);
1468 pci_read_config_dword(pvt->pci_mcr[socket][4], MC_TEST_ERR_RCV0, &rcv0);
1470 /* Store the new values */
1471 new2 = DIMM2_COR_ERR(rcv1);
1472 new1 = DIMM1_COR_ERR(rcv0);
1473 new0 = DIMM0_COR_ERR(rcv0);
1475 /* Updates CE counters if it is not the first time here */
1476 if (pvt->ce_count_available[socket]) {
1477 /* Updates CE counters */
1478 int add0, add1, add2;
1480 add2 = new2 - pvt->udimm_last_ce_count[socket][2];
1481 add1 = new1 - pvt->udimm_last_ce_count[socket][1];
1482 add0 = new0 - pvt->udimm_last_ce_count[socket][0];
1486 pvt->udimm_ce_count[socket][2] += add2;
1490 pvt->udimm_ce_count[socket][1] += add1;
1494 pvt->udimm_ce_count[socket][0] += add0;
1496 if (add0 | add1 | add2)
1497 i7core_printk(KERN_ERR, "New Corrected error(s): "
1498 "dimm0: +%d, dimm1: +%d, dimm2 +%d\n",
1501 pvt->ce_count_available[socket] = 1;
1503 /* Store the new values */
1504 pvt->udimm_last_ce_count[socket][2] = new2;
1505 pvt->udimm_last_ce_count[socket][1] = new1;
1506 pvt->udimm_last_ce_count[socket][0] = new0;
1510 * According with tables E-11 and E-12 of chapter E.3.3 of Intel 64 and IA-32
1511 * Architectures Software Developer’s Manual Volume 3B.
1512 * Nehalem are defined as family 0x06, model 0x1a
1514 * The MCA registers used here are the following ones:
1515 * struct mce field MCA Register
1516 * m->status MSR_IA32_MC8_STATUS
1517 * m->addr MSR_IA32_MC8_ADDR
1518 * m->misc MSR_IA32_MC8_MISC
1519 * In the case of Nehalem, the error information is masked at .status and .misc
1522 static void i7core_mce_output_error(struct mem_ctl_info *mci,
1525 struct i7core_pvt *pvt = mci->pvt_info;
1526 char *type, *optype, *err, *msg;
1527 unsigned long error = m->status & 0x1ff0000l;
1528 u32 optypenum = (m->status >> 4) & 0x07;
1529 u32 core_err_cnt = (m->status >> 38) && 0x7fff;
1530 u32 dimm = (m->misc >> 16) & 0x3;
1531 u32 channel = (m->misc >> 18) & 0x3;
1532 u32 syndrome = m->misc >> 32;
1533 u32 errnum = find_first_bit(&error, 32);
1536 u32 socket_id = cpu_data[m->cpu].phys_proc_id;
1541 if (m->mcgstatus & 1)
1546 switch (optypenum) {
1548 optype = "generic undef request";
1551 optype = "read error";
1554 optype = "write error";
1557 optype = "addr/cmd error";
1560 optype = "scrubbing error";
1563 optype = "reserved";
1569 err = "read ECC error";
1572 err = "RAS ECC error";
1575 err = "write parity error";
1578 err = "redundacy loss";
1584 err = "memory range error";
1587 err = "RTID out of range";
1590 err = "address parity error";
1593 err = "byte enable parity error";
1599 /* FIXME: should convert addr into bank and rank information */
1600 msg = kasprintf(GFP_ATOMIC,
1601 "%s (addr = 0x%08llx, socket=%d, Dimm=%d, Channel=%d, "
1602 "syndrome=0x%08x, count=%d, Err=%08llx:%08llx (%s: %s))\n",
1603 type, (long long) m->addr, socket_id, dimm, channel,
1604 syndrome, core_err_cnt, (long long)m->status,
1605 (long long)m->misc, optype, err);
1609 if (socket_id < NUM_SOCKETS)
1610 csrow = pvt->csrow_map[socket_id][channel][dimm];
1614 /* Call the helper to output message */
1615 if (m->mcgstatus & 1)
1616 edac_mc_handle_fbd_ue(mci, csrow, 0,
1617 0 /* FIXME: should be channel here */, msg);
1618 else if (!pvt->is_registered[socket_id])
1619 edac_mc_handle_fbd_ce(mci, csrow,
1620 0 /* FIXME: should be channel here */, msg);
1626 * i7core_check_error Retrieve and process errors reported by the
1627 * hardware. Called by the Core module.
1629 static void i7core_check_error(struct mem_ctl_info *mci)
1631 struct i7core_pvt *pvt = mci->pvt_info;
1634 struct mce *m = NULL;
1635 unsigned long flags;
1637 /* Copy all mce errors into a temporary buffer */
1638 spin_lock_irqsave(&pvt->mce_lock, flags);
1639 if (pvt->mce_count) {
1640 m = kmalloc(sizeof(*m) * pvt->mce_count, GFP_ATOMIC);
1642 count = pvt->mce_count;
1643 memcpy(m, &pvt->mce_entry, sizeof(*m) * count);
1647 spin_unlock_irqrestore(&pvt->mce_lock, flags);
1649 /* proccess mcelog errors */
1650 for (i = 0; i < count; i++)
1651 i7core_mce_output_error(mci, &m[i]);
1655 /* check memory count errors */
1656 for (i = 0; i < pvt->sockets; i++)
1657 if (!pvt->is_registered[i])
1658 i7core_udimm_check_mc_ecc_err(mci, i);
1660 i7core_rdimm_check_mc_ecc_err(mci, i);
1664 * i7core_mce_check_error Replicates mcelog routine to get errors
1665 * This routine simply queues mcelog errors, and
1666 * return. The error itself should be handled later
1667 * by i7core_check_error.
1669 static int i7core_mce_check_error(void *priv, struct mce *mce)
1671 struct mem_ctl_info *mci = priv;
1672 struct i7core_pvt *pvt = mci->pvt_info;
1673 unsigned long flags;
1676 * Just let mcelog handle it if the error is
1677 * outside the memory controller
1679 if (((mce->status & 0xffff) >> 7) != 1)
1682 /* Bank 8 registers are the only ones that we know how to handle */
1686 spin_lock_irqsave(&pvt->mce_lock, flags);
1687 if (pvt->mce_count < MCE_LOG_LEN) {
1688 memcpy(&pvt->mce_entry[pvt->mce_count], mce, sizeof(*mce));
1691 spin_unlock_irqrestore(&pvt->mce_lock, flags);
1693 /* Handle fatal errors immediately */
1694 if (mce->mcgstatus & 1)
1695 i7core_check_error(mci);
1697 /* Advice mcelog that the error were handled */
1702 * i7core_probe Probe for ONE instance of device to see if it is
1705 * 0 for FOUND a device
1706 * < 0 for error code
1708 static int __devinit i7core_probe(struct pci_dev *pdev,
1709 const struct pci_device_id *id)
1711 struct mem_ctl_info *mci;
1712 struct i7core_pvt *pvt;
1713 int num_channels = 0;
1716 int dev_idx = id->driver_data;
1720 if (unlikely(dev_idx >= ARRAY_SIZE(i7core_devs)))
1723 /* get the pci devices we want to reserve for our use */
1724 rc = i7core_get_devices();
1725 if (unlikely(rc < 0))
1729 for (i = NUM_SOCKETS - 1; i > 0; i--)
1730 if (pci_devs[0].pdev[i]) {
1735 for (i = 0; i < sockets; i++) {
1739 /* Check the number of active and not disabled channels */
1740 rc = i7core_get_active_channels(i, &channels, &csrows);
1741 if (unlikely(rc < 0))
1744 num_channels += channels;
1745 num_csrows += csrows;
1748 /* allocate a new MC control structure */
1749 mci = edac_mc_alloc(sizeof(*pvt), num_csrows, num_channels, 0);
1750 if (unlikely(!mci)) {
1755 debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci);
1757 mci->dev = &pdev->dev; /* record ptr to the generic device */
1758 pvt = mci->pvt_info;
1759 memset(pvt, 0, sizeof(*pvt));
1760 pvt->sockets = sockets;
1764 * FIXME: how to handle RDDR3 at MCI level? It is possible to have
1765 * Mixed RDDR3/UDDR3 with Nehalem, provided that they are on different
1768 mci->mtype_cap = MEM_FLAG_DDR3;
1769 mci->edac_ctl_cap = EDAC_FLAG_NONE;
1770 mci->edac_cap = EDAC_FLAG_NONE;
1771 mci->mod_name = "i7core_edac.c";
1772 mci->mod_ver = I7CORE_REVISION;
1773 mci->ctl_name = i7core_devs[dev_idx].ctl_name;
1774 mci->dev_name = pci_name(pdev);
1775 mci->ctl_page_to_phys = NULL;
1776 mci->mc_driver_sysfs_attributes = i7core_inj_attrs;
1777 /* Set the function pointer to an actual operation function */
1778 mci->edac_check = i7core_check_error;
1780 /* Store pci devices at mci for faster access */
1781 rc = mci_bind_devs(mci);
1782 if (unlikely(rc < 0))
1785 /* Get dimm basic config */
1786 for (i = 0; i < sockets; i++)
1787 get_dimm_config(mci, &csrow, i);
1789 /* add this new MC control structure to EDAC's list of MCs */
1790 if (unlikely(edac_mc_add_mc(mci))) {
1791 debugf0("MC: " __FILE__
1792 ": %s(): failed edac_mc_add_mc()\n", __func__);
1793 /* FIXME: perhaps some code should go here that disables error
1794 * reporting if we just enabled it
1801 /* allocating generic PCI control info */
1802 i7core_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR);
1803 if (unlikely(!i7core_pci)) {
1805 "%s(): Unable to create PCI control\n",
1808 "%s(): PCI error report via EDAC not setup\n",
1812 /* Default error mask is any memory */
1813 pvt->inject.channel = 0;
1814 pvt->inject.dimm = -1;
1815 pvt->inject.rank = -1;
1816 pvt->inject.bank = -1;
1817 pvt->inject.page = -1;
1818 pvt->inject.col = -1;
1820 /* Registers on edac_mce in order to receive memory errors */
1821 pvt->edac_mce.priv = mci;
1822 pvt->edac_mce.check_error = i7core_mce_check_error;
1823 spin_lock_init(&pvt->mce_lock);
1825 rc = edac_mce_register(&pvt->edac_mce);
1826 if (unlikely(rc < 0)) {
1827 debugf0("MC: " __FILE__
1828 ": %s(): failed edac_mce_register()\n", __func__);
1832 i7core_printk(KERN_INFO, "Driver loaded.\n");
1840 i7core_put_devices();
1845 * i7core_remove destructor for one instance of device
1848 static void __devexit i7core_remove(struct pci_dev *pdev)
1850 struct mem_ctl_info *mci;
1851 struct i7core_pvt *pvt;
1853 debugf0(__FILE__ ": %s()\n", __func__);
1856 edac_pci_release_generic_ctl(i7core_pci);
1859 mci = edac_mc_del_mc(&pdev->dev);
1863 /* Unregisters on edac_mce in order to receive memory errors */
1864 pvt = mci->pvt_info;
1865 edac_mce_unregister(&pvt->edac_mce);
1867 /* retrieve references to resources, and free those resources */
1868 i7core_put_devices();
1873 MODULE_DEVICE_TABLE(pci, i7core_pci_tbl);
1876 * i7core_driver pci_driver structure for this module
1879 static struct pci_driver i7core_driver = {
1880 .name = "i7core_edac",
1881 .probe = i7core_probe,
1882 .remove = __devexit_p(i7core_remove),
1883 .id_table = i7core_pci_tbl,
1887 * i7core_init Module entry function
1888 * Try to initialize this module for its devices
1890 static int __init i7core_init(void)
1894 debugf2("MC: " __FILE__ ": %s()\n", __func__);
1896 /* Ensure that the OPSTATE is set correctly for POLL or NMI */
1899 pci_rc = pci_register_driver(&i7core_driver);
1904 i7core_printk(KERN_ERR, "Failed to register device with error %d.\n",
1911 * i7core_exit() Module exit function
1912 * Unregister the driver
1914 static void __exit i7core_exit(void)
1916 debugf2("MC: " __FILE__ ": %s()\n", __func__);
1917 pci_unregister_driver(&i7core_driver);
1920 module_init(i7core_init);
1921 module_exit(i7core_exit);
1923 MODULE_LICENSE("GPL");
1924 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
1925 MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
1926 MODULE_DESCRIPTION("MC Driver for Intel i7 Core memory controllers - "
1929 module_param(edac_op_state, int, 0444);
1930 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");