aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2012-05-24 04:13:01 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2012-05-24 04:13:01 -0400
commite644dae645e167d154c0526358940986682a72b0 (patch)
tree972993c6568085b8d407fc7e13de10f4b93c651d /drivers/edac
parent899c612d74d4a242158a4db20367388d6299c028 (diff)
parent86809173ce32ef03bd4d0389dfc72df0c805e9c4 (diff)
Merge branch 'next' into for-linus
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/Kconfig2
-rw-r--r--drivers/edac/amd64_edac.c50
-rw-r--r--drivers/edac/amd76x_edac.c2
-rw-r--r--drivers/edac/e752x_edac.c2
-rw-r--r--drivers/edac/e7xxx_edac.c2
-rw-r--r--drivers/edac/edac_mc.c10
-rw-r--r--drivers/edac/edac_mc_sysfs.c4
-rw-r--r--drivers/edac/edac_stub.c1
-rw-r--r--drivers/edac/i3000_edac.c2
-rw-r--r--drivers/edac/i3200_edac.c2
-rw-r--r--drivers/edac/i5000_edac.c2
-rw-r--r--drivers/edac/i5100_edac.c15
-rw-r--r--drivers/edac/i5400_edac.c56
-rw-r--r--drivers/edac/i7300_edac.c2
-rw-r--r--drivers/edac/i7core_edac.c2
-rw-r--r--drivers/edac/i82443bxgx_edac.c2
-rw-r--r--drivers/edac/i82860_edac.c2
-rw-r--r--drivers/edac/i82875p_edac.c2
-rw-r--r--drivers/edac/i82975x_edac.c2
-rw-r--r--drivers/edac/mce_amd.c214
-rw-r--r--drivers/edac/mce_amd.h13
-rw-r--r--drivers/edac/mce_amd_inj.c1
-rw-r--r--drivers/edac/ppc4xx_edac.c4
-rw-r--r--drivers/edac/r82600_edac.c2
-rw-r--r--drivers/edac/sb_edac.c54
-rw-r--r--drivers/edac/tile_edac.c4
-rw-r--r--drivers/edac/x38_edac.c2
27 files changed, 215 insertions, 241 deletions
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 5948a2194f50..fdffa1beca17 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -215,7 +215,7 @@ config EDAC_I7300
215config EDAC_SBRIDGE 215config EDAC_SBRIDGE
216 tristate "Intel Sandy-Bridge Integrated MC" 216 tristate "Intel Sandy-Bridge Integrated MC"
217 depends on EDAC_MM_EDAC && PCI && X86_64 && X86_MCE_INTEL 217 depends on EDAC_MM_EDAC && PCI && X86_64 && X86_MCE_INTEL
218 depends on EXPERIMENTAL 218 depends on PCI_MMCONFIG && EXPERIMENTAL
219 help 219 help
220 Support for error detection and correction the Intel 220 Support for error detection and correction the Intel
221 Sandy Bridge Integrated Memory Controller. 221 Sandy Bridge Integrated Memory Controller.
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index c9eee6d33e9a..7ef73c919c5d 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -1132,12 +1132,36 @@ static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1132 return ddr2_cs_size(cs_mode, dclr & WIDTH_128); 1132 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1133 } 1133 }
1134 else if (pvt->ext_model >= K8_REV_D) { 1134 else if (pvt->ext_model >= K8_REV_D) {
1135 unsigned diff;
1135 WARN_ON(cs_mode > 10); 1136 WARN_ON(cs_mode > 10);
1136 1137
1137 if (cs_mode == 3 || cs_mode == 8) 1138 /*
1138 return 32 << (cs_mode - 1); 1139 * the below calculation, besides trying to win an obfuscated C
1139 else 1140 * contest, maps cs_mode values to DIMM chip select sizes. The
1140 return 32 << cs_mode; 1141 * mappings are:
1142 *
1143 * cs_mode CS size (mb)
1144 * ======= ============
1145 * 0 32
1146 * 1 64
1147 * 2 128
1148 * 3 128
1149 * 4 256
1150 * 5 512
1151 * 6 256
1152 * 7 512
1153 * 8 1024
1154 * 9 1024
1155 * 10 2048
1156 *
1157 * Basically, it calculates a value with which to shift the
1158 * smallest CS size of 32MB.
1159 *
1160 * ddr[23]_cs_size have a similar purpose.
1161 */
1162 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1163
1164 return 32 << (cs_mode - diff);
1141 } 1165 }
1142 else { 1166 else {
1143 WARN_ON(cs_mode > 6); 1167 WARN_ON(cs_mode > 6);
@@ -2133,6 +2157,7 @@ static void read_mc_regs(struct amd64_pvt *pvt)
2133static u32 amd64_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr) 2157static u32 amd64_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
2134{ 2158{
2135 u32 cs_mode, nr_pages; 2159 u32 cs_mode, nr_pages;
2160 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
2136 2161
2137 /* 2162 /*
2138 * The math on this doesn't look right on the surface because x/2*4 can 2163 * The math on this doesn't look right on the surface because x/2*4 can
@@ -2141,16 +2166,10 @@ static u32 amd64_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
2141 * number of bits to shift the DBAM register to extract the proper CSROW 2166 * number of bits to shift the DBAM register to extract the proper CSROW
2142 * field. 2167 * field.
2143 */ 2168 */
2144 cs_mode = (pvt->dbam0 >> ((csrow_nr / 2) * 4)) & 0xF; 2169 cs_mode = (dbam >> ((csrow_nr / 2) * 4)) & 0xF;
2145 2170
2146 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode) << (20 - PAGE_SHIFT); 2171 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode) << (20 - PAGE_SHIFT);
2147 2172
2148 /*
2149 * If dual channel then double the memory size of single channel.
2150 * Channel count is 1 or 2
2151 */
2152 nr_pages <<= (pvt->channel_count - 1);
2153
2154 debugf0(" (csrow=%d) DBAM map index= %d\n", csrow_nr, cs_mode); 2173 debugf0(" (csrow=%d) DBAM map index= %d\n", csrow_nr, cs_mode);
2155 debugf0(" nr_pages= %u channel-count = %d\n", 2174 debugf0(" nr_pages= %u channel-count = %d\n",
2156 nr_pages, pvt->channel_count); 2175 nr_pages, pvt->channel_count);
@@ -2181,7 +2200,7 @@ static int init_csrows(struct mem_ctl_info *mci)
2181 for_each_chip_select(i, 0, pvt) { 2200 for_each_chip_select(i, 0, pvt) {
2182 csrow = &mci->csrows[i]; 2201 csrow = &mci->csrows[i];
2183 2202
2184 if (!csrow_enabled(i, 0, pvt)) { 2203 if (!csrow_enabled(i, 0, pvt) && !csrow_enabled(i, 1, pvt)) {
2185 debugf1("----CSROW %d EMPTY for node %d\n", i, 2204 debugf1("----CSROW %d EMPTY for node %d\n", i,
2186 pvt->mc_node_id); 2205 pvt->mc_node_id);
2187 continue; 2206 continue;
@@ -2191,7 +2210,10 @@ static int init_csrows(struct mem_ctl_info *mci)
2191 i, pvt->mc_node_id); 2210 i, pvt->mc_node_id);
2192 2211
2193 empty = 0; 2212 empty = 0;
2194 csrow->nr_pages = amd64_csrow_nr_pages(pvt, 0, i); 2213 if (csrow_enabled(i, 0, pvt))
2214 csrow->nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
2215 if (csrow_enabled(i, 1, pvt))
2216 csrow->nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
2195 find_csrow_limits(mci, i, &input_addr_min, &input_addr_max); 2217 find_csrow_limits(mci, i, &input_addr_min, &input_addr_max);
2196 sys_addr = input_addr_to_sys_addr(mci, input_addr_min); 2218 sys_addr = input_addr_to_sys_addr(mci, input_addr_min);
2197 csrow->first_page = (u32) (sys_addr >> PAGE_SHIFT); 2219 csrow->first_page = (u32) (sys_addr >> PAGE_SHIFT);
@@ -2685,7 +2707,7 @@ static void __devexit amd64_remove_one_instance(struct pci_dev *pdev)
2685 * PCI core identifies what devices are on a system during boot, and then 2707 * PCI core identifies what devices are on a system during boot, and then
2686 * inquiry this table to see if this driver is for a given device found. 2708 * inquiry this table to see if this driver is for a given device found.
2687 */ 2709 */
2688static const struct pci_device_id amd64_pci_table[] __devinitdata = { 2710static DEFINE_PCI_DEVICE_TABLE(amd64_pci_table) = {
2689 { 2711 {
2690 .vendor = PCI_VENDOR_ID_AMD, 2712 .vendor = PCI_VENDOR_ID_AMD,
2691 .device = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, 2713 .device = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
diff --git a/drivers/edac/amd76x_edac.c b/drivers/edac/amd76x_edac.c
index e47e73bbbcc5..f8fd3c807bde 100644
--- a/drivers/edac/amd76x_edac.c
+++ b/drivers/edac/amd76x_edac.c
@@ -321,7 +321,7 @@ static void __devexit amd76x_remove_one(struct pci_dev *pdev)
321 edac_mc_free(mci); 321 edac_mc_free(mci);
322} 322}
323 323
324static const struct pci_device_id amd76x_pci_tbl[] __devinitdata = { 324static DEFINE_PCI_DEVICE_TABLE(amd76x_pci_tbl) = {
325 { 325 {
326 PCI_VEND_DEV(AMD, FE_GATE_700C), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 326 PCI_VEND_DEV(AMD, FE_GATE_700C), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
327 AMD762}, 327 AMD762},
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c
index 1af531a11d21..41223261ede9 100644
--- a/drivers/edac/e752x_edac.c
+++ b/drivers/edac/e752x_edac.c
@@ -1380,7 +1380,7 @@ static void __devexit e752x_remove_one(struct pci_dev *pdev)
1380 edac_mc_free(mci); 1380 edac_mc_free(mci);
1381} 1381}
1382 1382
1383static const struct pci_device_id e752x_pci_tbl[] __devinitdata = { 1383static DEFINE_PCI_DEVICE_TABLE(e752x_pci_tbl) = {
1384 { 1384 {
1385 PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1385 PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1386 E7520}, 1386 E7520},
diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c
index 6ffb6d23281f..68dea87b72e6 100644
--- a/drivers/edac/e7xxx_edac.c
+++ b/drivers/edac/e7xxx_edac.c
@@ -525,7 +525,7 @@ static void __devexit e7xxx_remove_one(struct pci_dev *pdev)
525 edac_mc_free(mci); 525 edac_mc_free(mci);
526} 526}
527 527
528static const struct pci_device_id e7xxx_pci_tbl[] __devinitdata = { 528static DEFINE_PCI_DEVICE_TABLE(e7xxx_pci_tbl) = {
529 { 529 {
530 PCI_VEND_DEV(INTEL, 7205_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 530 PCI_VEND_DEV(INTEL, 7205_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
531 E7205}, 531 E7205},
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index ca6c04d350ee..feef7733fae7 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -39,7 +39,7 @@ static LIST_HEAD(mc_devices);
39 39
40#ifdef CONFIG_EDAC_DEBUG 40#ifdef CONFIG_EDAC_DEBUG
41 41
42static void edac_mc_dump_channel(struct channel_info *chan) 42static void edac_mc_dump_channel(struct rank_info *chan)
43{ 43{
44 debugf4("\tchannel = %p\n", chan); 44 debugf4("\tchannel = %p\n", chan);
45 debugf4("\tchannel->chan_idx = %d\n", chan->chan_idx); 45 debugf4("\tchannel->chan_idx = %d\n", chan->chan_idx);
@@ -156,7 +156,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
156{ 156{
157 struct mem_ctl_info *mci; 157 struct mem_ctl_info *mci;
158 struct csrow_info *csi, *csrow; 158 struct csrow_info *csi, *csrow;
159 struct channel_info *chi, *chp, *chan; 159 struct rank_info *chi, *chp, *chan;
160 void *pvt; 160 void *pvt;
161 unsigned size; 161 unsigned size;
162 int row, chn; 162 int row, chn;
@@ -181,7 +181,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
181 * rather than an imaginary chunk of memory located at address 0. 181 * rather than an imaginary chunk of memory located at address 0.
182 */ 182 */
183 csi = (struct csrow_info *)(((char *)mci) + ((unsigned long)csi)); 183 csi = (struct csrow_info *)(((char *)mci) + ((unsigned long)csi));
184 chi = (struct channel_info *)(((char *)mci) + ((unsigned long)chi)); 184 chi = (struct rank_info *)(((char *)mci) + ((unsigned long)chi));
185 pvt = sz_pvt ? (((char *)mci) + ((unsigned long)pvt)) : NULL; 185 pvt = sz_pvt ? (((char *)mci) + ((unsigned long)pvt)) : NULL;
186 186
187 /* setup index and various internal pointers */ 187 /* setup index and various internal pointers */
@@ -620,13 +620,13 @@ static void edac_mc_scrub_block(unsigned long page, unsigned long offset,
620 if (PageHighMem(pg)) 620 if (PageHighMem(pg))
621 local_irq_save(flags); 621 local_irq_save(flags);
622 622
623 virt_addr = kmap_atomic(pg, KM_BOUNCE_READ); 623 virt_addr = kmap_atomic(pg);
624 624
625 /* Perform architecture specific atomic scrub operation */ 625 /* Perform architecture specific atomic scrub operation */
626 atomic_scrub(virt_addr + offset, size); 626 atomic_scrub(virt_addr + offset, size);
627 627
628 /* Unmap and complete */ 628 /* Unmap and complete */
629 kunmap_atomic(virt_addr, KM_BOUNCE_READ); 629 kunmap_atomic(virt_addr);
630 630
631 if (PageHighMem(pg)) 631 if (PageHighMem(pg))
632 local_irq_restore(flags); 632 local_irq_restore(flags);
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index d56e63477d5c..e9a28f576d14 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -452,7 +452,7 @@ static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci,
452 int new_bw = 0; 452 int new_bw = 0;
453 453
454 if (!mci->set_sdram_scrub_rate) 454 if (!mci->set_sdram_scrub_rate)
455 return -EINVAL; 455 return -ENODEV;
456 456
457 if (strict_strtoul(data, 10, &bandwidth) < 0) 457 if (strict_strtoul(data, 10, &bandwidth) < 0)
458 return -EINVAL; 458 return -EINVAL;
@@ -475,7 +475,7 @@ static ssize_t mci_sdram_scrub_rate_show(struct mem_ctl_info *mci, char *data)
475 int bandwidth = 0; 475 int bandwidth = 0;
476 476
477 if (!mci->get_sdram_scrub_rate) 477 if (!mci->get_sdram_scrub_rate)
478 return -EINVAL; 478 return -ENODEV;
479 479
480 bandwidth = mci->get_sdram_scrub_rate(mci); 480 bandwidth = mci->get_sdram_scrub_rate(mci);
481 if (bandwidth < 0) { 481 if (bandwidth < 0) {
diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c
index 670c4481453b..6c86f6e54558 100644
--- a/drivers/edac/edac_stub.c
+++ b/drivers/edac/edac_stub.c
@@ -15,6 +15,7 @@
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/edac.h> 16#include <linux/edac.h>
17#include <linux/atomic.h> 17#include <linux/atomic.h>
18#include <linux/device.h>
18#include <asm/edac.h> 19#include <asm/edac.h>
19 20
20int edac_op_state = EDAC_OPSTATE_INVAL; 21int edac_op_state = EDAC_OPSTATE_INVAL;
diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c
index c0510b3d7035..277689a68841 100644
--- a/drivers/edac/i3000_edac.c
+++ b/drivers/edac/i3000_edac.c
@@ -470,7 +470,7 @@ static void __devexit i3000_remove_one(struct pci_dev *pdev)
470 edac_mc_free(mci); 470 edac_mc_free(mci);
471} 471}
472 472
473static const struct pci_device_id i3000_pci_tbl[] __devinitdata = { 473static DEFINE_PCI_DEVICE_TABLE(i3000_pci_tbl) = {
474 { 474 {
475 PCI_VEND_DEV(INTEL, 3000_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 475 PCI_VEND_DEV(INTEL, 3000_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
476 I3000}, 476 I3000},
diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c
index 73f55e2008c2..046808c6357d 100644
--- a/drivers/edac/i3200_edac.c
+++ b/drivers/edac/i3200_edac.c
@@ -445,7 +445,7 @@ static void __devexit i3200_remove_one(struct pci_dev *pdev)
445 edac_mc_free(mci); 445 edac_mc_free(mci);
446} 446}
447 447
448static const struct pci_device_id i3200_pci_tbl[] __devinitdata = { 448static DEFINE_PCI_DEVICE_TABLE(i3200_pci_tbl) = {
449 { 449 {
450 PCI_VEND_DEV(INTEL, 3200_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 450 PCI_VEND_DEV(INTEL, 3200_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
451 I3200}, 451 I3200},
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c
index 4dc3ac25a422..a2680d8e744b 100644
--- a/drivers/edac/i5000_edac.c
+++ b/drivers/edac/i5000_edac.c
@@ -1516,7 +1516,7 @@ static void __devexit i5000_remove_one(struct pci_dev *pdev)
1516 * 1516 *
1517 * The "E500P" device is the first device supported. 1517 * The "E500P" device is the first device supported.
1518 */ 1518 */
1519static const struct pci_device_id i5000_pci_tbl[] __devinitdata = { 1519static DEFINE_PCI_DEVICE_TABLE(i5000_pci_tbl) = {
1520 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I5000_DEV16), 1520 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I5000_DEV16),
1521 .driver_data = I5000P}, 1521 .driver_data = I5000P},
1522 1522
diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c
index bcbdeeca48b8..d500749464ea 100644
--- a/drivers/edac/i5100_edac.c
+++ b/drivers/edac/i5100_edac.c
@@ -49,7 +49,7 @@
49#define I5100_FERR_NF_MEM_M6ERR_MASK (1 << 6) 49#define I5100_FERR_NF_MEM_M6ERR_MASK (1 << 6)
50#define I5100_FERR_NF_MEM_M5ERR_MASK (1 << 5) 50#define I5100_FERR_NF_MEM_M5ERR_MASK (1 << 5)
51#define I5100_FERR_NF_MEM_M4ERR_MASK (1 << 4) 51#define I5100_FERR_NF_MEM_M4ERR_MASK (1 << 4)
52#define I5100_FERR_NF_MEM_M1ERR_MASK 1 52#define I5100_FERR_NF_MEM_M1ERR_MASK (1 << 1)
53#define I5100_FERR_NF_MEM_ANY_MASK \ 53#define I5100_FERR_NF_MEM_ANY_MASK \
54 (I5100_FERR_NF_MEM_M16ERR_MASK | \ 54 (I5100_FERR_NF_MEM_M16ERR_MASK | \
55 I5100_FERR_NF_MEM_M15ERR_MASK | \ 55 I5100_FERR_NF_MEM_M15ERR_MASK | \
@@ -535,23 +535,20 @@ static void i5100_read_log(struct mem_ctl_info *mci, int chan,
535static void i5100_check_error(struct mem_ctl_info *mci) 535static void i5100_check_error(struct mem_ctl_info *mci)
536{ 536{
537 struct i5100_priv *priv = mci->pvt_info; 537 struct i5100_priv *priv = mci->pvt_info;
538 u32 dw; 538 u32 dw, dw2;
539
540 539
541 pci_read_config_dword(priv->mc, I5100_FERR_NF_MEM, &dw); 540 pci_read_config_dword(priv->mc, I5100_FERR_NF_MEM, &dw);
542 if (i5100_ferr_nf_mem_any(dw)) { 541 if (i5100_ferr_nf_mem_any(dw)) {
543 u32 dw2;
544 542
545 pci_read_config_dword(priv->mc, I5100_NERR_NF_MEM, &dw2); 543 pci_read_config_dword(priv->mc, I5100_NERR_NF_MEM, &dw2);
546 if (dw2)
547 pci_write_config_dword(priv->mc, I5100_NERR_NF_MEM,
548 dw2);
549 pci_write_config_dword(priv->mc, I5100_FERR_NF_MEM, dw);
550 544
551 i5100_read_log(mci, i5100_ferr_nf_mem_chan_indx(dw), 545 i5100_read_log(mci, i5100_ferr_nf_mem_chan_indx(dw),
552 i5100_ferr_nf_mem_any(dw), 546 i5100_ferr_nf_mem_any(dw),
553 i5100_nerr_nf_mem_any(dw2)); 547 i5100_nerr_nf_mem_any(dw2));
548
549 pci_write_config_dword(priv->mc, I5100_NERR_NF_MEM, dw2);
554 } 550 }
551 pci_write_config_dword(priv->mc, I5100_FERR_NF_MEM, dw);
555} 552}
556 553
557/* The i5100 chipset will scrub the entire memory once, then 554/* The i5100 chipset will scrub the entire memory once, then
@@ -1051,7 +1048,7 @@ static void __devexit i5100_remove_one(struct pci_dev *pdev)
1051 edac_mc_free(mci); 1048 edac_mc_free(mci);
1052} 1049}
1053 1050
1054static const struct pci_device_id i5100_pci_tbl[] __devinitdata = { 1051static DEFINE_PCI_DEVICE_TABLE(i5100_pci_tbl) = {
1055 /* Device 16, Function 0, Channel 0 Memory Map, Error Flag/Mask, ... */ 1052 /* Device 16, Function 0, Channel 0 Memory Map, Error Flag/Mask, ... */
1056 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5100_16) }, 1053 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5100_16) },
1057 { 0, } 1054 { 0, }
diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c
index 74d6ec342afb..1869a1018fb5 100644
--- a/drivers/edac/i5400_edac.c
+++ b/drivers/edac/i5400_edac.c
@@ -735,7 +735,7 @@ static int i5400_get_devices(struct mem_ctl_info *mci, int dev_idx)
735 735
736 /* Attempt to 'get' the MCH register we want */ 736 /* Attempt to 'get' the MCH register we want */
737 pdev = NULL; 737 pdev = NULL;
738 while (!pvt->branchmap_werrors || !pvt->fsb_error_regs) { 738 while (1) {
739 pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 739 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
740 PCI_DEVICE_ID_INTEL_5400_ERR, pdev); 740 PCI_DEVICE_ID_INTEL_5400_ERR, pdev);
741 if (!pdev) { 741 if (!pdev) {
@@ -743,23 +743,42 @@ static int i5400_get_devices(struct mem_ctl_info *mci, int dev_idx)
743 i5400_printk(KERN_ERR, 743 i5400_printk(KERN_ERR,
744 "'system address,Process Bus' " 744 "'system address,Process Bus' "
745 "device not found:" 745 "device not found:"
746 "vendor 0x%x device 0x%x ERR funcs " 746 "vendor 0x%x device 0x%x ERR func 1 "
747 "(broken BIOS?)\n", 747 "(broken BIOS?)\n",
748 PCI_VENDOR_ID_INTEL, 748 PCI_VENDOR_ID_INTEL,
749 PCI_DEVICE_ID_INTEL_5400_ERR); 749 PCI_DEVICE_ID_INTEL_5400_ERR);
750 goto error; 750 return -ENODEV;
751 } 751 }
752 752
753 /* Store device 16 funcs 1 and 2 */ 753 /* Store device 16 func 1 */
754 switch (PCI_FUNC(pdev->devfn)) { 754 if (PCI_FUNC(pdev->devfn) == 1)
755 case 1:
756 pvt->branchmap_werrors = pdev;
757 break;
758 case 2:
759 pvt->fsb_error_regs = pdev;
760 break; 755 break;
756 }
757 pvt->branchmap_werrors = pdev;
758
759 pdev = NULL;
760 while (1) {
761 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
762 PCI_DEVICE_ID_INTEL_5400_ERR, pdev);
763 if (!pdev) {
764 /* End of list, leave */
765 i5400_printk(KERN_ERR,
766 "'system address,Process Bus' "
767 "device not found:"
768 "vendor 0x%x device 0x%x ERR func 2 "
769 "(broken BIOS?)\n",
770 PCI_VENDOR_ID_INTEL,
771 PCI_DEVICE_ID_INTEL_5400_ERR);
772
773 pci_dev_put(pvt->branchmap_werrors);
774 return -ENODEV;
761 } 775 }
776
777 /* Store device 16 func 2 */
778 if (PCI_FUNC(pdev->devfn) == 2)
779 break;
762 } 780 }
781 pvt->fsb_error_regs = pdev;
763 782
764 debugf1("System Address, processor bus- PCI Bus ID: %s %x:%x\n", 783 debugf1("System Address, processor bus- PCI Bus ID: %s %x:%x\n",
765 pci_name(pvt->system_address), 784 pci_name(pvt->system_address),
@@ -778,7 +797,10 @@ static int i5400_get_devices(struct mem_ctl_info *mci, int dev_idx)
778 "MC: 'BRANCH 0' device not found:" 797 "MC: 'BRANCH 0' device not found:"
779 "vendor 0x%x device 0x%x Func 0 (broken BIOS?)\n", 798 "vendor 0x%x device 0x%x Func 0 (broken BIOS?)\n",
780 PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_FBD0); 799 PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_FBD0);
781 goto error; 800
801 pci_dev_put(pvt->fsb_error_regs);
802 pci_dev_put(pvt->branchmap_werrors);
803 return -ENODEV;
782 } 804 }
783 805
784 /* If this device claims to have more than 2 channels then 806 /* If this device claims to have more than 2 channels then
@@ -796,14 +818,14 @@ static int i5400_get_devices(struct mem_ctl_info *mci, int dev_idx)
796 "(broken BIOS?)\n", 818 "(broken BIOS?)\n",
797 PCI_VENDOR_ID_INTEL, 819 PCI_VENDOR_ID_INTEL,
798 PCI_DEVICE_ID_INTEL_5400_FBD1); 820 PCI_DEVICE_ID_INTEL_5400_FBD1);
799 goto error; 821
822 pci_dev_put(pvt->branch_0);
823 pci_dev_put(pvt->fsb_error_regs);
824 pci_dev_put(pvt->branchmap_werrors);
825 return -ENODEV;
800 } 826 }
801 827
802 return 0; 828 return 0;
803
804error:
805 i5400_put_devices(mci);
806 return -ENODEV;
807} 829}
808 830
809/* 831/*
@@ -1383,7 +1405,7 @@ static void __devexit i5400_remove_one(struct pci_dev *pdev)
1383 * 1405 *
1384 * The "E500P" device is the first device supported. 1406 * The "E500P" device is the first device supported.
1385 */ 1407 */
1386static const struct pci_device_id i5400_pci_tbl[] __devinitdata = { 1408static DEFINE_PCI_DEVICE_TABLE(i5400_pci_tbl) = {
1387 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_ERR)}, 1409 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_ERR)},
1388 {0,} /* 0 terminated list. */ 1410 {0,} /* 0 terminated list. */
1389}; 1411};
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
index 6104dba380b6..3bafa3bca148 100644
--- a/drivers/edac/i7300_edac.c
+++ b/drivers/edac/i7300_edac.c
@@ -1192,7 +1192,7 @@ static void __devexit i7300_remove_one(struct pci_dev *pdev)
1192 * 1192 *
1193 * Has only 8086:360c PCI ID 1193 * Has only 8086:360c PCI ID
1194 */ 1194 */
1195static const struct pci_device_id i7300_pci_tbl[] __devinitdata = { 1195static DEFINE_PCI_DEVICE_TABLE(i7300_pci_tbl) = {
1196 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I7300_MCH_ERR)}, 1196 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I7300_MCH_ERR)},
1197 {0,} /* 0 terminated list. */ 1197 {0,} /* 0 terminated list. */
1198}; 1198};
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 8568d9b61875..85226ccf5290 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -391,7 +391,7 @@ static const struct pci_id_table pci_dev_table[] = {
391/* 391/*
392 * pci_device_id table for which devices we are looking for 392 * pci_device_id table for which devices we are looking for
393 */ 393 */
394static const struct pci_device_id i7core_pci_tbl[] __devinitdata = { 394static DEFINE_PCI_DEVICE_TABLE(i7core_pci_tbl) = {
395 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)}, 395 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)},
396 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNNFIELD_QPI_LINK0)}, 396 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNNFIELD_QPI_LINK0)},
397 {0,} /* 0 terminated list. */ 397 {0,} /* 0 terminated list. */
diff --git a/drivers/edac/i82443bxgx_edac.c b/drivers/edac/i82443bxgx_edac.c
index 4329d39f902c..3bf2b2f490e7 100644
--- a/drivers/edac/i82443bxgx_edac.c
+++ b/drivers/edac/i82443bxgx_edac.c
@@ -380,7 +380,7 @@ static void __devexit i82443bxgx_edacmc_remove_one(struct pci_dev *pdev)
380 380
381EXPORT_SYMBOL_GPL(i82443bxgx_edacmc_remove_one); 381EXPORT_SYMBOL_GPL(i82443bxgx_edacmc_remove_one);
382 382
383static const struct pci_device_id i82443bxgx_pci_tbl[] __devinitdata = { 383static DEFINE_PCI_DEVICE_TABLE(i82443bxgx_pci_tbl) = {
384 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0)}, 384 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0)},
385 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2)}, 385 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2)},
386 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0)}, 386 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0)},
diff --git a/drivers/edac/i82860_edac.c b/drivers/edac/i82860_edac.c
index 931a05775049..c779092d18d1 100644
--- a/drivers/edac/i82860_edac.c
+++ b/drivers/edac/i82860_edac.c
@@ -270,7 +270,7 @@ static void __devexit i82860_remove_one(struct pci_dev *pdev)
270 edac_mc_free(mci); 270 edac_mc_free(mci);
271} 271}
272 272
273static const struct pci_device_id i82860_pci_tbl[] __devinitdata = { 273static DEFINE_PCI_DEVICE_TABLE(i82860_pci_tbl) = {
274 { 274 {
275 PCI_VEND_DEV(INTEL, 82860_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 275 PCI_VEND_DEV(INTEL, 82860_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
276 I82860}, 276 I82860},
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c
index 33864c63c684..10f15d85fb5e 100644
--- a/drivers/edac/i82875p_edac.c
+++ b/drivers/edac/i82875p_edac.c
@@ -511,7 +511,7 @@ static void __devexit i82875p_remove_one(struct pci_dev *pdev)
511 edac_mc_free(mci); 511 edac_mc_free(mci);
512} 512}
513 513
514static const struct pci_device_id i82875p_pci_tbl[] __devinitdata = { 514static DEFINE_PCI_DEVICE_TABLE(i82875p_pci_tbl) = {
515 { 515 {
516 PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 516 PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
517 I82875P}, 517 I82875P},
diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c
index 4184e0171f00..0cd8368f88f8 100644
--- a/drivers/edac/i82975x_edac.c
+++ b/drivers/edac/i82975x_edac.c
@@ -612,7 +612,7 @@ static void __devexit i82975x_remove_one(struct pci_dev *pdev)
612 edac_mc_free(mci); 612 edac_mc_free(mci);
613} 613}
614 614
615static const struct pci_device_id i82975x_pci_tbl[] __devinitdata = { 615static DEFINE_PCI_DEVICE_TABLE(i82975x_pci_tbl) = {
616 { 616 {
617 PCI_VEND_DEV(INTEL, 82975_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 617 PCI_VEND_DEV(INTEL, 82975_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
618 I82975X 618 I82975X
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index bd926ea2e00c..d0c372e30de4 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -39,42 +39,31 @@ EXPORT_SYMBOL_GPL(amd_unregister_ecc_decoder);
39 */ 39 */
40 40
41/* transaction type */ 41/* transaction type */
42const char *tt_msgs[] = { "INSN", "DATA", "GEN", "RESV" }; 42const char * const tt_msgs[] = { "INSN", "DATA", "GEN", "RESV" };
43EXPORT_SYMBOL_GPL(tt_msgs); 43EXPORT_SYMBOL_GPL(tt_msgs);
44 44
45/* cache level */ 45/* cache level */
46const char *ll_msgs[] = { "RESV", "L1", "L2", "L3/GEN" }; 46const char * const ll_msgs[] = { "RESV", "L1", "L2", "L3/GEN" };
47EXPORT_SYMBOL_GPL(ll_msgs); 47EXPORT_SYMBOL_GPL(ll_msgs);
48 48
49/* memory transaction type */ 49/* memory transaction type */
50const char *rrrr_msgs[] = { 50const char * const rrrr_msgs[] = {
51 "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP" 51 "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP"
52}; 52};
53EXPORT_SYMBOL_GPL(rrrr_msgs); 53EXPORT_SYMBOL_GPL(rrrr_msgs);
54 54
55/* participating processor */ 55/* participating processor */
56const char *pp_msgs[] = { "SRC", "RES", "OBS", "GEN" }; 56const char * const pp_msgs[] = { "SRC", "RES", "OBS", "GEN" };
57EXPORT_SYMBOL_GPL(pp_msgs); 57EXPORT_SYMBOL_GPL(pp_msgs);
58 58
59/* request timeout */ 59/* request timeout */
60const char *to_msgs[] = { "no timeout", "timed out" }; 60const char * const to_msgs[] = { "no timeout", "timed out" };
61EXPORT_SYMBOL_GPL(to_msgs); 61EXPORT_SYMBOL_GPL(to_msgs);
62 62
63/* memory or i/o */ 63/* memory or i/o */
64const char *ii_msgs[] = { "MEM", "RESV", "IO", "GEN" }; 64const char * const ii_msgs[] = { "MEM", "RESV", "IO", "GEN" };
65EXPORT_SYMBOL_GPL(ii_msgs); 65EXPORT_SYMBOL_GPL(ii_msgs);
66 66
67static const char *f10h_nb_mce_desc[] = {
68 "HT link data error",
69 "Protocol error (link, L3, probe filter, etc.)",
70 "Parity error in NB-internal arrays",
71 "Link Retry due to IO link transmission error",
72 "L3 ECC data cache error",
73 "ECC error in L3 cache tag",
74 "L3 LRU parity bits error",
75 "ECC Error in the Probe Filter directory"
76};
77
78static const char * const f15h_ic_mce_desc[] = { 67static const char * const f15h_ic_mce_desc[] = {
79 "UC during a demand linefill from L2", 68 "UC during a demand linefill from L2",
80 "Parity error during data load from IC", 69 "Parity error during data load from IC",
@@ -88,7 +77,7 @@ static const char * const f15h_ic_mce_desc[] = {
88 "Parity error for IC probe tag valid bit", 77 "Parity error for IC probe tag valid bit",
89 "PFB non-cacheable bit parity error", 78 "PFB non-cacheable bit parity error",
90 "PFB valid bit parity error", /* xec = 0xd */ 79 "PFB valid bit parity error", /* xec = 0xd */
91 "patch RAM", /* xec = 010 */ 80 "Microcode Patch Buffer", /* xec = 010 */
92 "uop queue", 81 "uop queue",
93 "insn buffer", 82 "insn buffer",
94 "predecode buffer", 83 "predecode buffer",
@@ -104,7 +93,7 @@ static const char * const f15h_cu_mce_desc[] = {
104 "WCC Tag ECC error", 93 "WCC Tag ECC error",
105 "WCC Data ECC error", 94 "WCC Data ECC error",
106 "WCB Data parity error", 95 "WCB Data parity error",
107 "VB Data/ECC error", 96 "VB Data ECC or parity error",
108 "L2 Tag ECC error", /* xec = 0x10 */ 97 "L2 Tag ECC error", /* xec = 0x10 */
109 "Hard L2 Tag ECC error", 98 "Hard L2 Tag ECC error",
110 "Multiple hits on L2 tag", 99 "Multiple hits on L2 tag",
@@ -112,6 +101,28 @@ static const char * const f15h_cu_mce_desc[] = {
112 "PRB address parity error" 101 "PRB address parity error"
113}; 102};
114 103
104static const char * const nb_mce_desc[] = {
105 "DRAM ECC error detected on the NB",
106 "CRC error detected on HT link",
107 "Link-defined sync error packets detected on HT link",
108 "HT Master abort",
109 "HT Target abort",
110 "Invalid GART PTE entry during GART table walk",
111 "Unsupported atomic RMW received from an IO link",
112 "Watchdog timeout due to lack of progress",
113 "DRAM ECC error detected on the NB",
114 "SVM DMA Exclusion Vector error",
115 "HT data error detected on link",
116 "Protocol error (link, L3, probe filter)",
117 "NB internal arrays parity error",
118 "DRAM addr/ctl signals parity error",
119 "IO link transmission error",
120 "L3 data cache ECC error", /* xec = 0x1c */
121 "L3 cache tag error",
122 "L3 LRU parity bits error",
123 "ECC Error in the Probe Filter directory"
124};
125
115static const char * const fr_ex_mce_desc[] = { 126static const char * const fr_ex_mce_desc[] = {
116 "CPU Watchdog timer expire", 127 "CPU Watchdog timer expire",
117 "Wakeup array dest tag", 128 "Wakeup array dest tag",
@@ -125,7 +136,7 @@ static const char * const fr_ex_mce_desc[] = {
125 "Physical register file AG0 port", 136 "Physical register file AG0 port",
126 "Physical register file AG1 port", 137 "Physical register file AG1 port",
127 "Flag register file", 138 "Flag register file",
128 "DE correctable error could not be corrected" 139 "DE error occurred"
129}; 140};
130 141
131static bool f12h_dc_mce(u16 ec, u8 xec) 142static bool f12h_dc_mce(u16 ec, u8 xec)
@@ -255,10 +266,9 @@ static bool f15h_dc_mce(u16 ec, u8 xec)
255 } else if (BUS_ERROR(ec)) { 266 } else if (BUS_ERROR(ec)) {
256 267
257 if (!xec) 268 if (!xec)
258 pr_cont("during system linefill.\n"); 269 pr_cont("System Read Data Error.\n");
259 else 270 else
260 pr_cont(" Internal %s condition.\n", 271 pr_cont(" Internal error condition type %d.\n", xec);
261 ((xec == 1) ? "livelock" : "deadlock"));
262 } else 272 } else
263 ret = false; 273 ret = false;
264 274
@@ -355,7 +365,11 @@ static bool f15h_ic_mce(u16 ec, u8 xec)
355 pr_cont("%s.\n", f15h_ic_mce_desc[xec-2]); 365 pr_cont("%s.\n", f15h_ic_mce_desc[xec-2]);
356 break; 366 break;
357 367
358 case 0x10 ... 0x14: 368 case 0x10:
369 pr_cont("%s.\n", f15h_ic_mce_desc[xec-4]);
370 break;
371
372 case 0x11 ... 0x14:
359 pr_cont("Decoder %s parity error.\n", f15h_ic_mce_desc[xec-4]); 373 pr_cont("Decoder %s parity error.\n", f15h_ic_mce_desc[xec-4]);
360 break; 374 break;
361 375
@@ -496,58 +510,31 @@ wrong_ls_mce:
496 pr_emerg(HW_ERR "Corrupted LS MCE info?\n"); 510 pr_emerg(HW_ERR "Corrupted LS MCE info?\n");
497} 511}
498 512
499static bool k8_nb_mce(u16 ec, u8 xec) 513void amd_decode_nb_mce(struct mce *m)
500{ 514{
501 bool ret = true; 515 struct cpuinfo_x86 *c = &boot_cpu_data;
502 516 int node_id = amd_get_nb_id(m->extcpu);
503 switch (xec) { 517 u16 ec = EC(m->status);
504 case 0x1: 518 u8 xec = XEC(m->status, 0x1f);
505 pr_cont("CRC error detected on HT link.\n"); 519 u8 offset = 0;
506 break;
507
508 case 0x5:
509 pr_cont("Invalid GART PTE entry during GART table walk.\n");
510 break;
511
512 case 0x6:
513 pr_cont("Unsupported atomic RMW received from an IO link.\n");
514 break;
515
516 case 0x0:
517 case 0x8:
518 if (boot_cpu_data.x86 == 0x11)
519 return false;
520
521 pr_cont("DRAM ECC error detected on the NB.\n");
522 break;
523
524 case 0xd:
525 pr_cont("Parity error on the DRAM addr/ctl signals.\n");
526 break;
527
528 default:
529 ret = false;
530 break;
531 }
532 520
533 return ret; 521 pr_emerg(HW_ERR "Northbridge Error (node %d): ", node_id);
534}
535 522
536static bool f10h_nb_mce(u16 ec, u8 xec) 523 switch (xec) {
537{ 524 case 0x0 ... 0xe:
538 bool ret = true;
539 u8 offset = 0;
540 525
541 if (k8_nb_mce(ec, xec)) 526 /* special handling for DRAM ECCs */
542 return true; 527 if (xec == 0x0 || xec == 0x8) {
528 /* no ECCs on F11h */
529 if (c->x86 == 0x11)
530 goto wrong_nb_mce;
543 531
544 switch(xec) { 532 pr_cont("%s.\n", nb_mce_desc[xec]);
545 case 0xa ... 0xc:
546 offset = 10;
547 break;
548 533
549 case 0xe: 534 if (nb_bus_decoder)
550 offset = 11; 535 nb_bus_decoder(node_id, m);
536 return;
537 }
551 break; 538 break;
552 539
553 case 0xf: 540 case 0xf:
@@ -556,83 +543,25 @@ static bool f10h_nb_mce(u16 ec, u8 xec)
556 else if (BUS_ERROR(ec)) 543 else if (BUS_ERROR(ec))
557 pr_cont("DMA Exclusion Vector Table Walk error.\n"); 544 pr_cont("DMA Exclusion Vector Table Walk error.\n");
558 else 545 else
559 ret = false; 546 goto wrong_nb_mce;
560 547 return;
561 goto out;
562 break;
563 548
564 case 0x19: 549 case 0x19:
565 if (boot_cpu_data.x86 == 0x15) 550 if (boot_cpu_data.x86 == 0x15)
566 pr_cont("Compute Unit Data Error.\n"); 551 pr_cont("Compute Unit Data Error.\n");
567 else 552 else
568 ret = false; 553 goto wrong_nb_mce;
569 554 return;
570 goto out;
571 break;
572 555
573 case 0x1c ... 0x1f: 556 case 0x1c ... 0x1f:
574 offset = 24; 557 offset = 13;
575 break; 558 break;
576 559
577 default: 560 default:
578 ret = false;
579
580 goto out;
581 break;
582 }
583
584 pr_cont("%s.\n", f10h_nb_mce_desc[xec - offset]);
585
586out:
587 return ret;
588}
589
590static bool nb_noop_mce(u16 ec, u8 xec)
591{
592 return false;
593}
594
595void amd_decode_nb_mce(struct mce *m)
596{
597 struct cpuinfo_x86 *c = &boot_cpu_data;
598 int node_id = amd_get_nb_id(m->extcpu);
599 u16 ec = EC(m->status);
600 u8 xec = XEC(m->status, 0x1f);
601
602 pr_emerg(HW_ERR "Northbridge Error (node %d): ", node_id);
603
604 switch (xec) {
605 case 0x2:
606 pr_cont("Sync error (sync packets on HT link detected).\n");
607 return;
608
609 case 0x3:
610 pr_cont("HT Master abort.\n");
611 return;
612
613 case 0x4:
614 pr_cont("HT Target abort.\n");
615 return;
616
617 case 0x7:
618 pr_cont("NB Watchdog timeout.\n");
619 return;
620
621 case 0x9:
622 pr_cont("SVM DMA Exclusion Vector error.\n");
623 return;
624
625 default:
626 break;
627 }
628
629 if (!fam_ops->nb_mce(ec, xec))
630 goto wrong_nb_mce; 561 goto wrong_nb_mce;
562 }
631 563
632 if (c->x86 == 0xf || c->x86 == 0x10 || c->x86 == 0x15) 564 pr_cont("%s.\n", nb_mce_desc[xec - offset]);
633 if ((xec == 0x8 || xec == 0x0) && nb_bus_decoder)
634 nb_bus_decoder(node_id, m);
635
636 return; 565 return;
637 566
638wrong_nb_mce: 567wrong_nb_mce:
@@ -648,9 +577,6 @@ static void amd_decode_fr_mce(struct mce *m)
648 if (c->x86 == 0xf || c->x86 == 0x11) 577 if (c->x86 == 0xf || c->x86 == 0x11)
649 goto wrong_fr_mce; 578 goto wrong_fr_mce;
650 579
651 if (c->x86 != 0x15 && xec != 0x0)
652 goto wrong_fr_mce;
653
654 pr_emerg(HW_ERR "%s Error: ", 580 pr_emerg(HW_ERR "%s Error: ",
655 (c->x86 == 0x15 ? "Execution Unit" : "FIROB")); 581 (c->x86 == 0x15 ? "Execution Unit" : "FIROB"));
656 582
@@ -828,9 +754,7 @@ static int __init mce_amd_init(void)
828 if (c->x86_vendor != X86_VENDOR_AMD) 754 if (c->x86_vendor != X86_VENDOR_AMD)
829 return 0; 755 return 0;
830 756
831 if ((c->x86 < 0xf || c->x86 > 0x12) && 757 if (c->x86 < 0xf || c->x86 > 0x15)
832 (c->x86 != 0x14 || c->x86_model > 0xf) &&
833 (c->x86 != 0x15 || c->x86_model > 0xf))
834 return 0; 758 return 0;
835 759
836 fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL); 760 fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
@@ -841,43 +765,37 @@ static int __init mce_amd_init(void)
841 case 0xf: 765 case 0xf:
842 fam_ops->dc_mce = k8_dc_mce; 766 fam_ops->dc_mce = k8_dc_mce;
843 fam_ops->ic_mce = k8_ic_mce; 767 fam_ops->ic_mce = k8_ic_mce;
844 fam_ops->nb_mce = k8_nb_mce;
845 break; 768 break;
846 769
847 case 0x10: 770 case 0x10:
848 fam_ops->dc_mce = f10h_dc_mce; 771 fam_ops->dc_mce = f10h_dc_mce;
849 fam_ops->ic_mce = k8_ic_mce; 772 fam_ops->ic_mce = k8_ic_mce;
850 fam_ops->nb_mce = f10h_nb_mce;
851 break; 773 break;
852 774
853 case 0x11: 775 case 0x11:
854 fam_ops->dc_mce = k8_dc_mce; 776 fam_ops->dc_mce = k8_dc_mce;
855 fam_ops->ic_mce = k8_ic_mce; 777 fam_ops->ic_mce = k8_ic_mce;
856 fam_ops->nb_mce = f10h_nb_mce;
857 break; 778 break;
858 779
859 case 0x12: 780 case 0x12:
860 fam_ops->dc_mce = f12h_dc_mce; 781 fam_ops->dc_mce = f12h_dc_mce;
861 fam_ops->ic_mce = k8_ic_mce; 782 fam_ops->ic_mce = k8_ic_mce;
862 fam_ops->nb_mce = nb_noop_mce;
863 break; 783 break;
864 784
865 case 0x14: 785 case 0x14:
866 nb_err_cpumask = 0x3; 786 nb_err_cpumask = 0x3;
867 fam_ops->dc_mce = f14h_dc_mce; 787 fam_ops->dc_mce = f14h_dc_mce;
868 fam_ops->ic_mce = f14h_ic_mce; 788 fam_ops->ic_mce = f14h_ic_mce;
869 fam_ops->nb_mce = nb_noop_mce;
870 break; 789 break;
871 790
872 case 0x15: 791 case 0x15:
873 xec_mask = 0x1f; 792 xec_mask = 0x1f;
874 fam_ops->dc_mce = f15h_dc_mce; 793 fam_ops->dc_mce = f15h_dc_mce;
875 fam_ops->ic_mce = f15h_ic_mce; 794 fam_ops->ic_mce = f15h_ic_mce;
876 fam_ops->nb_mce = f10h_nb_mce;
877 break; 795 break;
878 796
879 default: 797 default:
880 printk(KERN_WARNING "Huh? What family is that: %d?!\n", c->x86); 798 printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86);
881 kfree(fam_ops); 799 kfree(fam_ops);
882 return -EINVAL; 800 return -EINVAL;
883 } 801 }
diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h
index 0106747e240c..c6074c5cd1ef 100644
--- a/drivers/edac/mce_amd.h
+++ b/drivers/edac/mce_amd.h
@@ -69,12 +69,12 @@ enum rrrr_ids {
69 R4_SNOOP, 69 R4_SNOOP,
70}; 70};
71 71
72extern const char *tt_msgs[]; 72extern const char * const tt_msgs[];
73extern const char *ll_msgs[]; 73extern const char * const ll_msgs[];
74extern const char *rrrr_msgs[]; 74extern const char * const rrrr_msgs[];
75extern const char *pp_msgs[]; 75extern const char * const pp_msgs[];
76extern const char *to_msgs[]; 76extern const char * const to_msgs[];
77extern const char *ii_msgs[]; 77extern const char * const ii_msgs[];
78 78
79/* 79/*
80 * per-family decoder ops 80 * per-family decoder ops
@@ -82,7 +82,6 @@ extern const char *ii_msgs[];
82struct amd_decoder_ops { 82struct amd_decoder_ops {
83 bool (*dc_mce)(u16, u8); 83 bool (*dc_mce)(u16, u8);
84 bool (*ic_mce)(u16, u8); 84 bool (*ic_mce)(u16, u8);
85 bool (*nb_mce)(u16, u8);
86}; 85};
87 86
88void amd_report_gart_errors(bool); 87void amd_report_gart_errors(bool);
diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c
index 885e8ad8fdcf..66b5151c1080 100644
--- a/drivers/edac/mce_amd_inj.c
+++ b/drivers/edac/mce_amd_inj.c
@@ -11,6 +11,7 @@
11 */ 11 */
12 12
13#include <linux/kobject.h> 13#include <linux/kobject.h>
14#include <linux/device.h>
14#include <linux/edac.h> 15#include <linux/edac.h>
15#include <linux/module.h> 16#include <linux/module.h>
16#include <asm/mce.h> 17#include <asm/mce.h>
diff --git a/drivers/edac/ppc4xx_edac.c b/drivers/edac/ppc4xx_edac.c
index fc757069c6af..d427c69bb8b1 100644
--- a/drivers/edac/ppc4xx_edac.c
+++ b/drivers/edac/ppc4xx_edac.c
@@ -184,7 +184,7 @@ struct ppc4xx_ecc_status {
184 184
185/* Function Prototypes */ 185/* Function Prototypes */
186 186
187static int ppc4xx_edac_probe(struct platform_device *device) 187static int ppc4xx_edac_probe(struct platform_device *device);
188static int ppc4xx_edac_remove(struct platform_device *device); 188static int ppc4xx_edac_remove(struct platform_device *device);
189 189
190/* Global Variables */ 190/* Global Variables */
@@ -1068,7 +1068,7 @@ ppc4xx_edac_mc_init(struct mem_ctl_info *mci,
1068 1068
1069 mci->mod_name = PPC4XX_EDAC_MODULE_NAME; 1069 mci->mod_name = PPC4XX_EDAC_MODULE_NAME;
1070 mci->mod_ver = PPC4XX_EDAC_MODULE_REVISION; 1070 mci->mod_ver = PPC4XX_EDAC_MODULE_REVISION;
1071 mci->ctl_name = match->compatible, 1071 mci->ctl_name = ppc4xx_edac_match->compatible,
1072 mci->dev_name = np->full_name; 1072 mci->dev_name = np->full_name;
1073 1073
1074 /* Initialize callbacks */ 1074 /* Initialize callbacks */
diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c
index e294e1b3616c..6d908ad72d64 100644
--- a/drivers/edac/r82600_edac.c
+++ b/drivers/edac/r82600_edac.c
@@ -373,7 +373,7 @@ static void __devexit r82600_remove_one(struct pci_dev *pdev)
373 edac_mc_free(mci); 373 edac_mc_free(mci);
374} 374}
375 375
376static const struct pci_device_id r82600_pci_tbl[] __devinitdata = { 376static DEFINE_PCI_DEVICE_TABLE(r82600_pci_tbl) = {
377 { 377 {
378 PCI_DEVICE(PCI_VENDOR_ID_RADISYS, R82600_BRIDGE_ID) 378 PCI_DEVICE(PCI_VENDOR_ID_RADISYS, R82600_BRIDGE_ID)
379 }, 379 },
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index 1dc118d83cc6..a203536d90dd 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -20,6 +20,7 @@
20#include <linux/mmzone.h> 20#include <linux/mmzone.h>
21#include <linux/smp.h> 21#include <linux/smp.h>
22#include <linux/bitmap.h> 22#include <linux/bitmap.h>
23#include <linux/math64.h>
23#include <asm/processor.h> 24#include <asm/processor.h>
24#include <asm/mce.h> 25#include <asm/mce.h>
25 26
@@ -367,7 +368,7 @@ static const struct pci_id_table pci_dev_descr_sbridge_table[] = {
367/* 368/*
368 * pci_device_id table for which devices we are looking for 369 * pci_device_id table for which devices we are looking for
369 */ 370 */
370static const struct pci_device_id sbridge_pci_tbl[] __devinitdata = { 371static DEFINE_PCI_DEVICE_TABLE(sbridge_pci_tbl) = {
371 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA)}, 372 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA)},
372 {0,} /* 0 terminated list. */ 373 {0,} /* 0 terminated list. */
373}; 374};
@@ -670,6 +671,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
670 u32 reg; 671 u32 reg;
671 u64 limit, prv = 0; 672 u64 limit, prv = 0;
672 u64 tmp_mb; 673 u64 tmp_mb;
674 u32 mb, kb;
673 u32 rir_way; 675 u32 rir_way;
674 676
675 /* 677 /*
@@ -682,8 +684,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
682 pvt->tolm = GET_TOLM(reg); 684 pvt->tolm = GET_TOLM(reg);
683 tmp_mb = (1 + pvt->tolm) >> 20; 685 tmp_mb = (1 + pvt->tolm) >> 20;
684 686
685 debugf0("TOLM: %Lu.%03Lu GB (0x%016Lx)\n", 687 mb = div_u64_rem(tmp_mb, 1000, &kb);
686 tmp_mb / 1000, tmp_mb % 1000, (u64)pvt->tolm); 688 debugf0("TOLM: %u.%03u GB (0x%016Lx)\n",
689 mb, kb, (u64)pvt->tolm);
687 690
688 /* Address range is already 45:25 */ 691 /* Address range is already 45:25 */
689 pci_read_config_dword(pvt->pci_sad1, TOHM, 692 pci_read_config_dword(pvt->pci_sad1, TOHM,
@@ -691,8 +694,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
691 pvt->tohm = GET_TOHM(reg); 694 pvt->tohm = GET_TOHM(reg);
692 tmp_mb = (1 + pvt->tohm) >> 20; 695 tmp_mb = (1 + pvt->tohm) >> 20;
693 696
694 debugf0("TOHM: %Lu.%03Lu GB (0x%016Lx)", 697 mb = div_u64_rem(tmp_mb, 1000, &kb);
695 tmp_mb / 1000, tmp_mb % 1000, (u64)pvt->tohm); 698 debugf0("TOHM: %u.%03u GB (0x%016Lx)",
699 mb, kb, (u64)pvt->tohm);
696 700
697 /* 701 /*
698 * Step 2) Get SAD range and SAD Interleave list 702 * Step 2) Get SAD range and SAD Interleave list
@@ -714,10 +718,11 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
714 break; 718 break;
715 719
716 tmp_mb = (limit + 1) >> 20; 720 tmp_mb = (limit + 1) >> 20;
717 debugf0("SAD#%d %s up to %Lu.%03Lu GB (0x%016Lx) %s reg=0x%08x\n", 721 mb = div_u64_rem(tmp_mb, 1000, &kb);
722 debugf0("SAD#%d %s up to %u.%03u GB (0x%016Lx) %s reg=0x%08x\n",
718 n_sads, 723 n_sads,
719 get_dram_attr(reg), 724 get_dram_attr(reg),
720 tmp_mb / 1000, tmp_mb % 1000, 725 mb, kb,
721 ((u64)tmp_mb) << 20L, 726 ((u64)tmp_mb) << 20L,
722 INTERLEAVE_MODE(reg) ? "Interleave: 8:6" : "Interleave: [8:6]XOR[18:16]", 727 INTERLEAVE_MODE(reg) ? "Interleave: 8:6" : "Interleave: [8:6]XOR[18:16]",
723 reg); 728 reg);
@@ -747,8 +752,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
747 break; 752 break;
748 tmp_mb = (limit + 1) >> 20; 753 tmp_mb = (limit + 1) >> 20;
749 754
750 debugf0("TAD#%d: up to %Lu.%03Lu GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n", 755 mb = div_u64_rem(tmp_mb, 1000, &kb);
751 n_tads, tmp_mb / 1000, tmp_mb % 1000, 756 debugf0("TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n",
757 n_tads, mb, kb,
752 ((u64)tmp_mb) << 20L, 758 ((u64)tmp_mb) << 20L,
753 (u32)TAD_SOCK(reg), 759 (u32)TAD_SOCK(reg),
754 (u32)TAD_CH(reg), 760 (u32)TAD_CH(reg),
@@ -757,7 +763,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
757 (u32)TAD_TGT2(reg), 763 (u32)TAD_TGT2(reg),
758 (u32)TAD_TGT3(reg), 764 (u32)TAD_TGT3(reg),
759 reg); 765 reg);
760 prv = tmp_mb; 766 prv = limit;
761 } 767 }
762 768
763 /* 769 /*
@@ -771,9 +777,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
771 tad_ch_nilv_offset[j], 777 tad_ch_nilv_offset[j],
772 &reg); 778 &reg);
773 tmp_mb = TAD_OFFSET(reg) >> 20; 779 tmp_mb = TAD_OFFSET(reg) >> 20;
774 debugf0("TAD CH#%d, offset #%d: %Lu.%03Lu GB (0x%016Lx), reg=0x%08x\n", 780 mb = div_u64_rem(tmp_mb, 1000, &kb);
781 debugf0("TAD CH#%d, offset #%d: %u.%03u GB (0x%016Lx), reg=0x%08x\n",
775 i, j, 782 i, j,
776 tmp_mb / 1000, tmp_mb % 1000, 783 mb, kb,
777 ((u64)tmp_mb) << 20L, 784 ((u64)tmp_mb) << 20L,
778 reg); 785 reg);
779 } 786 }
@@ -795,9 +802,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
795 802
796 tmp_mb = RIR_LIMIT(reg) >> 20; 803 tmp_mb = RIR_LIMIT(reg) >> 20;
797 rir_way = 1 << RIR_WAY(reg); 804 rir_way = 1 << RIR_WAY(reg);
798 debugf0("CH#%d RIR#%d, limit: %Lu.%03Lu GB (0x%016Lx), way: %d, reg=0x%08x\n", 805 mb = div_u64_rem(tmp_mb, 1000, &kb);
806 debugf0("CH#%d RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d, reg=0x%08x\n",
799 i, j, 807 i, j,
800 tmp_mb / 1000, tmp_mb % 1000, 808 mb, kb,
801 ((u64)tmp_mb) << 20L, 809 ((u64)tmp_mb) << 20L,
802 rir_way, 810 rir_way,
803 reg); 811 reg);
@@ -808,9 +816,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
808 &reg); 816 &reg);
809 tmp_mb = RIR_OFFSET(reg) << 6; 817 tmp_mb = RIR_OFFSET(reg) << 6;
810 818
811 debugf0("CH#%d RIR#%d INTL#%d, offset %Lu.%03Lu GB (0x%016Lx), tgt: %d, reg=0x%08x\n", 819 mb = div_u64_rem(tmp_mb, 1000, &kb);
820 debugf0("CH#%d RIR#%d INTL#%d, offset %u.%03u GB (0x%016Lx), tgt: %d, reg=0x%08x\n",
812 i, j, k, 821 i, j, k,
813 tmp_mb / 1000, tmp_mb % 1000, 822 mb, kb,
814 ((u64)tmp_mb) << 20L, 823 ((u64)tmp_mb) << 20L,
815 (u32)RIR_RNK_TGT(reg), 824 (u32)RIR_RNK_TGT(reg),
816 reg); 825 reg);
@@ -848,6 +857,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
848 u8 ch_way,sck_way; 857 u8 ch_way,sck_way;
849 u32 tad_offset; 858 u32 tad_offset;
850 u32 rir_way; 859 u32 rir_way;
860 u32 mb, kb;
851 u64 ch_addr, offset, limit, prv = 0; 861 u64 ch_addr, offset, limit, prv = 0;
852 862
853 863
@@ -858,7 +868,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
858 * range (e. g. VGA addresses). It is unlikely, however, that the 868 * range (e. g. VGA addresses). It is unlikely, however, that the
859 * memory controller would generate an error on that range. 869 * memory controller would generate an error on that range.
860 */ 870 */
861 if ((addr > (u64) pvt->tolm) && (addr < (1L << 32))) { 871 if ((addr > (u64) pvt->tolm) && (addr < (1LL << 32))) {
862 sprintf(msg, "Error at TOLM area, on addr 0x%08Lx", addr); 872 sprintf(msg, "Error at TOLM area, on addr 0x%08Lx", addr);
863 edac_mc_handle_ce_no_info(mci, msg); 873 edac_mc_handle_ce_no_info(mci, msg);
864 return -EINVAL; 874 return -EINVAL;
@@ -913,7 +923,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
913 addr, 923 addr,
914 limit, 924 limit,
915 sad_way + 7, 925 sad_way + 7,
916 INTERLEAVE_MODE(reg) ? "" : "XOR[18:16]"); 926 interleave_mode ? "" : "XOR[18:16]");
917 if (interleave_mode) 927 if (interleave_mode)
918 idx = ((addr >> 6) ^ (addr >> 16)) & 7; 928 idx = ((addr >> 6) ^ (addr >> 16)) & 7;
919 else 929 else
@@ -1053,7 +1063,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
1053 ch_addr = addr & 0x7f; 1063 ch_addr = addr & 0x7f;
1054 /* Remove socket wayness and remove 6 bits */ 1064 /* Remove socket wayness and remove 6 bits */
1055 addr >>= 6; 1065 addr >>= 6;
1056 addr /= sck_xch; 1066 addr = div_u64(addr, sck_xch);
1057#if 0 1067#if 0
1058 /* Divide by channel way */ 1068 /* Divide by channel way */
1059 addr = addr / ch_way; 1069 addr = addr / ch_way;
@@ -1073,10 +1083,10 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
1073 continue; 1083 continue;
1074 1084
1075 limit = RIR_LIMIT(reg); 1085 limit = RIR_LIMIT(reg);
1076 1086 mb = div_u64_rem(limit >> 20, 1000, &kb);
1077 debugf0("RIR#%d, limit: %Lu.%03Lu GB (0x%016Lx), way: %d\n", 1087 debugf0("RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d\n",
1078 n_rir, 1088 n_rir,
1079 (limit >> 20) / 1000, (limit >> 20) % 1000, 1089 mb, kb,
1080 limit, 1090 limit,
1081 1 << RIR_WAY(reg)); 1091 1 << RIR_WAY(reg));
1082 if (ch_addr <= limit) 1092 if (ch_addr <= limit)
diff --git a/drivers/edac/tile_edac.c b/drivers/edac/tile_edac.c
index 1d5cf06f6c6b..e99d00976189 100644
--- a/drivers/edac/tile_edac.c
+++ b/drivers/edac/tile_edac.c
@@ -145,7 +145,11 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev)
145 mci->edac_ctl_cap = EDAC_FLAG_SECDED; 145 mci->edac_ctl_cap = EDAC_FLAG_SECDED;
146 146
147 mci->mod_name = DRV_NAME; 147 mci->mod_name = DRV_NAME;
148#ifdef __tilegx__
149 mci->ctl_name = "TILEGx_Memory_Controller";
150#else
148 mci->ctl_name = "TILEPro_Memory_Controller"; 151 mci->ctl_name = "TILEPro_Memory_Controller";
152#endif
149 mci->dev_name = dev_name(&pdev->dev); 153 mci->dev_name = dev_name(&pdev->dev);
150 mci->edac_check = tile_edac_check; 154 mci->edac_check = tile_edac_check;
151 155
diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c
index b6f47de152f3..a438297389e5 100644
--- a/drivers/edac/x38_edac.c
+++ b/drivers/edac/x38_edac.c
@@ -440,7 +440,7 @@ static void __devexit x38_remove_one(struct pci_dev *pdev)
440 edac_mc_free(mci); 440 edac_mc_free(mci);
441} 441}
442 442
443static const struct pci_device_id x38_pci_tbl[] __devinitdata = { 443static DEFINE_PCI_DEVICE_TABLE(x38_pci_tbl) = {
444 { 444 {
445 PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 445 PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
446 X38}, 446 X38},