aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2015-02-17 04:58:34 -0500
committerBorislav Petkov <bp@suse.de>2015-02-23 07:16:01 -0500
commit2ec591ac7422048f6148c762d6cb8fb96d9a290b (patch)
tree8da9981d3f24671f59f4a83367dad2e4922621f9
parentc6b97bcf8e3ee6643a7f90a54d1ef3f9e12ec245 (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.c33
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 */
21static atomic_t drv_instances = ATOMIC_INIT(0); 21static atomic_t drv_instances = ATOMIC_INIT(0);
22 22
23/* Per-node driver instances */ 23/* Per-node stuff */
24static struct mem_ctl_info **mcis;
25static struct ecc_settings **ecc_stngs; 24static 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] */
904static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m) 903static 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
3033err_free: 3032err_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}