[PATCH v2 16/24] EDAC, ghes: Moving code around ghes_edac_register()

Robert Richter
2019-06-24T15:10:24Z

This is in preparation of the next patch to make the changes there
more visible.

Signed-off-by: Robert Richter <rrichter@marvell.com>
---
drivers/edac/ghes_edac.c | 97 ++++++++++++++++++++++------------------
1 file changed, 53 insertions(+), 44 deletions(-)

diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c
index 793362bea044..13b74368ad81 100644
--- a/drivers/edac/ghes_edac.c
+++ b/drivers/edac/ghes_edac.c
@@ -640,45 +640,19 @@ static struct acpi_platform_list plat_list[] = {
{ } /* End */
};

-int ghes_edac_register(struct ghes *ghes, struct device *dev)
+static int
+ghes_edac_register_one(int nid, struct ghes *ghes, struct device *parent)
{
- bool fake = false;
int rc;
struct mem_ctl_info *mci;
struct edac_mc_layer layers[1];
- int idx = -1;
-
- if (IS_ENABLED(CONFIG_X86)) {
- /* Check if safe to enable on this system */
- idx = acpi_match_platform_list(plat_list);
- if (!force_load && idx < 0)
- return -ENODEV;
- } else {
- idx = 0;
- }
-
- /*
- * We have only one logical memory controller to which all DIMMs belong.
- */
- if (atomic_inc_return(&ghes_init) > 1)
- return 0;
-
- rc = mem_info_setup();
- if (rc == -EINVAL) {
- /* we've got a bogus BIOS */
- fake = true;
- rc = mem_info_setup_fake();
- }
- if (rc < 0) {
- pr_err("Can't allocate memory for DIMM data\n");
- return rc;
- }

layers[0].type = EDAC_MC_LAYER_ALL_MEM;
layers[0].size = mem_info.num_dimm;
layers[0].is_virt_csrow = true;

- mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(struct ghes_edac_pvt));
+ mci = edac_mc_alloc(nid, ARRAY_SIZE(layers), layers,
+ sizeof(struct ghes_edac_pvt));
if (!mci) {
pr_err("Can't allocate memory for EDAC data\n");
return -ENOMEM;
@@ -688,7 +662,7 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
ghes_pvt->ghes = ghes;
ghes_pvt->mci = mci;

- mci->pdev = dev;
+ mci->pdev = parent;
mci->mtype_cap = MEM_FLAG_EMPTY;
mci->edac_ctl_cap = EDAC_FLAG_NONE;
mci->edac_cap = EDAC_FLAG_NONE;
@@ -696,19 +670,6 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
mci->ctl_name = "ghes_edac";
mci->dev_name = "ghes";

- if (fake) {
- 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");
- pr_info("work on such system. Use this driver with caution\n");
- } else if (idx < 0) {
- pr_info("This EDAC driver relies on BIOS to enumerate memory and get error reports.\n");
- pr_info("Unfortunately, not all BIOSes reflect the memory layout correctly.\n");
- pr_info("So, the end result of using this driver varies from vendor to vendor.\n");
- pr_info("If you find incorrect reports, please contact your hardware vendor\n");
- pr_info("to correct its BIOS.\n");
- pr_info("This system has %d DIMM sockets.\n", mem_info.num_dimm);
- }
-
mem_info_prepare_mci(mci);

rc = edac_mc_add_mc(mci);
@@ -733,3 +694,51 @@ void ghes_edac_unregister(struct ghes *ghes)

kfree(mem_info.dimms);
}
+
+int ghes_edac_register(struct ghes *ghes, struct device *dev)
+{
+ bool fake = false;
+ int rc;
+ int idx = -1;
+
+ if (IS_ENABLED(CONFIG_X86)) {
+ /* Check if safe to enable on this system */
+ idx = acpi_match_platform_list(plat_list);
+ if (!force_load && idx < 0)
+ return -ENODEV;
+ } else {
+ idx = 0;
+ }
+
+ /* We have only one ghes instance at a time. */
+ if (atomic_inc_return(&ghes_init) > 1)
+ return 0;
+
+ rc = mem_info_setup();
+ if (rc == -EINVAL) {
+ /* we've got a bogus BIOS */
+ fake = true;
+ rc = mem_info_setup_fake();
+ }
+ if (rc < 0) {
+ pr_err("Can't allocate memory for DIMM data\n");
+ return rc;
+ }
+
+ if (fake) {
+ 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");
+ pr_info("work on such system. Use this driver with caution\n");
+ } else if (idx < 0) {
+ pr_info("This EDAC driver relies on BIOS to enumerate memory and get error reports.\n");
+ pr_info("Unfortunately, not all BIOSes reflect the memory layout correctly.\n");
+ pr_info("So, the end result of using this driver varies from vendor to vendor.\n");
+ pr_info("If you find incorrect reports, please contact your hardware vendor\n");
+ pr_info("to correct its BIOS.\n");
+ pr_info("This system has %d DIMM sockets.\n", mem_info.num_dimm);
+ }
+
+ rc = ghes_edac_register_one(0, ghes, dev);
+
+ return rc;
+}
--
2.20.1