Skip to content

Commit 1032095

Browse files
qzhuo2aegl
authored andcommitted
EDAC/skx: Use the mcmtr register to retrieve close_pg/bank_xor_enable
The skx_edac driver wrongly uses the mtr register to retrieve two fields close_pg and bank_xor_enable. Fix it by using the correct mcmtr register to get the two fields. Cc: <[email protected]> Signed-off-by: Qiuxu Zhuo <[email protected]> Reported-by: Matthew Riley <[email protected]> Acked-by: Aristeu Rozanski <[email protected]> Signed-off-by: Tony Luck <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent b2f9fb0 commit 1032095

File tree

4 files changed

+13
-17
lines changed

4 files changed

+13
-17
lines changed

drivers/edac/i10nm_base.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci)
161161
mtr, mcddrtcfg, imc->mc, i, j);
162162

163163
if (IS_DIMM_PRESENT(mtr))
164-
ndimms += skx_get_dimm_info(mtr, 0, dimm,
164+
ndimms += skx_get_dimm_info(mtr, 0, 0, dimm,
165165
imc, i, j);
166166
else if (IS_NVDIMM_PRESENT(mcddrtcfg, j))
167167
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,

drivers/edac/skx_base.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,27 +163,23 @@ static const struct x86_cpu_id skx_cpuids[] = {
163163
};
164164
MODULE_DEVICE_TABLE(x86cpu, skx_cpuids);
165165

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)
166+
static bool skx_check_ecc(u32 mcmtr)
170167
{
171-
u32 mtmtr;
172-
173-
SKX_GET_MTMTR(pdev, mtmtr);
174-
175-
return !!GET_BITFIELD(mtmtr, 2, 2);
168+
return !!GET_BITFIELD(mcmtr, 2, 2);
176169
}
177170

178171
static int skx_get_dimm_config(struct mem_ctl_info *mci)
179172
{
180173
struct skx_pvt *pvt = mci->pvt_info;
174+
u32 mtr, mcmtr, amap, mcddrtcfg;
181175
struct skx_imc *imc = pvt->imc;
182-
u32 mtr, amap, mcddrtcfg;
183176
struct dimm_info *dimm;
184177
int i, j;
185178
int ndimms;
186179

180+
/* Only the mcmtr on the first channel is effective */
181+
pci_read_config_dword(imc->chan[0].cdev, 0x87c, &mcmtr);
182+
187183
for (i = 0; i < SKX_NUM_CHANNELS; i++) {
188184
ndimms = 0;
189185
pci_read_config_dword(imc->chan[i].cdev, 0x8C, &amap);
@@ -193,14 +189,14 @@ static int skx_get_dimm_config(struct mem_ctl_info *mci)
193189
pci_read_config_dword(imc->chan[i].cdev,
194190
0x80 + 4 * j, &mtr);
195191
if (IS_DIMM_PRESENT(mtr)) {
196-
ndimms += skx_get_dimm_info(mtr, amap, dimm, imc, i, j);
192+
ndimms += skx_get_dimm_info(mtr, mcmtr, amap, dimm, imc, i, j);
197193
} else if (IS_NVDIMM_PRESENT(mcddrtcfg, j)) {
198194
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
199195
EDAC_MOD_STR);
200196
nvdimm_count++;
201197
}
202198
}
203-
if (ndimms && !skx_check_ecc(imc->chan[0].cdev)) {
199+
if (ndimms && !skx_check_ecc(mcmtr)) {
204200
skx_printk(KERN_ERR, "ECC is disabled on imc %d\n", imc->mc);
205201
return -ENODEV;
206202
}

drivers/edac/skx_common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add,
304304
#define numrow(reg) skx_get_dimm_attr(reg, 2, 4, 12, 1, 6, "rows")
305305
#define numcol(reg) skx_get_dimm_attr(reg, 0, 1, 10, 0, 2, "cols")
306306

307-
int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
307+
int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
308308
struct skx_imc *imc, int chan, int dimmno)
309309
{
310310
int banks = 16, ranks, rows, cols, npages;
@@ -324,8 +324,8 @@ int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
324324
imc->mc, chan, dimmno, size, npages,
325325
banks, 1 << ranks, rows, cols);
326326

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);
327+
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mcmtr, 0, 0);
328+
imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mcmtr, 9, 9);
329329
imc->chan[chan].dimms[dimmno].fine_grain_bank = GET_BITFIELD(amap, 0, 0);
330330
imc->chan[chan].dimms[dimmno].rowbits = rows;
331331
imc->chan[chan].dimms[dimmno].colbits = cols;

drivers/edac/skx_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type,
128128

129129
int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm);
130130

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

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

0 commit comments

Comments
 (0)