Skip to content

Commit 498550e

Browse files
qzhuo2aegl
authored andcommitted
EDAC/ie31200: Break up ie31200_probe1()
Split ie31200_probe1() into two helper functions to easily extend support for multiple memory controllers. No functional changes intended. Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com> Signed-off-by: Tony Luck <tony.luck@intel.com> Tested-by: Gary Wang <gary.c.wang@intel.com> Link: https://lore.kernel.org/r/20250310011411.31685-10-qiuxu.zhuo@intel.com
1 parent a217961 commit 498550e

File tree

1 file changed

+61
-47
lines changed

1 file changed

+61
-47
lines changed

drivers/edac/ie31200_edac.c

Lines changed: 61 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -332,21 +332,51 @@ static void populate_dimm_info(struct dimm_data *dd, u32 addr_decode, int dimm,
332332
dd->dtype = field_get(cfg->reg_mad_dimm_width_mask[dimm], addr_decode) + DEV_X8;
333333
}
334334

335-
static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
335+
static void ie31200_get_dimm_config(struct mem_ctl_info *mci, void __iomem *window,
336+
struct res_config *cfg)
336337
{
337-
int i, j, k, ret;
338-
struct mem_ctl_info *mci = NULL;
339-
struct edac_mc_layer layers[2];
340-
void __iomem *window;
341-
struct ie31200_priv *priv;
338+
struct dimm_data dimm_info;
339+
struct dimm_info *dimm;
340+
unsigned long nr_pages;
342341
u32 addr_decode;
342+
int i, j, k;
343343

344-
edac_dbg(0, "MC:\n");
344+
for (i = 0; i < IE31200_CHANNELS; i++) {
345+
addr_decode = readl(window + cfg->reg_mad_dimm_offset[i]);
346+
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode);
345347

346-
if (!ecc_capable(pdev)) {
347-
ie31200_printk(KERN_INFO, "No ECC support\n");
348-
return -ENODEV;
348+
for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) {
349+
populate_dimm_info(&dimm_info, addr_decode, j, cfg);
350+
edac_dbg(0, "channel: %d, dimm: %d, size: %lld MiB, ranks: %d, DRAM chip type: %d\n",
351+
i, j, dimm_info.size >> 20,
352+
dimm_info.ranks,
353+
dimm_info.dtype);
354+
355+
nr_pages = MiB_TO_PAGES(dimm_info.size >> 20);
356+
if (nr_pages == 0)
357+
continue;
358+
359+
nr_pages = nr_pages / dimm_info.ranks;
360+
for (k = 0; k < dimm_info.ranks; k++) {
361+
dimm = edac_get_dimm(mci, (j * dimm_info.ranks) + k, i, 0);
362+
dimm->nr_pages = nr_pages;
363+
edac_dbg(0, "set nr pages: 0x%lx\n", nr_pages);
364+
dimm->grain = 8; /* just a guess */
365+
dimm->mtype = cfg->mtype;
366+
dimm->dtype = dimm_info.dtype;
367+
dimm->edac_mode = EDAC_UNKNOWN;
368+
}
369+
}
349370
}
371+
}
372+
373+
static int ie31200_register_mci(struct pci_dev *pdev, struct res_config *cfg)
374+
{
375+
struct edac_mc_layer layers[2];
376+
struct ie31200_priv *priv;
377+
struct mem_ctl_info *mci;
378+
void __iomem *window;
379+
int ret;
350380

351381
nr_channels = how_many_channels(pdev);
352382
layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
@@ -382,38 +412,7 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
382412
priv->c1errlog = window + cfg->reg_eccerrlog_offset[1];
383413
priv->cfg = cfg;
384414

385-
for (i = 0; i < IE31200_CHANNELS; i++) {
386-
addr_decode = readl(window + cfg->reg_mad_dimm_offset[i]);
387-
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode);
388-
389-
for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) {
390-
struct dimm_data dimm_info;
391-
struct dimm_info *dimm;
392-
unsigned long nr_pages;
393-
394-
populate_dimm_info(&dimm_info, addr_decode, j, cfg);
395-
edac_dbg(0, "channel: %d, dimm: %d, size: %lld MiB, ranks: %d, DRAM chip type: %d\n",
396-
i, j, dimm_info.size >> 20,
397-
dimm_info.ranks,
398-
dimm_info.dtype);
399-
400-
nr_pages = MiB_TO_PAGES(dimm_info.size >> 20);
401-
if (nr_pages == 0)
402-
continue;
403-
404-
nr_pages = nr_pages / dimm_info.ranks;
405-
for (k = 0; k < dimm_info.ranks; k++) {
406-
dimm = edac_get_dimm(mci, (j * dimm_info.ranks) + k, i, 0);
407-
dimm->nr_pages = nr_pages;
408-
edac_dbg(0, "set nr pages: 0x%lx\n", nr_pages);
409-
dimm->grain = 8; /* just a guess */
410-
dimm->mtype = cfg->mtype;
411-
dimm->dtype = dimm_info.dtype;
412-
dimm->edac_mode = EDAC_UNKNOWN;
413-
}
414-
}
415-
}
416-
415+
ie31200_get_dimm_config(mci, window, cfg);
417416
ie31200_clear_error_info(mci);
418417

419418
if (edac_mc_add_mc(mci)) {
@@ -422,19 +421,34 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
422421
goto fail_unmap;
423422
}
424423

425-
/* get this far and it's successful */
426-
edac_dbg(3, "MC: success\n");
427424
return 0;
428-
429425
fail_unmap:
430426
iounmap(window);
431-
432427
fail_free:
433428
edac_mc_free(mci);
434-
435429
return ret;
436430
}
437431

432+
static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
433+
{
434+
int ret;
435+
436+
edac_dbg(0, "MC:\n");
437+
438+
if (!ecc_capable(pdev)) {
439+
ie31200_printk(KERN_INFO, "No ECC support\n");
440+
return -ENODEV;
441+
}
442+
443+
ret = ie31200_register_mci(pdev, cfg);
444+
if (ret)
445+
return ret;
446+
447+
/* get this far and it's successful. */
448+
edac_dbg(3, "MC: success\n");
449+
return 0;
450+
}
451+
438452
static int ie31200_init_one(struct pci_dev *pdev,
439453
const struct pci_device_id *ent)
440454
{

0 commit comments

Comments
 (0)