From fbe63acf62f57f8e51adae602c5ce1025002d5ee Mon Sep 17 00:00:00 2001 From: Yazen Ghannam Date: Mon, 20 Mar 2017 15:26:51 -0500 Subject: [PATCH 01/15] EDAC, mce_amd: Use cpu_to_node() to find the node ID Using the homegrown amd_get_nb_id() to find a node ID on AMD was fine while the L3 to node mapping was 1:1. And Zen topology broke this. So let's start slowly moving away from it and use the topology interfaces instead. Signed-off-by: Yazen Ghannam Cc: linux-edac Cc: x86-ml Link: http://lkml.kernel.org/r/1490041614-90057-2-git-send-email-Yazen.Ghannam@amd.com [ Massage commit message. ] Signed-off-by: Borislav Petkov --- drivers/edac/mce_amd.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c index 9a2658a256a9..e8e9d7df0a6e 100644 --- a/drivers/edac/mce_amd.c +++ b/drivers/edac/mce_amd.c @@ -878,12 +878,8 @@ static void decode_smca_errors(struct mce *m) 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) - 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) From 1c18be5a4e3ecbb40fbee015711aea6cc6467417 Mon Sep 17 00:00:00 2001 From: Arvind Yadav Date: Mon, 17 Jul 2017 10:20:25 +0200 Subject: [PATCH 02/15] EDAC: Constify attribute_group structures attribute_groups are not supposed to change at runtime. All functions working with attribute_groups provided by work with const attribute_group. So mark the non-const structs as const. Signed-off-by: Arvind Yadav CC: linux-edac@vger.kernel.org Link: http://lkml.kernel.org/r/776cb8265509054abd01b0b551624cc0da3b88e7.1499078335.git.arvind.yadav.cs@gmail.com Signed-off-by: Borislav Petkov --- drivers/edac/edac_mc_sysfs.c | 6 +++--- drivers/edac/i7core_edac.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 445862dac273..dbc64469b7da 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@ -287,7 +287,7 @@ static struct attribute *csrow_attrs[] = { NULL, }; -static struct attribute_group csrow_attr_grp = { +static const struct attribute_group csrow_attr_grp = { .attrs = csrow_attrs, }; @@ -627,7 +627,7 @@ static struct attribute *dimm_attrs[] = { NULL, }; -static struct attribute_group dimm_attr_grp = { +static const struct attribute_group dimm_attr_grp = { .attrs = dimm_attrs, }; @@ -902,7 +902,7 @@ static umode_t mci_attr_is_visible(struct kobject *kobj, return mode; } -static struct attribute_group mci_attr_grp = { +static const struct attribute_group mci_attr_grp = { .attrs = mci_attrs, .is_visible = mci_attr_is_visible, }; diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 75ad847593b7..ba0fa112996f 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c @@ -1079,7 +1079,7 @@ static struct attribute *i7core_addrmatch_attrs[] = { NULL }; -static struct attribute_group addrmatch_grp = { +static const struct attribute_group addrmatch_grp = { .attrs = i7core_addrmatch_attrs, }; @@ -1110,7 +1110,7 @@ static struct attribute *i7core_udimm_counters_attrs[] = { NULL }; -static struct attribute_group all_channel_counts_grp = { +static const struct attribute_group all_channel_counts_grp = { .attrs = i7core_udimm_counters_attrs, }; From c54182ec0e157988f0cafd1e8d37b68ab4210f87 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Thu, 29 Jun 2017 12:00:05 +0200 Subject: [PATCH 03/15] EDAC: Get rid of mci->mod_ver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is a write-only variable so get rid of it. Signed-off-by: Borislav Petkov Acked-by: Robert Richter Acked-by: Michal Simek Acked-by: Thor Thayer Acked-by: Tony Luck Cc: Mark Gross Cc: Tim Small Cc: Ranganathan Desikan Cc: "Arvind R." Cc: Jason Baron Cc: "Sören Brinkmann" Cc: Ralf Baechle Cc: David Daney Cc: Loc Ho Cc: linux-edac@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-mips@linux-mips.org --- drivers/edac/altera_edac.c | 2 -- drivers/edac/amd64_edac.c | 1 - drivers/edac/amd76x_edac.c | 2 -- drivers/edac/cpc925_edac.c | 1 - drivers/edac/e752x_edac.c | 2 -- drivers/edac/e7xxx_edac.c | 2 -- drivers/edac/ghes_edac.c | 3 --- drivers/edac/highbank_mc_edac.c | 1 - drivers/edac/i3000_edac.c | 3 --- drivers/edac/i3200_edac.c | 3 --- drivers/edac/i5000_edac.c | 1 - drivers/edac/i5100_edac.c | 1 - drivers/edac/i5400_edac.c | 1 - drivers/edac/i7300_edac.c | 1 - drivers/edac/i7core_edac.c | 1 - drivers/edac/i82443bxgx_edac.c | 3 --- drivers/edac/i82860_edac.c | 2 -- drivers/edac/i82875p_edac.c | 2 -- drivers/edac/i82975x_edac.c | 2 -- drivers/edac/ie31200_edac.c | 2 -- drivers/edac/mv64x60_edac.c | 1 - drivers/edac/ppc4xx_edac.c | 1 - drivers/edac/r82600_edac.c | 2 -- drivers/edac/sb_edac.c | 1 - drivers/edac/skx_edac.c | 3 --- drivers/edac/synopsys_edac.c | 1 - drivers/edac/thunderx_edac.c | 1 - drivers/edac/x38_edac.c | 3 --- drivers/edac/xgene_edac.c | 1 - include/linux/edac.h | 1 - 30 files changed, 51 deletions(-) diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index db75d4b614f7..fa2e5db56d24 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -38,7 +38,6 @@ #include "edac_module.h" #define EDAC_MOD_STR "altera_edac" -#define EDAC_VERSION "1" #define EDAC_DEVICE "Altera" static const struct altr_sdram_prv_data c5_data = { @@ -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_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = EDAC_VERSION; mci->ctl_name = dev_name(&pdev->dev); mci->scrub_mode = SCRUB_SW_SRC; mci->dev_name = dev_name(&pdev->dev); diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 3aea55698165..ac2f30295efe 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -3130,7 +3130,6 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci, mci->edac_cap = determine_edac_cap(pvt); mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = EDAC_AMD64_VERSION; mci->ctl_name = fam->ctl_name; mci->dev_name = pci_name(pvt->F3); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/amd76x_edac.c b/drivers/edac/amd76x_edac.c index a7450275ad28..9c6e326b4c14 100644 --- a/drivers/edac/amd76x_edac.c +++ b/drivers/edac/amd76x_edac.c @@ -19,7 +19,6 @@ #include #include "edac_module.h" -#define AMD76X_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "amd76x_edac" #define amd76x_printk(level, fmt, arg...) \ @@ -263,7 +262,6 @@ static int amd76x_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_cap = ems_mode ? (EDAC_FLAG_EC | EDAC_FLAG_SECDED) : EDAC_FLAG_NONE; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = AMD76X_REVISION; mci->ctl_name = amd76x_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = amd76x_check; diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c index 837b62c4993d..cba8ee14a067 100644 --- a/drivers/edac/cpc925_edac.c +++ b/drivers/edac/cpc925_edac.c @@ -999,7 +999,6 @@ static int cpc925_probe(struct platform_device *pdev) mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = CPC925_EDAC_MOD_STR; - mci->mod_ver = CPC925_EDAC_REVISION; mci->ctl_name = pdev->name; if (edac_op_state == EDAC_OPSTATE_POLL) diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 1a352cae1f52..b5de9a13ea3f 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c @@ -26,7 +26,6 @@ #include #include "edac_module.h" -#define E752X_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "e752x_edac" static int report_non_memory_errors; @@ -1303,7 +1302,6 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) (EDAC_FLAG_NONE | EDAC_FLAG_SECDED | EDAC_FLAG_S4ECD4ED); /* FIXME - what if different memory types are in different csrows? */ mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = E752X_REVISION; mci->pdev = &pdev->dev; edac_dbg(3, "init pvt\n"); diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c index 67ef07aed923..75d7ce62b3be 100644 --- a/drivers/edac/e7xxx_edac.c +++ b/drivers/edac/e7xxx_edac.c @@ -32,7 +32,6 @@ #include #include "edac_module.h" -#define E7XXX_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "e7xxx_edac" #define e7xxx_printk(level, fmt, arg...) \ @@ -458,7 +457,6 @@ static int e7xxx_probe1(struct pci_dev *pdev, int dev_idx) EDAC_FLAG_S4ECD4ED; /* FIXME - what if different memory types are in different csrows? */ mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = E7XXX_REVISION; mci->pdev = &pdev->dev; edac_dbg(3, "init pvt\n"); pvt = (struct e7xxx_pvt *)mci->pvt_info; diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c index 4e61a6229dd2..6f80eb65c26c 100644 --- a/drivers/edac/ghes_edac.c +++ b/drivers/edac/ghes_edac.c @@ -17,8 +17,6 @@ #include "edac_module.h" #include -#define GHES_EDAC_REVISION " Ver: 1.0.0" - struct ghes_edac_pvt { struct list_head list; struct ghes *ghes; @@ -451,7 +449,6 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "ghes_edac.c"; - mci->mod_ver = GHES_EDAC_REVISION; mci->ctl_name = "ghes_edac"; mci->dev_name = "ghes"; diff --git a/drivers/edac/highbank_mc_edac.c b/drivers/edac/highbank_mc_edac.c index 0e7e0a404d89..6092e61be605 100644 --- a/drivers/edac/highbank_mc_edac.c +++ b/drivers/edac/highbank_mc_edac.c @@ -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_cap = EDAC_FLAG_SECDED; mci->mod_name = pdev->dev.driver->name; - mci->mod_ver = "1"; mci->ctl_name = id->compatible; mci->dev_name = dev_name(&pdev->dev); mci->scrub_mode = SCRUB_SW_SRC; diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c index 5306240570d7..8085a32ec3bd 100644 --- a/drivers/edac/i3000_edac.c +++ b/drivers/edac/i3000_edac.c @@ -16,8 +16,6 @@ #include #include "edac_module.h" -#define I3000_REVISION "1.1" - #define EDAC_MOD_STR "i3000_edac" #define I3000_RANKS 8 @@ -375,7 +373,6 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I3000_REVISION; mci->ctl_name = i3000_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = i3000_check; diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c index 77c58d201a30..d92d56cee101 100644 --- a/drivers/edac/i3200_edac.c +++ b/drivers/edac/i3200_edac.c @@ -17,8 +17,6 @@ #include -#define I3200_REVISION "1.1" - #define EDAC_MOD_STR "i3200_edac" #define PCI_DEVICE_ID_INTEL_3200_HB 0x29f0 @@ -375,7 +373,6 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I3200_REVISION; mci->ctl_name = i3200_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = i3200_check; diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index 8f5a56e25bd2..53f24b18cd61 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c @@ -1430,7 +1430,6 @@ static int i5000_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "i5000_edac.c"; - mci->mod_ver = I5000_REVISION; mci->ctl_name = i5000_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c index a8334c4acea7..b506eef6b146 100644 --- a/drivers/edac/i5100_edac.c +++ b/drivers/edac/i5100_edac.c @@ -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_cap = EDAC_FLAG_SECDED; mci->mod_name = "i5100_edac.c"; - mci->mod_ver = "not versioned"; mci->ctl_name = "i5100"; mci->dev_name = pci_name(pdev); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c index cd889edc8516..6f8bcdb9256a 100644 --- a/drivers/edac/i5400_edac.c +++ b/drivers/edac/i5400_edac.c @@ -1315,7 +1315,6 @@ static int i5400_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "i5400_edac.c"; - mci->mod_ver = I5400_REVISION; mci->ctl_name = i5400_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index e391f5a716be..6b5a554ba8e4 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c @@ -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_cap = EDAC_FLAG_NONE; mci->mod_name = "i7300_edac.c"; - mci->mod_ver = I7300_REVISION; mci->ctl_name = i7300_devs[0].ctl_name; mci->dev_name = pci_name(pdev); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index ba0fa112996f..d36cc8498084 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c @@ -2159,7 +2159,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev) mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "i7core_edac.c"; - mci->mod_ver = I7CORE_REVISION; mci->ctl_name = kasprintf(GFP_KERNEL, "i7 core #%d", i7core_dev->socket); mci->dev_name = pci_name(i7core_dev->pdev[0]); diff --git a/drivers/edac/i82443bxgx_edac.c b/drivers/edac/i82443bxgx_edac.c index cb61a5b7d080..a2ca929e2168 100644 --- a/drivers/edac/i82443bxgx_edac.c +++ b/drivers/edac/i82443bxgx_edac.c @@ -31,8 +31,6 @@ #include #include "edac_module.h" -#define I82443_REVISION "0.1" - #define EDAC_MOD_STR "i82443bxgx_edac" /* 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) I82443BXGX_EAP_OFFSET_MBE)); mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I82443_REVISION; mci->ctl_name = "I82443BXGX"; mci->dev_name = pci_name(pdev); mci->edac_check = i82443bxgx_edacmc_check; diff --git a/drivers/edac/i82860_edac.c b/drivers/edac/i82860_edac.c index 236c813227fc..3e3a80ffb322 100644 --- a/drivers/edac/i82860_edac.c +++ b/drivers/edac/i82860_edac.c @@ -16,7 +16,6 @@ #include #include "edac_module.h" -#define I82860_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "i82860_edac" #define i82860_printk(level, fmt, arg...) \ @@ -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 */ mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I82860_REVISION; mci->ctl_name = i82860_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = i82860_check; diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index e286b7e74c7a..ceac925af38c 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c @@ -20,7 +20,6 @@ #include #include "edac_module.h" -#define I82875P_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "i82875p_edac" #define i82875p_printk(level, fmt, arg...) \ @@ -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_cap = EDAC_FLAG_UNKNOWN; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I82875P_REVISION; mci->ctl_name = i82875p_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = i82875p_check; diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c index 9dcdab28f665..892815eaa97b 100644 --- a/drivers/edac/i82975x_edac.c +++ b/drivers/edac/i82975x_edac.c @@ -16,7 +16,6 @@ #include #include "edac_module.h" -#define I82975X_REVISION " Ver: 1.0.0" #define EDAC_MOD_STR "i82975x_edac" #define i82975x_printk(level, fmt, arg...) \ @@ -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_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = I82975X_REVISION; mci->ctl_name = i82975x_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = i82975x_check; diff --git a/drivers/edac/ie31200_edac.c b/drivers/edac/ie31200_edac.c index 4260579e6901..aac9b9b360b8 100644 --- a/drivers/edac/ie31200_edac.c +++ b/drivers/edac/ie31200_edac.c @@ -45,7 +45,6 @@ #include #include "edac_module.h" -#define IE31200_REVISION "1.0" #define EDAC_MOD_STR "ie31200_edac" #define ie31200_printk(level, fmt, arg...) \ @@ -420,7 +419,6 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_ctl_cap = EDAC_FLAG_SECDED; mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = IE31200_REVISION; mci->ctl_name = ie31200_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = ie31200_check; diff --git a/drivers/edac/mv64x60_edac.c b/drivers/edac/mv64x60_edac.c index d3650df94fe8..ec5d695bbb72 100644 --- a/drivers/edac/mv64x60_edac.c +++ b/drivers/edac/mv64x60_edac.c @@ -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_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = MV64x60_REVISION; mci->ctl_name = mv64x60_ctl_name; if (edac_op_state == EDAC_OPSTATE_POLL) diff --git a/drivers/edac/ppc4xx_edac.c b/drivers/edac/ppc4xx_edac.c index e55e92590106..98d6dc7ef8e8 100644 --- a/drivers/edac/ppc4xx_edac.c +++ b/drivers/edac/ppc4xx_edac.c @@ -1063,7 +1063,6 @@ static int ppc4xx_edac_mc_init(struct mem_ctl_info *mci, /* Initialize strings */ mci->mod_name = PPC4XX_EDAC_MODULE_NAME; - mci->mod_ver = PPC4XX_EDAC_MODULE_REVISION; mci->ctl_name = ppc4xx_edac_match->compatible, mci->dev_name = np->full_name; diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c index 978916625ced..851e53e122aa 100644 --- a/drivers/edac/r82600_edac.c +++ b/drivers/edac/r82600_edac.c @@ -22,7 +22,6 @@ #include #include "edac_module.h" -#define R82600_REVISION " Ver: 2.0.2" #define EDAC_MOD_STR "r82600_edac" #define r82600_printk(level, fmt, arg...) \ @@ -316,7 +315,6 @@ static int r82600_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = R82600_REVISION; mci->ctl_name = "R82600"; mci->dev_name = pci_name(pdev); mci->edac_check = r82600_check; diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 80d860cb0746..687d0f23b9cc 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@ -3125,7 +3125,6 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) mci->edac_ctl_cap = EDAC_FLAG_NONE; mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "sb_edac.c"; - mci->mod_ver = SBRIDGE_REVISION; mci->dev_name = pci_name(pdev); mci->ctl_page_to_phys = NULL; diff --git a/drivers/edac/skx_edac.c b/drivers/edac/skx_edac.c index 64bef6c9cfb4..16dea97568a1 100644 --- a/drivers/edac/skx_edac.c +++ b/drivers/edac/skx_edac.c @@ -31,8 +31,6 @@ #include "edac_module.h" -#define SKX_REVISION " Ver: 1.0 " - /* * Debug macros */ @@ -473,7 +471,6 @@ static int skx_register_mci(struct skx_imc *imc) mci->edac_cap = EDAC_FLAG_NONE; mci->mod_name = "skx_edac.c"; mci->dev_name = pci_name(imc->chan[0].cdev); - mci->mod_ver = SKX_REVISION; mci->ctl_page_to_phys = NULL; rc = skx_get_dimm_config(mci); diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c index 1c01dec78ec3..0c9c59e2b5a3 100644 --- a/drivers/edac/synopsys_edac.c +++ b/drivers/edac/synopsys_edac.c @@ -413,7 +413,6 @@ static int synps_edac_mc_init(struct mem_ctl_info *mci, mci->ctl_name = "synps_ddr_controller"; mci->dev_name = SYNPS_EDAC_MOD_STRING; mci->mod_name = SYNPS_EDAC_MOD_VER; - mci->mod_ver = "1"; edac_op_state = EDAC_OPSTATE_POLL; mci->edac_check = synps_edac_check; diff --git a/drivers/edac/thunderx_edac.c b/drivers/edac/thunderx_edac.c index 2d352b40ae1c..c8e8b9fd4772 100644 --- a/drivers/edac/thunderx_edac.c +++ b/drivers/edac/thunderx_edac.c @@ -732,7 +732,6 @@ static int thunderx_lmc_probe(struct pci_dev *pdev, mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = "thunderx-lmc"; - mci->mod_ver = "1"; mci->ctl_name = "thunderx-lmc"; mci->dev_name = dev_name(&pdev->dev); mci->scrub_mode = SCRUB_NONE; diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c index 03c97a4bf590..cc779f3f9e2d 100644 --- a/drivers/edac/x38_edac.c +++ b/drivers/edac/x38_edac.c @@ -18,8 +18,6 @@ #include #include "edac_module.h" -#define X38_REVISION "1.1" - #define EDAC_MOD_STR "x38_edac" #define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0 @@ -357,7 +355,6 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx) mci->edac_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = X38_REVISION; mci->ctl_name = x38_devs[dev_idx].ctl_name; mci->dev_name = pci_name(pdev); mci->edac_check = x38_check; diff --git a/drivers/edac/xgene_edac.c b/drivers/edac/xgene_edac.c index 669246056812..e8b81d7ef61f 100644 --- a/drivers/edac/xgene_edac.c +++ b/drivers/edac/xgene_edac.c @@ -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_cap = EDAC_FLAG_SECDED; mci->mod_name = EDAC_MOD_STR; - mci->mod_ver = "0.1"; mci->ctl_page_to_phys = NULL; mci->scrub_cap = SCRUB_FLAG_HW_SRC; mci->scrub_mode = SCRUB_HW_SRC; diff --git a/include/linux/edac.h b/include/linux/edac.h index 8ae0f45fafd6..cd75c173fd00 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -619,7 +619,6 @@ struct mem_ctl_info { */ struct device *pdev; const char *mod_name; - const char *mod_ver; const char *ctl_name; const char *dev_name; void *pvt_info; From 2efdda4a41086aaf62a1a89e898514d674a8b727 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Tue, 18 Jul 2017 16:42:59 -0500 Subject: [PATCH 04/15] EDAC, cpc925, ppc4xx: Convert to using %pOF instead of full_name Now that we have a custom printf format specifier, convert users of full_name to use %pOF instead. This is preparation to remove storing of the full path string for each node. Signed-off-by: Rob Herring Cc: devicetree@vger.kernel.org Cc: linux-edac Link: http://lkml.kernel.org/r/20170718214339.7774-19-robh@kernel.org Signed-off-by: Borislav Petkov --- drivers/edac/cpc925_edac.c | 2 +- drivers/edac/ppc4xx_edac.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c index cba8ee14a067..2c98e020df05 100644 --- a/drivers/edac/cpc925_edac.c +++ b/drivers/edac/cpc925_edac.c @@ -618,7 +618,7 @@ static u32 cpc925_cpu_mask_disabled(void) } 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; } diff --git a/drivers/edac/ppc4xx_edac.c b/drivers/edac/ppc4xx_edac.c index 98d6dc7ef8e8..fd3202c30f69 100644 --- a/drivers/edac/ppc4xx_edac.c +++ b/drivers/edac/ppc4xx_edac.c @@ -1266,8 +1266,8 @@ static int ppc4xx_edac_probe(struct platform_device *op) memcheck = (mcopt1 & SDRAM_MCOPT1_MCHK_MASK); if (memcheck == SDRAM_MCOPT1_MCHK_NON) { - ppc4xx_edac_printk(KERN_INFO, "%s: No ECC memory detected or " - "ECC is disabled.\n", np->full_name); + ppc4xx_edac_printk(KERN_INFO, "%pOF: No ECC memory detected or " + "ECC is disabled.\n", np); status = -ENODEV; goto done; } @@ -1286,9 +1286,9 @@ static int ppc4xx_edac_probe(struct platform_device *op) mci = edac_mc_alloc(ppc4xx_edac_instance, ARRAY_SIZE(layers), layers, sizeof(struct ppc4xx_edac_pdata)); if (mci == NULL) { - ppc4xx_edac_printk(KERN_ERR, "%s: " + ppc4xx_edac_printk(KERN_ERR, "%pOF: " "Failed to allocate EDAC MC instance!\n", - np->full_name); + np); status = -ENOMEM; goto done; } From 039d7af651ba414b468bbb22d5d1a76169f81c0d Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Mon, 31 Jul 2017 02:06:51 +0800 Subject: [PATCH 05/15] EDAC, sb_edac: Classify memory mirroring modes Basically, there are full memory mirroring and address range partial memory mirroring (supported by Haswell EX and Broadwell EX) modes. a) In full memory mirroring, the memory behind each memory controller is mirrored, i.e. the memory is split into two identical mirrors (primary and secondary), half of the memory is reserved for redundancy. b) In address range partial memory mirroring, the memory size (range) of primary and secondary behind each memory controller can be user defined by the TAD0 register. The rest of memory ranges defined by TAD1/TAD2/... in that memory controller are non-mirrored. For more detail on memory mirroring, see the following link written by Tony Luck: https://01.org/lkp/blogs/tonyluck/2016/address-range-partial-memory-mirroring-linux Currently the sb_edac driver only supports address decoding in full memory mirroring and non-mirroring modes. In address range partial memory mirroring mode, it may fail to decode an address that falls in a non-mirroring area (the following was one of this kind of failed logs). mce: Uncorrected hardware memory error in user-access at 566d53a400 Memory failure: 0x566d53a: Killing einj_mem_uc:4647 due to hardware memory corruption Memory failure: 0x566d53a: recovery action for dirty LRU page: Recovered mce: [Hardware Error]: Machine check events logged EDAC sbridge MC1: HANDLING MCE MEMORY ERROR EDAC sbridge MC1: CPU 48: Machine Check Event: 0 Bank 7: ec00000000010090 EDAC sbridge MC1: TSC 4b914aa5a99dab EDAC sbridge MC1: ADDR 566d53a400 EDAC sbridge MC1: MISC 1443a0c86 EDAC sbridge MC1: PROCESSOR 0:406f1 TIME 1499712764 SOCKET 2 APIC 80 EDAC MC1: 0 UE Can't discover the memory rank for ch addr 0x7fb54e900 on any memory ( page:0x0 offset:0x0 grain:32) mce: [Hardware Error]: Machine check events logged Therefore, classify memory mirroring modes and make the address decoding in address range partial memory mode correct. Signed-off-by: Qiuxu Zhuo Cc: Tony Luck Cc: linux-edac Link: http://lkml.kernel.org/r/20170730180651.30060-1-qiuxu.zhuo@intel.com Signed-off-by: Borislav Petkov --- drivers/edac/sb_edac.c | 63 +++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 687d0f23b9cc..dc0591654011 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@ -300,6 +300,12 @@ enum domain { SOCK, }; +enum mirroring_mode { + NON_MIRRORING, + ADDR_RANGE_MIRRORING, + FULL_MIRRORING, +}; + struct sbridge_pvt; struct sbridge_info { enum type type; @@ -377,8 +383,9 @@ struct sbridge_pvt { struct sbridge_channel channel[NUM_CHANNELS]; /* 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; + enum mirroring_mode mirror_mode; /* Memory description */ u64 tolm, tohm; @@ -1648,10 +1655,6 @@ static int get_dimm_config(struct mem_ctl_info *mci) enum edac_type mode; u32 reg; - if (pvt->info.type == HASWELL || pvt->info.type == BROADWELL) { - pci_read_config_dword(pvt->pci_ha, HASWELL_HASYSDEFEATURE2, ®); - pvt->is_chan_hash = GET_BITFIELD(reg, 21, 21); - } pvt->sbridge_dev->node_id = pvt->info.get_node_id(pvt); edac_dbg(0, "mc#%d: Node ID: %d, source ID: %d\n", pvt->sbridge_dev->mc, @@ -1663,22 +1666,45 @@ static int get_dimm_config(struct mem_ctl_info *mci) */ if (pvt->info.type == KNIGHTS_LANDING) { 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) 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 { - pci_read_config_dword(pvt->pci_ras, RASENABLES, ®); + if (pvt->info.type == HASWELL || pvt->info.type == BROADWELL) { + if (pci_read_config_dword(pvt->pci_ha, HASWELL_HASYSDEFEATURE2, ®)) { + 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, ®)) { + edac_dbg(0, "Failed to read RASENABLES register\n"); + return -ENODEV; + } if (IS_MIRROR_ENABLED(reg)) { - edac_dbg(0, "Memory mirror is enabled\n"); - pvt->is_mirrored = true; + pvt->mirror_mode = FULL_MIRRORING; + edac_dbg(0, "Full memory mirroring is enabled\n"); } else { - edac_dbg(0, "Memory mirror is disabled\n"); - pvt->is_mirrored = false; + pvt->mirror_mode = NON_MIRRORING; + 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)) { edac_dbg(0, "Lockstep is enabled\n"); mode = EDAC_S8ECD8ED; @@ -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); - 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); switch(ch_way) { case 2: @@ -2103,8 +2130,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci, sprintf(msg, "Invalid mirror set. Can't decode addr"); return -EINVAL; } - } else + + pvt->is_cur_addr_mirrored = true; + } else { sck_xch = (1 << sck_way) * ch_way; + pvt->is_cur_addr_mirrored = false; + } if (pvt->is_lockstep) *channel_mask |= 1 << ((base_ch + 1) % 4); @@ -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 * 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; snprintf(msg, sizeof(msg), From 3e5d2bd19138d6683f69de26a34d7eb9ab3823ed Mon Sep 17 00:00:00 2001 From: Tony Luck Date: Thu, 3 Aug 2017 14:05:36 -0700 Subject: [PATCH 06/15] EDAC, pnd2: Build in a minimal sideband driver for Apollo Lake I've been waing a long time for the generic sideband driver to appear. Patience has run out, so include the minimum here to just read registers. Signed-off-by: Tony Luck Cc: Aristeu Rozanski Cc: Mauro Carvalho Chehab Cc: Patrick Geary Cc: Qiuxu Zhuo Cc: linux-edac Link: http://lkml.kernel.org/r/20170803210536.5662-1-tony.luck@intel.com Signed-off-by: Borislav Petkov --- drivers/edac/pnd2_edac.c | 88 +++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c index 8e599490f6de..a3180a87ff96 100644 --- a/drivers/edac/pnd2_edac.c +++ b/drivers/edac/pnd2_edac.c @@ -129,42 +129,66 @@ static struct mem_ctl_info *pnd2_mci; #define GET_BITFIELD(v, lo, hi) (((v) & GENMASK_ULL(hi, lo)) >> (lo)) #define U64_LSHIFT(val, s) ((u64)(val) << (s)) -#ifdef CONFIG_X86_INTEL_SBI_APL -#include "linux/platform_data/sbi_apl.h" -static int sbi_send(int port, int off, int op, u32 *data) +/* + * On Apollo Lake we access memory controller registers via a + * 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; - int ret, read = 0; + P2SB_READ(word, P2SB_STAT_OFF, status); - memset(&sbi_arg, 0, sizeof(sbi_arg)); + return !!(*status & P2SB_BUSY); +} - if (op == 0 || op == 4 || op == 6) - read = 1; - else - sbi_arg.data = *data; +static int _apl_rd_reg(int port, int off, int op, u32 *data) +{ + int retries = 0xff, ret; + u16 status; - sbi_arg.opcode = op; - sbi_arg.port_address = port; - sbi_arg.register_offset = off; - ret = sbi_apl_commit(&sbi_arg); - if (ret || sbi_arg.status) - edac_dbg(2, "sbi_send status=%d ret=%d data=%x\n", - sbi_arg.status, ret, sbi_arg.data); + P2SB_WRITE(byte, P2SB_HIDE_OFF, 0); - if (ret == 0) - ret = sbi_arg.status; + if (p2sb_is_busy(&status)) { + ret = -EAGAIN; + goto out; + } - if (ret == 0 && read) - *data = sbi_arg.data; + P2SB_WRITE(dword, P2SB_ADDR_OFF, (port << 24) | off); + P2SB_WRITE(dword, P2SB_DATA_OFF, 0); + P2SB_WRITE(dword, P2SB_EADD_OFF, 0); + P2SB_WRITE(word, P2SB_ROUT_OFF, 0); + P2SB_WRITE(word, P2SB_STAT_OFF, (op << 8) | P2SB_BUSY); + + while (p2sb_is_busy(&status)) { + if (retries-- == 0) { + ret = -EBUSY; + goto out; + } + } + + P2SB_READ(dword, P2SB_DATA_OFF, data); + ret = (status >> 1) & 0x3; +out: + P2SB_WRITE(byte, P2SB_HIDE_OFF, 1); 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) { @@ -173,10 +197,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); switch (sz) { 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 */ 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, sz == 8 ? *((u32 *)(data + 4)) : 0, *((u32 *)data), ret); break; @@ -1515,6 +1539,12 @@ static int __init pnd2_init(void) 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 */ opstate_init(); From 8b073d945cd31165591bdebc54dc1fded88b4ef3 Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Wed, 16 Aug 2017 07:05:06 +0200 Subject: [PATCH 07/15] EDAC, altera: Fix error handling path in altr_edac_device_probe() Return the proper error value if devm_ioremap() fails (and not 0). Signed-off-by: Christophe JAILLET Acked-by: Thor Thayer Cc: linux-edac Link: http://lkml.kernel.org/r/20170816050506.14541-1-christophe.jaillet@wanadoo.fr [ Massage commit message. ] Signed-off-by: Borislav Petkov --- drivers/edac/altera_edac.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index fa2e5db56d24..346c4987b284 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -747,8 +747,10 @@ static int altr_edac_device_probe(struct platform_device *pdev) drvdata->edac_dev_name = ecc_name; drvdata->base = devm_ioremap(&pdev->dev, r->start, resource_size(r)); - if (!drvdata->base) + if (!drvdata->base) { + res = -ENOMEM; goto fail1; + } /* Get driver specific data for this EDAC device */ drvdata->data = of_match_node(altr_edac_device_of_match, np)->data; From 3eaef0fa39f7badb0bf25bb28ab96cf06b29d45c Mon Sep 17 00:00:00 2001 From: Christophe JAILLET Date: Wed, 16 Aug 2017 06:58:21 +0200 Subject: [PATCH 08/15] EDAC, thunderx: Fix error handling path in thunderx_lmc_probe() Return the proper error value if ioremap() fails (and not 0). Signed-off-by: Christophe JAILLET Cc: David Daney Cc: Ralf Baechle Cc: linux-edac Cc: linux-mips@linux-mips.org Link: http://lkml.kernel.org/r/20170816045821.14165-1-christophe.jaillet@wanadoo.fr [ Massage commit message, remove newline. ] Signed-off-by: Borislav Petkov --- drivers/edac/thunderx_edac.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/edac/thunderx_edac.c b/drivers/edac/thunderx_edac.c index c8e8b9fd4772..f35d87519a3e 100644 --- a/drivers/edac/thunderx_edac.c +++ b/drivers/edac/thunderx_edac.c @@ -774,11 +774,10 @@ static int thunderx_lmc_probe(struct pci_dev *pdev, lmc->xor_bank = lmc_control & LMC_CONTROL_XOR_BANK; - l2c_ioaddr = ioremap(L2C_CTL | FIELD_PREP(THUNDERX_NODE, lmc->node), - PAGE_SIZE); - + l2c_ioaddr = ioremap(L2C_CTL | FIELD_PREP(THUNDERX_NODE, lmc->node), PAGE_SIZE); if (!l2c_ioaddr) { dev_err(&pdev->dev, "Cannot map L2C_CTL\n"); + ret = -ENOMEM; goto err_free; } From d84676a9e12817c8435e836911800bdcc67928a0 Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Mon, 14 Aug 2017 23:48:13 +0800 Subject: [PATCH 09/15] EDAC, pnd2: Mask off the lower four bits of a BAR Bit[0] of BAR is always zero. Bit[2:1] and bit[3] of BAR contain the information of 'type' and the 'prefetchable' accordingly. Therefore, mask the lower four bits to retrieve the actual base address of a BAR. Signed-off-by: Qiuxu Zhuo Cc: Tony Luck Cc: linux-edac Link: http://lkml.kernel.org/r/20170814154813.21619-1-qiuxu.zhuo@intel.com Signed-off-by: Borislav Petkov --- drivers/edac/pnd2_edac.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c index a3180a87ff96..2b16b95201eb 100644 --- a/drivers/edac/pnd2_edac.c +++ b/drivers/edac/pnd2_edac.c @@ -241,6 +241,7 @@ static u64 get_sideband_reg_base_addr(void) if (pdev) { pci_read_config_dword(pdev, 0x10, &lo); pci_read_config_dword(pdev, 0x14, &hi); + lo &= 0xfffffff0; pci_dev_put(pdev); return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0)); } else { From 5fd77cb3bac77f690d1d9cf57dc7851fcb3e7945 Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Mon, 14 Aug 2017 23:48:45 +0800 Subject: [PATCH 10/15] EDAC, pnd2: Conditionally unhide/hide the P2SB PCI device to read BAR On Deverton server, the P2SB PCI device (DEV:1F, FUN:1) is used by multiple device drivers. If it's hidden by some device driver (e.g. with the i801 I2C driver, the commit 9424693035a5 ("i2c: i801: Create iTCO device on newer Intel PCHs") unconditionally hid the P2SB PCI device wrongly) it will make the pnd2_edac driver read out an invalid BAR value of 0xffffffff and then fail on ioremap(). Therefore, store the presence state of P2SB PCI device before unhiding it for reading BAR and restore the presence state after reading BAR. Signed-off-by: Qiuxu Zhuo Cc: Tony Luck Cc: linux-edac Cc: linux-i2c@vger.kernel.org Link: http://lkml.kernel.org/r/20170814154845.21663-1-qiuxu.zhuo@intel.com Signed-off-by: Borislav Petkov --- drivers/edac/pnd2_edac.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c index 2b16b95201eb..89cdd9a7a733 100644 --- a/drivers/edac/pnd2_edac.c +++ b/drivers/edac/pnd2_edac.c @@ -236,12 +236,23 @@ static u64 get_sideband_reg_base_addr(void) { struct pci_dev *pdev; u32 hi, lo; + u8 hidden; pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x19dd, NULL); 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, 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); return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0)); } else { From bc8f10babcc27c1f4d8e80d91cc543eabf9125c4 Mon Sep 17 00:00:00 2001 From: Qiuxu Zhuo Date: Mon, 14 Aug 2017 23:49:05 +0800 Subject: [PATCH 11/15] EDAC, pnd2: Properly toggle hidden state for P2SB PCI device Properly handle hidden state of P2SB PCI device (DEV:D, FUN:0) for Apollo Lake. Signed-off-by: Qiuxu Zhuo Cc: Tony Luck Cc: linux-edac Link: http://lkml.kernel.org/r/20170814154905.21707-1-qiuxu.zhuo@intel.com Signed-off-by: Borislav Petkov --- drivers/edac/pnd2_edac.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c index 89cdd9a7a733..4395c84cdcbf 100644 --- a/drivers/edac/pnd2_edac.c +++ b/drivers/edac/pnd2_edac.c @@ -161,8 +161,12 @@ static int _apl_rd_reg(int port, int off, int op, u32 *data) { int retries = 0xff, ret; u16 status; + u8 hidden; - P2SB_WRITE(byte, P2SB_HIDE_OFF, 0); + /* 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; @@ -185,7 +189,9 @@ static int _apl_rd_reg(int port, int off, int op, u32 *data) P2SB_READ(dword, P2SB_DATA_OFF, data); ret = (status >> 1) & 0x3; out: - P2SB_WRITE(byte, P2SB_HIDE_OFF, 1); + /* Hide the P2SB device, if it was hidden before */ + if (hidden) + P2SB_WRITE(byte, P2SB_HIDE_OFF, hidden); return ret; } From b2b3e7362ee7014ad9c40c925a4c27a690dbdd77 Mon Sep 17 00:00:00 2001 From: Bhumika Goyal Date: Sat, 19 Aug 2017 13:52:12 +0530 Subject: [PATCH 12/15] EDAC: Make device_type const Make these const as they are only stored in the type field of a device structure, which is const. Done using Coccinelle. Signed-off-by: Bhumika Goyal Cc: linux-edac Link: http://lkml.kernel.org/r/1503130946-2854-2-git-send-email-bhumirks@gmail.com Signed-off-by: Borislav Petkov --- drivers/edac/edac_mc_sysfs.c | 8 ++++---- drivers/edac/i7core_edac.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index dbc64469b7da..e4fcfa84fbd3 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@ -304,7 +304,7 @@ static void csrow_attr_release(struct device *dev) kfree(csrow); } -static struct device_type csrow_attr_type = { +static const struct device_type csrow_attr_type = { .groups = csrow_attr_groups, .release = csrow_attr_release, }; @@ -644,7 +644,7 @@ static void dimm_attr_release(struct device *dev) kfree(dimm); } -static struct device_type dimm_attr_type = { +static const struct device_type dimm_attr_type = { .groups = dimm_attr_groups, .release = dimm_attr_release, }; @@ -920,7 +920,7 @@ static void mci_attr_release(struct device *dev) kfree(mci); } -static struct device_type mci_attr_type = { +static const struct device_type mci_attr_type = { .groups = mci_attr_groups, .release = mci_attr_release, }; @@ -1074,7 +1074,7 @@ static void mc_attr_release(struct device *dev) kfree(dev); } -static struct device_type mc_attr_type = { +static const struct device_type mc_attr_type = { .release = mc_attr_release, }; /* diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index d36cc8498084..c16c3b931b3d 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c @@ -1094,7 +1094,7 @@ static void addrmatch_release(struct device *device) kfree(device); } -static struct device_type addrmatch_type = { +static const struct device_type addrmatch_type = { .groups = addrmatch_groups, .release = addrmatch_release, }; @@ -1125,7 +1125,7 @@ static void all_channel_counts_release(struct device *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, .release = all_channel_counts_release, }; From 4ab1784b48b384e52a6539ab10201fed7a3127f5 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Tue, 25 Jul 2017 10:44:59 +0200 Subject: [PATCH 13/15] EDAC, mce_amd: Rename decode_smca_errors() to decode_smca_error() Singular fits better because it decodes a single error. No functionality change. Signed-off-by: Borislav Petkov --- drivers/edac/mce_amd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c index e8e9d7df0a6e..94cadd7f69e9 100644 --- a/drivers/edac/mce_amd.c +++ b/drivers/edac/mce_amd.c @@ -849,7 +849,7 @@ static void decode_mc6_mce(struct mce *m) } /* 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; unsigned int bank_type; @@ -998,7 +998,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) pr_cont("\n"); - decode_smca_errors(m); + decode_smca_error(m); goto err_code; } From f3c0891c2feafa008cc35d6ffb8cf593df66c867 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Tue, 25 Jul 2017 11:07:03 +0200 Subject: [PATCH 14/15] EDAC, mce_amd: Get rid of most struct cpuinfo_x86 uses struct mce.cpuid contains CPUID(1).EAX which contains family, model and stepping and thus has enough information for our purposes. Thus get rid of some external dependencies which are not really needed. No functionality change. Signed-off-by: Borislav Petkov --- drivers/edac/mce_amd.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c index 94cadd7f69e9..c0ae47a5c7b7 100644 --- a/drivers/edac/mce_amd.c +++ b/drivers/edac/mce_amd.c @@ -1,6 +1,8 @@ #include #include +#include + #include "mce_amd.h" static struct amd_decoder_ops *fam_ops; @@ -744,7 +746,7 @@ static void decode_mc3_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); u16 ec = EC(m->status); u8 xec = XEC(m->status, 0x1f); @@ -758,7 +760,7 @@ static void decode_mc4_mce(struct mce *m) /* special handling for DRAM ECCs */ if (xec == 0x0 || xec == 0x8) { /* no ECCs on F11h */ - if (c->x86 == 0x11) + if (fam == 0x11) goto wrong_mc4_mce; pr_cont("%s.\n", mc4_mce_desc[xec]); @@ -779,7 +781,7 @@ static void decode_mc4_mce(struct mce *m) return; 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"); else goto wrong_mc4_mce; @@ -802,11 +804,11 @@ static void decode_mc4_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); u8 xec = XEC(m->status, xec_mask); - if (c->x86 == 0xf || c->x86 == 0x11) + if (fam == 0xf || fam == 0x11) goto wrong_mc5_mce; pr_emerg(HW_ERR "MC5 Error: "); @@ -859,7 +861,7 @@ static void decode_smca_error(struct mce *m) if (m->bank >= ARRAY_SIZE(smca_banks)) 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"); hwid = smca_banks[m->bank].hwid; @@ -942,7 +944,7 @@ static int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) { struct mce *m = (struct mce *)data; - struct cpuinfo_x86 *c = &cpu_data(m->extcpu); + unsigned int fam = x86_family(m->cpuid); int ecc; if (amd_filter_mce(m)) @@ -952,7 +954,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", m->extcpu, - c->x86, c->x86_model, c->x86_mask, + fam, x86_model(m->cpuid), x86_stepping(m->cpuid), m->bank, ((m->status & MCI_STATUS_OVER) ? "Over" : "-"), ((m->status & MCI_STATUS_UC) ? "UE" : @@ -961,11 +963,11 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data) ((m->status & MCI_STATUS_PCC) ? "PCC" : "-"), ((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-")); - if (c->x86 >= 0x15) { + if (fam >= 0x15) { pr_cont("|%s", (m->status & MCI_STATUS_DEFERRED ? "Deferred" : "-")); /* 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" : "-")); } From 398443471f1698003832972637d5508a0c0809e0 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Tue, 25 Jul 2017 11:09:56 +0200 Subject: [PATCH 15/15] EDAC, mce_amd: Get rid of local var in amd_filter_mce() ... and use the macro for that. No functionality change. Signed-off-by: Borislav Petkov --- drivers/edac/mce_amd.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c index c0ae47a5c7b7..a11a671c7a38 100644 --- a/drivers/edac/mce_amd.c +++ b/drivers/edac/mce_amd.c @@ -913,12 +913,10 @@ static inline void amd_decode_err_code(u16 ec) */ static bool amd_filter_mce(struct mce *m) { - u8 xec = (m->status >> 16) & 0x1f; - /* * 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 false;