diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 12:26:15 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 12:26:15 -0500 |
commit | 09854dde949d611c6675075cb22927444a28faf6 (patch) | |
tree | acba379c7f951290af91a4c6cdf6f12e16ae54b5 /drivers/edac | |
parent | a1a3b3efc45518233a4d4738a68a2edd7671efb3 (diff) | |
parent | 881f0fcef9993992c24f5b649a3fb67fd4208f8f (diff) |
Merge tag 'edac_for_3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp
Pull EDAC updates from Borislav Petkov:
- mpc85xx PCIe error interrupt support
- misc small enhancements/fixes all over the place.
* tag 'edac_for_3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp:
EDAC: Don't try to cancel workqueue when it's never setup
e752x_edac: Fix pci_dev usage count
sb_edac: Mark get_mci_for_node_id as static
EDAC: Mark edac_create_debug_nodes as static
amd64_edac: Remove "amd64" prefix from static functions
amd64_edac: Simplify code around decode_bus_error
amd64_edac: Mark amd64_decode_bus_error as static
EDAC: Remove DEFINE_PCI_DEVICE_TABLE macro
amd64_edac: Fix condition to verify max channels allowed for F15 M30h
edac/85xx: Add PCIe error interrupt edac support
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/amd64_edac.c | 135 | ||||
-rw-r--r-- | drivers/edac/amd76x_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/e752x_edac.c | 6 | ||||
-rw-r--r-- | drivers/edac/e7xxx_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/edac_device.c | 3 | ||||
-rw-r--r-- | drivers/edac/edac_mc_sysfs.c | 2 | ||||
-rw-r--r-- | drivers/edac/i3000_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i3200_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i5000_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i5100_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i5400_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i7300_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i7core_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i82443bxgx_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i82860_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i82875p_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/i82975x_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/mpc85xx_edac.c | 98 | ||||
-rw-r--r-- | drivers/edac/mpc85xx_edac.h | 7 | ||||
-rw-r--r-- | drivers/edac/r82600_edac.c | 2 | ||||
-rw-r--r-- | drivers/edac/sb_edac.c | 4 | ||||
-rw-r--r-- | drivers/edac/x38_edac.c | 2 |
22 files changed, 181 insertions, 104 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index b53d0de17e15..98e14ee4833c 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -1,7 +1,7 @@ | |||
1 | #include "amd64_edac.h" | 1 | #include "amd64_edac.h" |
2 | #include <asm/amd_nb.h> | 2 | #include <asm/amd_nb.h> |
3 | 3 | ||
4 | static struct edac_pci_ctl_info *amd64_ctl_pci; | 4 | static struct edac_pci_ctl_info *pci_ctl; |
5 | 5 | ||
6 | static int report_gart_errors; | 6 | static int report_gart_errors; |
7 | module_param(report_gart_errors, int, 0644); | 7 | module_param(report_gart_errors, int, 0644); |
@@ -162,7 +162,7 @@ static int f15_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val, | |||
162 | * scan the scrub rate mapping table for a close or matching bandwidth value to | 162 | * scan the scrub rate mapping table for a close or matching bandwidth value to |
163 | * issue. If requested is too big, then use last maximum value found. | 163 | * issue. If requested is too big, then use last maximum value found. |
164 | */ | 164 | */ |
165 | static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) | 165 | static int __set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) |
166 | { | 166 | { |
167 | u32 scrubval; | 167 | u32 scrubval; |
168 | int i; | 168 | int i; |
@@ -198,7 +198,7 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) | |||
198 | return 0; | 198 | return 0; |
199 | } | 199 | } |
200 | 200 | ||
201 | static int amd64_set_scrub_rate(struct mem_ctl_info *mci, u32 bw) | 201 | static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw) |
202 | { | 202 | { |
203 | struct amd64_pvt *pvt = mci->pvt_info; | 203 | struct amd64_pvt *pvt = mci->pvt_info; |
204 | u32 min_scrubrate = 0x5; | 204 | u32 min_scrubrate = 0x5; |
@@ -210,10 +210,10 @@ static int amd64_set_scrub_rate(struct mem_ctl_info *mci, u32 bw) | |||
210 | if (pvt->fam == 0x15 && pvt->model < 0x10) | 210 | if (pvt->fam == 0x15 && pvt->model < 0x10) |
211 | f15h_select_dct(pvt, 0); | 211 | f15h_select_dct(pvt, 0); |
212 | 212 | ||
213 | return __amd64_set_scrub_rate(pvt->F3, bw, min_scrubrate); | 213 | return __set_scrub_rate(pvt->F3, bw, min_scrubrate); |
214 | } | 214 | } |
215 | 215 | ||
216 | static int amd64_get_scrub_rate(struct mem_ctl_info *mci) | 216 | static int get_scrub_rate(struct mem_ctl_info *mci) |
217 | { | 217 | { |
218 | struct amd64_pvt *pvt = mci->pvt_info; | 218 | struct amd64_pvt *pvt = mci->pvt_info; |
219 | u32 scrubval = 0; | 219 | u32 scrubval = 0; |
@@ -240,8 +240,7 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci) | |||
240 | * returns true if the SysAddr given by sys_addr matches the | 240 | * returns true if the SysAddr given by sys_addr matches the |
241 | * DRAM base/limit associated with node_id | 241 | * DRAM base/limit associated with node_id |
242 | */ | 242 | */ |
243 | static bool amd64_base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, | 243 | static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid) |
244 | u8 nid) | ||
245 | { | 244 | { |
246 | u64 addr; | 245 | u64 addr; |
247 | 246 | ||
@@ -285,7 +284,7 @@ static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci, | |||
285 | 284 | ||
286 | if (intlv_en == 0) { | 285 | if (intlv_en == 0) { |
287 | for (node_id = 0; node_id < DRAM_RANGES; node_id++) { | 286 | for (node_id = 0; node_id < DRAM_RANGES; node_id++) { |
288 | if (amd64_base_limit_match(pvt, sys_addr, node_id)) | 287 | if (base_limit_match(pvt, sys_addr, node_id)) |
289 | goto found; | 288 | goto found; |
290 | } | 289 | } |
291 | goto err_no_match; | 290 | goto err_no_match; |
@@ -309,7 +308,7 @@ static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci, | |||
309 | } | 308 | } |
310 | 309 | ||
311 | /* sanity test for sys_addr */ | 310 | /* sanity test for sys_addr */ |
312 | if (unlikely(!amd64_base_limit_match(pvt, sys_addr, node_id))) { | 311 | if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) { |
313 | amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address" | 312 | amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address" |
314 | "range for node %d with node interleaving enabled.\n", | 313 | "range for node %d with node interleaving enabled.\n", |
315 | __func__, sys_addr, node_id); | 314 | __func__, sys_addr, node_id); |
@@ -660,7 +659,7 @@ static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16); | |||
660 | * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs | 659 | * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs |
661 | * are ECC capable. | 660 | * are ECC capable. |
662 | */ | 661 | */ |
663 | static unsigned long amd64_determine_edac_cap(struct amd64_pvt *pvt) | 662 | static unsigned long determine_edac_cap(struct amd64_pvt *pvt) |
664 | { | 663 | { |
665 | u8 bit; | 664 | u8 bit; |
666 | unsigned long edac_cap = EDAC_FLAG_NONE; | 665 | unsigned long edac_cap = EDAC_FLAG_NONE; |
@@ -675,9 +674,9 @@ static unsigned long amd64_determine_edac_cap(struct amd64_pvt *pvt) | |||
675 | return edac_cap; | 674 | return edac_cap; |
676 | } | 675 | } |
677 | 676 | ||
678 | static void amd64_debug_display_dimm_sizes(struct amd64_pvt *, u8); | 677 | static void debug_display_dimm_sizes(struct amd64_pvt *, u8); |
679 | 678 | ||
680 | static void amd64_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan) | 679 | static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan) |
681 | { | 680 | { |
682 | edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr); | 681 | edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr); |
683 | 682 | ||
@@ -711,7 +710,7 @@ static void dump_misc_regs(struct amd64_pvt *pvt) | |||
711 | (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no", | 710 | (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no", |
712 | (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no"); | 711 | (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no"); |
713 | 712 | ||
714 | amd64_dump_dramcfg_low(pvt, pvt->dclr0, 0); | 713 | debug_dump_dramcfg_low(pvt, pvt->dclr0, 0); |
715 | 714 | ||
716 | edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare); | 715 | edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare); |
717 | 716 | ||
@@ -722,19 +721,19 @@ static void dump_misc_regs(struct amd64_pvt *pvt) | |||
722 | 721 | ||
723 | edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no"); | 722 | edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no"); |
724 | 723 | ||
725 | amd64_debug_display_dimm_sizes(pvt, 0); | 724 | debug_display_dimm_sizes(pvt, 0); |
726 | 725 | ||
727 | /* everything below this point is Fam10h and above */ | 726 | /* everything below this point is Fam10h and above */ |
728 | if (pvt->fam == 0xf) | 727 | if (pvt->fam == 0xf) |
729 | return; | 728 | return; |
730 | 729 | ||
731 | amd64_debug_display_dimm_sizes(pvt, 1); | 730 | debug_display_dimm_sizes(pvt, 1); |
732 | 731 | ||
733 | amd64_info("using %s syndromes.\n", ((pvt->ecc_sym_sz == 8) ? "x8" : "x4")); | 732 | amd64_info("using %s syndromes.\n", ((pvt->ecc_sym_sz == 8) ? "x8" : "x4")); |
734 | 733 | ||
735 | /* Only if NOT ganged does dclr1 have valid info */ | 734 | /* Only if NOT ganged does dclr1 have valid info */ |
736 | if (!dct_ganging_enabled(pvt)) | 735 | if (!dct_ganging_enabled(pvt)) |
737 | amd64_dump_dramcfg_low(pvt, pvt->dclr1, 1); | 736 | debug_dump_dramcfg_low(pvt, pvt->dclr1, 1); |
738 | } | 737 | } |
739 | 738 | ||
740 | /* | 739 | /* |
@@ -800,7 +799,7 @@ static void read_dct_base_mask(struct amd64_pvt *pvt) | |||
800 | } | 799 | } |
801 | } | 800 | } |
802 | 801 | ||
803 | static enum mem_type amd64_determine_memory_type(struct amd64_pvt *pvt, int cs) | 802 | static enum mem_type determine_memory_type(struct amd64_pvt *pvt, int cs) |
804 | { | 803 | { |
805 | enum mem_type type; | 804 | enum mem_type type; |
806 | 805 | ||
@@ -1578,7 +1577,7 @@ static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range, | |||
1578 | num_dcts_intlv, dct_sel); | 1577 | num_dcts_intlv, dct_sel); |
1579 | 1578 | ||
1580 | /* Verify we stay within the MAX number of channels allowed */ | 1579 | /* Verify we stay within the MAX number of channels allowed */ |
1581 | if (channel > 4 || channel < 0) | 1580 | if (channel > 3) |
1582 | return -EINVAL; | 1581 | return -EINVAL; |
1583 | 1582 | ||
1584 | leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0)); | 1583 | leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0)); |
@@ -1702,7 +1701,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, | |||
1702 | * debug routine to display the memory sizes of all logical DIMMs and its | 1701 | * debug routine to display the memory sizes of all logical DIMMs and its |
1703 | * CSROWs | 1702 | * CSROWs |
1704 | */ | 1703 | */ |
1705 | static void amd64_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) | 1704 | static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) |
1706 | { | 1705 | { |
1707 | int dimm, size0, size1; | 1706 | int dimm, size0, size1; |
1708 | u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases; | 1707 | u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases; |
@@ -1744,7 +1743,7 @@ static void amd64_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl) | |||
1744 | } | 1743 | } |
1745 | } | 1744 | } |
1746 | 1745 | ||
1747 | static struct amd64_family_type amd64_family_types[] = { | 1746 | static struct amd64_family_type family_types[] = { |
1748 | [K8_CPUS] = { | 1747 | [K8_CPUS] = { |
1749 | .ctl_name = "K8", | 1748 | .ctl_name = "K8", |
1750 | .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP, | 1749 | .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP, |
@@ -2005,9 +2004,9 @@ static void __log_bus_error(struct mem_ctl_info *mci, struct err_info *err, | |||
2005 | string, ""); | 2004 | string, ""); |
2006 | } | 2005 | } |
2007 | 2006 | ||
2008 | static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci, | 2007 | static inline void decode_bus_error(int node_id, struct mce *m) |
2009 | struct mce *m) | ||
2010 | { | 2008 | { |
2009 | struct mem_ctl_info *mci = mcis[node_id]; | ||
2011 | struct amd64_pvt *pvt = mci->pvt_info; | 2010 | struct amd64_pvt *pvt = mci->pvt_info; |
2012 | u8 ecc_type = (m->status >> 45) & 0x3; | 2011 | u8 ecc_type = (m->status >> 45) & 0x3; |
2013 | u8 xec = XEC(m->status, 0x1f); | 2012 | u8 xec = XEC(m->status, 0x1f); |
@@ -2035,11 +2034,6 @@ static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci, | |||
2035 | __log_bus_error(mci, &err, ecc_type); | 2034 | __log_bus_error(mci, &err, ecc_type); |
2036 | } | 2035 | } |
2037 | 2036 | ||
2038 | void amd64_decode_bus_error(int node_id, struct mce *m) | ||
2039 | { | ||
2040 | __amd64_decode_bus_error(mcis[node_id], m); | ||
2041 | } | ||
2042 | |||
2043 | /* | 2037 | /* |
2044 | * Use pvt->F2 which contains the F2 CPU PCI device to get the related | 2038 | * Use pvt->F2 which contains the F2 CPU PCI device to get the related |
2045 | * F1 (AddrMap) and F3 (Misc) devices. Return negative value on error. | 2039 | * F1 (AddrMap) and F3 (Misc) devices. Return negative value on error. |
@@ -2196,7 +2190,7 @@ static void read_mc_regs(struct amd64_pvt *pvt) | |||
2196 | * encompasses | 2190 | * encompasses |
2197 | * | 2191 | * |
2198 | */ | 2192 | */ |
2199 | static u32 amd64_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr) | 2193 | static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr) |
2200 | { | 2194 | { |
2201 | u32 cs_mode, nr_pages; | 2195 | u32 cs_mode, nr_pages; |
2202 | u32 dbam = dct ? pvt->dbam1 : pvt->dbam0; | 2196 | u32 dbam = dct ? pvt->dbam1 : pvt->dbam0; |
@@ -2263,19 +2257,19 @@ static int init_csrows(struct mem_ctl_info *mci) | |||
2263 | pvt->mc_node_id, i); | 2257 | pvt->mc_node_id, i); |
2264 | 2258 | ||
2265 | if (row_dct0) { | 2259 | if (row_dct0) { |
2266 | nr_pages = amd64_csrow_nr_pages(pvt, 0, i); | 2260 | nr_pages = get_csrow_nr_pages(pvt, 0, i); |
2267 | csrow->channels[0]->dimm->nr_pages = nr_pages; | 2261 | csrow->channels[0]->dimm->nr_pages = nr_pages; |
2268 | } | 2262 | } |
2269 | 2263 | ||
2270 | /* K8 has only one DCT */ | 2264 | /* K8 has only one DCT */ |
2271 | if (pvt->fam != 0xf && row_dct1) { | 2265 | if (pvt->fam != 0xf && row_dct1) { |
2272 | int row_dct1_pages = amd64_csrow_nr_pages(pvt, 1, i); | 2266 | int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i); |
2273 | 2267 | ||
2274 | csrow->channels[1]->dimm->nr_pages = row_dct1_pages; | 2268 | csrow->channels[1]->dimm->nr_pages = row_dct1_pages; |
2275 | nr_pages += row_dct1_pages; | 2269 | nr_pages += row_dct1_pages; |
2276 | } | 2270 | } |
2277 | 2271 | ||
2278 | mtype = amd64_determine_memory_type(pvt, i); | 2272 | mtype = determine_memory_type(pvt, i); |
2279 | 2273 | ||
2280 | edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages); | 2274 | edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages); |
2281 | 2275 | ||
@@ -2309,7 +2303,7 @@ static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid) | |||
2309 | } | 2303 | } |
2310 | 2304 | ||
2311 | /* check MCG_CTL on all the cpus on this node */ | 2305 | /* check MCG_CTL on all the cpus on this node */ |
2312 | static bool amd64_nb_mce_bank_enabled_on_node(u16 nid) | 2306 | static bool nb_mce_bank_enabled_on_node(u16 nid) |
2313 | { | 2307 | { |
2314 | cpumask_var_t mask; | 2308 | cpumask_var_t mask; |
2315 | int cpu, nbe; | 2309 | int cpu, nbe; |
@@ -2482,7 +2476,7 @@ static bool ecc_enabled(struct pci_dev *F3, u16 nid) | |||
2482 | ecc_en = !!(value & NBCFG_ECC_ENABLE); | 2476 | ecc_en = !!(value & NBCFG_ECC_ENABLE); |
2483 | amd64_info("DRAM ECC %s.\n", (ecc_en ? "enabled" : "disabled")); | 2477 | amd64_info("DRAM ECC %s.\n", (ecc_en ? "enabled" : "disabled")); |
2484 | 2478 | ||
2485 | nb_mce_en = amd64_nb_mce_bank_enabled_on_node(nid); | 2479 | nb_mce_en = nb_mce_bank_enabled_on_node(nid); |
2486 | if (!nb_mce_en) | 2480 | if (!nb_mce_en) |
2487 | amd64_notice("NB MCE bank disabled, set MSR " | 2481 | amd64_notice("NB MCE bank disabled, set MSR " |
2488 | "0x%08x[4] on node %d to enable.\n", | 2482 | "0x%08x[4] on node %d to enable.\n", |
@@ -2537,7 +2531,7 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci, | |||
2537 | if (pvt->nbcap & NBCAP_CHIPKILL) | 2531 | if (pvt->nbcap & NBCAP_CHIPKILL) |
2538 | mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED; | 2532 | mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED; |
2539 | 2533 | ||
2540 | mci->edac_cap = amd64_determine_edac_cap(pvt); | 2534 | mci->edac_cap = determine_edac_cap(pvt); |
2541 | mci->mod_name = EDAC_MOD_STR; | 2535 | mci->mod_name = EDAC_MOD_STR; |
2542 | mci->mod_ver = EDAC_AMD64_VERSION; | 2536 | mci->mod_ver = EDAC_AMD64_VERSION; |
2543 | mci->ctl_name = fam->ctl_name; | 2537 | mci->ctl_name = fam->ctl_name; |
@@ -2545,14 +2539,14 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci, | |||
2545 | mci->ctl_page_to_phys = NULL; | 2539 | mci->ctl_page_to_phys = NULL; |
2546 | 2540 | ||
2547 | /* memory scrubber interface */ | 2541 | /* memory scrubber interface */ |
2548 | mci->set_sdram_scrub_rate = amd64_set_scrub_rate; | 2542 | mci->set_sdram_scrub_rate = set_scrub_rate; |
2549 | mci->get_sdram_scrub_rate = amd64_get_scrub_rate; | 2543 | mci->get_sdram_scrub_rate = get_scrub_rate; |
2550 | } | 2544 | } |
2551 | 2545 | ||
2552 | /* | 2546 | /* |
2553 | * returns a pointer to the family descriptor on success, NULL otherwise. | 2547 | * returns a pointer to the family descriptor on success, NULL otherwise. |
2554 | */ | 2548 | */ |
2555 | static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) | 2549 | static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt) |
2556 | { | 2550 | { |
2557 | struct amd64_family_type *fam_type = NULL; | 2551 | struct amd64_family_type *fam_type = NULL; |
2558 | 2552 | ||
@@ -2563,29 +2557,29 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) | |||
2563 | 2557 | ||
2564 | switch (pvt->fam) { | 2558 | switch (pvt->fam) { |
2565 | case 0xf: | 2559 | case 0xf: |
2566 | fam_type = &amd64_family_types[K8_CPUS]; | 2560 | fam_type = &family_types[K8_CPUS]; |
2567 | pvt->ops = &amd64_family_types[K8_CPUS].ops; | 2561 | pvt->ops = &family_types[K8_CPUS].ops; |
2568 | break; | 2562 | break; |
2569 | 2563 | ||
2570 | case 0x10: | 2564 | case 0x10: |
2571 | fam_type = &amd64_family_types[F10_CPUS]; | 2565 | fam_type = &family_types[F10_CPUS]; |
2572 | pvt->ops = &amd64_family_types[F10_CPUS].ops; | 2566 | pvt->ops = &family_types[F10_CPUS].ops; |
2573 | break; | 2567 | break; |
2574 | 2568 | ||
2575 | case 0x15: | 2569 | case 0x15: |
2576 | if (pvt->model == 0x30) { | 2570 | if (pvt->model == 0x30) { |
2577 | fam_type = &amd64_family_types[F15_M30H_CPUS]; | 2571 | fam_type = &family_types[F15_M30H_CPUS]; |
2578 | pvt->ops = &amd64_family_types[F15_M30H_CPUS].ops; | 2572 | pvt->ops = &family_types[F15_M30H_CPUS].ops; |
2579 | break; | 2573 | break; |
2580 | } | 2574 | } |
2581 | 2575 | ||
2582 | fam_type = &amd64_family_types[F15_CPUS]; | 2576 | fam_type = &family_types[F15_CPUS]; |
2583 | pvt->ops = &amd64_family_types[F15_CPUS].ops; | 2577 | pvt->ops = &family_types[F15_CPUS].ops; |
2584 | break; | 2578 | break; |
2585 | 2579 | ||
2586 | case 0x16: | 2580 | case 0x16: |
2587 | fam_type = &amd64_family_types[F16_CPUS]; | 2581 | fam_type = &family_types[F16_CPUS]; |
2588 | pvt->ops = &amd64_family_types[F16_CPUS].ops; | 2582 | pvt->ops = &family_types[F16_CPUS].ops; |
2589 | break; | 2583 | break; |
2590 | 2584 | ||
2591 | default: | 2585 | default: |
@@ -2601,7 +2595,7 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) | |||
2601 | return fam_type; | 2595 | return fam_type; |
2602 | } | 2596 | } |
2603 | 2597 | ||
2604 | static int amd64_init_one_instance(struct pci_dev *F2) | 2598 | static int init_one_instance(struct pci_dev *F2) |
2605 | { | 2599 | { |
2606 | struct amd64_pvt *pvt = NULL; | 2600 | struct amd64_pvt *pvt = NULL; |
2607 | struct amd64_family_type *fam_type = NULL; | 2601 | struct amd64_family_type *fam_type = NULL; |
@@ -2619,7 +2613,7 @@ static int amd64_init_one_instance(struct pci_dev *F2) | |||
2619 | pvt->F2 = F2; | 2613 | pvt->F2 = F2; |
2620 | 2614 | ||
2621 | ret = -EINVAL; | 2615 | ret = -EINVAL; |
2622 | fam_type = amd64_per_family_init(pvt); | 2616 | fam_type = per_family_init(pvt); |
2623 | if (!fam_type) | 2617 | if (!fam_type) |
2624 | goto err_free; | 2618 | goto err_free; |
2625 | 2619 | ||
@@ -2680,7 +2674,7 @@ static int amd64_init_one_instance(struct pci_dev *F2) | |||
2680 | if (report_gart_errors) | 2674 | if (report_gart_errors) |
2681 | amd_report_gart_errors(true); | 2675 | amd_report_gart_errors(true); |
2682 | 2676 | ||
2683 | amd_register_ecc_decoder(amd64_decode_bus_error); | 2677 | amd_register_ecc_decoder(decode_bus_error); |
2684 | 2678 | ||
2685 | mcis[nid] = mci; | 2679 | mcis[nid] = mci; |
2686 | 2680 | ||
@@ -2703,8 +2697,8 @@ err_ret: | |||
2703 | return ret; | 2697 | return ret; |
2704 | } | 2698 | } |
2705 | 2699 | ||
2706 | static int amd64_probe_one_instance(struct pci_dev *pdev, | 2700 | static int probe_one_instance(struct pci_dev *pdev, |
2707 | const struct pci_device_id *mc_type) | 2701 | const struct pci_device_id *mc_type) |
2708 | { | 2702 | { |
2709 | u16 nid = amd_get_node_id(pdev); | 2703 | u16 nid = amd_get_node_id(pdev); |
2710 | struct pci_dev *F3 = node_to_amd_nb(nid)->misc; | 2704 | struct pci_dev *F3 = node_to_amd_nb(nid)->misc; |
@@ -2736,7 +2730,7 @@ static int amd64_probe_one_instance(struct pci_dev *pdev, | |||
2736 | goto err_enable; | 2730 | goto err_enable; |
2737 | } | 2731 | } |
2738 | 2732 | ||
2739 | ret = amd64_init_one_instance(pdev); | 2733 | ret = init_one_instance(pdev); |
2740 | if (ret < 0) { | 2734 | if (ret < 0) { |
2741 | amd64_err("Error probing instance: %d\n", nid); | 2735 | amd64_err("Error probing instance: %d\n", nid); |
2742 | restore_ecc_error_reporting(s, nid, F3); | 2736 | restore_ecc_error_reporting(s, nid, F3); |
@@ -2752,7 +2746,7 @@ err_out: | |||
2752 | return ret; | 2746 | return ret; |
2753 | } | 2747 | } |
2754 | 2748 | ||
2755 | static void amd64_remove_one_instance(struct pci_dev *pdev) | 2749 | static void remove_one_instance(struct pci_dev *pdev) |
2756 | { | 2750 | { |
2757 | struct mem_ctl_info *mci; | 2751 | struct mem_ctl_info *mci; |
2758 | struct amd64_pvt *pvt; | 2752 | struct amd64_pvt *pvt; |
@@ -2777,7 +2771,7 @@ static void amd64_remove_one_instance(struct pci_dev *pdev) | |||
2777 | 2771 | ||
2778 | /* unregister from EDAC MCE */ | 2772 | /* unregister from EDAC MCE */ |
2779 | amd_report_gart_errors(false); | 2773 | amd_report_gart_errors(false); |
2780 | amd_unregister_ecc_decoder(amd64_decode_bus_error); | 2774 | amd_unregister_ecc_decoder(decode_bus_error); |
2781 | 2775 | ||
2782 | kfree(ecc_stngs[nid]); | 2776 | kfree(ecc_stngs[nid]); |
2783 | ecc_stngs[nid] = NULL; | 2777 | ecc_stngs[nid] = NULL; |
@@ -2795,7 +2789,7 @@ static void amd64_remove_one_instance(struct pci_dev *pdev) | |||
2795 | * PCI core identifies what devices are on a system during boot, and then | 2789 | * PCI core identifies what devices are on a system during boot, and then |
2796 | * inquiry this table to see if this driver is for a given device found. | 2790 | * inquiry this table to see if this driver is for a given device found. |
2797 | */ | 2791 | */ |
2798 | static DEFINE_PCI_DEVICE_TABLE(amd64_pci_table) = { | 2792 | static const struct pci_device_id amd64_pci_table[] = { |
2799 | { | 2793 | { |
2800 | .vendor = PCI_VENDOR_ID_AMD, | 2794 | .vendor = PCI_VENDOR_ID_AMD, |
2801 | .device = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, | 2795 | .device = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, |
@@ -2843,8 +2837,8 @@ MODULE_DEVICE_TABLE(pci, amd64_pci_table); | |||
2843 | 2837 | ||
2844 | static struct pci_driver amd64_pci_driver = { | 2838 | static struct pci_driver amd64_pci_driver = { |
2845 | .name = EDAC_MOD_STR, | 2839 | .name = EDAC_MOD_STR, |
2846 | .probe = amd64_probe_one_instance, | 2840 | .probe = probe_one_instance, |
2847 | .remove = amd64_remove_one_instance, | 2841 | .remove = remove_one_instance, |
2848 | .id_table = amd64_pci_table, | 2842 | .id_table = amd64_pci_table, |
2849 | }; | 2843 | }; |
2850 | 2844 | ||
@@ -2853,23 +2847,18 @@ static void setup_pci_device(void) | |||
2853 | struct mem_ctl_info *mci; | 2847 | struct mem_ctl_info *mci; |
2854 | struct amd64_pvt *pvt; | 2848 | struct amd64_pvt *pvt; |
2855 | 2849 | ||
2856 | if (amd64_ctl_pci) | 2850 | if (pci_ctl) |
2857 | return; | 2851 | return; |
2858 | 2852 | ||
2859 | mci = mcis[0]; | 2853 | mci = mcis[0]; |
2860 | if (mci) { | 2854 | if (!mci) |
2861 | 2855 | return; | |
2862 | pvt = mci->pvt_info; | ||
2863 | amd64_ctl_pci = | ||
2864 | edac_pci_create_generic_ctl(&pvt->F2->dev, EDAC_MOD_STR); | ||
2865 | |||
2866 | if (!amd64_ctl_pci) { | ||
2867 | pr_warning("%s(): Unable to create PCI control\n", | ||
2868 | __func__); | ||
2869 | 2856 | ||
2870 | pr_warning("%s(): PCI error report via EDAC not set\n", | 2857 | pvt = mci->pvt_info; |
2871 | __func__); | 2858 | pci_ctl = edac_pci_create_generic_ctl(&pvt->F2->dev, EDAC_MOD_STR); |
2872 | } | 2859 | if (!pci_ctl) { |
2860 | pr_warn("%s(): Unable to create PCI control\n", __func__); | ||
2861 | pr_warn("%s(): PCI error report via EDAC not set\n", __func__); | ||
2873 | } | 2862 | } |
2874 | } | 2863 | } |
2875 | 2864 | ||
@@ -2925,8 +2914,8 @@ err_ret: | |||
2925 | 2914 | ||
2926 | static void __exit amd64_edac_exit(void) | 2915 | static void __exit amd64_edac_exit(void) |
2927 | { | 2916 | { |
2928 | if (amd64_ctl_pci) | 2917 | if (pci_ctl) |
2929 | edac_pci_release_generic_ctl(amd64_ctl_pci); | 2918 | edac_pci_release_generic_ctl(pci_ctl); |
2930 | 2919 | ||
2931 | pci_unregister_driver(&amd64_pci_driver); | 2920 | pci_unregister_driver(&amd64_pci_driver); |
2932 | 2921 | ||
diff --git a/drivers/edac/amd76x_edac.c b/drivers/edac/amd76x_edac.c index 96e3ee3460a5..3a501b530e11 100644 --- a/drivers/edac/amd76x_edac.c +++ b/drivers/edac/amd76x_edac.c | |||
@@ -333,7 +333,7 @@ static void amd76x_remove_one(struct pci_dev *pdev) | |||
333 | edac_mc_free(mci); | 333 | edac_mc_free(mci); |
334 | } | 334 | } |
335 | 335 | ||
336 | static DEFINE_PCI_DEVICE_TABLE(amd76x_pci_tbl) = { | 336 | static const struct pci_device_id amd76x_pci_tbl[] = { |
337 | { | 337 | { |
338 | PCI_VEND_DEV(AMD, FE_GATE_700C), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 338 | PCI_VEND_DEV(AMD, FE_GATE_700C), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
339 | AMD762}, | 339 | AMD762}, |
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 644fec54681f..92d54fa65f93 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
@@ -1182,9 +1182,11 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, | |||
1182 | pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL, | 1182 | pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL, |
1183 | pvt->dev_info->err_dev, pvt->bridge_ck); | 1183 | pvt->dev_info->err_dev, pvt->bridge_ck); |
1184 | 1184 | ||
1185 | if (pvt->bridge_ck == NULL) | 1185 | if (pvt->bridge_ck == NULL) { |
1186 | pvt->bridge_ck = pci_scan_single_device(pdev->bus, | 1186 | pvt->bridge_ck = pci_scan_single_device(pdev->bus, |
1187 | PCI_DEVFN(0, 1)); | 1187 | PCI_DEVFN(0, 1)); |
1188 | pci_dev_get(pvt->bridge_ck); | ||
1189 | } | ||
1188 | 1190 | ||
1189 | if (pvt->bridge_ck == NULL) { | 1191 | if (pvt->bridge_ck == NULL) { |
1190 | e752x_printk(KERN_ERR, "error reporting device not found:" | 1192 | e752x_printk(KERN_ERR, "error reporting device not found:" |
@@ -1421,7 +1423,7 @@ static void e752x_remove_one(struct pci_dev *pdev) | |||
1421 | edac_mc_free(mci); | 1423 | edac_mc_free(mci); |
1422 | } | 1424 | } |
1423 | 1425 | ||
1424 | static DEFINE_PCI_DEVICE_TABLE(e752x_pci_tbl) = { | 1426 | static const struct pci_device_id e752x_pci_tbl[] = { |
1425 | { | 1427 | { |
1426 | PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 1428 | PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
1427 | E7520}, | 1429 | E7520}, |
diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c index 1c4056a50383..3cda79bc8b00 100644 --- a/drivers/edac/e7xxx_edac.c +++ b/drivers/edac/e7xxx_edac.c | |||
@@ -555,7 +555,7 @@ static void e7xxx_remove_one(struct pci_dev *pdev) | |||
555 | edac_mc_free(mci); | 555 | edac_mc_free(mci); |
556 | } | 556 | } |
557 | 557 | ||
558 | static DEFINE_PCI_DEVICE_TABLE(e7xxx_pci_tbl) = { | 558 | static const struct pci_device_id e7xxx_pci_tbl[] = { |
559 | { | 559 | { |
560 | PCI_VEND_DEV(INTEL, 7205_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 560 | PCI_VEND_DEV(INTEL, 7205_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
561 | E7205}, | 561 | E7205}, |
diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index 102674346035..592af5f0cf39 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c | |||
@@ -437,6 +437,9 @@ void edac_device_workq_teardown(struct edac_device_ctl_info *edac_dev) | |||
437 | { | 437 | { |
438 | int status; | 438 | int status; |
439 | 439 | ||
440 | if (!edac_dev->edac_check) | ||
441 | return; | ||
442 | |||
440 | status = cancel_delayed_work(&edac_dev->work); | 443 | status = cancel_delayed_work(&edac_dev->work); |
441 | if (status == 0) { | 444 | if (status == 0) { |
442 | /* workq instance might be running, wait for it */ | 445 | /* workq instance might be running, wait for it */ |
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 9f7e0e609516..51c0362acf5c 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
@@ -914,7 +914,7 @@ void __exit edac_debugfs_exit(void) | |||
914 | debugfs_remove(edac_debugfs); | 914 | debugfs_remove(edac_debugfs); |
915 | } | 915 | } |
916 | 916 | ||
917 | int edac_create_debug_nodes(struct mem_ctl_info *mci) | 917 | static int edac_create_debug_nodes(struct mem_ctl_info *mci) |
918 | { | 918 | { |
919 | struct dentry *d, *parent; | 919 | struct dentry *d, *parent; |
920 | char name[80]; | 920 | char name[80]; |
diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c index 694efcbf19c0..cd28b968e5c7 100644 --- a/drivers/edac/i3000_edac.c +++ b/drivers/edac/i3000_edac.c | |||
@@ -487,7 +487,7 @@ static void i3000_remove_one(struct pci_dev *pdev) | |||
487 | edac_mc_free(mci); | 487 | edac_mc_free(mci); |
488 | } | 488 | } |
489 | 489 | ||
490 | static DEFINE_PCI_DEVICE_TABLE(i3000_pci_tbl) = { | 490 | static const struct pci_device_id i3000_pci_tbl[] = { |
491 | { | 491 | { |
492 | PCI_VEND_DEV(INTEL, 3000_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 492 | PCI_VEND_DEV(INTEL, 3000_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
493 | I3000}, | 493 | I3000}, |
diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c index be10a74b16ea..fa1326e5a4b0 100644 --- a/drivers/edac/i3200_edac.c +++ b/drivers/edac/i3200_edac.c | |||
@@ -466,7 +466,7 @@ static void i3200_remove_one(struct pci_dev *pdev) | |||
466 | edac_mc_free(mci); | 466 | edac_mc_free(mci); |
467 | } | 467 | } |
468 | 468 | ||
469 | static DEFINE_PCI_DEVICE_TABLE(i3200_pci_tbl) = { | 469 | static const struct pci_device_id i3200_pci_tbl[] = { |
470 | { | 470 | { |
471 | PCI_VEND_DEV(INTEL, 3200_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 471 | PCI_VEND_DEV(INTEL, 3200_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
472 | I3200}, | 472 | I3200}, |
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index 63b2194e8c20..72e07e3cf718 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c | |||
@@ -1530,7 +1530,7 @@ static void i5000_remove_one(struct pci_dev *pdev) | |||
1530 | * | 1530 | * |
1531 | * The "E500P" device is the first device supported. | 1531 | * The "E500P" device is the first device supported. |
1532 | */ | 1532 | */ |
1533 | static DEFINE_PCI_DEVICE_TABLE(i5000_pci_tbl) = { | 1533 | static const struct pci_device_id i5000_pci_tbl[] = { |
1534 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I5000_DEV16), | 1534 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I5000_DEV16), |
1535 | .driver_data = I5000P}, | 1535 | .driver_data = I5000P}, |
1536 | 1536 | ||
diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c index 157b934e8ce3..36a38ee94fa8 100644 --- a/drivers/edac/i5100_edac.c +++ b/drivers/edac/i5100_edac.c | |||
@@ -1213,7 +1213,7 @@ static void i5100_remove_one(struct pci_dev *pdev) | |||
1213 | edac_mc_free(mci); | 1213 | edac_mc_free(mci); |
1214 | } | 1214 | } |
1215 | 1215 | ||
1216 | static DEFINE_PCI_DEVICE_TABLE(i5100_pci_tbl) = { | 1216 | static const struct pci_device_id i5100_pci_tbl[] = { |
1217 | /* Device 16, Function 0, Channel 0 Memory Map, Error Flag/Mask, ... */ | 1217 | /* Device 16, Function 0, Channel 0 Memory Map, Error Flag/Mask, ... */ |
1218 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5100_16) }, | 1218 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5100_16) }, |
1219 | { 0, } | 1219 | { 0, } |
diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c index 0a05bbceb08f..e080cbfa8fc9 100644 --- a/drivers/edac/i5400_edac.c +++ b/drivers/edac/i5400_edac.c | |||
@@ -1416,7 +1416,7 @@ static void i5400_remove_one(struct pci_dev *pdev) | |||
1416 | * | 1416 | * |
1417 | * The "E500P" device is the first device supported. | 1417 | * The "E500P" device is the first device supported. |
1418 | */ | 1418 | */ |
1419 | static DEFINE_PCI_DEVICE_TABLE(i5400_pci_tbl) = { | 1419 | static const struct pci_device_id i5400_pci_tbl[] = { |
1420 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_ERR)}, | 1420 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5400_ERR)}, |
1421 | {0,} /* 0 terminated list. */ | 1421 | {0,} /* 0 terminated list. */ |
1422 | }; | 1422 | }; |
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index 9004c64b169e..d63f4798f7d0 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c | |||
@@ -1160,7 +1160,7 @@ static void i7300_remove_one(struct pci_dev *pdev) | |||
1160 | * | 1160 | * |
1161 | * Has only 8086:360c PCI ID | 1161 | * Has only 8086:360c PCI ID |
1162 | */ | 1162 | */ |
1163 | static DEFINE_PCI_DEVICE_TABLE(i7300_pci_tbl) = { | 1163 | static const struct pci_device_id i7300_pci_tbl[] = { |
1164 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I7300_MCH_ERR)}, | 1164 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_I7300_MCH_ERR)}, |
1165 | {0,} /* 0 terminated list. */ | 1165 | {0,} /* 0 terminated list. */ |
1166 | }; | 1166 | }; |
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 80a963d64e58..87533ca7752e 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
@@ -394,7 +394,7 @@ static const struct pci_id_table pci_dev_table[] = { | |||
394 | /* | 394 | /* |
395 | * pci_device_id table for which devices we are looking for | 395 | * pci_device_id table for which devices we are looking for |
396 | */ | 396 | */ |
397 | static DEFINE_PCI_DEVICE_TABLE(i7core_pci_tbl) = { | 397 | static const struct pci_device_id i7core_pci_tbl[] = { |
398 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)}, | 398 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_X58_HUB_MGMT)}, |
399 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNNFIELD_QPI_LINK0)}, | 399 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNNFIELD_QPI_LINK0)}, |
400 | {0,} /* 0 terminated list. */ | 400 | {0,} /* 0 terminated list. */ |
diff --git a/drivers/edac/i82443bxgx_edac.c b/drivers/edac/i82443bxgx_edac.c index 57fdb77903ba..d730e276d1a8 100644 --- a/drivers/edac/i82443bxgx_edac.c +++ b/drivers/edac/i82443bxgx_edac.c | |||
@@ -386,7 +386,7 @@ static void i82443bxgx_edacmc_remove_one(struct pci_dev *pdev) | |||
386 | 386 | ||
387 | EXPORT_SYMBOL_GPL(i82443bxgx_edacmc_remove_one); | 387 | EXPORT_SYMBOL_GPL(i82443bxgx_edacmc_remove_one); |
388 | 388 | ||
389 | static DEFINE_PCI_DEVICE_TABLE(i82443bxgx_pci_tbl) = { | 389 | static const struct pci_device_id i82443bxgx_pci_tbl[] = { |
390 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0)}, | 390 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0)}, |
391 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2)}, | 391 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2)}, |
392 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0)}, | 392 | {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 3e3e431c8301..3382f6344e42 100644 --- a/drivers/edac/i82860_edac.c +++ b/drivers/edac/i82860_edac.c | |||
@@ -288,7 +288,7 @@ static void i82860_remove_one(struct pci_dev *pdev) | |||
288 | edac_mc_free(mci); | 288 | edac_mc_free(mci); |
289 | } | 289 | } |
290 | 290 | ||
291 | static DEFINE_PCI_DEVICE_TABLE(i82860_pci_tbl) = { | 291 | static const struct pci_device_id i82860_pci_tbl[] = { |
292 | { | 292 | { |
293 | PCI_VEND_DEV(INTEL, 82860_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 293 | PCI_VEND_DEV(INTEL, 82860_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
294 | I82860}, | 294 | I82860}, |
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index 2f8535fc451e..80573df0a4d7 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c | |||
@@ -527,7 +527,7 @@ static void i82875p_remove_one(struct pci_dev *pdev) | |||
527 | edac_mc_free(mci); | 527 | edac_mc_free(mci); |
528 | } | 528 | } |
529 | 529 | ||
530 | static DEFINE_PCI_DEVICE_TABLE(i82875p_pci_tbl) = { | 530 | static const struct pci_device_id i82875p_pci_tbl[] = { |
531 | { | 531 | { |
532 | PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 532 | PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
533 | I82875P}, | 533 | I82875P}, |
diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c index 0c8d4b0eaa32..10b10521f62e 100644 --- a/drivers/edac/i82975x_edac.c +++ b/drivers/edac/i82975x_edac.c | |||
@@ -628,7 +628,7 @@ static void i82975x_remove_one(struct pci_dev *pdev) | |||
628 | edac_mc_free(mci); | 628 | edac_mc_free(mci); |
629 | } | 629 | } |
630 | 630 | ||
631 | static DEFINE_PCI_DEVICE_TABLE(i82975x_pci_tbl) = { | 631 | static const struct pci_device_id i82975x_pci_tbl[] = { |
632 | { | 632 | { |
633 | PCI_VEND_DEV(INTEL, 82975_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 633 | PCI_VEND_DEV(INTEL, 82975_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
634 | I82975X | 634 | I82975X |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index fd46b0bd5f2a..8f9182179a7c 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * Freescale MPC85xx Memory Controller kenel module | 2 | * Freescale MPC85xx Memory Controller kenel module |
3 | * | 3 | * |
4 | * Parts Copyrighted (c) 2013 by Freescale Semiconductor, Inc. | ||
5 | * | ||
4 | * Author: Dave Jiang <djiang@mvista.com> | 6 | * Author: Dave Jiang <djiang@mvista.com> |
5 | * | 7 | * |
6 | * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under | 8 | * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under |
@@ -196,6 +198,42 @@ static void mpc85xx_pci_check(struct edac_pci_ctl_info *pci) | |||
196 | edac_pci_handle_npe(pci, pci->ctl_name); | 198 | edac_pci_handle_npe(pci, pci->ctl_name); |
197 | } | 199 | } |
198 | 200 | ||
201 | static void mpc85xx_pcie_check(struct edac_pci_ctl_info *pci) | ||
202 | { | ||
203 | struct mpc85xx_pci_pdata *pdata = pci->pvt_info; | ||
204 | u32 err_detect; | ||
205 | |||
206 | err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR); | ||
207 | |||
208 | pr_err("PCIe error(s) detected\n"); | ||
209 | pr_err("PCIe ERR_DR register: 0x%08x\n", err_detect); | ||
210 | pr_err("PCIe ERR_CAP_STAT register: 0x%08x\n", | ||
211 | in_be32(pdata->pci_vbase + MPC85XX_PCI_GAS_TIMR)); | ||
212 | pr_err("PCIe ERR_CAP_R0 register: 0x%08x\n", | ||
213 | in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R0)); | ||
214 | pr_err("PCIe ERR_CAP_R1 register: 0x%08x\n", | ||
215 | in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R1)); | ||
216 | pr_err("PCIe ERR_CAP_R2 register: 0x%08x\n", | ||
217 | in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R2)); | ||
218 | pr_err("PCIe ERR_CAP_R3 register: 0x%08x\n", | ||
219 | in_be32(pdata->pci_vbase + MPC85XX_PCIE_ERR_CAP_R3)); | ||
220 | |||
221 | /* clear error bits */ | ||
222 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect); | ||
223 | } | ||
224 | |||
225 | static int mpc85xx_pcie_find_capability(struct device_node *np) | ||
226 | { | ||
227 | struct pci_controller *hose; | ||
228 | |||
229 | if (!np) | ||
230 | return -EINVAL; | ||
231 | |||
232 | hose = pci_find_hose_for_OF_device(np); | ||
233 | |||
234 | return early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP); | ||
235 | } | ||
236 | |||
199 | static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id) | 237 | static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id) |
200 | { | 238 | { |
201 | struct edac_pci_ctl_info *pci = dev_id; | 239 | struct edac_pci_ctl_info *pci = dev_id; |
@@ -207,7 +245,10 @@ static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id) | |||
207 | if (!err_detect) | 245 | if (!err_detect) |
208 | return IRQ_NONE; | 246 | return IRQ_NONE; |
209 | 247 | ||
210 | mpc85xx_pci_check(pci); | 248 | if (pdata->is_pcie) |
249 | mpc85xx_pcie_check(pci); | ||
250 | else | ||
251 | mpc85xx_pci_check(pci); | ||
211 | 252 | ||
212 | return IRQ_HANDLED; | 253 | return IRQ_HANDLED; |
213 | } | 254 | } |
@@ -239,14 +280,22 @@ int mpc85xx_pci_err_probe(struct platform_device *op) | |||
239 | pdata = pci->pvt_info; | 280 | pdata = pci->pvt_info; |
240 | pdata->name = "mpc85xx_pci_err"; | 281 | pdata->name = "mpc85xx_pci_err"; |
241 | pdata->irq = NO_IRQ; | 282 | pdata->irq = NO_IRQ; |
283 | |||
284 | if (mpc85xx_pcie_find_capability(op->dev.of_node) > 0) | ||
285 | pdata->is_pcie = true; | ||
286 | |||
242 | dev_set_drvdata(&op->dev, pci); | 287 | dev_set_drvdata(&op->dev, pci); |
243 | pci->dev = &op->dev; | 288 | pci->dev = &op->dev; |
244 | pci->mod_name = EDAC_MOD_STR; | 289 | pci->mod_name = EDAC_MOD_STR; |
245 | pci->ctl_name = pdata->name; | 290 | pci->ctl_name = pdata->name; |
246 | pci->dev_name = dev_name(&op->dev); | 291 | pci->dev_name = dev_name(&op->dev); |
247 | 292 | ||
248 | if (edac_op_state == EDAC_OPSTATE_POLL) | 293 | if (edac_op_state == EDAC_OPSTATE_POLL) { |
249 | pci->edac_check = mpc85xx_pci_check; | 294 | if (pdata->is_pcie) |
295 | pci->edac_check = mpc85xx_pcie_check; | ||
296 | else | ||
297 | pci->edac_check = mpc85xx_pci_check; | ||
298 | } | ||
250 | 299 | ||
251 | pdata->edac_idx = edac_pci_idx++; | 300 | pdata->edac_idx = edac_pci_idx++; |
252 | 301 | ||
@@ -275,16 +324,26 @@ int mpc85xx_pci_err_probe(struct platform_device *op) | |||
275 | goto err; | 324 | goto err; |
276 | } | 325 | } |
277 | 326 | ||
278 | orig_pci_err_cap_dr = | 327 | if (pdata->is_pcie) { |
279 | in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR); | 328 | orig_pci_err_cap_dr = |
329 | in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR); | ||
330 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR, ~0); | ||
331 | orig_pci_err_en = | ||
332 | in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN); | ||
333 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, 0); | ||
334 | } else { | ||
335 | orig_pci_err_cap_dr = | ||
336 | in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR); | ||
280 | 337 | ||
281 | /* PCI master abort is expected during config cycles */ | 338 | /* PCI master abort is expected during config cycles */ |
282 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR, 0x40); | 339 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR, 0x40); |
283 | 340 | ||
284 | orig_pci_err_en = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN); | 341 | orig_pci_err_en = |
342 | in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN); | ||
285 | 343 | ||
286 | /* disable master abort reporting */ | 344 | /* disable master abort reporting */ |
287 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0x40); | 345 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0x40); |
346 | } | ||
288 | 347 | ||
289 | /* clear error bits */ | 348 | /* clear error bits */ |
290 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, ~0); | 349 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, ~0); |
@@ -297,7 +356,8 @@ int mpc85xx_pci_err_probe(struct platform_device *op) | |||
297 | if (edac_op_state == EDAC_OPSTATE_INT) { | 356 | if (edac_op_state == EDAC_OPSTATE_INT) { |
298 | pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); | 357 | pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); |
299 | res = devm_request_irq(&op->dev, pdata->irq, | 358 | res = devm_request_irq(&op->dev, pdata->irq, |
300 | mpc85xx_pci_isr, IRQF_DISABLED, | 359 | mpc85xx_pci_isr, |
360 | IRQF_DISABLED | IRQF_SHARED, | ||
301 | "[EDAC] PCI err", pci); | 361 | "[EDAC] PCI err", pci); |
302 | if (res < 0) { | 362 | if (res < 0) { |
303 | printk(KERN_ERR | 363 | printk(KERN_ERR |
@@ -312,6 +372,22 @@ int mpc85xx_pci_err_probe(struct platform_device *op) | |||
312 | pdata->irq); | 372 | pdata->irq); |
313 | } | 373 | } |
314 | 374 | ||
375 | if (pdata->is_pcie) { | ||
376 | /* | ||
377 | * Enable all PCIe error interrupt & error detect except invalid | ||
378 | * PEX_CONFIG_ADDR/PEX_CONFIG_DATA access interrupt generation | ||
379 | * enable bit and invalid PEX_CONFIG_ADDR/PEX_CONFIG_DATA access | ||
380 | * detection enable bit. Because PCIe bus code to initialize and | ||
381 | * configure these PCIe devices on booting will use some invalid | ||
382 | * PEX_CONFIG_ADDR/PEX_CONFIG_DATA, edac driver prints the much | ||
383 | * notice information. So disable this detect to fix ugly print. | ||
384 | */ | ||
385 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0 | ||
386 | & ~PEX_ERR_ICCAIE_EN_BIT); | ||
387 | out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR, 0 | ||
388 | | PEX_ERR_ICCAD_DISR_BIT); | ||
389 | } | ||
390 | |||
315 | devres_remove_group(&op->dev, mpc85xx_pci_err_probe); | 391 | devres_remove_group(&op->dev, mpc85xx_pci_err_probe); |
316 | edac_dbg(3, "success\n"); | 392 | edac_dbg(3, "success\n"); |
317 | printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n"); | 393 | printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n"); |
diff --git a/drivers/edac/mpc85xx_edac.h b/drivers/edac/mpc85xx_edac.h index 932016f2cf06..8c6256436227 100644 --- a/drivers/edac/mpc85xx_edac.h +++ b/drivers/edac/mpc85xx_edac.h | |||
@@ -134,13 +134,19 @@ | |||
134 | #define MPC85XX_PCI_ERR_DR 0x0000 | 134 | #define MPC85XX_PCI_ERR_DR 0x0000 |
135 | #define MPC85XX_PCI_ERR_CAP_DR 0x0004 | 135 | #define MPC85XX_PCI_ERR_CAP_DR 0x0004 |
136 | #define MPC85XX_PCI_ERR_EN 0x0008 | 136 | #define MPC85XX_PCI_ERR_EN 0x0008 |
137 | #define PEX_ERR_ICCAIE_EN_BIT 0x00020000 | ||
137 | #define MPC85XX_PCI_ERR_ATTRIB 0x000c | 138 | #define MPC85XX_PCI_ERR_ATTRIB 0x000c |
138 | #define MPC85XX_PCI_ERR_ADDR 0x0010 | 139 | #define MPC85XX_PCI_ERR_ADDR 0x0010 |
140 | #define PEX_ERR_ICCAD_DISR_BIT 0x00020000 | ||
139 | #define MPC85XX_PCI_ERR_EXT_ADDR 0x0014 | 141 | #define MPC85XX_PCI_ERR_EXT_ADDR 0x0014 |
140 | #define MPC85XX_PCI_ERR_DL 0x0018 | 142 | #define MPC85XX_PCI_ERR_DL 0x0018 |
141 | #define MPC85XX_PCI_ERR_DH 0x001c | 143 | #define MPC85XX_PCI_ERR_DH 0x001c |
142 | #define MPC85XX_PCI_GAS_TIMR 0x0020 | 144 | #define MPC85XX_PCI_GAS_TIMR 0x0020 |
143 | #define MPC85XX_PCI_PCIX_TIMR 0x0024 | 145 | #define MPC85XX_PCI_PCIX_TIMR 0x0024 |
146 | #define MPC85XX_PCIE_ERR_CAP_R0 0x0028 | ||
147 | #define MPC85XX_PCIE_ERR_CAP_R1 0x002c | ||
148 | #define MPC85XX_PCIE_ERR_CAP_R2 0x0030 | ||
149 | #define MPC85XX_PCIE_ERR_CAP_R3 0x0034 | ||
144 | 150 | ||
145 | struct mpc85xx_mc_pdata { | 151 | struct mpc85xx_mc_pdata { |
146 | char *name; | 152 | char *name; |
@@ -158,6 +164,7 @@ struct mpc85xx_l2_pdata { | |||
158 | 164 | ||
159 | struct mpc85xx_pci_pdata { | 165 | struct mpc85xx_pci_pdata { |
160 | char *name; | 166 | char *name; |
167 | bool is_pcie; | ||
161 | int edac_idx; | 168 | int edac_idx; |
162 | void __iomem *pci_vbase; | 169 | void __iomem *pci_vbase; |
163 | int irq; | 170 | int irq; |
diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c index 2fd6a5490905..8f936bc7a010 100644 --- a/drivers/edac/r82600_edac.c +++ b/drivers/edac/r82600_edac.c | |||
@@ -383,7 +383,7 @@ static void r82600_remove_one(struct pci_dev *pdev) | |||
383 | edac_mc_free(mci); | 383 | edac_mc_free(mci); |
384 | } | 384 | } |
385 | 385 | ||
386 | static DEFINE_PCI_DEVICE_TABLE(r82600_pci_tbl) = { | 386 | static const struct pci_device_id r82600_pci_tbl[] = { |
387 | { | 387 | { |
388 | PCI_DEVICE(PCI_VENDOR_ID_RADISYS, R82600_BRIDGE_ID) | 388 | PCI_DEVICE(PCI_VENDOR_ID_RADISYS, R82600_BRIDGE_ID) |
389 | }, | 389 | }, |
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index d7f1b57bd3be..de988c8da1c8 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c | |||
@@ -461,7 +461,7 @@ static const struct pci_id_table pci_dev_descr_ibridge_table[] = { | |||
461 | /* | 461 | /* |
462 | * pci_device_id table for which devices we are looking for | 462 | * pci_device_id table for which devices we are looking for |
463 | */ | 463 | */ |
464 | static DEFINE_PCI_DEVICE_TABLE(sbridge_pci_tbl) = { | 464 | static const struct pci_device_id sbridge_pci_tbl[] = { |
465 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA)}, | 465 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA)}, |
466 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TA)}, | 466 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TA)}, |
467 | {0,} /* 0 terminated list. */ | 467 | {0,} /* 0 terminated list. */ |
@@ -915,7 +915,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci) | |||
915 | } | 915 | } |
916 | } | 916 | } |
917 | 917 | ||
918 | struct mem_ctl_info *get_mci_for_node_id(u8 node_id) | 918 | static struct mem_ctl_info *get_mci_for_node_id(u8 node_id) |
919 | { | 919 | { |
920 | struct sbridge_dev *sbridge_dev; | 920 | struct sbridge_dev *sbridge_dev; |
921 | 921 | ||
diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c index 1a4df82376ba..4891b450830b 100644 --- a/drivers/edac/x38_edac.c +++ b/drivers/edac/x38_edac.c | |||
@@ -448,7 +448,7 @@ static void x38_remove_one(struct pci_dev *pdev) | |||
448 | edac_mc_free(mci); | 448 | edac_mc_free(mci); |
449 | } | 449 | } |
450 | 450 | ||
451 | static DEFINE_PCI_DEVICE_TABLE(x38_pci_tbl) = { | 451 | static const struct pci_device_id x38_pci_tbl[] = { |
452 | { | 452 | { |
453 | PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 453 | PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
454 | X38}, | 454 | X38}, |