Skip to content

Commit 8b11dd5

Browse files
committed
Merge tag 'edac_updates_for_5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras
Pull EDAC updates from Borislav Petkov: - Fix i10nm_edac loading on some Ice Lake and Tremont/Jacobsville steppings due to the offset change of the bus number configuration register, by Qiuxu Zhuo. - The usual cleanups and fixes all over the place. * tag 'edac_updates_for_5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras: EDAC/amd64: Remove redundant assignment to variable ret in hw_info_get() EDAC/skx: Use the mcmtr register to retrieve close_pg/bank_xor_enable EDAC/i10nm: Update driver to support different bus number config register offsets EDAC, {skx,i10nm}: Make some configurations CPU model specific EDAC/amd8131: Remove defined but not used bridge_str EDAC/thunderx: Make symbols static MAINTAINERS: Remove sifive_l2_cache.c from EDAC-SIFIVE pattern EDAC/xgene: Remove set but not used address local var EDAC/armada_xp: Fix some log messages
2 parents ca1f5df + 2a02ca0 commit 8b11dd5

File tree

10 files changed

+73
-55
lines changed

10 files changed

+73
-55
lines changed

MAINTAINERS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6193,7 +6193,6 @@ M: Yash Shah <[email protected]>
61936193
61946194
S: Supported
61956195
F: drivers/edac/sifive_edac.c
6196-
F: drivers/soc/sifive_l2_cache.c
61976196

61986197
EDAC-SKYLAKE
61996198
M: Tony Luck <[email protected]>

drivers/edac/amd64_edac.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3403,7 +3403,7 @@ static const struct attribute_group *amd64_edac_attr_groups[] = {
34033403
static int hw_info_get(struct amd64_pvt *pvt)
34043404
{
34053405
u16 pci_id1, pci_id2;
3406-
int ret = -EINVAL;
3406+
int ret;
34073407

34083408
if (pvt->fam >= 0x17) {
34093409
pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);

drivers/edac/amd8131_edac.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@ static void edac_pci_write_dword(struct pci_dev *dev, int reg, u32 val32)
4444
" PCI Access Write Error at 0x%x\n", reg);
4545
}
4646

47-
static char * const bridge_str[] = {
48-
[NORTH_A] = "NORTH A",
49-
[NORTH_B] = "NORTH B",
50-
[SOUTH_A] = "SOUTH A",
51-
[SOUTH_B] = "SOUTH B",
52-
[NO_BRIDGE] = "NO BRIDGE",
53-
};
54-
5547
/* Support up to two AMD8131 chipsets on a platform */
5648
static struct amd8131_dev_info amd8131_devices[] = {
5749
{

drivers/edac/armada_xp_edac.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct axp_mc_drvdata {
7878
char msg[128];
7979
};
8080

81-
/* derived from "DRAM Address Multiplexing" in the ARAMDA XP Functional Spec */
81+
/* derived from "DRAM Address Multiplexing" in the ARMADA XP Functional Spec */
8282
static uint32_t axp_mc_calc_address(struct axp_mc_drvdata *drvdata,
8383
uint8_t cs, uint8_t bank, uint16_t row,
8484
uint16_t col)
@@ -160,12 +160,12 @@ static void axp_mc_check(struct mem_ctl_info *mci)
160160
if (cnt_sbe)
161161
cnt_sbe--;
162162
else
163-
dev_warn(mci->pdev, "inconsistent SBE count detected");
163+
dev_warn(mci->pdev, "inconsistent SBE count detected\n");
164164
} else {
165165
if (cnt_dbe)
166166
cnt_dbe--;
167167
else
168-
dev_warn(mci->pdev, "inconsistent DBE count detected");
168+
dev_warn(mci->pdev, "inconsistent DBE count detected\n");
169169
}
170170

171171
/* report earlier errors */
@@ -304,7 +304,7 @@ static int axp_mc_probe(struct platform_device *pdev)
304304

305305
config = readl(base + SDRAM_CONFIG_REG);
306306
if (!(config & SDRAM_CONFIG_ECC_MASK)) {
307-
dev_warn(&pdev->dev, "SDRAM ECC is not enabled");
307+
dev_warn(&pdev->dev, "SDRAM ECC is not enabled\n");
308308
return -EINVAL;
309309
}
310310

@@ -532,9 +532,9 @@ static int aurora_l2_probe(struct platform_device *pdev)
532532

533533
l2x0_aux_ctrl = readl(base + L2X0_AUX_CTRL);
534534
if (!(l2x0_aux_ctrl & AURORA_ACR_PARITY_EN))
535-
dev_warn(&pdev->dev, "tag parity is not enabled");
535+
dev_warn(&pdev->dev, "tag parity is not enabled\n");
536536
if (!(l2x0_aux_ctrl & AURORA_ACR_ECC_EN))
537-
dev_warn(&pdev->dev, "data ECC is not enabled");
537+
dev_warn(&pdev->dev, "data ECC is not enabled\n");
538538

539539
dci = edac_device_alloc_ctl_info(sizeof(*drvdata),
540540
"cpu", 1, "L", 1, 2, NULL, 0, 0);
@@ -618,7 +618,7 @@ static int __init armada_xp_edac_init(void)
618618

619619
res = platform_register_drivers(drivers, ARRAY_SIZE(drivers));
620620
if (res)
621-
pr_warn("Aramda XP EDAC drivers fail to register\n");
621+
pr_warn("Armada XP EDAC drivers fail to register\n");
622622

623623
return 0;
624624
}

drivers/edac/i10nm_base.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,22 @@ static int i10nm_get_all_munits(void)
122122
return 0;
123123
}
124124

125+
static struct res_config i10nm_cfg0 = {
126+
.type = I10NM,
127+
.decs_did = 0x3452,
128+
.busno_cfg_offset = 0xcc,
129+
};
130+
131+
static struct res_config i10nm_cfg1 = {
132+
.type = I10NM,
133+
.decs_did = 0x3452,
134+
.busno_cfg_offset = 0xd0,
135+
};
136+
125137
static const struct x86_cpu_id i10nm_cpuids[] = {
126-
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, NULL),
127-
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_X, NULL),
128-
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_D, NULL),
138+
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, &i10nm_cfg0),
139+
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_X, &i10nm_cfg0),
140+
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_D, &i10nm_cfg1),
129141
{}
130142
};
131143
MODULE_DEVICE_TABLE(x86cpu, i10nm_cpuids);
@@ -161,7 +173,7 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci)
161173
mtr, mcddrtcfg, imc->mc, i, j);
162174

163175
if (IS_DIMM_PRESENT(mtr))
164-
ndimms += skx_get_dimm_info(mtr, 0, dimm,
176+
ndimms += skx_get_dimm_info(mtr, 0, 0, dimm,
165177
imc, i, j);
166178
else if (IS_NVDIMM_PRESENT(mcddrtcfg, j))
167179
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
@@ -234,6 +246,7 @@ static int __init i10nm_init(void)
234246
{
235247
u8 mc = 0, src_id = 0, node_id = 0;
236248
const struct x86_cpu_id *id;
249+
struct res_config *cfg;
237250
const char *owner;
238251
struct skx_dev *d;
239252
int rc, i, off[3] = {0xd0, 0xc8, 0xcc};
@@ -249,11 +262,17 @@ static int __init i10nm_init(void)
249262
if (!id)
250263
return -ENODEV;
251264

265+
cfg = (struct res_config *)id->driver_data;
266+
267+
/* Newer steppings have different offset for ATOM_TREMONT_D/ICELAKE_X */
268+
if (boot_cpu_data.x86_stepping >= 4)
269+
cfg->busno_cfg_offset = 0xd0;
270+
252271
rc = skx_get_hi_lo(0x09a2, off, &tolm, &tohm);
253272
if (rc)
254273
return rc;
255274

256-
rc = skx_get_all_bus_mappings(0x3452, 0xcc, I10NM, &i10nm_edac_list);
275+
rc = skx_get_all_bus_mappings(cfg, &i10nm_edac_list);
257276
if (rc < 0)
258277
goto fail;
259278
if (rc == 0) {

drivers/edac/skx_base.c

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,33 +157,35 @@ static int get_all_munits(const struct munit *m)
157157
return -ENODEV;
158158
}
159159

160+
static struct res_config skx_cfg = {
161+
.type = SKX,
162+
.decs_did = 0x2016,
163+
.busno_cfg_offset = 0xcc,
164+
};
165+
160166
static const struct x86_cpu_id skx_cpuids[] = {
161-
X86_MATCH_INTEL_FAM6_MODEL(SKYLAKE_X, NULL),
167+
X86_MATCH_INTEL_FAM6_MODEL(SKYLAKE_X, &skx_cfg),
162168
{ }
163169
};
164170
MODULE_DEVICE_TABLE(x86cpu, skx_cpuids);
165171

166-
#define SKX_GET_MTMTR(dev, reg) \
167-
pci_read_config_dword((dev), 0x87c, &(reg))
168-
169-
static bool skx_check_ecc(struct pci_dev *pdev)
172+
static bool skx_check_ecc(u32 mcmtr)
170173
{
171-
u32 mtmtr;
172-
173-
SKX_GET_MTMTR(pdev, mtmtr);
174-
175-
return !!GET_BITFIELD(mtmtr, 2, 2);
174+
return !!GET_BITFIELD(mcmtr, 2, 2);
176175
}
177176

178177
static int skx_get_dimm_config(struct mem_ctl_info *mci)
179178
{
180179
struct skx_pvt *pvt = mci->pvt_info;
180+
u32 mtr, mcmtr, amap, mcddrtcfg;
181181
struct skx_imc *imc = pvt->imc;
182-
u32 mtr, amap, mcddrtcfg;
183182
struct dimm_info *dimm;
184183
int i, j;
185184
int ndimms;
186185

186+
/* Only the mcmtr on the first channel is effective */
187+
pci_read_config_dword(imc->chan[0].cdev, 0x87c, &mcmtr);
188+
187189
for (i = 0; i < SKX_NUM_CHANNELS; i++) {
188190
ndimms = 0;
189191
pci_read_config_dword(imc->chan[i].cdev, 0x8C, &amap);
@@ -193,14 +195,14 @@ static int skx_get_dimm_config(struct mem_ctl_info *mci)
193195
pci_read_config_dword(imc->chan[i].cdev,
194196
0x80 + 4 * j, &mtr);
195197
if (IS_DIMM_PRESENT(mtr)) {
196-
ndimms += skx_get_dimm_info(mtr, amap, dimm, imc, i, j);
198+
ndimms += skx_get_dimm_info(mtr, mcmtr, amap, dimm, imc, i, j);
197199
} else if (IS_NVDIMM_PRESENT(mcddrtcfg, j)) {
198200
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
199201
EDAC_MOD_STR);
200202
nvdimm_count++;
201203
}
202204
}
203-
if (ndimms && !skx_check_ecc(imc->chan[0].cdev)) {
205+
if (ndimms && !skx_check_ecc(mcmtr)) {
204206
skx_printk(KERN_ERR, "ECC is disabled on imc %d\n", imc->mc);
205207
return -ENODEV;
206208
}
@@ -641,6 +643,7 @@ static inline void teardown_skx_debug(void) {}
641643
static int __init skx_init(void)
642644
{
643645
const struct x86_cpu_id *id;
646+
struct res_config *cfg;
644647
const struct munit *m;
645648
const char *owner;
646649
int rc = 0, i, off[3] = {0xd0, 0xd4, 0xd8};
@@ -657,11 +660,13 @@ static int __init skx_init(void)
657660
if (!id)
658661
return -ENODEV;
659662

663+
cfg = (struct res_config *)id->driver_data;
664+
660665
rc = skx_get_hi_lo(0x2034, off, &skx_tolm, &skx_tohm);
661666
if (rc)
662667
return rc;
663668

664-
rc = skx_get_all_bus_mappings(0x2016, 0xcc, SKX, &skx_edac_list);
669+
rc = skx_get_all_bus_mappings(cfg, &skx_edac_list);
665670
if (rc < 0)
666671
goto fail;
667672
if (rc == 0) {

drivers/edac/skx_common.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,11 @@ static int get_width(u32 mtr)
197197
}
198198

199199
/*
200-
* We use the per-socket device @did to count how many sockets are present,
200+
* We use the per-socket device @cfg->did to count how many sockets are present,
201201
* and to detemine which PCI buses are associated with each socket. Allocate
202202
* and build the full list of all the skx_dev structures that we need here.
203203
*/
204-
int skx_get_all_bus_mappings(unsigned int did, int off, enum type type,
205-
struct list_head **list)
204+
int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list)
206205
{
207206
struct pci_dev *pdev, *prev;
208207
struct skx_dev *d;
@@ -211,7 +210,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type type,
211210

212211
prev = NULL;
213212
for (;;) {
214-
pdev = pci_get_device(PCI_VENDOR_ID_INTEL, did, prev);
213+
pdev = pci_get_device(PCI_VENDOR_ID_INTEL, cfg->decs_did, prev);
215214
if (!pdev)
216215
break;
217216
ndev++;
@@ -221,7 +220,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type type,
221220
return -ENOMEM;
222221
}
223222

224-
if (pci_read_config_dword(pdev, off, &reg)) {
223+
if (pci_read_config_dword(pdev, cfg->busno_cfg_offset, &reg)) {
225224
kfree(d);
226225
pci_dev_put(pdev);
227226
skx_printk(KERN_ERR, "Failed to read bus idx\n");
@@ -230,7 +229,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type type,
230229

231230
d->bus[0] = GET_BITFIELD(reg, 0, 7);
232231
d->bus[1] = GET_BITFIELD(reg, 8, 15);
233-
if (type == SKX) {
232+
if (cfg->type == SKX) {
234233
d->seg = pci_domain_nr(pdev->bus);
235234
d->bus[2] = GET_BITFIELD(reg, 16, 23);
236235
d->bus[3] = GET_BITFIELD(reg, 24, 31);
@@ -304,7 +303,7 @@ static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add,
304303
#define numrow(reg) skx_get_dimm_attr(reg, 2, 4, 12, 1, 6, "rows")
305304
#define numcol(reg) skx_get_dimm_attr(reg, 0, 1, 10, 0, 2, "cols")
306305

307-
int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
306+
int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
308307
struct skx_imc *imc, int chan, int dimmno)
309308
{
310309
int banks = 16, ranks, rows, cols, npages;
@@ -324,8 +323,8 @@ int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
324323
imc->mc, chan, dimmno, size, npages,
325324
banks, 1 << ranks, rows, cols);
326325

327-
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mtr, 0, 0);
328-
imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mtr, 9, 9);
326+
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mcmtr, 0, 0);
327+
imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mcmtr, 9, 9);
329328
imc->chan[chan].dimms[dimmno].fine_grain_bank = GET_BITFIELD(amap, 0, 0);
330329
imc->chan[chan].dimms[dimmno].rowbits = rows;
331330
imc->chan[chan].dimms[dimmno].colbits = cols;

drivers/edac/skx_common.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ struct decoded_addr {
112112
int bank_group;
113113
};
114114

115+
struct res_config {
116+
enum type type;
117+
/* Configuration agent device ID */
118+
unsigned int decs_did;
119+
/* Default bus number configuration register offset */
120+
int busno_cfg_offset;
121+
};
122+
115123
typedef int (*get_dimm_config_f)(struct mem_ctl_info *mci);
116124
typedef bool (*skx_decode_f)(struct decoded_addr *res);
117125
typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, int len);
@@ -123,12 +131,11 @@ void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log);
123131
int skx_get_src_id(struct skx_dev *d, int off, u8 *id);
124132
int skx_get_node_id(struct skx_dev *d, u8 *id);
125133

126-
int skx_get_all_bus_mappings(unsigned int did, int off, enum type,
127-
struct list_head **list);
134+
int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list);
128135

129136
int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm);
130137

131-
int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
138+
int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
132139
struct skx_imc *imc, int chan, int dimmno);
133140

134141
int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,

drivers/edac/thunderx_edac.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,7 +1278,7 @@ OCX_DEBUGFS_ATTR(lne23_badcnt, OCX_LNE_BAD_CNT(23));
12781278

12791279
OCX_DEBUGFS_ATTR(com_int, OCX_COM_INT_W1S);
12801280

1281-
struct debugfs_entry *ocx_dfs_ents[] = {
1281+
static struct debugfs_entry *ocx_dfs_ents[] = {
12821282
&debugfs_tlk0_ecc_ctl,
12831283
&debugfs_tlk1_ecc_ctl,
12841284
&debugfs_tlk2_ecc_ctl,
@@ -1919,19 +1919,19 @@ static irqreturn_t thunderx_l2c_threaded_isr(int irq, void *irq_id)
19191919

19201920
L2C_DEBUGFS_ATTR(tad_int, L2C_TAD_INT_W1S);
19211921

1922-
struct debugfs_entry *l2c_tad_dfs_ents[] = {
1922+
static struct debugfs_entry *l2c_tad_dfs_ents[] = {
19231923
&debugfs_tad_int,
19241924
};
19251925

19261926
L2C_DEBUGFS_ATTR(cbc_int, L2C_CBC_INT_W1S);
19271927

1928-
struct debugfs_entry *l2c_cbc_dfs_ents[] = {
1928+
static struct debugfs_entry *l2c_cbc_dfs_ents[] = {
19291929
&debugfs_cbc_int,
19301930
};
19311931

19321932
L2C_DEBUGFS_ATTR(mci_int, L2C_MCI_INT_W1S);
19331933

1934-
struct debugfs_entry *l2c_mci_dfs_ents[] = {
1934+
static struct debugfs_entry *l2c_mci_dfs_ents[] = {
19351935
&debugfs_mci_int,
19361936
};
19371937

drivers/edac/xgene_edac.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,7 +1349,6 @@ static int xgene_edac_l3_remove(struct xgene_edac_dev_ctx *l3)
13491349
#define WORD_ALIGNED_ERR_MASK BIT(28)
13501350
#define PAGE_ACCESS_ERR_MASK BIT(27)
13511351
#define WRITE_ACCESS_MASK BIT(26)
1352-
#define RBERRADDR_RD(src) ((src) & 0x03FFFFFF)
13531352

13541353
static const char * const soc_mem_err_v1[] = {
13551354
"10GbE0",
@@ -1483,13 +1482,11 @@ static void xgene_edac_rb_report(struct edac_device_ctl_info *edac_dev)
14831482
return;
14841483
if (reg & STICKYERR_MASK) {
14851484
bool write;
1486-
u32 address;
14871485

14881486
dev_err(edac_dev->dev, "IOB bus access error(s)\n");
14891487
if (regmap_read(ctx->edac->rb_map, RBEIR, &reg))
14901488
return;
14911489
write = reg & WRITE_ACCESS_MASK ? 1 : 0;
1492-
address = RBERRADDR_RD(reg);
14931490
if (reg & AGENT_OFFLINE_ERR_MASK)
14941491
dev_err(edac_dev->dev,
14951492
"IOB bus %s access to offline agent error\n",

0 commit comments

Comments
 (0)