diff options
author | Borislav Petkov <bp@suse.de> | 2015-02-17 04:58:34 -0500 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2015-02-23 07:16:01 -0500 |
commit | 2ec591ac7422048f6148c762d6cb8fb96d9a290b (patch) | |
tree | 8da9981d3f24671f59f4a83367dad2e4922621f9 | |
parent | c6b97bcf8e3ee6643a7f90a54d1ef3f9e12ec245 (diff) |
EDAC, amd64_edac: Get rid of per-node driver instances
... and do the proper thing using EDAC core facilities.
Cc: Daniel J Blueman <daniel@numascale.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
-rw-r--r-- | drivers/edac/amd64_edac.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 3d6a511a9025..92772fffc52f 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -20,8 +20,7 @@ static struct msr __percpu *msrs; | |||
20 | */ | 20 | */ |
21 | static atomic_t drv_instances = ATOMIC_INIT(0); | 21 | static atomic_t drv_instances = ATOMIC_INIT(0); |
22 | 22 | ||
23 | /* Per-node driver instances */ | 23 | /* Per-node stuff */ |
24 | static struct mem_ctl_info **mcis; | ||
25 | static struct ecc_settings **ecc_stngs; | 24 | static struct ecc_settings **ecc_stngs; |
26 | 25 | ||
27 | /* | 26 | /* |
@@ -903,9 +902,17 @@ static int k8_early_channel_count(struct amd64_pvt *pvt) | |||
903 | /* On F10h and later ErrAddr is MC4_ADDR[47:1] */ | 902 | /* On F10h and later ErrAddr is MC4_ADDR[47:1] */ |
904 | static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m) | 903 | static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m) |
905 | { | 904 | { |
906 | u64 addr; | 905 | u16 mce_nid = amd_get_nb_id(m->extcpu); |
906 | struct mem_ctl_info *mci; | ||
907 | u8 start_bit = 1; | 907 | u8 start_bit = 1; |
908 | u8 end_bit = 47; | 908 | u8 end_bit = 47; |
909 | u64 addr; | ||
910 | |||
911 | mci = edac_mc_find(mce_nid); | ||
912 | if (!mci) | ||
913 | return 0; | ||
914 | |||
915 | pvt = mci->pvt_info; | ||
909 | 916 | ||
910 | if (pvt->fam == 0xf) { | 917 | if (pvt->fam == 0xf) { |
911 | start_bit = 3; | 918 | start_bit = 3; |
@@ -918,17 +925,13 @@ static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m) | |||
918 | * Erratum 637 workaround | 925 | * Erratum 637 workaround |
919 | */ | 926 | */ |
920 | if (pvt->fam == 0x15) { | 927 | if (pvt->fam == 0x15) { |
921 | struct amd64_pvt *pvt; | ||
922 | u64 cc6_base, tmp_addr; | 928 | u64 cc6_base, tmp_addr; |
923 | u32 tmp; | 929 | u32 tmp; |
924 | u16 mce_nid; | ||
925 | u8 intlv_en; | 930 | u8 intlv_en; |
926 | 931 | ||
927 | if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7) | 932 | if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7) |
928 | return addr; | 933 | return addr; |
929 | 934 | ||
930 | mce_nid = amd_get_nb_id(m->extcpu); | ||
931 | pvt = mcis[mce_nid]->pvt_info; | ||
932 | 935 | ||
933 | amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp); | 936 | amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp); |
934 | intlv_en = tmp >> 21 & 0x7; | 937 | intlv_en = tmp >> 21 & 0x7; |
@@ -1511,7 +1514,7 @@ static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct) | |||
1511 | int cs_found = -EINVAL; | 1514 | int cs_found = -EINVAL; |
1512 | int csrow; | 1515 | int csrow; |
1513 | 1516 | ||
1514 | mci = mcis[nid]; | 1517 | mci = edac_mc_find(nid); |
1515 | if (!mci) | 1518 | if (!mci) |
1516 | return cs_found; | 1519 | return cs_found; |
1517 | 1520 | ||
@@ -2837,8 +2840,6 @@ static int init_one_instance(struct pci_dev *F2) | |||
2837 | 2840 | ||
2838 | amd_register_ecc_decoder(decode_bus_error); | 2841 | amd_register_ecc_decoder(decode_bus_error); |
2839 | 2842 | ||
2840 | mcis[nid] = mci; | ||
2841 | |||
2842 | atomic_inc(&drv_instances); | 2843 | atomic_inc(&drv_instances); |
2843 | 2844 | ||
2844 | return 0; | 2845 | return 0; |
@@ -2936,7 +2937,6 @@ static void remove_one_instance(struct pci_dev *pdev) | |||
2936 | 2937 | ||
2937 | /* Free the EDAC CORE resources */ | 2938 | /* Free the EDAC CORE resources */ |
2938 | mci->pvt_info = NULL; | 2939 | mci->pvt_info = NULL; |
2939 | mcis[nid] = NULL; | ||
2940 | 2940 | ||
2941 | kfree(pvt); | 2941 | kfree(pvt); |
2942 | edac_mc_free(mci); | 2942 | edac_mc_free(mci); |
@@ -2974,7 +2974,7 @@ static void setup_pci_device(void) | |||
2974 | if (pci_ctl) | 2974 | if (pci_ctl) |
2975 | return; | 2975 | return; |
2976 | 2976 | ||
2977 | mci = mcis[0]; | 2977 | mci = edac_mc_find(0); |
2978 | if (!mci) | 2978 | if (!mci) |
2979 | return; | 2979 | return; |
2980 | 2980 | ||
@@ -2998,9 +2998,8 @@ static int __init amd64_edac_init(void) | |||
2998 | goto err_ret; | 2998 | goto err_ret; |
2999 | 2999 | ||
3000 | err = -ENOMEM; | 3000 | err = -ENOMEM; |
3001 | mcis = kzalloc(amd_nb_num() * sizeof(mcis[0]), GFP_KERNEL); | ||
3002 | ecc_stngs = kzalloc(amd_nb_num() * sizeof(ecc_stngs[0]), GFP_KERNEL); | 3001 | ecc_stngs = kzalloc(amd_nb_num() * sizeof(ecc_stngs[0]), GFP_KERNEL); |
3003 | if (!(mcis && ecc_stngs)) | 3002 | if (!ecc_stngs) |
3004 | goto err_free; | 3003 | goto err_free; |
3005 | 3004 | ||
3006 | msrs = msrs_alloc(); | 3005 | msrs = msrs_alloc(); |
@@ -3031,9 +3030,6 @@ err_pci: | |||
3031 | msrs = NULL; | 3030 | msrs = NULL; |
3032 | 3031 | ||
3033 | err_free: | 3032 | err_free: |
3034 | kfree(mcis); | ||
3035 | mcis = NULL; | ||
3036 | |||
3037 | kfree(ecc_stngs); | 3033 | kfree(ecc_stngs); |
3038 | ecc_stngs = NULL; | 3034 | ecc_stngs = NULL; |
3039 | 3035 | ||
@@ -3051,9 +3047,6 @@ static void __exit amd64_edac_exit(void) | |||
3051 | kfree(ecc_stngs); | 3047 | kfree(ecc_stngs); |
3052 | ecc_stngs = NULL; | 3048 | ecc_stngs = NULL; |
3053 | 3049 | ||
3054 | kfree(mcis); | ||
3055 | mcis = NULL; | ||
3056 | |||
3057 | msrs_free(msrs); | 3050 | msrs_free(msrs); |
3058 | msrs = NULL; | 3051 | msrs = NULL; |
3059 | } | 3052 | } |