Commit 16a832a2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'edac_for_4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp

Pull EDAC updates from Borislav Petkov:

 - pnd2_edac: A minimal sideband driver (Tony Luck)

 - small-ish cleanups and fixes all over the place

* tag 'edac_for_4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp:
  EDAC, mce_amd: Get rid of local var in amd_filter_mce()
  EDAC, mce_amd: Get rid of most struct cpuinfo_x86 uses
  EDAC, mce_amd: Rename decode_smca_errors() to decode_smca_error()
  EDAC: Make device_type const
  EDAC, pnd2: Properly toggle hidden state for P2SB PCI device
  EDAC, pnd2: Conditionally unhide/hide the P2SB PCI device to read BAR
  EDAC, pnd2: Mask off the lower four bits of a BAR
  EDAC, thunderx: Fix error handling path in thunderx_lmc_probe()
  EDAC, altera: Fix error handling path in altr_edac_device_probe()
  EDAC, pnd2: Build in a minimal sideband driver for Apollo Lake
  EDAC, sb_edac: Classify memory mirroring modes
  EDAC, cpc925, ppc4xx: Convert to using %pOF instead of full_name
  EDAC: Get rid of mci->mod_ver
  EDAC: Constify attribute_group structures
  EDAC, mce_amd: Use cpu_to_node() to find the node ID
