Commit 62ff577f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'edac_for_3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp

Pull EDAC updates from Borislav Petkov:
 "A bunch of EDAC updates all over the place:

   - Support for new AMD models, along with more graceful fallback for
     unsupported hw.

   - Bunch of fixes from SUSE accumulated from bug reports

   - Misc other fixes and cleanups"

* tag 'edac_for_3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp:
  amd64_edac: Add support for newer F16h models
  i7core_edac: Drop unused variable
  i82875p_edac: Drop redundant call to pci_get_device()
  amd8111_edac: Fix leaks in probe error paths
  e752x_edac: Drop pvt->bridge_ck
  MCE, AMD: Fix decoding module loading on unsupported hw
  i5100_edac: Remove an unneeded condition in i5100_init_csrows()
  sb_edac: Degrade log level for device registration
  amd64_edac: Fix logic to determine channel for F15 M30h processors
  edac/85xx: Remove deprecated IRQF_DISABLED
  i3200_edac: Add a missing pci_disable_device() on the exit path
  i5400_edac: Disable device when unloading module
  e752x_edac: Simplify call to pci_get_device()
parents 26f31fb9 85a8885b
...@@ -22,6 +22,7 @@ const struct pci_device_id amd_nb_misc_ids[] = { ...@@ -22,6 +22,7 @@ const struct pci_device_id amd_nb_misc_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F3) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F3) },
{} {}
}; };
EXPORT_SYMBOL(amd_nb_misc_ids); EXPORT_SYMBOL(amd_nb_misc_ids);
...@@ -30,6 +31,7 @@ static const struct pci_device_id amd_nb_link_ids[] = { ...@@ -30,6 +31,7 @@ static const struct pci_device_id amd_nb_link_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F4) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F4) },
{} {}
}; };
......
...@@ -1239,9 +1239,17 @@ static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr, ...@@ -1239,9 +1239,17 @@ static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
if (num_dcts_intlv == 2) { if (num_dcts_intlv == 2) {
select = (sys_addr >> 8) & 0x3; select = (sys_addr >> 8) & 0x3;
channel = select ? 0x3 : 0; channel = select ? 0x3 : 0;
} else if (num_dcts_intlv == 4) } else if (num_dcts_intlv == 4) {
channel = (sys_addr >> 8) & 0x7; u8 intlv_addr = dct_sel_interleave_addr(pvt);
switch (intlv_addr) {
case 0x4:
channel = (sys_addr >> 8) & 0x3;
break;
case 0x5:
channel = (sys_addr >> 9) & 0x3;
break;
}
}
return channel; return channel;
} }
...@@ -1799,6 +1807,17 @@ static struct amd64_family_type family_types[] = { ...@@ -1799,6 +1807,17 @@ static struct amd64_family_type family_types[] = {
.read_dct_pci_cfg = f10_read_dct_pci_cfg, .read_dct_pci_cfg = f10_read_dct_pci_cfg,
} }
}, },
[F16_M30H_CPUS] = {
.ctl_name = "F16h_M30h",
.f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
.f3_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F3,
.ops = {
.early_channel_count = f1x_early_channel_count,
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
.dbam_to_cs = f16_dbam_to_chip_select,
.read_dct_pci_cfg = f10_read_dct_pci_cfg,
}
},
}; };
/* /*
...@@ -2578,6 +2597,11 @@ static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt) ...@@ -2578,6 +2597,11 @@ static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
break; break;
case 0x16: case 0x16:
if (pvt->model == 0x30) {
fam_type = &family_types[F16_M30H_CPUS];
pvt->ops = &family_types[F16_M30H_CPUS].ops;
break;
}
fam_type = &family_types[F16_CPUS]; fam_type = &family_types[F16_CPUS];
pvt->ops = &family_types[F16_CPUS].ops; pvt->ops = &family_types[F16_CPUS].ops;
break; break;
...@@ -2830,6 +2854,14 @@ static const struct pci_device_id amd64_pci_table[] = { ...@@ -2830,6 +2854,14 @@ static const struct pci_device_id amd64_pci_table[] = {
.class = 0, .class = 0,
.class_mask = 0, .class_mask = 0,
}, },
{
.vendor = PCI_VENDOR_ID_AMD,
.device = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.class = 0,
.class_mask = 0,
},
{0, } {0, }
}; };
......
...@@ -168,6 +168,8 @@ ...@@ -168,6 +168,8 @@
#define PCI_DEVICE_ID_AMD_15H_NB_F2 0x1602 #define PCI_DEVICE_ID_AMD_15H_NB_F2 0x1602
#define PCI_DEVICE_ID_AMD_16H_NB_F1 0x1531 #define PCI_DEVICE_ID_AMD_16H_NB_F1 0x1531
#define PCI_DEVICE_ID_AMD_16H_NB_F2 0x1532 #define PCI_DEVICE_ID_AMD_16H_NB_F2 0x1532
#define PCI_DEVICE_ID_AMD_16H_M30H_NB_F1 0x1581
#define PCI_DEVICE_ID_AMD_16H_M30H_NB_F2 0x1582
/* /*
* Function 1 - Address Map * Function 1 - Address Map
...@@ -300,6 +302,7 @@ enum amd_families { ...@@ -300,6 +302,7 @@ enum amd_families {
F15_CPUS, F15_CPUS,
F15_M30H_CPUS, F15_M30H_CPUS,
F16_CPUS, F16_CPUS,
F16_M30H_CPUS,
NUM_FAMILIES, NUM_FAMILIES,
}; };
......
...@@ -350,6 +350,7 @@ static int amd8111_dev_probe(struct pci_dev *dev, ...@@ -350,6 +350,7 @@ static int amd8111_dev_probe(struct pci_dev *dev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
struct amd8111_dev_info *dev_info = &amd8111_devices[id->driver_data]; struct amd8111_dev_info *dev_info = &amd8111_devices[id->driver_data];
int ret = -ENODEV;
dev_info->dev = pci_get_device(PCI_VENDOR_ID_AMD, dev_info->dev = pci_get_device(PCI_VENDOR_ID_AMD,
dev_info->err_dev, NULL); dev_info->err_dev, NULL);
...@@ -359,16 +360,15 @@ static int amd8111_dev_probe(struct pci_dev *dev, ...@@ -359,16 +360,15 @@ static int amd8111_dev_probe(struct pci_dev *dev,
"vendor %x, device %x, name %s\n", "vendor %x, device %x, name %s\n",
PCI_VENDOR_ID_AMD, dev_info->err_dev, PCI_VENDOR_ID_AMD, dev_info->err_dev,
dev_info->ctl_name); dev_info->ctl_name);
return -ENODEV; goto err;
} }
if (pci_enable_device(dev_info->dev)) { if (pci_enable_device(dev_info->dev)) {
pci_dev_put(dev_info->dev);
printk(KERN_ERR "failed to enable:" printk(KERN_ERR "failed to enable:"
"vendor %x, device %x, name %s\n", "vendor %x, device %x, name %s\n",
PCI_VENDOR_ID_AMD, dev_info->err_dev, PCI_VENDOR_ID_AMD, dev_info->err_dev,
dev_info->ctl_name); dev_info->ctl_name);
return -ENODEV; goto err_dev_put;
} }
/* /*
...@@ -381,8 +381,10 @@ static int amd8111_dev_probe(struct pci_dev *dev, ...@@ -381,8 +381,10 @@ static int amd8111_dev_probe(struct pci_dev *dev,
edac_device_alloc_ctl_info(0, dev_info->ctl_name, 1, edac_device_alloc_ctl_info(0, dev_info->ctl_name, 1,
NULL, 0, 0, NULL, 0, 0,
NULL, 0, dev_info->edac_idx); NULL, 0, dev_info->edac_idx);
if (!dev_info->edac_dev) if (!dev_info->edac_dev) {
return -ENOMEM; ret = -ENOMEM;
goto err_dev_put;
}
dev_info->edac_dev->pvt_info = dev_info; dev_info->edac_dev->pvt_info = dev_info;
dev_info->edac_dev->dev = &dev_info->dev->dev; dev_info->edac_dev->dev = &dev_info->dev->dev;
...@@ -399,8 +401,7 @@ static int amd8111_dev_probe(struct pci_dev *dev, ...@@ -399,8 +401,7 @@ static int amd8111_dev_probe(struct pci_dev *dev,
if (edac_device_add_device(dev_info->edac_dev) > 0) { if (edac_device_add_device(dev_info->edac_dev) > 0) {
printk(KERN_ERR "failed to add edac_dev for %s\n", printk(KERN_ERR "failed to add edac_dev for %s\n",
dev_info->ctl_name); dev_info->ctl_name);
edac_device_free_ctl_info(dev_info->edac_dev); goto err_edac_free_ctl;
return -ENODEV;
} }
printk(KERN_INFO "added one edac_dev on AMD8111 " printk(KERN_INFO "added one edac_dev on AMD8111 "
...@@ -409,6 +410,13 @@ static int amd8111_dev_probe(struct pci_dev *dev, ...@@ -409,6 +410,13 @@ static int amd8111_dev_probe(struct pci_dev *dev,
dev_info->ctl_name); dev_info->ctl_name);
return 0; return 0;
err_edac_free_ctl:
edac_device_free_ctl_info(dev_info->edac_dev);
err_dev_put:
pci_dev_put(dev_info->dev);
err:
return ret;
} }
static void amd8111_dev_remove(struct pci_dev *dev) static void amd8111_dev_remove(struct pci_dev *dev)
...@@ -437,6 +445,7 @@ static int amd8111_pci_probe(struct pci_dev *dev, ...@@ -437,6 +445,7 @@ static int amd8111_pci_probe(struct pci_dev *dev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
struct amd8111_pci_info *pci_info = &amd8111_pcis[id->driver_data]; struct amd8111_pci_info *pci_info = &amd8111_pcis[id->driver_data];
int ret = -ENODEV;
pci_info->dev = pci_get_device(PCI_VENDOR_ID_AMD, pci_info->dev = pci_get_device(PCI_VENDOR_ID_AMD,
pci_info->err_dev, NULL); pci_info->err_dev, NULL);
...@@ -446,16 +455,15 @@ static int amd8111_pci_probe(struct pci_dev *dev, ...@@ -446,16 +455,15 @@ static int amd8111_pci_probe(struct pci_dev *dev,
"vendor %x, device %x, name %s\n", "vendor %x, device %x, name %s\n",
PCI_VENDOR_ID_AMD, pci_info->err_dev, PCI_VENDOR_ID_AMD, pci_info->err_dev,
pci_info->ctl_name); pci_info->ctl_name);
return -ENODEV; goto err;
} }
if (pci_enable_device(pci_info->dev)) { if (pci_enable_device(pci_info->dev)) {
pci_dev_put(pci_info->dev);
printk(KERN_ERR "failed to enable:" printk(KERN_ERR "failed to enable:"
"vendor %x, device %x, name %s\n", "vendor %x, device %x, name %s\n",
PCI_VENDOR_ID_AMD, pci_info->err_dev, PCI_VENDOR_ID_AMD, pci_info->err_dev,
pci_info->ctl_name); pci_info->ctl_name);
return -ENODEV; goto err_dev_put;
} }
/* /*
...@@ -465,8 +473,10 @@ static int amd8111_pci_probe(struct pci_dev *dev, ...@@ -465,8 +473,10 @@ static int amd8111_pci_probe(struct pci_dev *dev,
*/ */
pci_info->edac_idx = edac_pci_alloc_index(); pci_info->edac_idx = edac_pci_alloc_index();
pci_info->edac_dev = edac_pci_alloc_ctl_info(0, pci_info->ctl_name); pci_info->edac_dev = edac_pci_alloc_ctl_info(0, pci_info->ctl_name);
if (!pci_info->edac_dev) if (!pci_info->edac_dev) {
return -ENOMEM; ret = -ENOMEM;
goto err_dev_put;
}
pci_info->edac_dev->pvt_info = pci_info; pci_info->edac_dev->pvt_info = pci_info;
pci_info->edac_dev->dev = &pci_info->dev->dev; pci_info->edac_dev->dev = &pci_info->dev->dev;
...@@ -483,8 +493,7 @@ static int amd8111_pci_probe(struct pci_dev *dev, ...@@ -483,8 +493,7 @@ static int amd8111_pci_probe(struct pci_dev *dev,
if (edac_pci_add_device(pci_info->edac_dev, pci_info->edac_idx) > 0) { if (edac_pci_add_device(pci_info->edac_dev, pci_info->edac_idx) > 0) {
printk(KERN_ERR "failed to add edac_pci for %s\n", printk(KERN_ERR "failed to add edac_pci for %s\n",
pci_info->ctl_name); pci_info->ctl_name);
edac_pci_free_ctl_info(pci_info->edac_dev); goto err_edac_free_ctl;
return -ENODEV;
} }
printk(KERN_INFO "added one edac_pci on AMD8111 " printk(KERN_INFO "added one edac_pci on AMD8111 "
...@@ -493,6 +502,13 @@ static int amd8111_pci_probe(struct pci_dev *dev, ...@@ -493,6 +502,13 @@ static int amd8111_pci_probe(struct pci_dev *dev,
pci_info->ctl_name); pci_info->ctl_name);
return 0; return 0;
err_edac_free_ctl:
edac_pci_free_ctl_info(pci_info->edac_dev);
err_dev_put:
pci_dev_put(pci_info->dev);
err:
return ret;
} }
static void amd8111_pci_remove(struct pci_dev *dev) static void amd8111_pci_remove(struct pci_dev *dev)
......
...@@ -209,7 +209,6 @@ enum e752x_chips { ...@@ -209,7 +209,6 @@ enum e752x_chips {
*/ */
struct e752x_pvt { struct e752x_pvt {
struct pci_dev *bridge_ck;
struct pci_dev *dev_d0f0; struct pci_dev *dev_d0f0;
struct pci_dev *dev_d0f1; struct pci_dev *dev_d0f1;
u32 tolm; u32 tolm;
...@@ -891,7 +890,7 @@ static void e752x_get_error_info(struct mem_ctl_info *mci, ...@@ -891,7 +890,7 @@ static void e752x_get_error_info(struct mem_ctl_info *mci,
info->buf_ferr); info->buf_ferr);
if (info->dram_ferr) if (info->dram_ferr)
pci_write_bits16(pvt->bridge_ck, E752X_DRAM_FERR, pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_FERR,
info->dram_ferr, info->dram_ferr); info->dram_ferr, info->dram_ferr);
pci_write_config_dword(dev, E752X_FERR_GLOBAL, pci_write_config_dword(dev, E752X_FERR_GLOBAL,
...@@ -936,7 +935,7 @@ static void e752x_get_error_info(struct mem_ctl_info *mci, ...@@ -936,7 +935,7 @@ static void e752x_get_error_info(struct mem_ctl_info *mci,
info->buf_nerr); info->buf_nerr);
if (info->dram_nerr) if (info->dram_nerr)
pci_write_bits16(pvt->bridge_ck, E752X_DRAM_NERR, pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_NERR,
info->dram_nerr, info->dram_nerr); info->dram_nerr, info->dram_nerr);
pci_write_config_dword(dev, E752X_NERR_GLOBAL, pci_write_config_dword(dev, E752X_NERR_GLOBAL,
...@@ -1177,38 +1176,33 @@ static void e752x_init_mem_map_table(struct pci_dev *pdev, ...@@ -1177,38 +1176,33 @@ static void e752x_init_mem_map_table(struct pci_dev *pdev,
static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, static int e752x_get_devs(struct pci_dev *pdev, int dev_idx,
struct e752x_pvt *pvt) struct e752x_pvt *pvt)
{ {
struct pci_dev *dev; pvt->dev_d0f1 = pci_get_device(PCI_VENDOR_ID_INTEL,
pvt->dev_info->err_dev, NULL);
pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL,
pvt->dev_info->err_dev, pvt->bridge_ck);
if (pvt->bridge_ck == NULL) { if (pvt->dev_d0f1 == NULL) {
pvt->bridge_ck = pci_scan_single_device(pdev->bus, pvt->dev_d0f1 = pci_scan_single_device(pdev->bus,
PCI_DEVFN(0, 1)); PCI_DEVFN(0, 1));
pci_dev_get(pvt->bridge_ck); pci_dev_get(pvt->dev_d0f1);
} }
if (pvt->bridge_ck == NULL) { if (pvt->dev_d0f1 == NULL) {
e752x_printk(KERN_ERR, "error reporting device not found:" e752x_printk(KERN_ERR, "error reporting device not found:"
"vendor %x device 0x%x (broken BIOS?)\n", "vendor %x device 0x%x (broken BIOS?)\n",
PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev); PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev);
return 1; return 1;
} }
dev = pci_get_device(PCI_VENDOR_ID_INTEL, pvt->dev_d0f0 = pci_get_device(PCI_VENDOR_ID_INTEL,
e752x_devs[dev_idx].ctl_dev, e752x_devs[dev_idx].ctl_dev,
NULL); NULL);
if (dev == NULL) if (pvt->dev_d0f0 == NULL)
goto fail; goto fail;
pvt->dev_d0f0 = dev;
pvt->dev_d0f1 = pci_dev_get(pvt->bridge_ck);
return 0; return 0;
fail: fail:
pci_dev_put(pvt->bridge_ck); pci_dev_put(pvt->dev_d0f1);
return 1; return 1;
} }
...@@ -1385,7 +1379,6 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -1385,7 +1379,6 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
fail: fail:
pci_dev_put(pvt->dev_d0f0); pci_dev_put(pvt->dev_d0f0);
pci_dev_put(pvt->dev_d0f1); pci_dev_put(pvt->dev_d0f1);
pci_dev_put(pvt->bridge_ck);
edac_mc_free(mci); edac_mc_free(mci);
return -ENODEV; return -ENODEV;
...@@ -1419,7 +1412,6 @@ static void e752x_remove_one(struct pci_dev *pdev) ...@@ -1419,7 +1412,6 @@ static void e752x_remove_one(struct pci_dev *pdev)
pvt = (struct e752x_pvt *)mci->pvt_info; pvt = (struct e752x_pvt *)mci->pvt_info;
pci_dev_put(pvt->dev_d0f0); pci_dev_put(pvt->dev_d0f0);
pci_dev_put(pvt->dev_d0f1); pci_dev_put(pvt->dev_d0f1);
pci_dev_put(pvt->bridge_ck);
edac_mc_free(mci); edac_mc_free(mci);
} }
......
...@@ -464,6 +464,8 @@ static void i3200_remove_one(struct pci_dev *pdev) ...@@ -464,6 +464,8 @@ static void i3200_remove_one(struct pci_dev *pdev)
iounmap(priv->window); iounmap(priv->window);
edac_mc_free(mci); edac_mc_free(mci);
pci_disable_device(pdev);
} }
static const struct pci_device_id i3200_pci_tbl[] = { static const struct pci_device_id i3200_pci_tbl[] = {
......
...@@ -869,16 +869,13 @@ static void i5100_init_csrows(struct mem_ctl_info *mci) ...@@ -869,16 +869,13 @@ static void i5100_init_csrows(struct mem_ctl_info *mci)
chan, rank, 0); chan, rank, 0);
dimm->nr_pages = npages; dimm->nr_pages = npages;
if (npages) { dimm->grain = 32;
dimm->grain = 32; dimm->dtype = (priv->mtr[chan][rank].width == 4) ?
dimm->dtype = (priv->mtr[chan][rank].width == 4) ? DEV_X4 : DEV_X8;
DEV_X4 : DEV_X8; dimm->mtype = MEM_RDDR2;
dimm->mtype = MEM_RDDR2; dimm->edac_mode = EDAC_SECDED;
dimm->edac_mode = EDAC_SECDED; snprintf(dimm->label, sizeof(dimm->label), "DIMM%u",
snprintf(dimm->label, sizeof(dimm->label), i5100_rank_to_slot(mci, chan, rank));
"DIMM%u",
i5100_rank_to_slot(mci, chan, rank));
}
edac_dbg(2, "dimm channel %d, rank %d, size %ld\n", edac_dbg(2, "dimm channel %d, rank %d, size %ld\n",
chan, rank, (long)PAGES_TO_MiB(npages)); chan, rank, (long)PAGES_TO_MiB(npages));
......
...@@ -1408,6 +1408,8 @@ static void i5400_remove_one(struct pci_dev *pdev) ...@@ -1408,6 +1408,8 @@ static void i5400_remove_one(struct pci_dev *pdev)
/* retrieve references to resources, and free those resources */ /* retrieve references to resources, and free those resources */
i5400_put_devices(mci); i5400_put_devices(mci);
pci_disable_device(pdev);
edac_mc_free(mci); edac_mc_free(mci);
} }
......
...@@ -1708,7 +1708,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, ...@@ -1708,7 +1708,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
const struct mce *m) const struct mce *m)
{ {
struct i7core_pvt *pvt = mci->pvt_info; struct i7core_pvt *pvt = mci->pvt_info;
char *type, *optype, *err; char *optype, *err;
enum hw_event_mc_err_type tp_event; enum hw_event_mc_err_type tp_event;
unsigned long error = m->status & 0x1ff0000l; unsigned long error = m->status & 0x1ff0000l;
bool uncorrected_error = m->mcgstatus & 1ll << 61; bool uncorrected_error = m->mcgstatus & 1ll << 61;
...@@ -1721,15 +1721,11 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, ...@@ -1721,15 +1721,11 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
u32 errnum = find_first_bit(&error, 32); u32 errnum = find_first_bit(&error, 32);
if (uncorrected_error) { if (uncorrected_error) {
if (ripv) { if (ripv)
type = "FATAL";
tp_event = HW_EVENT_ERR_FATAL; tp_event = HW_EVENT_ERR_FATAL;
} else { else
type = "NON_FATAL";
tp_event = HW_EVENT_ERR_UNCORRECTED; tp_event = HW_EVENT_ERR_UNCORRECTED;
}
} else { } else {
type = "CORRECTED";
tp_event = HW_EVENT_ERR_CORRECTED; tp_event = HW_EVENT_ERR_CORRECTED;
} }
......
...@@ -406,8 +406,6 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -406,8 +406,6 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx)
edac_dbg(0, "\n"); edac_dbg(0, "\n");
ovrfl_pdev = pci_get_device(PCI_VEND_DEV(INTEL, 82875_6), NULL);
if (i82875p_setup_overfl_dev(pdev, &ovrfl_pdev, &ovrfl_window)) if (i82875p_setup_overfl_dev(pdev, &ovrfl_pdev, &ovrfl_window))
return -ENODEV; return -ENODEV;
drc = readl(ovrfl_window + I82875P_DRC); drc = readl(ovrfl_window + I82875P_DRC);
......
...@@ -741,6 +741,36 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ...@@ -741,6 +741,36 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
if (amd_filter_mce(m)) if (amd_filter_mce(m))
return NOTIFY_STOP; return NOTIFY_STOP;
pr_emerg(HW_ERR "%s\n", decode_error_status(m));
pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
m->extcpu,
c->x86, c->x86_model, c->x86_mask,
m->bank,
((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
((m->status & MCI_STATUS_UC) ? "UE" : "CE"),
((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
((m->status & MCI_STATUS_PCC) ? "PCC" : "-"),
((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
if (c->x86 == 0x15 || c->x86 == 0x16)
pr_cont("|%s|%s",
((m->status & MCI_STATUS_DEFERRED) ? "Deferred" : "-"),
((m->status & MCI_STATUS_POISON) ? "Poison" : "-"));
/* do the two bits[14:13] together */
ecc = (m->status >> 45) & 0x3;
if (ecc)
pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
pr_cont("]: 0x%016llx\n", m->status);
if (m->status & MCI_STATUS_ADDRV)
pr_emerg(HW_ERR "MC%d_ADDR: 0x%016llx\n", m->bank, m->addr);
if (!fam_ops)
goto err_code;
switch (m->bank) { switch (m->bank) {
case 0: case 0:
decode_mc0_mce(m); decode_mc0_mce(m);
...@@ -774,33 +804,7 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ...@@ -774,33 +804,7 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
break; break;
} }
pr_emerg(HW_ERR "Error Status: %s\n", decode_error_status(m)); err_code:
pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
m->extcpu,
c->x86, c->x86_model, c->x86_mask,
m->bank,
((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
((m->status & MCI_STATUS_UC) ? "UE" : "CE"),
((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
((m->status & MCI_STATUS_PCC) ? "PCC" : "-"),
((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
if (c->x86 == 0x15 || c->x86 == 0x16)
pr_cont("|%s|%s",
((m->status & MCI_STATUS_DEFERRED) ? "Deferred" : "-"),
((m->status & MCI_STATUS_POISON) ? "Poison" : "-"));
/* do the two bits[14:13] together */
ecc = (m->status >> 45) & 0x3;
if (ecc)
pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
pr_cont("]: 0x%016llx\n", m->status);
if (m->status & MCI_STATUS_ADDRV)
pr_emerg(HW_ERR "MC%d_ADDR: 0x%016llx\n", m->bank, m->addr);
amd_decode_err_code(m->status & 0xffff); amd_decode_err_code(m->status & 0xffff);
return NOTIFY_STOP; return NOTIFY_STOP;
...@@ -816,10 +820,7 @@ static int __init mce_amd_init(void) ...@@ -816,10 +820,7 @@ static int __init mce_amd_init(void)
struct cpuinfo_x86 *c = &boot_cpu_data; struct cpuinfo_x86 *c = &boot_cpu_data;
if (c->x86_vendor != X86_VENDOR_AMD) if (c->x86_vendor != X86_VENDOR_AMD)
return 0; return -ENODEV;
if (c->x86 < 0xf || c->x86 > 0x16)
return 0;
fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL); fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
if (!fam_ops) if (!fam_ops)
...@@ -874,7 +875,7 @@ static int __init mce_amd_init(void) ...@@ -874,7 +875,7 @@ static int __init mce_amd_init(void)
default: default:
printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86); printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86);
kfree(fam_ops); kfree(fam_ops);
return -EINVAL; fam_ops = NULL;
} }
pr_info("MCE: In-kernel MCE decoding enabled.\n"); pr_info("MCE: In-kernel MCE decoding enabled.\n");
......
...@@ -357,7 +357,7 @@ int mpc85xx_pci_err_probe(struct platform_device *op) ...@@ -357,7 +357,7 @@ int mpc85xx_pci_err_probe(struct platform_device *op)
pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0);
res = devm_request_irq(&op->dev, pdata->irq, res = devm_request_irq(&op->dev, pdata->irq,
mpc85xx_pci_isr, mpc85xx_pci_isr,
IRQF_DISABLED | IRQF_SHARED, IRQF_SHARED,
"[EDAC] PCI err", pci); "[EDAC] PCI err", pci);
if (res < 0) { if (res < 0) {
printk(KERN_ERR printk(KERN_ERR
...@@ -633,7 +633,7 @@ static int mpc85xx_l2_err_probe(struct platform_device *op) ...@@ -633,7 +633,7 @@ static int mpc85xx_l2_err_probe(struct platform_device *op)
if (edac_op_state == EDAC_OPSTATE_INT) { if (edac_op_state == EDAC_OPSTATE_INT) {
pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0);
res = devm_request_irq(&op->dev, pdata->irq, res = devm_request_irq(&op->dev, pdata->irq,
mpc85xx_l2_isr, IRQF_DISABLED, mpc85xx_l2_isr, 0,
"[EDAC] L2 err", edac_dev); "[EDAC] L2 err", edac_dev);
if (res < 0) { if (res < 0) {
printk(KERN_ERR printk(KERN_ERR
...@@ -1133,7 +1133,7 @@ static int mpc85xx_mc_err_probe(struct platform_device *op) ...@@ -1133,7 +1133,7 @@ static int mpc85xx_mc_err_probe(struct platform_device *op)
pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0);
res = devm_request_irq(&op->dev, pdata->irq, res = devm_request_irq(&op->dev, pdata->irq,
mpc85xx_mc_isr, mpc85xx_mc_isr,
IRQF_DISABLED | IRQF_SHARED, IRQF_SHARED,
"[EDAC] MC err", mci); "[EDAC] MC err", mci);
if (res < 0) { if (res < 0) {
printk(KERN_ERR "%s: Unable to request irq %d for " printk(KERN_ERR "%s: Unable to request irq %d for "
......
...@@ -1263,7 +1263,7 @@ static int sbridge_get_onedevice(struct pci_dev **prev, ...@@ -1263,7 +1263,7 @@ static int sbridge_get_onedevice(struct pci_dev **prev,
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
u8 bus = 0; u8 bus = 0;
sbridge_printk(KERN_INFO, sbridge_printk(KERN_DEBUG,
"Seeking for: dev %02x.%d PCI ID %04x:%04x\n", "Seeking for: dev %02x.%d PCI ID %04x:%04x\n",
dev_descr->dev, dev_descr->func, dev_descr->dev, dev_descr->func,
PCI_VENDOR_ID_INTEL, dev_descr->dev_id); PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
......
...@@ -528,6 +528,8 @@ ...@@ -528,6 +528,8 @@
#define PCI_DEVICE_ID_AMD_15H_NB_F5 0x1605 #define PCI_DEVICE_ID_AMD_15H_NB_F5 0x1605
#define PCI_DEVICE_ID_AMD_16H_NB_F3 0x1533 #define PCI_DEVICE_ID_AMD_16H_NB_F3 0x1533
#define PCI_DEVICE_ID_AMD_16H_NB_F4 0x1534 #define PCI_DEVICE_ID_AMD_16H_NB_F4 0x1534
#define PCI_DEVICE_ID_AMD_16H_M30H_NB_F3 0x1583
#define PCI_DEVICE_ID_AMD_16H_M30H_NB_F4 0x1584
#define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703 #define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703
#define PCI_DEVICE_ID_AMD_LANCE 0x2000 #define PCI_DEVICE_ID_AMD_LANCE 0x2000
#define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment