From b8cfa02f833a614e80f851747c4ce14989a4cfd0 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Fri, 1 Oct 2010 19:35:38 +0200 Subject: amd64_edac: Concentrate per-family init even more Move the remaining per-family init code into the proper place and simplify the rest of the initialization. Reorganize error handling in amd64_init_one_instance(). Signed-off-by: Borislav Petkov --- drivers/edac/amd64_edac.c | 31 +++++++++++++++---------------- drivers/edac/amd64_edac.h | 15 ++------------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 437f5b67ab3c..0caea2b76659 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -2573,11 +2573,13 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) switch (fam) { case 0xf: fam_type = &amd64_family_types[K8_CPUS]; + pvt->ops = &amd64_family_types[K8_CPUS].ops; pvt->ctl_name = fam_type->ctl_name; pvt->min_scrubrate = K8_MIN_SCRUB_RATE_BITS; break; case 0x10: fam_type = &amd64_family_types[F10_CPUS]; + pvt->ops = &amd64_family_types[F10_CPUS].ops; pvt->ctl_name = fam_type->ctl_name; pvt->min_scrubrate = F10_MIN_SCRUB_RATE_BITS; break; @@ -2587,6 +2589,8 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) return NULL; } + pvt->ext_model = boot_cpu_data.x86_model >> 4; + amd64_printk(KERN_INFO, "%s %s detected.\n", pvt->ctl_name, (fam == 0xf ? (pvt->ext_model >= K8_REV_F ? "revF or later" @@ -2607,8 +2611,7 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) * later come back in a finish-setup function to perform that final * initialization. See also amd64_init_2nd_stage() for that. */ -static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl, - int mc_type_index) +static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl) { struct amd64_pvt *pvt = NULL; struct amd64_family_type *fam_type = NULL; @@ -2619,12 +2622,8 @@ static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl, if (!pvt) goto err_exit; - pvt->mc_node_id = get_node_id(dram_f2_ctl); - - pvt->dram_f2_ctl = dram_f2_ctl; - pvt->ext_model = boot_cpu_data.x86_model >> 4; - pvt->mc_type_index = mc_type_index; - pvt->ops = family_ops(mc_type_index); + pvt->mc_node_id = get_node_id(dram_f2_ctl); + pvt->dram_f2_ctl = dram_f2_ctl; ret = -EINVAL; fam_type = amd64_per_family_init(pvt); @@ -2743,20 +2742,22 @@ err_exit: static int __devinit amd64_init_one_instance(struct pci_dev *pdev, - const struct pci_device_id *mc_type) + const struct pci_device_id *mc_type) { int ret = 0; debugf0("(MC node=%d)\n", get_node_id(pdev)); ret = pci_enable_device(pdev); - if (ret < 0) - ret = -EIO; - else - ret = amd64_probe_one_instance(pdev, mc_type->driver_data); + if (ret < 0) { + debugf0("ret=%d\n", ret); + return -EIO; + } + ret = amd64_probe_one_instance(pdev); if (ret < 0) - debugf0("ret=%d\n", ret); + amd64_printk(KERN_ERR, "Error probing instance: %d\n", + get_node_id(pdev)); return ret; } @@ -2805,7 +2806,6 @@ static const struct pci_device_id amd64_pci_table[] __devinitdata = { .subdevice = PCI_ANY_ID, .class = 0, .class_mask = 0, - .driver_data = K8_CPUS }, { .vendor = PCI_VENDOR_ID_AMD, @@ -2814,7 +2814,6 @@ static const struct pci_device_id amd64_pci_table[] __devinitdata = { .subdevice = PCI_ANY_ID, .class = 0, .class_mask = 0, - .driver_data = F10_CPUS }, {0, } }; diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 064e0d691ff9..007b68a436c5 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -383,6 +383,8 @@ struct error_injection { }; struct amd64_pvt { + struct low_ops *ops; + /* pci_device handles which we utilize */ struct pci_dev *addr_f1_ctl; struct pci_dev *dram_f2_ctl; @@ -390,9 +392,6 @@ struct amd64_pvt { int mc_node_id; /* MC index of this MC node */ int ext_model; /* extended model value of this node */ - - struct low_ops *ops; /* pointer to per PCI Device ID func table */ - int channel_count; /* Raw registers */ @@ -458,9 +457,6 @@ struct amd64_pvt { u32 nbctl_mcgctl_saved; /* When true, following 2 are valid */ u32 old_nbctl; - /* MC Type Index value: socket F vs Family 10h */ - u32 mc_type_index; - /* DCT per-family scrubrate setting */ u32 min_scrubrate; @@ -527,13 +523,6 @@ struct amd64_family_type { struct low_ops ops; }; -static struct amd64_family_type amd64_family_types[]; - -static inline struct low_ops *family_ops(int index) -{ - return &amd64_family_types[index].ops; -} - static inline int amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset, u32 *val, const char *func) { -- cgit v1.2.3