parents bafb0762 39844347
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include "edac_module.h" #include "edac_module.h"
#define EDAC_MOD_STR "altera_edac" #define EDAC_MOD_STR "altera_edac"
#define EDAC_VERSION "1"
#define EDAC_DEVICE "Altera" #define EDAC_DEVICE "Altera"
static const struct altr_sdram_prv_data c5_data = { static const struct altr_sdram_prv_data c5_data = {
...@@ -392,7 +391,6 @@ static int altr_sdram_probe(struct platform_device *pdev) ...@@ -392,7 +391,6 @@ static int altr_sdram_probe(struct platform_device *pdev)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = EDAC_VERSION;
mci->ctl_name = dev_name(&pdev->dev); mci->ctl_name = dev_name(&pdev->dev);
mci->scrub_mode = SCRUB_SW_SRC; mci->scrub_mode = SCRUB_SW_SRC;
mci->dev_name = dev_name(&pdev->dev); mci->dev_name = dev_name(&pdev->dev);
...@@ -749,8 +747,10 @@ static int altr_edac_device_probe(struct platform_device *pdev) ...@@ -749,8 +747,10 @@ static int altr_edac_device_probe(struct platform_device *pdev)
drvdata->edac_dev_name = ecc_name; drvdata->edac_dev_name = ecc_name;
drvdata->base = devm_ioremap(&pdev->dev, r->start, resource_size(r)); drvdata->base = devm_ioremap(&pdev->dev, r->start, resource_size(r));
if (!drvdata->base) if (!drvdata->base) {
res = -ENOMEM;
goto fail1; goto fail1;
}
/* Get driver specific data for this EDAC device */ /* Get driver specific data for this EDAC device */
drvdata->data = of_match_node(altr_edac_device_of_match, np)->data; drvdata->data = of_match_node(altr_edac_device_of_match, np)->data;
......
...@@ -3130,7 +3130,6 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci, ...@@ -3130,7 +3130,6 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci,
mci->edac_cap = determine_edac_cap(pvt); mci->edac_cap = determine_edac_cap(pvt);
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = EDAC_AMD64_VERSION;
mci->ctl_name = fam->ctl_name; mci->ctl_name = fam->ctl_name;
mci->dev_name = pci_name(pvt->F3); mci->dev_name = pci_name(pvt->F3);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define AMD76X_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "amd76x_edac" #define EDAC_MOD_STR "amd76x_edac"
#define amd76x_printk(level, fmt, arg...) \ #define amd76x_printk(level, fmt, arg...) \
...@@ -263,7 +262,6 @@ static int amd76x_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -263,7 +262,6 @@ static int amd76x_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_cap = ems_mode ? mci->edac_cap = ems_mode ?
(EDAC_FLAG_EC | EDAC_FLAG_SECDED) : EDAC_FLAG_NONE; (EDAC_FLAG_EC | EDAC_FLAG_SECDED) : EDAC_FLAG_NONE;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = AMD76X_REVISION;
mci->ctl_name = amd76x_devs[dev_idx].ctl_name; mci->ctl_name = amd76x_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = amd76x_check; mci->edac_check = amd76x_check;
......
...@@ -618,7 +618,7 @@ static u32 cpc925_cpu_mask_disabled(void) ...@@ -618,7 +618,7 @@ static u32 cpc925_cpu_mask_disabled(void)
} }
if (reg == NULL || *reg > 2) { if (reg == NULL || *reg > 2) {
cpc925_printk(KERN_ERR, "Bad reg value at %s\n", cpunode->full_name); cpc925_printk(KERN_ERR, "Bad reg value at %pOF\n", cpunode);
continue; continue;
} }
...@@ -999,7 +999,6 @@ static int cpc925_probe(struct platform_device *pdev) ...@@ -999,7 +999,6 @@ static int cpc925_probe(struct platform_device *pdev)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = CPC925_EDAC_MOD_STR; mci->mod_name = CPC925_EDAC_MOD_STR;
mci->mod_ver = CPC925_EDAC_REVISION;
mci->ctl_name = pdev->name; mci->ctl_name = pdev->name;
if (edac_op_state == EDAC_OPSTATE_POLL) if (edac_op_state == EDAC_OPSTATE_POLL)
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define E752X_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "e752x_edac" #define EDAC_MOD_STR "e752x_edac"
static int report_non_memory_errors; static int report_non_memory_errors;
...@@ -1303,7 +1302,6 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -1303,7 +1302,6 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
(EDAC_FLAG_NONE | EDAC_FLAG_SECDED | EDAC_FLAG_S4ECD4ED); (EDAC_FLAG_NONE | EDAC_FLAG_SECDED | EDAC_FLAG_S4ECD4ED);
/* FIXME - what if different memory types are in different csrows? */ /* FIXME - what if different memory types are in different csrows? */
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = E752X_REVISION;
mci->pdev = &pdev->dev; mci->pdev = &pdev->dev;
edac_dbg(3, "init pvt\n"); edac_dbg(3, "init pvt\n");
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define E7XXX_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "e7xxx_edac" #define EDAC_MOD_STR "e7xxx_edac"
#define e7xxx_printk(level, fmt, arg...) \ #define e7xxx_printk(level, fmt, arg...) \
...@@ -458,7 +457,6 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -458,7 +457,6 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx)
EDAC_FLAG_S4ECD4ED; EDAC_FLAG_S4ECD4ED;
/* FIXME - what if different memory types are in different csrows? */ /* FIXME - what if different memory types are in different csrows? */
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = E7XXX_REVISION;
mci->pdev = &pdev->dev; mci->pdev = &pdev->dev;
edac_dbg(3, "init pvt\n"); edac_dbg(3, "init pvt\n");
pvt = (struct e7xxx_pvt *)mci->pvt_info; pvt = (struct e7xxx_pvt *)mci->pvt_info;
......
...@@ -287,7 +287,7 @@ static struct attribute *csrow_attrs[] = { ...@@ -287,7 +287,7 @@ static struct attribute *csrow_attrs[] = {
NULL, NULL,
}; };
static struct attribute_group csrow_attr_grp = { static const struct attribute_group csrow_attr_grp = {
.attrs = csrow_attrs, .attrs = csrow_attrs,
}; };
...@@ -304,7 +304,7 @@ static void csrow_attr_release(struct device *dev) ...@@ -304,7 +304,7 @@ static void csrow_attr_release(struct device *dev)
kfree(csrow); kfree(csrow);
} }
static struct device_type csrow_attr_type = { static const struct device_type csrow_attr_type = {
.groups = csrow_attr_groups, .groups = csrow_attr_groups,
.release = csrow_attr_release, .release = csrow_attr_release,
}; };
...@@ -627,7 +627,7 @@ static struct attribute *dimm_attrs[] = { ...@@ -627,7 +627,7 @@ static struct attribute *dimm_attrs[] = {
NULL, NULL,
}; };
static struct attribute_group dimm_attr_grp = { static const struct attribute_group dimm_attr_grp = {
.attrs = dimm_attrs, .attrs = dimm_attrs,
}; };
...@@ -644,7 +644,7 @@ static void dimm_attr_release(struct device *dev) ...@@ -644,7 +644,7 @@ static void dimm_attr_release(struct device *dev)
kfree(dimm); kfree(dimm);
} }
static struct device_type dimm_attr_type = { static const struct device_type dimm_attr_type = {
.groups = dimm_attr_groups, .groups = dimm_attr_groups,
.release = dimm_attr_release, .release = dimm_attr_release,
}; };
...@@ -902,7 +902,7 @@ static umode_t mci_attr_is_visible(struct kobject *kobj, ...@@ -902,7 +902,7 @@ static umode_t mci_attr_is_visible(struct kobject *kobj,
return mode; return mode;
} }
static struct attribute_group mci_attr_grp = { static const struct attribute_group mci_attr_grp = {
.attrs = mci_attrs, .attrs = mci_attrs,
.is_visible = mci_attr_is_visible, .is_visible = mci_attr_is_visible,
}; };
...@@ -920,7 +920,7 @@ static void mci_attr_release(struct device *dev) ...@@ -920,7 +920,7 @@ static void mci_attr_release(struct device *dev)
kfree(mci); kfree(mci);
} }
static struct device_type mci_attr_type = { static const struct device_type mci_attr_type = {
.groups = mci_attr_groups, .groups = mci_attr_groups,
.release = mci_attr_release, .release = mci_attr_release,
}; };
...@@ -1074,7 +1074,7 @@ static void mc_attr_release(struct device *dev) ...@@ -1074,7 +1074,7 @@ static void mc_attr_release(struct device *dev)
kfree(dev); kfree(dev);
} }
static struct device_type mc_attr_type = { static const struct device_type mc_attr_type = {
.release = mc_attr_release, .release = mc_attr_release,
}; };
/* /*
......
...@@ -17,8 +17,6 @@ ...@@ -17,8 +17,6 @@
#include "edac_module.h" #include "edac_module.h"
#include <ras/ras_event.h> #include <ras/ras_event.h>
#define GHES_EDAC_REVISION " Ver: 1.0.0"
struct ghes_edac_pvt { struct ghes_edac_pvt {
struct list_head list; struct list_head list;
struct ghes *ghes; struct ghes *ghes;
...@@ -451,7 +449,6 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) ...@@ -451,7 +449,6 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "ghes_edac.c"; mci->mod_name = "ghes_edac.c";
mci->mod_ver = GHES_EDAC_REVISION;
mci->ctl_name = "ghes_edac"; mci->ctl_name = "ghes_edac";
mci->dev_name = "ghes"; mci->dev_name = "ghes";
......
...@@ -224,7 +224,6 @@ static int highbank_mc_probe(struct platform_device *pdev) ...@@ -224,7 +224,6 @@ static int highbank_mc_probe(struct platform_device *pdev)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = pdev->dev.driver->name; mci->mod_name = pdev->dev.driver->name;
mci->mod_ver = "1";
mci->ctl_name = id->compatible; mci->ctl_name = id->compatible;
mci->dev_name = dev_name(&pdev->dev); mci->dev_name = dev_name(&pdev->dev);
mci->scrub_mode = SCRUB_SW_SRC; mci->scrub_mode = SCRUB_SW_SRC;
......
...@@ -16,8 +16,6 @@ ...@@ -16,8 +16,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define I3000_REVISION "1.1"
#define EDAC_MOD_STR "i3000_edac" #define EDAC_MOD_STR "i3000_edac"
#define I3000_RANKS 8 #define I3000_RANKS 8
...@@ -375,7 +373,6 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -375,7 +373,6 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I3000_REVISION;
mci->ctl_name = i3000_devs[dev_idx].ctl_name; mci->ctl_name = i3000_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i3000_check; mci->edac_check = i3000_check;
......
...@@ -17,8 +17,6 @@ ...@@ -17,8 +17,6 @@
#include <linux/io-64-nonatomic-lo-hi.h> #include <linux/io-64-nonatomic-lo-hi.h>
#define I3200_REVISION "1.1"
#define EDAC_MOD_STR "i3200_edac" #define EDAC_MOD_STR "i3200_edac"
#define PCI_DEVICE_ID_INTEL_3200_HB 0x29f0 #define PCI_DEVICE_ID_INTEL_3200_HB 0x29f0
...@@ -375,7 +373,6 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -375,7 +373,6 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I3200_REVISION;
mci->ctl_name = i3200_devs[dev_idx].ctl_name; mci->ctl_name = i3200_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i3200_check; mci->edac_check = i3200_check;
......
...@@ -1430,7 +1430,6 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -1430,7 +1430,6 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "i5000_edac.c"; mci->mod_name = "i5000_edac.c";
mci->mod_ver = I5000_REVISION;
mci->ctl_name = i5000_devs[dev_idx].ctl_name; mci->ctl_name = i5000_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -1108,7 +1108,6 @@ static int i5100_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1108,7 +1108,6 @@ static int i5100_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
mci->edac_ctl_cap = EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = "i5100_edac.c"; mci->mod_name = "i5100_edac.c";
mci->mod_ver = "not versioned";
mci->ctl_name = "i5100"; mci->ctl_name = "i5100";
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -1315,7 +1315,6 @@ static int i5400_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -1315,7 +1315,6 @@ static int i5400_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "i5400_edac.c"; mci->mod_name = "i5400_edac.c";
mci->mod_ver = I5400_REVISION;
mci->ctl_name = i5400_devs[dev_idx].ctl_name; mci->ctl_name = i5400_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -1077,7 +1077,6 @@ static int i7300_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1077,7 +1077,6 @@ static int i7300_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "i7300_edac.c"; mci->mod_name = "i7300_edac.c";
mci->mod_ver = I7300_REVISION;
mci->ctl_name = i7300_devs[0].ctl_name; mci->ctl_name = i7300_devs[0].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -1079,7 +1079,7 @@ static struct attribute *i7core_addrmatch_attrs[] = { ...@@ -1079,7 +1079,7 @@ static struct attribute *i7core_addrmatch_attrs[] = {
NULL NULL
}; };
static struct attribute_group addrmatch_grp = { static const struct attribute_group addrmatch_grp = {
.attrs = i7core_addrmatch_attrs, .attrs = i7core_addrmatch_attrs,
}; };
...@@ -1094,7 +1094,7 @@ static void addrmatch_release(struct device *device) ...@@ -1094,7 +1094,7 @@ static void addrmatch_release(struct device *device)
kfree(device); kfree(device);
} }
static struct device_type addrmatch_type = { static const struct device_type addrmatch_type = {
.groups = addrmatch_groups, .groups = addrmatch_groups,
.release = addrmatch_release, .release = addrmatch_release,
}; };
...@@ -1110,7 +1110,7 @@ static struct attribute *i7core_udimm_counters_attrs[] = { ...@@ -1110,7 +1110,7 @@ static struct attribute *i7core_udimm_counters_attrs[] = {
NULL NULL
}; };
static struct attribute_group all_channel_counts_grp = { static const struct attribute_group all_channel_counts_grp = {
.attrs = i7core_udimm_counters_attrs, .attrs = i7core_udimm_counters_attrs,
}; };
...@@ -1125,7 +1125,7 @@ static void all_channel_counts_release(struct device *device) ...@@ -1125,7 +1125,7 @@ static void all_channel_counts_release(struct device *device)
kfree(device); kfree(device);
} }
static struct device_type all_channel_counts_type = { static const struct device_type all_channel_counts_type = {
.groups = all_channel_counts_groups, .groups = all_channel_counts_groups,
.release = all_channel_counts_release, .release = all_channel_counts_release,
}; };
...@@ -2159,7 +2159,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev) ...@@ -2159,7 +2159,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "i7core_edac.c"; mci->mod_name = "i7core_edac.c";
mci->mod_ver = I7CORE_REVISION;
mci->ctl_name = kasprintf(GFP_KERNEL, "i7 core #%d", mci->ctl_name = kasprintf(GFP_KERNEL, "i7 core #%d",
i7core_dev->socket); i7core_dev->socket);
mci->dev_name = pci_name(i7core_dev->pdev[0]); mci->dev_name = pci_name(i7core_dev->pdev[0]);
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define I82443_REVISION "0.1"
#define EDAC_MOD_STR "i82443bxgx_edac" #define EDAC_MOD_STR "i82443bxgx_edac"
/* The 82443BX supports SDRAM, or EDO (EDO for mobile only), "Memory /* The 82443BX supports SDRAM, or EDO (EDO for mobile only), "Memory
...@@ -320,7 +318,6 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -320,7 +318,6 @@ static int i82443bxgx_edacmc_probe1(struct pci_dev *pdev, int dev_idx)
I82443BXGX_EAP_OFFSET_MBE)); I82443BXGX_EAP_OFFSET_MBE));
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I82443_REVISION;
mci->ctl_name = "I82443BXGX"; mci->ctl_name = "I82443BXGX";
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i82443bxgx_edacmc_check; mci->edac_check = i82443bxgx_edacmc_check;
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define I82860_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "i82860_edac" #define EDAC_MOD_STR "i82860_edac"
#define i82860_printk(level, fmt, arg...) \ #define i82860_printk(level, fmt, arg...) \
...@@ -216,7 +215,6 @@ static int i82860_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -216,7 +215,6 @@ static int i82860_probe1(struct pci_dev *pdev, int dev_idx)
/* I"m not sure about this but I think that all RDRAM is SECDED */ /* I"m not sure about this but I think that all RDRAM is SECDED */
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I82860_REVISION;
mci->ctl_name = i82860_devs[dev_idx].ctl_name; mci->ctl_name = i82860_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i82860_check; mci->edac_check = i82860_check;
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define I82875P_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "i82875p_edac" #define EDAC_MOD_STR "i82875p_edac"
#define i82875p_printk(level, fmt, arg...) \ #define i82875p_printk(level, fmt, arg...) \
...@@ -423,7 +422,6 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -423,7 +422,6 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_UNKNOWN; mci->edac_cap = EDAC_FLAG_UNKNOWN;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I82875P_REVISION;
mci->ctl_name = i82875p_devs[dev_idx].ctl_name; mci->ctl_name = i82875p_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i82875p_check; mci->edac_check = i82875p_check;
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define I82975X_REVISION " Ver: 1.0.0"
#define EDAC_MOD_STR "i82975x_edac" #define EDAC_MOD_STR "i82975x_edac"
#define i82975x_printk(level, fmt, arg...) \ #define i82975x_printk(level, fmt, arg...) \
...@@ -564,7 +563,6 @@ static int i82975x_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -564,7 +563,6 @@ static int i82975x_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = I82975X_REVISION;
mci->ctl_name = i82975x_devs[dev_idx].ctl_name; mci->ctl_name = i82975x_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = i82975x_check; mci->edac_check = i82975x_check;
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include <linux/io-64-nonatomic-lo-hi.h> #include <linux/io-64-nonatomic-lo-hi.h>
#include "edac_module.h" #include "edac_module.h"
#define IE31200_REVISION "1.0"
#define EDAC_MOD_STR "ie31200_edac" #define EDAC_MOD_STR "ie31200_edac"
#define ie31200_printk(level, fmt, arg...) \ #define ie31200_printk(level, fmt, arg...) \
...@@ -420,7 +419,6 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -420,7 +419,6 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_ctl_cap = EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = IE31200_REVISION;
mci->ctl_name = ie31200_devs[dev_idx].ctl_name; mci->ctl_name = ie31200_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = ie31200_check; mci->edac_check = ie31200_check;
......
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <asm/cpu.h>
#include "mce_amd.h" #include "mce_amd.h"
static struct amd_decoder_ops *fam_ops; static struct amd_decoder_ops *fam_ops;
...@@ -744,7 +746,7 @@ static void decode_mc3_mce(struct mce *m) ...@@ -744,7 +746,7 @@ static void decode_mc3_mce(struct mce *m)
static void decode_mc4_mce(struct mce *m) static void decode_mc4_mce(struct mce *m)
{ {
struct cpuinfo_x86 *c = &boot_cpu_data; unsigned int fam = x86_family(m->cpuid);
int node_id = amd_get_nb_id(m->extcpu); int node_id = amd_get_nb_id(m->extcpu);
u16 ec = EC(m->status); u16 ec = EC(m->status);
u8 xec = XEC(m->status, 0x1f); u8 xec = XEC(m->status, 0x1f);
...@@ -758,7 +760,7 @@ static void decode_mc4_mce(struct mce *m) ...@@ -758,7 +760,7 @@ static void decode_mc4_mce(struct mce *m)
/* special handling for DRAM ECCs */ /* special handling for DRAM ECCs */
if (xec == 0x0 || xec == 0x8) { if (xec == 0x0 || xec == 0x8) {
/* no ECCs on F11h */ /* no ECCs on F11h */
if (c->x86 == 0x11) if (fam == 0x11)
goto wrong_mc4_mce; goto wrong_mc4_mce;
pr_cont("%s.\n", mc4_mce_desc[xec]); pr_cont("%s.\n", mc4_mce_desc[xec]);
...@@ -779,7 +781,7 @@ static void decode_mc4_mce(struct mce *m) ...@@ -779,7 +781,7 @@ static void decode_mc4_mce(struct mce *m)
return; return;
case 0x19: case 0x19:
if (boot_cpu_data.x86 == 0x15 || boot_cpu_data.x86 == 0x16) if (fam == 0x15 || fam == 0x16)
pr_cont("Compute Unit Data Error.\n"); pr_cont("Compute Unit Data Error.\n");
else else
goto wrong_mc4_mce; goto wrong_mc4_mce;
...@@ -802,11 +804,11 @@ static void decode_mc4_mce(struct mce *m) ...@@ -802,11 +804,11 @@ static void decode_mc4_mce(struct mce *m)
static void decode_mc5_mce(struct mce *m) static void decode_mc5_mce(struct mce *m)
{ {
struct cpuinfo_x86 *c = &boot_cpu_data; unsigned int fam = x86_family(m->cpuid);
u16 ec = EC(m->status); u16 ec = EC(m->status);
u8 xec = XEC(m->status, xec_mask); u8 xec = XEC(m->status, xec_mask);
if (c->x86 == 0xf || c->x86 == 0x11) if (fam == 0xf || fam == 0x11)
goto wrong_mc5_mce; goto wrong_mc5_mce;
pr_emerg(HW_ERR "MC5 Error: "); pr_emerg(HW_ERR "MC5 Error: ");
...@@ -849,7 +851,7 @@ static void decode_mc6_mce(struct mce *m) ...@@ -849,7 +851,7 @@ static void decode_mc6_mce(struct mce *m)
} }
/* Decode errors according to Scalable MCA specification */ /* Decode errors according to Scalable MCA specification */
static void decode_smca_errors(struct mce *m) static void decode_smca_error(struct mce *m)
{ {
struct smca_hwid *hwid; struct smca_hwid *hwid;
unsigned int bank_type; unsigned int bank_type;
...@@ -859,7 +861,7 @@ static void decode_smca_errors(struct mce *m) ...@@ -859,7 +861,7 @@ static void decode_smca_errors(struct mce *m)
if (m->bank >= ARRAY_SIZE(smca_banks)) if (m->bank >= ARRAY_SIZE(smca_banks))
return; return;
if (boot_cpu_data.x86 >= 0x17 && m->bank == 4) if (x86_family(m->cpuid) >= 0x17 && m->bank == 4)
pr_emerg(HW_ERR "Bank 4 is reserved on Fam17h.\n"); pr_emerg(HW_ERR "Bank 4 is reserved on Fam17h.\n");
hwid = smca_banks[m->bank].hwid; hwid = smca_banks[m->bank].hwid;
...@@ -878,12 +880,8 @@ static void decode_smca_errors(struct mce *m) ...@@ -878,12 +880,8 @@ static void decode_smca_errors(struct mce *m)
pr_cont("%s.\n", smca_mce_descs[bank_type].descs[xec]); pr_cont("%s.\n", smca_mce_descs[bank_type].descs[xec]);
} }
/*
* amd_get_nb_id() returns the last level cache id.
* The last level cache on Fam17h is 1 level below the node.
*/
if (bank_type == SMCA_UMC && xec == 0 && decode_dram_ecc) if (bank_type == SMCA_UMC && xec == 0 && decode_dram_ecc)
decode_dram_ecc(amd_get_nb_id(m->extcpu) >> 1, m); decode_dram_ecc(cpu_to_node(m->extcpu), m);
} }
static inline void amd_decode_err_code(u16 ec) static inline void amd_decode_err_code(u16 ec)
...@@ -915,12 +913,10 @@ static inline void amd_decode_err_code(u16 ec) ...@@ -915,12 +913,10 @@ static inline void amd_decode_err_code(u16 ec)
*/ */
static bool amd_filter_mce(struct mce *m) static bool amd_filter_mce(struct mce *m)
{ {
u8 xec = (m->status >> 16) & 0x1f;
/* /*
* NB GART TLB error reporting is disabled by default. * NB GART TLB error reporting is disabled by default.
*/ */
if (m->bank == 4 && xec == 0x5 && !report_gart_errors) if (m->bank == 4 && XEC(m->status, 0x1f) == 0x5 && !report_gart_errors)
return true; return true;
return false; return false;
...@@ -946,7 +942,7 @@ static int ...@@ -946,7 +942,7 @@ static int
amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
{ {
struct mce *m = (struct mce *)data; struct mce *m = (struct mce *)data;
struct cpuinfo_x86 *c = &cpu_data(m->extcpu); unsigned int fam = x86_family(m->cpuid);
int ecc; int ecc;
if (amd_filter_mce(m)) if (amd_filter_mce(m))
...@@ -956,7 +952,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ...@@ -956,7 +952,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s", pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
m->extcpu, m->extcpu,
c->x86, c->x86_model, c->x86_mask, fam, x86_model(m->cpuid), x86_stepping(m->cpuid),
m->bank, m->bank,
((m->status & MCI_STATUS_OVER) ? "Over" : "-"), ((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
((m->status & MCI_STATUS_UC) ? "UE" : ((m->status & MCI_STATUS_UC) ? "UE" :
...@@ -965,11 +961,11 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ...@@ -965,11 +961,11 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
((m->status & MCI_STATUS_PCC) ? "PCC" : "-"), ((m->status & MCI_STATUS_PCC) ? "PCC" : "-"),
((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-")); ((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
if (c->x86 >= 0x15) { if (fam >= 0x15) {
pr_cont("|%s", (m->status & MCI_STATUS_DEFERRED ? "Deferred" : "-")); pr_cont("|%s", (m->status & MCI_STATUS_DEFERRED ? "Deferred" : "-"));
/* F15h, bank4, bit 43 is part of McaStatSubCache. */ /* F15h, bank4, bit 43 is part of McaStatSubCache. */
if (c->x86 != 0x15 || m->bank != 4) if (fam != 0x15 || m->bank != 4)
pr_cont("|%s", (m->status & MCI_STATUS_POISON ? "Poison" : "-")); pr_cont("|%s", (m->status & MCI_STATUS_POISON ? "Poison" : "-"));
} }
...@@ -1002,7 +998,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ...@@ -1002,7 +998,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
pr_cont("\n"); pr_cont("\n");
decode_smca_errors(m); decode_smca_error(m);
goto err_code; goto err_code;
} }
......
...@@ -766,7 +766,6 @@ static int mv64x60_mc_err_probe(struct platform_device *pdev) ...@@ -766,7 +766,6 @@ static int mv64x60_mc_err_probe(struct platform_device *pdev)
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = MV64x60_REVISION;
mci->ctl_name = mv64x60_ctl_name; mci->ctl_name = mv64x60_ctl_name;
if (edac_op_state == EDAC_OPSTATE_POLL) if (edac_op_state == EDAC_OPSTATE_POLL)
......
...@@ -129,42 +129,72 @@ static struct mem_ctl_info *pnd2_mci; ...@@ -129,42 +129,72 @@ static struct mem_ctl_info *pnd2_mci;
#define GET_BITFIELD(v, lo, hi) (((v) & GENMASK_ULL(hi, lo)) >> (lo)) #define GET_BITFIELD(v, lo, hi) (((v) & GENMASK_ULL(hi, lo)) >> (lo))
#define U64_LSHIFT(val, s) ((u64)(val) << (s)) #define U64_LSHIFT(val, s) ((u64)(val) << (s))
#ifdef CONFIG_X86_INTEL_SBI_APL /*
#include "linux/platform_data/sbi_apl.h" * On Apollo Lake we access memory controller registers via a
static int sbi_send(int port, int off, int op, u32 *data) * side-band mailbox style interface in a hidden PCI device
* configuration space.
*/
static struct pci_bus *p2sb_bus;
#define P2SB_DEVFN PCI_DEVFN(0xd, 0)
#define P2SB_ADDR_OFF 0xd0
#define P2SB_DATA_OFF 0xd4
#define P2SB_STAT_OFF 0xd8
#define P2SB_ROUT_OFF 0xda
#define P2SB_EADD_OFF 0xdc
#define P2SB_HIDE_OFF 0xe1
#define P2SB_BUSY 1
#define P2SB_READ(size, off, ptr) \
pci_bus_read_config_##size(p2sb_bus, P2SB_DEVFN, off, ptr)
#define P2SB_WRITE(size, off, val) \
pci_bus_write_config_##size(p2sb_bus, P2SB_DEVFN, off, val)
static bool p2sb_is_busy(u16 *status)
{ {
struct sbi_apl_message sbi_arg; P2SB_READ(word, P2SB_STAT_OFF, status);
int ret, read = 0;
memset(&sbi_arg, 0, sizeof(sbi_arg)); return !!(*status & P2SB_BUSY);
}
if (op == 0 || op == 4 || op == 6) static int _apl_rd_reg(int port, int off, int op, u32 *data)
read = 1; {
else int retries = 0xff, ret;
sbi_arg.data = *data; u16 status;
u8 hidden;
/* Unhide the P2SB device, if it's hidden */
P2SB_READ(byte, P2SB_HIDE_OFF, &hidden);
if (hidden)
P2SB_WRITE(byte, P2SB_HIDE_OFF, 0);
if (p2sb_is_busy(&status)) {
ret = -EAGAIN;
goto out;
}
sbi_arg.opcode = op; P2SB_WRITE(dword, P2SB_ADDR_OFF, (port << 24) | off);
sbi_arg.port_address = port; P2SB_WRITE(dword, P2SB_DATA_OFF, 0);
sbi_arg.register_offset = off; P2SB_WRITE(dword, P2SB_EADD_OFF, 0);
ret = sbi_apl_commit(&sbi_arg); P2SB_WRITE(word, P2SB_ROUT_OFF, 0);
if (ret || sbi_arg.status) P2SB_WRITE(word, P2SB_STAT_OFF, (op << 8) | P2SB_BUSY);
edac_dbg(2, "sbi_send status=%d ret=%d data=%x\n",
sbi_arg.status, ret, sbi_arg.data);
if (ret == 0) while (p2sb_is_busy(&status)) {
ret = sbi_arg.status; if (retries-- == 0) {
ret = -EBUSY;
goto out;
}
}
if (ret == 0 && read) P2SB_READ(dword, P2SB_DATA_OFF, data);
*data = sbi_arg.data; ret = (status >> 1) & 0x3;
out:
/* Hide the P2SB device, if it was hidden before */
if (hidden)
P2SB_WRITE(byte, P2SB_HIDE_OFF, hidden);
return ret; return ret;
} }
#else
static int sbi_send(int port, int off, int op, u32 *data)
{
return -EUNATCH;
}
#endif
static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *name) static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
{ {
...@@ -173,10 +203,10 @@ static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *na ...@@ -173,10 +203,10 @@ static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *na
edac_dbg(2, "Read %s port=%x off=%x op=%x\n", name, port, off, op); edac_dbg(2, "Read %s port=%x off=%x op=%x\n", name, port, off, op);
switch (sz) { switch (sz) {
case 8: case 8:
ret = sbi_send(port, off + 4, op, (u32 *)(data + 4)); ret = _apl_rd_reg(port, off + 4, op, (u32 *)(data + 4));
/* fall through */ /* fall through */
case 4: case 4:
ret |= sbi_send(port, off, op, (u32 *)data); ret |= _apl_rd_reg(port, off, op, (u32 *)data);
pnd2_printk(KERN_DEBUG, "%s=%x%08x ret=%d\n", name, pnd2_printk(KERN_DEBUG, "%s=%x%08x ret=%d\n", name,
sz == 8 ? *((u32 *)(data + 4)) : 0, *((u32 *)data), ret); sz == 8 ? *((u32 *)(data + 4)) : 0, *((u32 *)data), ret);
break; break;
...@@ -212,11 +242,23 @@ static u64 get_sideband_reg_base_addr(void) ...@@ -212,11 +242,23 @@ static u64 get_sideband_reg_base_addr(void)
{ {
struct pci_dev *pdev; struct pci_dev *pdev;
u32 hi, lo; u32 hi, lo;
u8 hidden;
pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x19dd, NULL); pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x19dd, NULL);
if (pdev) { if (pdev) {
/* Unhide the P2SB device, if it's hidden */
pci_read_config_byte(pdev, 0xe1, &hidden);
if (hidden)
pci_write_config_byte(pdev, 0xe1, 0);
pci_read_config_dword(pdev, 0x10, &lo); pci_read_config_dword(pdev, 0x10, &lo);
pci_read_config_dword(pdev, 0x14, &hi); pci_read_config_dword(pdev, 0x14, &hi);
lo &= 0xfffffff0;
/* Hide the P2SB device, if it was hidden before */
if (hidden)
pci_write_config_byte(pdev, 0xe1, hidden);
pci_dev_put(pdev); pci_dev_put(pdev);
return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0)); return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0));
} else { } else {
...@@ -1515,6 +1557,12 @@ static int __init pnd2_init(void) ...@@ -1515,6 +1557,12 @@ static int __init pnd2_init(void)
ops = (struct dunit_ops *)id->driver_data; ops = (struct dunit_ops *)id->driver_data;
if (ops->type == APL) {
p2sb_bus = pci_find_bus(0, 0);
if (!p2sb_bus)
return -ENODEV;
}
/* Ensure that the OPSTATE is set correctly for POLL or NMI */ /* Ensure that the OPSTATE is set correctly for POLL or NMI */
opstate_init(); opstate_init();
......
...@@ -1063,7 +1063,6 @@ static int ppc4xx_edac_mc_init(struct mem_ctl_info *mci, ...@@ -1063,7 +1063,6 @@ static int ppc4xx_edac_mc_init(struct mem_ctl_info *mci,
/* Initialize strings */ /* Initialize strings */
mci->mod_name = PPC4XX_EDAC_MODULE_NAME; mci->mod_name = PPC4XX_EDAC_MODULE_NAME;
mci->mod_ver = PPC4XX_EDAC_MODULE_REVISION;
mci->ctl_name = ppc4xx_edac_match->compatible, mci->ctl_name = ppc4xx_edac_match->compatible,
mci->dev_name = np->full_name; mci->dev_name = np->full_name;
...@@ -1267,8 +1266,8 @@ static int ppc4xx_edac_probe(struct platform_device *op) ...@@ -1267,8 +1266,8 @@ static int ppc4xx_edac_probe(struct platform_device *op)
memcheck = (mcopt1 & SDRAM_MCOPT1_MCHK_MASK); memcheck = (mcopt1 & SDRAM_MCOPT1_MCHK_MASK);
if (memcheck == SDRAM_MCOPT1_MCHK_NON) { if (memcheck == SDRAM_MCOPT1_MCHK_NON) {
ppc4xx_edac_printk(KERN_INFO, "%s: No ECC memory detected or " ppc4xx_edac_printk(KERN_INFO, "%pOF: No ECC memory detected or "
"ECC is disabled.\n", np->full_name); "ECC is disabled.\n", np);
status = -ENODEV; status = -ENODEV;
goto done; goto done;
} }
...@@ -1287,9 +1286,9 @@ static int ppc4xx_edac_probe(struct platform_device *op) ...@@ -1287,9 +1286,9 @@ static int ppc4xx_edac_probe(struct platform_device *op)
mci = edac_mc_alloc(ppc4xx_edac_instance, ARRAY_SIZE(layers), layers, mci = edac_mc_alloc(ppc4xx_edac_instance, ARRAY_SIZE(layers), layers,
sizeof(struct ppc4xx_edac_pdata)); sizeof(struct ppc4xx_edac_pdata));
if (mci == NULL) { if (mci == NULL) {
ppc4xx_edac_printk(KERN_ERR, "%s: " ppc4xx_edac_printk(KERN_ERR, "%pOF: "
"Failed to allocate EDAC MC instance!\n", "Failed to allocate EDAC MC instance!\n",
np->full_name); np);
status = -ENOMEM; status = -ENOMEM;
goto done; goto done;
} }
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <linux/edac.h> #include <linux/edac.h>
#include "edac_module.h" #include "edac_module.h"
#define R82600_REVISION " Ver: 2.0.2"
#define EDAC_MOD_STR "r82600_edac" #define EDAC_MOD_STR "r82600_edac"
#define r82600_printk(level, fmt, arg...) \ #define r82600_printk(level, fmt, arg...) \
...@@ -316,7 +315,6 @@ static int r82600_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -316,7 +315,6 @@ static int r82600_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = R82600_REVISION;
mci->ctl_name = "R82600"; mci->ctl_name = "R82600";
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = r82600_check; mci->edac_check = r82600_check;
......
...@@ -300,6 +300,12 @@ enum domain { ...@@ -300,6 +300,12 @@ enum domain {
SOCK, SOCK,
}; };
enum mirroring_mode {
NON_MIRRORING,
ADDR_RANGE_MIRRORING,
FULL_MIRRORING,
};
struct sbridge_pvt; struct sbridge_pvt;
struct sbridge_info { struct sbridge_info {
enum type type; enum type type;
...@@ -377,8 +383,9 @@ struct sbridge_pvt { ...@@ -377,8 +383,9 @@ struct sbridge_pvt {
struct sbridge_channel channel[NUM_CHANNELS]; struct sbridge_channel channel[NUM_CHANNELS];
/* Memory type detection */ /* Memory type detection */
bool is_mirrored, is_lockstep, is_close_pg; bool is_cur_addr_mirrored, is_lockstep, is_close_pg;
bool is_chan_hash; bool is_chan_hash;
enum mirroring_mode mirror_mode;
/* Memory description */ /* Memory description */
u64 tolm, tohm; u64 tolm, tohm;
...@@ -1648,10 +1655,6 @@ static int get_dimm_config(struct mem_ctl_info *mci) ...@@ -1648,10 +1655,6 @@ static int get_dimm_config(struct mem_ctl_info *mci)
enum edac_type mode; enum edac_type mode;
u32 reg; u32 reg;
if (pvt->info.type == HASWELL || pvt->info.type == BROADWELL) {
pci_read_config_dword(pvt->pci_ha, HASWELL_HASYSDEFEATURE2, &reg);
pvt->is_chan_hash = GET_BITFIELD(reg, 21, 21);
}
pvt->sbridge_dev->node_id = pvt->info.get_node_id(pvt); pvt->sbridge_dev->node_id = pvt->info.get_node_id(pvt);
edac_dbg(0, "mc#%d: Node ID: %d, source ID: %d\n", edac_dbg(0, "mc#%d: Node ID: %d, source ID: %d\n",
pvt->sbridge_dev->mc, pvt->sbridge_dev->mc,
...@@ -1663,22 +1666,45 @@ static int get_dimm_config(struct mem_ctl_info *mci) ...@@ -1663,22 +1666,45 @@ static int get_dimm_config(struct mem_ctl_info *mci)
*/ */
if (pvt->info.type == KNIGHTS_LANDING) { if (pvt->info.type == KNIGHTS_LANDING) {
mode = EDAC_S4ECD4ED; mode = EDAC_S4ECD4ED;
pvt->is_mirrored = false; pvt->mirror_mode = NON_MIRRORING;
pvt->is_cur_addr_mirrored = false;
if (knl_get_dimm_capacity(pvt, knl_mc_sizes) != 0) if (knl_get_dimm_capacity(pvt, knl_mc_sizes) != 0)
return -1; return -1;
pci_read_config_dword(pvt->pci_ta, KNL_MCMTR, &pvt->info.mcmtr); if (pci_read_config_dword(pvt->pci_ta, KNL_MCMTR, &pvt->info.mcmtr)) {
edac_dbg(0, "Failed to read KNL_MCMTR register\n");
return -ENODEV;
}
} else { } else {
pci_read_config_dword(pvt->pci_ras, RASENABLES, &reg); if (pvt->info.type == HASWELL || pvt->info.type == BROADWELL) {
if (pci_read_config_dword(pvt->pci_ha, HASWELL_HASYSDEFEATURE2, &reg)) {
edac_dbg(0, "Failed to read HASWELL_HASYSDEFEATURE2 register\n");
return -ENODEV;
}
pvt->is_chan_hash = GET_BITFIELD(reg, 21, 21);
if (GET_BITFIELD(reg, 28, 28)) {
pvt->mirror_mode = ADDR_RANGE_MIRRORING;
edac_dbg(0, "Address range partial memory mirroring is enabled\n");
goto next;
}
}
if (pci_read_config_dword(pvt->pci_ras, RASENABLES, &reg)) {
edac_dbg(0, "Failed to read RASENABLES register\n");
return -ENODEV;
}
if (IS_MIRROR_ENABLED(reg)) { if (IS_MIRROR_ENABLED(reg)) {
edac_dbg(0, "Memory mirror is enabled\n"); pvt->mirror_mode = FULL_MIRRORING;
pvt->is_mirrored = true; edac_dbg(0, "Full memory mirroring is enabled\n");
} else { } else {
edac_dbg(0, "Memory mirror is disabled\n"); pvt->mirror_mode = NON_MIRRORING;
pvt->is_mirrored = false; edac_dbg(0, "Memory mirroring is disabled\n");
} }
pci_read_config_dword(pvt->pci_ta, MCMTR, &pvt->info.mcmtr); next:
if (pci_read_config_dword(pvt->pci_ta, MCMTR, &pvt->info.mcmtr)) {
edac_dbg(0, "Failed to read MCMTR register\n");
return -ENODEV;
}
if (IS_LOCKSTEP_ENABLED(pvt->info.mcmtr)) { if (IS_LOCKSTEP_ENABLED(pvt->info.mcmtr)) {
edac_dbg(0, "Lockstep is enabled\n"); edac_dbg(0, "Lockstep is enabled\n");
mode = EDAC_S8ECD8ED; mode = EDAC_S8ECD8ED;
...@@ -2092,7 +2118,8 @@ static int get_memory_error_data(struct mem_ctl_info *mci, ...@@ -2092,7 +2118,8 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
pci_read_config_dword(pvt->pci_tad[base_ch], tad_ch_nilv_offset[n_tads], &tad_offset); pci_read_config_dword(pvt->pci_tad[base_ch], tad_ch_nilv_offset[n_tads], &tad_offset);
if (pvt->is_mirrored) { if (pvt->mirror_mode == FULL_MIRRORING ||
(pvt->mirror_mode == ADDR_RANGE_MIRRORING && n_tads == 0)) {
*channel_mask |= 1 << ((base_ch + 2) % 4); *channel_mask |= 1 << ((base_ch + 2) % 4);
switch(ch_way) { switch(ch_way) {
case 2: case 2:
...@@ -2103,8 +2130,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci, ...@@ -2103,8 +2130,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
sprintf(msg, "Invalid mirror set. Can't decode addr"); sprintf(msg, "Invalid mirror set. Can't decode addr");
return -EINVAL; return -EINVAL;
} }
} else
pvt->is_cur_addr_mirrored = true;
} else {
sck_xch = (1 << sck_way) * ch_way; sck_xch = (1 << sck_way) * ch_way;
pvt->is_cur_addr_mirrored = false;
}
if (pvt->is_lockstep) if (pvt->is_lockstep)
*channel_mask |= 1 << ((base_ch + 1) % 4); *channel_mask |= 1 << ((base_ch + 1) % 4);
...@@ -2967,7 +2998,7 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci, ...@@ -2967,7 +2998,7 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
* EDAC core should be handling the channel mask, in order to point * EDAC core should be handling the channel mask, in order to point
* to the group of dimm's where the error may be happening. * to the group of dimm's where the error may be happening.
*/ */
if (!pvt->is_lockstep && !pvt->is_mirrored && !pvt->is_close_pg) if (!pvt->is_lockstep && !pvt->is_cur_addr_mirrored && !pvt->is_close_pg)
channel = first_channel; channel = first_channel;
snprintf(msg, sizeof(msg), snprintf(msg, sizeof(msg),
...@@ -3125,7 +3156,6 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) ...@@ -3125,7 +3156,6 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "sb_edac.c"; mci->mod_name = "sb_edac.c";
mci->mod_ver = SBRIDGE_REVISION;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "edac_module.h" #include "edac_module.h"
#define SKX_REVISION " Ver: 1.0 "
/* /*
* Debug macros * Debug macros
*/ */
...@@ -473,7 +471,6 @@ static int skx_register_mci(struct skx_imc *imc) ...@@ -473,7 +471,6 @@ static int skx_register_mci(struct skx_imc *imc)
mci->edac_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE;
mci->mod_name = "skx_edac.c"; mci->mod_name = "skx_edac.c";
mci->dev_name = pci_name(imc->chan[0].cdev); mci->dev_name = pci_name(imc->chan[0].cdev);
mci->mod_ver = SKX_REVISION;
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
rc = skx_get_dimm_config(mci); rc = skx_get_dimm_config(mci);
......
...@@ -413,7 +413,6 @@ static int synps_edac_mc_init(struct mem_ctl_info *mci, ...@@ -413,7 +413,6 @@ static int synps_edac_mc_init(struct mem_ctl_info *mci,
mci->ctl_name = "synps_ddr_controller"; mci->ctl_name = "synps_ddr_controller";
mci->dev_name = SYNPS_EDAC_MOD_STRING; mci->dev_name = SYNPS_EDAC_MOD_STRING;
mci->mod_name = SYNPS_EDAC_MOD_VER; mci->mod_name = SYNPS_EDAC_MOD_VER;
mci->mod_ver = "1";
edac_op_state = EDAC_OPSTATE_POLL; edac_op_state = EDAC_OPSTATE_POLL;
mci->edac_check = synps_edac_check; mci->edac_check = synps_edac_check;
......
...@@ -732,7 +732,6 @@ static int thunderx_lmc_probe(struct pci_dev *pdev, ...@@ -732,7 +732,6 @@ static int thunderx_lmc_probe(struct pci_dev *pdev,
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = "thunderx-lmc"; mci->mod_name = "thunderx-lmc";
mci->mod_ver = "1";
mci->ctl_name = "thunderx-lmc"; mci->ctl_name = "thunderx-lmc";
mci->dev_name = dev_name(&pdev->dev); mci->dev_name = dev_name(&pdev->dev);
mci->scrub_mode = SCRUB_NONE; mci->scrub_mode = SCRUB_NONE;
...@@ -775,11 +774,10 @@ static int thunderx_lmc_probe(struct pci_dev *pdev, ...@@ -775,11 +774,10 @@ static int thunderx_lmc_probe(struct pci_dev *pdev,
lmc->xor_bank = lmc_control & LMC_CONTROL_XOR_BANK; lmc->xor_bank = lmc_control & LMC_CONTROL_XOR_BANK;
l2c_ioaddr = ioremap(L2C_CTL | FIELD_PREP(THUNDERX_NODE, lmc->node), l2c_ioaddr = ioremap(L2C_CTL | FIELD_PREP(THUNDERX_NODE, lmc->node), PAGE_SIZE);
PAGE_SIZE);
if (!l2c_ioaddr) { if (!l2c_ioaddr) {
dev_err(&pdev->dev, "Cannot map L2C_CTL\n"); dev_err(&pdev->dev, "Cannot map L2C_CTL\n");
ret = -ENOMEM;
goto err_free; goto err_free;
} }
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#include <linux/io-64-nonatomic-lo-hi.h> #include <linux/io-64-nonatomic-lo-hi.h>
#include "edac_module.h" #include "edac_module.h"
#define X38_REVISION "1.1"
#define EDAC_MOD_STR "x38_edac" #define EDAC_MOD_STR "x38_edac"
#define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0 #define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0
...@@ -357,7 +355,6 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx) ...@@ -357,7 +355,6 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx)
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = X38_REVISION;
mci->ctl_name = x38_devs[dev_idx].ctl_name; mci->ctl_name = x38_devs[dev_idx].ctl_name;
mci->dev_name = pci_name(pdev); mci->dev_name = pci_name(pdev);
mci->edac_check = x38_check; mci->edac_check = x38_check;
......
...@@ -415,7 +415,6 @@ static int xgene_edac_mc_add(struct xgene_edac *edac, struct device_node *np) ...@@ -415,7 +415,6 @@ static int xgene_edac_mc_add(struct xgene_edac *edac, struct device_node *np)
mci->edac_ctl_cap = EDAC_FLAG_SECDED; mci->edac_ctl_cap = EDAC_FLAG_SECDED;
mci->edac_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED;
mci->mod_name = EDAC_MOD_STR; mci->mod_name = EDAC_MOD_STR;
mci->mod_ver = "0.1";
mci->ctl_page_to_phys = NULL; mci->ctl_page_to_phys = NULL;
mci->scrub_cap = SCRUB_FLAG_HW_SRC; mci->scrub_cap = SCRUB_FLAG_HW_SRC;
mci->scrub_mode = SCRUB_HW_SRC; mci->scrub_mode = SCRUB_HW_SRC;
......
...@@ -619,7 +619,6 @@ struct mem_ctl_info { ...@@ -619,7 +619,6 @@ struct mem_ctl_info {
*/ */
struct device *pdev; struct device *pdev;
const char *mod_name; const char *mod_name;
const char *mod_ver;
const char *ctl_name; const char *ctl_name;
const char *dev_name; const char *dev_name;
void *pvt_info; void *pvt_info;
......
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