Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

EDAC, amd64_edac: Drop pci_register_driver() use

- remove homegrown instances counting.
- take F3 PCI device from amd_nb caching instead of F2 which was used with the
PCI core.

With those changes, the driver doesn't need to register a PCI driver and
relies on the northbridges caching which we do anyway on AMD.

Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Yazen Ghannam <yazen.ghannam@amd.com>

+44 -83
+43 -82
drivers/edac/amd64_edac.c
··· 15 15 16 16 static struct msr __percpu *msrs; 17 17 18 - /* 19 - * count successfully initialized driver instances for setup_pci_device() 20 - */ 21 - static atomic_t drv_instances = ATOMIC_INIT(0); 22 - 23 18 /* Per-node stuff */ 24 19 static struct ecc_settings **ecc_stngs; 25 20 ··· 1913 1918 [K8_CPUS] = { 1914 1919 .ctl_name = "K8", 1915 1920 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP, 1916 - .f3_id = PCI_DEVICE_ID_AMD_K8_NB_MISC, 1921 + .f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, 1917 1922 .ops = { 1918 1923 .early_channel_count = k8_early_channel_count, 1919 1924 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow, ··· 1923 1928 [F10_CPUS] = { 1924 1929 .ctl_name = "F10h", 1925 1930 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP, 1926 - .f3_id = PCI_DEVICE_ID_AMD_10H_NB_MISC, 1931 + .f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM, 1927 1932 .ops = { 1928 1933 .early_channel_count = f1x_early_channel_count, 1929 1934 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 1933 1938 [F15_CPUS] = { 1934 1939 .ctl_name = "F15h", 1935 1940 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1, 1936 - .f3_id = PCI_DEVICE_ID_AMD_15H_NB_F3, 1941 + .f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2, 1937 1942 .ops = { 1938 1943 .early_channel_count = f1x_early_channel_count, 1939 1944 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 1943 1948 [F15_M30H_CPUS] = { 1944 1949 .ctl_name = "F15h_M30h", 1945 1950 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1, 1946 - .f3_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F3, 1951 + .f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2, 1947 1952 .ops = { 1948 1953 .early_channel_count = f1x_early_channel_count, 1949 1954 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 1953 1958 [F15_M60H_CPUS] = { 1954 1959 .ctl_name = "F15h_M60h", 1955 1960 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1, 1956 - .f3_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F3, 1961 + .f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2, 1957 1962 .ops = { 1958 1963 .early_channel_count = f1x_early_channel_count, 1959 1964 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 1963 1968 [F16_CPUS] = { 1964 1969 .ctl_name = "F16h", 1965 1970 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1, 1966 - .f3_id = PCI_DEVICE_ID_AMD_16H_NB_F3, 1971 + .f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2, 1967 1972 .ops = { 1968 1973 .early_channel_count = f1x_early_channel_count, 1969 1974 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 1973 1978 [F16_M30H_CPUS] = { 1974 1979 .ctl_name = "F16h_M30h", 1975 1980 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1, 1976 - .f3_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F3, 1981 + .f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2, 1977 1982 .ops = { 1978 1983 .early_channel_count = f1x_early_channel_count, 1979 1984 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow, ··· 2222 2227 } 2223 2228 2224 2229 /* 2225 - * Use pvt->F2 which contains the F2 CPU PCI device to get the related 2226 - * F1 (AddrMap) and F3 (Misc) devices. Return negative value on error. 2230 + * Use pvt->F3 which contains the F3 CPU PCI device to get the related 2231 + * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error. 2227 2232 */ 2228 - static int reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 f1_id, u16 f3_id) 2233 + static int reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 f1_id, u16 f2_id) 2229 2234 { 2230 2235 /* Reserve the ADDRESS MAP Device */ 2231 - pvt->F1 = pci_get_related_function(pvt->F2->vendor, f1_id, pvt->F2); 2236 + pvt->F1 = pci_get_related_function(pvt->F3->vendor, f1_id, pvt->F3); 2232 2237 if (!pvt->F1) { 2233 2238 amd64_err("error address map device not found: " 2234 2239 "vendor %x device 0x%x (broken BIOS?)\n", ··· 2236 2241 return -ENODEV; 2237 2242 } 2238 2243 2239 - /* Reserve the MISC Device */ 2240 - pvt->F3 = pci_get_related_function(pvt->F2->vendor, f3_id, pvt->F2); 2241 - if (!pvt->F3) { 2244 + /* Reserve the DCT Device */ 2245 + pvt->F2 = pci_get_related_function(pvt->F3->vendor, f2_id, pvt->F3); 2246 + if (!pvt->F2) { 2242 2247 pci_dev_put(pvt->F1); 2243 2248 pvt->F1 = NULL; 2244 2249 2245 - amd64_err("error F3 device not found: " 2250 + amd64_err("error F2 device not found: " 2246 2251 "vendor %x device 0x%x (broken BIOS?)\n", 2247 - PCI_VENDOR_ID_AMD, f3_id); 2252 + PCI_VENDOR_ID_AMD, f2_id); 2248 2253 2249 2254 return -ENODEV; 2250 2255 } ··· 2258 2263 static void free_mc_sibling_devs(struct amd64_pvt *pvt) 2259 2264 { 2260 2265 pci_dev_put(pvt->F1); 2261 - pci_dev_put(pvt->F3); 2266 + pci_dev_put(pvt->F2); 2262 2267 } 2263 2268 2264 2269 /* ··· 2773 2778 NULL 2774 2779 }; 2775 2780 2776 - static int init_one_instance(struct pci_dev *F2) 2781 + static int init_one_instance(unsigned int nid) 2777 2782 { 2778 - struct amd64_pvt *pvt = NULL; 2783 + struct pci_dev *F3 = node_to_amd_nb(nid)->misc; 2779 2784 struct amd64_family_type *fam_type = NULL; 2780 2785 struct mem_ctl_info *mci = NULL; 2781 2786 struct edac_mc_layer layers[2]; 2787 + struct amd64_pvt *pvt = NULL; 2782 2788 int err = 0, ret; 2783 - u16 nid = amd_pci_dev_to_node_id(F2); 2784 2789 2785 2790 ret = -ENOMEM; 2786 2791 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL); ··· 2788 2793 goto err_ret; 2789 2794 2790 2795 pvt->mc_node_id = nid; 2791 - pvt->F2 = F2; 2796 + pvt->F3 = F3; 2792 2797 2793 2798 ret = -EINVAL; 2794 2799 fam_type = per_family_init(pvt); ··· 2796 2801 goto err_free; 2797 2802 2798 2803 ret = -ENODEV; 2799 - err = reserve_mc_sibling_devs(pvt, fam_type->f1_id, fam_type->f3_id); 2804 + err = reserve_mc_sibling_devs(pvt, fam_type->f1_id, fam_type->f2_id); 2800 2805 if (err) 2801 2806 goto err_free; 2802 2807 ··· 2831 2836 goto err_siblings; 2832 2837 2833 2838 mci->pvt_info = pvt; 2834 - mci->pdev = &pvt->F2->dev; 2839 + mci->pdev = &pvt->F3->dev; 2835 2840 2836 2841 setup_mci_misc_attrs(mci, fam_type); 2837 2842 ··· 2850 2855 2851 2856 amd_register_ecc_decoder(decode_bus_error); 2852 2857 2853 - atomic_inc(&drv_instances); 2854 - 2855 2858 return 0; 2856 2859 2857 2860 err_add_mc: ··· 2865 2872 return ret; 2866 2873 } 2867 2874 2868 - static int probe_one_instance(struct pci_dev *pdev, 2869 - const struct pci_device_id *mc_type) 2875 + static int probe_one_instance(unsigned int nid) 2870 2876 { 2871 - u16 nid = amd_pci_dev_to_node_id(pdev); 2872 2877 struct pci_dev *F3 = node_to_amd_nb(nid)->misc; 2873 2878 struct ecc_settings *s; 2874 - int ret = 0; 2875 - 2876 - ret = pci_enable_device(pdev); 2877 - if (ret < 0) { 2878 - edac_dbg(0, "ret=%d\n", ret); 2879 - return -EIO; 2880 - } 2879 + int ret; 2881 2880 2882 2881 ret = -ENOMEM; 2883 2882 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL); ··· 2890 2905 goto err_enable; 2891 2906 } 2892 2907 2893 - ret = init_one_instance(pdev); 2908 + ret = init_one_instance(nid); 2894 2909 if (ret < 0) { 2895 2910 amd64_err("Error probing instance: %d\n", nid); 2896 2911 restore_ecc_error_reporting(s, nid, F3); ··· 2906 2921 return ret; 2907 2922 } 2908 2923 2909 - static void remove_one_instance(struct pci_dev *pdev) 2924 + static void remove_one_instance(unsigned int nid) 2910 2925 { 2911 - struct mem_ctl_info *mci; 2912 - struct amd64_pvt *pvt; 2913 - u16 nid = amd_pci_dev_to_node_id(pdev); 2914 2926 struct pci_dev *F3 = node_to_amd_nb(nid)->misc; 2915 2927 struct ecc_settings *s = ecc_stngs[nid]; 2928 + struct mem_ctl_info *mci; 2929 + struct amd64_pvt *pvt; 2916 2930 2917 - mci = find_mci_by_dev(&pdev->dev); 2931 + mci = find_mci_by_dev(&F3->dev); 2918 2932 WARN_ON(!mci); 2919 2933 2920 2934 /* Remove from EDAC CORE tracking list */ 2921 - mci = edac_mc_del_mc(&pdev->dev); 2935 + mci = edac_mc_del_mc(&F3->dev); 2922 2936 if (!mci) 2923 2937 return; 2924 2938 ··· 2940 2956 kfree(pvt); 2941 2957 edac_mc_free(mci); 2942 2958 } 2943 - 2944 - /* 2945 - * This table is part of the interface for loading drivers for PCI devices. The 2946 - * PCI core identifies what devices are on a system during boot, and then 2947 - * inquiry this table to see if this driver is for a given device found. 2948 - */ 2949 - static const struct pci_device_id amd64_pci_table[] = { 2950 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_K8_NB_MEMCTL) }, 2951 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_DRAM) }, 2952 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F2) }, 2953 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F2) }, 2954 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M60H_NB_F2) }, 2955 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F2) }, 2956 - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F2) }, 2957 - {0, } 2958 - }; 2959 - MODULE_DEVICE_TABLE(pci, amd64_pci_table); 2960 - 2961 - static struct pci_driver amd64_pci_driver = { 2962 - .name = EDAC_MOD_STR, 2963 - .probe = probe_one_instance, 2964 - .remove = remove_one_instance, 2965 - .id_table = amd64_pci_table, 2966 - .driver.probe_type = PROBE_FORCE_SYNCHRONOUS, 2967 - }; 2968 2959 2969 2960 static void setup_pci_device(void) 2970 2961 { ··· 2964 3005 static int __init amd64_edac_init(void) 2965 3006 { 2966 3007 int err = -ENODEV; 3008 + int i; 2967 3009 2968 3010 opstate_init(); 2969 3011 ··· 2980 3020 if (!msrs) 2981 3021 goto err_free; 2982 3022 2983 - err = pci_register_driver(&amd64_pci_driver); 2984 - if (err) 2985 - goto err_pci; 3023 + for (i = 0; i < amd_nb_num(); i++) 3024 + if (probe_one_instance(i)) { 3025 + /* unwind properly */ 3026 + while (--i >= 0) 3027 + remove_one_instance(i); 2986 3028 2987 - err = -ENODEV; 2988 - if (!atomic_read(&drv_instances)) 2989 - goto err_no_instances; 3029 + goto err_pci; 3030 + } 2990 3031 2991 3032 setup_pci_device(); 2992 3033 ··· 2998 3037 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION); 2999 3038 3000 3039 return 0; 3001 - 3002 - err_no_instances: 3003 - pci_unregister_driver(&amd64_pci_driver); 3004 3040 3005 3041 err_pci: 3006 3042 msrs_free(msrs); ··· 3013 3055 3014 3056 static void __exit amd64_edac_exit(void) 3015 3057 { 3058 + int i; 3059 + 3016 3060 if (pci_ctl) 3017 3061 edac_pci_release_generic_ctl(pci_ctl); 3018 3062 3019 - pci_unregister_driver(&amd64_pci_driver); 3063 + for (i = 0; i < amd_nb_num(); i++) 3064 + remove_one_instance(i); 3020 3065 3021 3066 kfree(ecc_stngs); 3022 3067 ecc_stngs = NULL;
+1 -1
drivers/edac/amd64_edac.h
··· 422 422 423 423 struct amd64_family_type { 424 424 const char *ctl_name; 425 - u16 f1_id, f3_id; 425 + u16 f1_id, f2_id; 426 426 struct low_ops ops; 427 427 }; 428 428