Factor out code to register a memory controller including DIMMs. Do this for standard and fake memory controller in the two functions ghes_edac_register_one() and ghes_edac_register_fake().
Function ghes_edac_register_one() could be reused to register multiple *mci structs. Signed-off-by: Robert Richter <rrich...@marvell.com> --- drivers/edac/ghes_edac.c | 94 +++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c index 47b99e0fea6d..b68cd22e68bf 100644 --- a/drivers/edac/ghes_edac.c +++ b/drivers/edac/ghes_edac.c @@ -531,11 +531,60 @@ static struct mem_ctl_info *ghes_mc_del(void) return mci; } -int ghes_edac_register(struct ghes *ghes, struct device *dev) +static int ghes_edac_register_fake(struct device *dev) +{ + struct mem_ctl_info *mci; + struct dimm_info *dimm; + int rc; + + mci = ghes_mc_create(dev, 0, 1); + if (!mci) + return -ENOMEM; + + dimm = edac_get_dimm_by_index(mci, 0); + + dimm->nr_pages = 1; + dimm->grain = 128; + dimm->mtype = MEM_UNKNOWN; + dimm->dtype = DEV_UNKNOWN; + dimm->edac_mode = EDAC_SECDED; + + snprintf(dimm->label, sizeof(dimm->label), "unknown memory"); + + rc = ghes_mc_add(mci); + + if (rc < 0) + ghes_mc_destroy(mci); + + return rc; +} + +static int ghes_edac_register_one(struct device *dev, int mc_idx, int num_dimm) { struct dimm_fill dimm_fill; - int rc = 0, num_dimm = 0; struct mem_ctl_info *mci; + int rc; + + mci = ghes_mc_create(dev, mc_idx, num_dimm); + if (!mci) + return -ENOMEM; + + dimm_fill.index = 0; + dimm_fill.mci = mci; + + dmi_walk(ghes_edac_dmidecode, &dimm_fill); + + rc = ghes_mc_add(mci); + + if (rc < 0) + ghes_mc_destroy(mci); + + return rc; +} + +int ghes_edac_register(struct ghes *ghes, struct device *dev) +{ + int rc = 0, num_dimm = 0; int idx; if (IS_ENABLED(CONFIG_X86)) { @@ -565,29 +614,9 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) * with only one DIMM for the whole address range to * catch all errros. */ - struct dimm_info *dimm; - - mci = ghes_mc_create(dev, 0, 1); - if (!mci) { - rc = -ENOMEM; + rc = ghes_edac_register_fake(dev); + if (rc < 0) goto unlock; - } - - dimm = edac_get_dimm_by_index(mci, 0); - - dimm->nr_pages = 1; - dimm->grain = 128; - dimm->mtype = MEM_UNKNOWN; - dimm->dtype = DEV_UNKNOWN; - dimm->edac_mode = EDAC_SECDED; - - snprintf(dimm->label, sizeof(dimm->label), "unknown memory"); - - rc = ghes_mc_add(mci); - if (rc) { - ghes_mc_destroy(mci); - goto unlock; - } pr_info("This system has a very crappy BIOS: It doesn't even list the DIMMS.\n"); pr_info("Its SMBIOS info is wrong. It is doubtful that the error report would\n"); @@ -605,22 +634,9 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) pr_info("This system has %d DIMM sockets.\n", num_dimm); } - mci = ghes_mc_create(dev, 0, num_dimm); - if (!mci) { - rc = -ENOMEM; - goto unlock; - } - - dimm_fill.index = 0; - dimm_fill.mci = mci; - - dmi_walk(ghes_edac_dmidecode, &dimm_fill); - - rc = ghes_mc_add(mci); - if (rc < 0) { - ghes_mc_destroy(mci); + rc = ghes_edac_register_one(dev, 0, num_dimm); + if (rc < 0) goto unlock; - } out: /* only set on success */ -- 2.20.1