aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/amd64_edac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edac/amd64_edac.c')
-rw-r--r--drivers/edac/amd64_edac.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 84c565d4f56b..98c0150800dc 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -15,10 +15,9 @@ module_param(ecc_enable_override, int, 0644);
static struct msr __percpu *msrs;
-/* Lookup table for all possible MC control instances */
-struct amd64_pvt;
-static struct mem_ctl_info *mci_lookup[EDAC_MAX_NUMNODES];
-static struct amd64_pvt *pvt_lookup[EDAC_MAX_NUMNODES];
+/* Per-node driver instances */
+static struct mem_ctl_info **mcis;
+static struct amd64_pvt **pvts;
/*
* Address to DRAM bank mapping: see F2x80 for K8 and F2x[1,0]80 for Fam10 and
@@ -1446,7 +1445,7 @@ static int f10_lookup_addr_in_dct(u32 in_addr, u32 nid, u32 cs)
int cs_found = -EINVAL;
int csrow;
- mci = mci_lookup[nid];
+ mci = mcis[nid];
if (!mci)
return cs_found;
@@ -1995,7 +1994,7 @@ static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
void amd64_decode_bus_error(int node_id, struct mce *m, u32 nbcfg)
{
- struct mem_ctl_info *mci = mci_lookup[node_id];
+ struct mem_ctl_info *mci = mcis[node_id];
struct err_regs regs;
regs.nbsl = (u32) m->status;
@@ -2615,7 +2614,7 @@ static int amd64_probe_one_instance(struct pci_dev *F2)
* Save the pointer to the private data for use in 2nd initialization
* stage
*/
- pvt_lookup[pvt->mc_node_id] = pvt;
+ pvts[pvt->mc_node_id] = pvt;
return 0;
@@ -2672,8 +2671,8 @@ static int amd64_init_2nd_stage(struct amd64_pvt *pvt)
goto err_add_mc;
}
- mci_lookup[node_id] = mci;
- pvt_lookup[node_id] = NULL;
+ mcis[node_id] = mci;
+ pvts[node_id] = NULL;
/* register stuff with EDAC MCE */
if (report_gart_errors)
@@ -2696,8 +2695,8 @@ err_exit:
amd64_free_mc_sibling_devices(pvt);
- kfree(pvt_lookup[pvt->mc_node_id]);
- pvt_lookup[node_id] = NULL;
+ kfree(pvts[pvt->mc_node_id]);
+ pvts[node_id] = NULL;
return ret;
}
@@ -2746,7 +2745,7 @@ static void __devexit amd64_remove_one_instance(struct pci_dev *pdev)
/* Free the EDAC CORE resources */
mci->pvt_info = NULL;
- mci_lookup[pvt->mc_node_id] = NULL;
+ mcis[pvt->mc_node_id] = NULL;
kfree(pvt);
edac_mc_free(mci);
@@ -2793,7 +2792,7 @@ static void amd64_setup_pci_device(void)
if (amd64_ctl_pci)
return;
- mci = mci_lookup[0];
+ mci = mcis[0];
if (mci) {
pvt = mci->pvt_info;
@@ -2822,6 +2821,12 @@ static int __init amd64_edac_init(void)
if (amd_cache_northbridges() < 0)
goto err_ret;
+ err = -ENOMEM;
+ pvts = kzalloc(amd_nb_num() * sizeof(pvts[0]), GFP_KERNEL);
+ mcis = kzalloc(amd_nb_num() * sizeof(mcis[0]), GFP_KERNEL);
+ if (!(pvts && mcis))
+ goto err_ret;
+
msrs = msrs_alloc();
if (!msrs)
goto err_ret;
@@ -2831,16 +2836,16 @@ static int __init amd64_edac_init(void)
goto err_pci;
/*
- * At this point, the array 'pvt_lookup[]' contains pointers to alloc'd
+ * At this point, the array 'pvts[]' contains pointers to alloc'd
* amd64_pvt structs. These will be used in the 2nd stage init function
* to finish initialization of the MC instances.
*/
err = -ENODEV;
for (nb = 0; nb < amd_nb_num(); nb++) {
- if (!pvt_lookup[nb])
+ if (!pvts[nb])
continue;
- err = amd64_init_2nd_stage(pvt_lookup[nb]);
+ err = amd64_init_2nd_stage(pvts[nb]);
if (err)
goto err_2nd_stage;
@@ -2854,9 +2859,11 @@ static int __init amd64_edac_init(void)
err_2nd_stage:
pci_unregister_driver(&amd64_pci_driver);
+
err_pci:
msrs_free(msrs);
msrs = NULL;
+
err_ret:
return err;
}
@@ -2868,6 +2875,12 @@ static void __exit amd64_edac_exit(void)
pci_unregister_driver(&amd64_pci_driver);
+ kfree(mcis);
+ mcis = NULL;
+
+ kfree(pvts);
+ pvts = NULL;
+
msrs_free(msrs);
msrs = NULL;
}