diff options
-rw-r--r-- | drivers/edac/amd64_edac.c | 153 | ||||
-rw-r--r-- | drivers/edac/amd64_edac.h | 7 | ||||
-rw-r--r-- | drivers/edac/amd64_edac_inj.c | 12 |
3 files changed, 77 insertions, 95 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 0caea2b76659..26fb0f962605 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -163,7 +163,7 @@ static int amd64_set_scrub_rate(struct mem_ctl_info *mci, u32 bw) | |||
163 | { | 163 | { |
164 | struct amd64_pvt *pvt = mci->pvt_info; | 164 | struct amd64_pvt *pvt = mci->pvt_info; |
165 | 165 | ||
166 | return __amd64_set_scrub_rate(pvt->misc_f3_ctl, bw, pvt->min_scrubrate); | 166 | return __amd64_set_scrub_rate(pvt->F3, bw, pvt->min_scrubrate); |
167 | } | 167 | } |
168 | 168 | ||
169 | static int amd64_get_scrub_rate(struct mem_ctl_info *mci, u32 *bw) | 169 | static int amd64_get_scrub_rate(struct mem_ctl_info *mci, u32 *bw) |
@@ -172,7 +172,7 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci, u32 *bw) | |||
172 | u32 scrubval = 0; | 172 | u32 scrubval = 0; |
173 | int status = -1, i; | 173 | int status = -1, i; |
174 | 174 | ||
175 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_SCRCTRL, &scrubval); | 175 | amd64_read_pci_cfg(pvt->F3, K8_SCRCTRL, &scrubval); |
176 | 176 | ||
177 | scrubval = scrubval & 0x001F; | 177 | scrubval = scrubval & 0x001F; |
178 | 178 | ||
@@ -882,10 +882,10 @@ static void amd64_dump_misc_regs(struct amd64_pvt *pvt) | |||
882 | /* Read in both of DBAM registers */ | 882 | /* Read in both of DBAM registers */ |
883 | static void amd64_read_dbam_reg(struct amd64_pvt *pvt) | 883 | static void amd64_read_dbam_reg(struct amd64_pvt *pvt) |
884 | { | 884 | { |
885 | amd64_read_pci_cfg(pvt->dram_f2_ctl, DBAM0, &pvt->dbam0); | 885 | amd64_read_pci_cfg(pvt->F2, DBAM0, &pvt->dbam0); |
886 | 886 | ||
887 | if (boot_cpu_data.x86 >= 0x10) | 887 | if (boot_cpu_data.x86 >= 0x10) |
888 | amd64_read_pci_cfg(pvt->dram_f2_ctl, DBAM1, &pvt->dbam1); | 888 | amd64_read_pci_cfg(pvt->F2, DBAM1, &pvt->dbam1); |
889 | } | 889 | } |
890 | 890 | ||
891 | /* | 891 | /* |
@@ -948,14 +948,14 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt) | |||
948 | 948 | ||
949 | for (cs = 0; cs < pvt->cs_count; cs++) { | 949 | for (cs = 0; cs < pvt->cs_count; cs++) { |
950 | reg = K8_DCSB0 + (cs * 4); | 950 | reg = K8_DCSB0 + (cs * 4); |
951 | if (!amd64_read_pci_cfg(pvt->dram_f2_ctl, reg, &pvt->dcsb0[cs])) | 951 | if (!amd64_read_pci_cfg(pvt->F2, reg, &pvt->dcsb0[cs])) |
952 | debugf0(" DCSB0[%d]=0x%08x reg: F2x%x\n", | 952 | debugf0(" DCSB0[%d]=0x%08x reg: F2x%x\n", |
953 | cs, pvt->dcsb0[cs], reg); | 953 | cs, pvt->dcsb0[cs], reg); |
954 | 954 | ||
955 | /* If DCT are NOT ganged, then read in DCT1's base */ | 955 | /* If DCT are NOT ganged, then read in DCT1's base */ |
956 | if (boot_cpu_data.x86 >= 0x10 && !dct_ganging_enabled(pvt)) { | 956 | if (boot_cpu_data.x86 >= 0x10 && !dct_ganging_enabled(pvt)) { |
957 | reg = F10_DCSB1 + (cs * 4); | 957 | reg = F10_DCSB1 + (cs * 4); |
958 | if (!amd64_read_pci_cfg(pvt->dram_f2_ctl, reg, | 958 | if (!amd64_read_pci_cfg(pvt->F2, reg, |
959 | &pvt->dcsb1[cs])) | 959 | &pvt->dcsb1[cs])) |
960 | debugf0(" DCSB1[%d]=0x%08x reg: F2x%x\n", | 960 | debugf0(" DCSB1[%d]=0x%08x reg: F2x%x\n", |
961 | cs, pvt->dcsb1[cs], reg); | 961 | cs, pvt->dcsb1[cs], reg); |
@@ -966,14 +966,14 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt) | |||
966 | 966 | ||
967 | for (cs = 0; cs < pvt->num_dcsm; cs++) { | 967 | for (cs = 0; cs < pvt->num_dcsm; cs++) { |
968 | reg = K8_DCSM0 + (cs * 4); | 968 | reg = K8_DCSM0 + (cs * 4); |
969 | if (!amd64_read_pci_cfg(pvt->dram_f2_ctl, reg, &pvt->dcsm0[cs])) | 969 | if (!amd64_read_pci_cfg(pvt->F2, reg, &pvt->dcsm0[cs])) |
970 | debugf0(" DCSM0[%d]=0x%08x reg: F2x%x\n", | 970 | debugf0(" DCSM0[%d]=0x%08x reg: F2x%x\n", |
971 | cs, pvt->dcsm0[cs], reg); | 971 | cs, pvt->dcsm0[cs], reg); |
972 | 972 | ||
973 | /* If DCT are NOT ganged, then read in DCT1's mask */ | 973 | /* If DCT are NOT ganged, then read in DCT1's mask */ |
974 | if (boot_cpu_data.x86 >= 0x10 && !dct_ganging_enabled(pvt)) { | 974 | if (boot_cpu_data.x86 >= 0x10 && !dct_ganging_enabled(pvt)) { |
975 | reg = F10_DCSM1 + (cs * 4); | 975 | reg = F10_DCSM1 + (cs * 4); |
976 | if (!amd64_read_pci_cfg(pvt->dram_f2_ctl, reg, | 976 | if (!amd64_read_pci_cfg(pvt->F2, reg, |
977 | &pvt->dcsm1[cs])) | 977 | &pvt->dcsm1[cs])) |
978 | debugf0(" DCSM1[%d]=0x%08x reg: F2x%x\n", | 978 | debugf0(" DCSM1[%d]=0x%08x reg: F2x%x\n", |
979 | cs, pvt->dcsm1[cs], reg); | 979 | cs, pvt->dcsm1[cs], reg); |
@@ -1014,7 +1014,7 @@ static int k8_early_channel_count(struct amd64_pvt *pvt) | |||
1014 | { | 1014 | { |
1015 | int flag, err = 0; | 1015 | int flag, err = 0; |
1016 | 1016 | ||
1017 | err = amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCLR_0, &pvt->dclr0); | 1017 | err = amd64_read_pci_cfg(pvt->F2, F10_DCLR_0, &pvt->dclr0); |
1018 | if (err) | 1018 | if (err) |
1019 | return err; | 1019 | return err; |
1020 | 1020 | ||
@@ -1050,14 +1050,14 @@ static void k8_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1050 | u32 low; | 1050 | u32 low; |
1051 | u32 off = dram << 3; /* 8 bytes between DRAM entries */ | 1051 | u32 off = dram << 3; /* 8 bytes between DRAM entries */ |
1052 | 1052 | ||
1053 | amd64_read_pci_cfg(pvt->addr_f1_ctl, K8_DRAM_BASE_LOW + off, &low); | 1053 | amd64_read_pci_cfg(pvt->F1, K8_DRAM_BASE_LOW + off, &low); |
1054 | 1054 | ||
1055 | /* Extract parts into separate data entries */ | 1055 | /* Extract parts into separate data entries */ |
1056 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 8; | 1056 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 8; |
1057 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; | 1057 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; |
1058 | pvt->dram_rw_en[dram] = (low & 0x3); | 1058 | pvt->dram_rw_en[dram] = (low & 0x3); |
1059 | 1059 | ||
1060 | amd64_read_pci_cfg(pvt->addr_f1_ctl, K8_DRAM_LIMIT_LOW + off, &low); | 1060 | amd64_read_pci_cfg(pvt->F1, K8_DRAM_LIMIT_LOW + off, &low); |
1061 | 1061 | ||
1062 | /* | 1062 | /* |
1063 | * Extract parts into separate data entries. Limit is the HIGHEST memory | 1063 | * Extract parts into separate data entries. Limit is the HIGHEST memory |
@@ -1180,7 +1180,7 @@ static int f10_early_channel_count(struct amd64_pvt *pvt) | |||
1180 | * both controllers since DIMMs can be placed in either one. | 1180 | * both controllers since DIMMs can be placed in either one. |
1181 | */ | 1181 | */ |
1182 | for (i = 0; i < ARRAY_SIZE(dbams); i++) { | 1182 | for (i = 0; i < ARRAY_SIZE(dbams); i++) { |
1183 | if (amd64_read_pci_cfg(pvt->dram_f2_ctl, dbams[i], &dbam)) | 1183 | if (amd64_read_pci_cfg(pvt->F2, dbams[i], &dbam)) |
1184 | goto err_reg; | 1184 | goto err_reg; |
1185 | 1185 | ||
1186 | for (j = 0; j < 4; j++) { | 1186 | for (j = 0; j < 4; j++) { |
@@ -1220,11 +1220,11 @@ static void amd64_setup(struct amd64_pvt *pvt) | |||
1220 | { | 1220 | { |
1221 | u32 reg; | 1221 | u32 reg; |
1222 | 1222 | ||
1223 | amd64_read_pci_cfg(pvt->misc_f3_ctl, F10_NB_CFG_HIGH, ®); | 1223 | amd64_read_pci_cfg(pvt->F3, F10_NB_CFG_HIGH, ®); |
1224 | 1224 | ||
1225 | pvt->flags.cf8_extcfg = !!(reg & F10_NB_CFG_LOW_ENABLE_EXT_CFG); | 1225 | pvt->flags.cf8_extcfg = !!(reg & F10_NB_CFG_LOW_ENABLE_EXT_CFG); |
1226 | reg |= F10_NB_CFG_LOW_ENABLE_EXT_CFG; | 1226 | reg |= F10_NB_CFG_LOW_ENABLE_EXT_CFG; |
1227 | pci_write_config_dword(pvt->misc_f3_ctl, F10_NB_CFG_HIGH, reg); | 1227 | pci_write_config_dword(pvt->F3, F10_NB_CFG_HIGH, reg); |
1228 | } | 1228 | } |
1229 | 1229 | ||
1230 | /* Restore the extended configuration access via 0xCF8 feature */ | 1230 | /* Restore the extended configuration access via 0xCF8 feature */ |
@@ -1232,12 +1232,12 @@ static void amd64_teardown(struct amd64_pvt *pvt) | |||
1232 | { | 1232 | { |
1233 | u32 reg; | 1233 | u32 reg; |
1234 | 1234 | ||
1235 | amd64_read_pci_cfg(pvt->misc_f3_ctl, F10_NB_CFG_HIGH, ®); | 1235 | amd64_read_pci_cfg(pvt->F3, F10_NB_CFG_HIGH, ®); |
1236 | 1236 | ||
1237 | reg &= ~F10_NB_CFG_LOW_ENABLE_EXT_CFG; | 1237 | reg &= ~F10_NB_CFG_LOW_ENABLE_EXT_CFG; |
1238 | if (pvt->flags.cf8_extcfg) | 1238 | if (pvt->flags.cf8_extcfg) |
1239 | reg |= F10_NB_CFG_LOW_ENABLE_EXT_CFG; | 1239 | reg |= F10_NB_CFG_LOW_ENABLE_EXT_CFG; |
1240 | pci_write_config_dword(pvt->misc_f3_ctl, F10_NB_CFG_HIGH, reg); | 1240 | pci_write_config_dword(pvt->F3, F10_NB_CFG_HIGH, reg); |
1241 | } | 1241 | } |
1242 | 1242 | ||
1243 | static u64 f10_get_error_address(struct mem_ctl_info *mci, | 1243 | static u64 f10_get_error_address(struct mem_ctl_info *mci, |
@@ -1261,10 +1261,10 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1261 | high_offset = F10_DRAM_BASE_HIGH + (dram << 3); | 1261 | high_offset = F10_DRAM_BASE_HIGH + (dram << 3); |
1262 | 1262 | ||
1263 | /* read the 'raw' DRAM BASE Address register */ | 1263 | /* read the 'raw' DRAM BASE Address register */ |
1264 | amd64_read_pci_cfg(pvt->addr_f1_ctl, low_offset, &low_base); | 1264 | amd64_read_pci_cfg(pvt->F1, low_offset, &low_base); |
1265 | 1265 | ||
1266 | /* Read from the ECS data register */ | 1266 | /* Read from the ECS data register */ |
1267 | amd64_read_pci_cfg(pvt->addr_f1_ctl, high_offset, &high_base); | 1267 | amd64_read_pci_cfg(pvt->F1, high_offset, &high_base); |
1268 | 1268 | ||
1269 | /* Extract parts into separate data entries */ | 1269 | /* Extract parts into separate data entries */ |
1270 | pvt->dram_rw_en[dram] = (low_base & 0x3); | 1270 | pvt->dram_rw_en[dram] = (low_base & 0x3); |
@@ -1281,10 +1281,10 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1281 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); | 1281 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); |
1282 | 1282 | ||
1283 | /* read the 'raw' LIMIT registers */ | 1283 | /* read the 'raw' LIMIT registers */ |
1284 | amd64_read_pci_cfg(pvt->addr_f1_ctl, low_offset, &low_limit); | 1284 | amd64_read_pci_cfg(pvt->F1, low_offset, &low_limit); |
1285 | 1285 | ||
1286 | /* Read from the ECS data register for the HIGH portion */ | 1286 | /* Read from the ECS data register for the HIGH portion */ |
1287 | amd64_read_pci_cfg(pvt->addr_f1_ctl, high_offset, &high_limit); | 1287 | amd64_read_pci_cfg(pvt->F1, high_offset, &high_limit); |
1288 | 1288 | ||
1289 | pvt->dram_DstNode[dram] = (low_limit & 0x7); | 1289 | pvt->dram_DstNode[dram] = (low_limit & 0x7); |
1290 | pvt->dram_IntlvSel[dram] = (low_limit >> 8) & 0x7; | 1290 | pvt->dram_IntlvSel[dram] = (low_limit >> 8) & 0x7; |
@@ -1301,7 +1301,7 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1301 | static void f10_read_dram_ctl_register(struct amd64_pvt *pvt) | 1301 | static void f10_read_dram_ctl_register(struct amd64_pvt *pvt) |
1302 | { | 1302 | { |
1303 | 1303 | ||
1304 | if (!amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCTL_SEL_LOW, | 1304 | if (!amd64_read_pci_cfg(pvt->F2, F10_DCTL_SEL_LOW, |
1305 | &pvt->dram_ctl_select_low)) { | 1305 | &pvt->dram_ctl_select_low)) { |
1306 | debugf0("F2x110 (DCTL Sel. Low): 0x%08x, " | 1306 | debugf0("F2x110 (DCTL Sel. Low): 0x%08x, " |
1307 | "High range addresses at: 0x%x\n", | 1307 | "High range addresses at: 0x%x\n", |
@@ -1327,7 +1327,7 @@ static void f10_read_dram_ctl_register(struct amd64_pvt *pvt) | |||
1327 | dct_sel_interleave_addr(pvt)); | 1327 | dct_sel_interleave_addr(pvt)); |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCTL_SEL_HIGH, | 1330 | amd64_read_pci_cfg(pvt->F2, F10_DCTL_SEL_HIGH, |
1331 | &pvt->dram_ctl_select_high); | 1331 | &pvt->dram_ctl_select_high); |
1332 | } | 1332 | } |
1333 | 1333 | ||
@@ -1707,8 +1707,8 @@ static void amd64_debug_display_dimm_sizes(int ctrl, struct amd64_pvt *pvt) | |||
1707 | static struct amd64_family_type amd64_family_types[] = { | 1707 | static struct amd64_family_type amd64_family_types[] = { |
1708 | [K8_CPUS] = { | 1708 | [K8_CPUS] = { |
1709 | .ctl_name = "K8", | 1709 | .ctl_name = "K8", |
1710 | .addr_f1_ctl = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP, | 1710 | .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP, |
1711 | .misc_f3_ctl = PCI_DEVICE_ID_AMD_K8_NB_MISC, | 1711 | .f3_id = PCI_DEVICE_ID_AMD_K8_NB_MISC, |
1712 | .ops = { | 1712 | .ops = { |
1713 | .early_channel_count = k8_early_channel_count, | 1713 | .early_channel_count = k8_early_channel_count, |
1714 | .get_error_address = k8_get_error_address, | 1714 | .get_error_address = k8_get_error_address, |
@@ -1719,8 +1719,8 @@ static struct amd64_family_type amd64_family_types[] = { | |||
1719 | }, | 1719 | }, |
1720 | [F10_CPUS] = { | 1720 | [F10_CPUS] = { |
1721 | .ctl_name = "F10h", | 1721 | .ctl_name = "F10h", |
1722 | .addr_f1_ctl = PCI_DEVICE_ID_AMD_10H_NB_MAP, | 1722 | .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP, |
1723 | .misc_f3_ctl = PCI_DEVICE_ID_AMD_10H_NB_MISC, | 1723 | .f3_id = PCI_DEVICE_ID_AMD_10H_NB_MISC, |
1724 | .ops = { | 1724 | .ops = { |
1725 | .early_channel_count = f10_early_channel_count, | 1725 | .early_channel_count = f10_early_channel_count, |
1726 | .get_error_address = f10_get_error_address, | 1726 | .get_error_address = f10_get_error_address, |
@@ -2035,53 +2035,44 @@ void amd64_decode_bus_error(int node_id, struct mce *m, u32 nbcfg) | |||
2035 | } | 2035 | } |
2036 | 2036 | ||
2037 | /* | 2037 | /* |
2038 | * Use pvt->dram_f2_ctl which contains the F2 CPU PCI device to get the related | 2038 | * Use pvt->F2 which contains the F2 CPU PCI device to get the related |
2039 | * F1 (AddrMap) and F3 (Misc) devices. Return negative value on error. | 2039 | * F1 (AddrMap) and F3 (Misc) devices. Return negative value on error. |
2040 | */ | 2040 | */ |
2041 | static int amd64_reserve_mc_sibling_devices(struct amd64_pvt *pvt, u16 f1_id, | 2041 | static int amd64_reserve_mc_sibling_devices(struct amd64_pvt *pvt, u16 f1_id, |
2042 | u16 f3_id) | 2042 | u16 f3_id) |
2043 | { | 2043 | { |
2044 | /* Reserve the ADDRESS MAP Device */ | 2044 | /* Reserve the ADDRESS MAP Device */ |
2045 | pvt->addr_f1_ctl = pci_get_related_function(pvt->dram_f2_ctl->vendor, | 2045 | pvt->F1 = pci_get_related_function(pvt->F2->vendor, f1_id, pvt->F2); |
2046 | f1_id, | 2046 | if (!pvt->F1) { |
2047 | pvt->dram_f2_ctl); | ||
2048 | |||
2049 | if (!pvt->addr_f1_ctl) { | ||
2050 | amd64_printk(KERN_ERR, "error address map device not found: " | 2047 | amd64_printk(KERN_ERR, "error address map device not found: " |
2051 | "vendor %x device 0x%x (broken BIOS?)\n", | 2048 | "vendor %x device 0x%x (broken BIOS?)\n", |
2052 | PCI_VENDOR_ID_AMD, f1_id); | 2049 | PCI_VENDOR_ID_AMD, f1_id); |
2053 | return -ENODEV; | 2050 | return -ENODEV; |
2054 | } | 2051 | } |
2055 | 2052 | ||
2056 | /* Reserve the MISC Device */ | 2053 | /* Reserve the MISC Device */ |
2057 | pvt->misc_f3_ctl = pci_get_related_function(pvt->dram_f2_ctl->vendor, | 2054 | pvt->F3 = pci_get_related_function(pvt->F2->vendor, f3_id, pvt->F2); |
2058 | f3_id, | 2055 | if (!pvt->F3) { |
2059 | pvt->dram_f2_ctl); | 2056 | pci_dev_put(pvt->F1); |
2057 | pvt->F1 = NULL; | ||
2060 | 2058 | ||
2061 | if (!pvt->misc_f3_ctl) { | 2059 | amd64_printk(KERN_ERR, "error F3 device not found: " |
2062 | pci_dev_put(pvt->addr_f1_ctl); | 2060 | "vendor %x device 0x%x (broken BIOS?)\n", |
2063 | pvt->addr_f1_ctl = NULL; | 2061 | PCI_VENDOR_ID_AMD, f3_id); |
2064 | 2062 | ||
2065 | amd64_printk(KERN_ERR, "error miscellaneous device not found: " | ||
2066 | "vendor %x device 0x%x (broken BIOS?)\n", | ||
2067 | PCI_VENDOR_ID_AMD, f3_id); | ||
2068 | return -ENODEV; | 2063 | return -ENODEV; |
2069 | } | 2064 | } |
2070 | 2065 | debugf1("F1: %s\n", pci_name(pvt->F1)); | |
2071 | debugf1(" Addr Map device PCI Bus ID:\t%s\n", | 2066 | debugf1("F2: %s\n", pci_name(pvt->F2)); |
2072 | pci_name(pvt->addr_f1_ctl)); | 2067 | debugf1("F3: %s\n", pci_name(pvt->F3)); |
2073 | debugf1(" DRAM MEM-CTL PCI Bus ID:\t%s\n", | ||
2074 | pci_name(pvt->dram_f2_ctl)); | ||
2075 | debugf1(" Misc device PCI Bus ID:\t%s\n", | ||
2076 | pci_name(pvt->misc_f3_ctl)); | ||
2077 | 2068 | ||
2078 | return 0; | 2069 | return 0; |
2079 | } | 2070 | } |
2080 | 2071 | ||
2081 | static void amd64_free_mc_sibling_devices(struct amd64_pvt *pvt) | 2072 | static void amd64_free_mc_sibling_devices(struct amd64_pvt *pvt) |
2082 | { | 2073 | { |
2083 | pci_dev_put(pvt->addr_f1_ctl); | 2074 | pci_dev_put(pvt->F1); |
2084 | pci_dev_put(pvt->misc_f3_ctl); | 2075 | pci_dev_put(pvt->F3); |
2085 | } | 2076 | } |
2086 | 2077 | ||
2087 | /* | 2078 | /* |
@@ -2109,7 +2100,7 @@ static void amd64_read_mc_registers(struct amd64_pvt *pvt) | |||
2109 | } else | 2100 | } else |
2110 | debugf0(" TOP_MEM2 disabled.\n"); | 2101 | debugf0(" TOP_MEM2 disabled.\n"); |
2111 | 2102 | ||
2112 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCAP, &pvt->nbcap); | 2103 | amd64_read_pci_cfg(pvt->F3, K8_NBCAP, &pvt->nbcap); |
2113 | 2104 | ||
2114 | if (pvt->ops->read_dram_ctl_register) | 2105 | if (pvt->ops->read_dram_ctl_register) |
2115 | pvt->ops->read_dram_ctl_register(pvt); | 2106 | pvt->ops->read_dram_ctl_register(pvt); |
@@ -2146,21 +2137,20 @@ static void amd64_read_mc_registers(struct amd64_pvt *pvt) | |||
2146 | 2137 | ||
2147 | amd64_read_dct_base_mask(pvt); | 2138 | amd64_read_dct_base_mask(pvt); |
2148 | 2139 | ||
2149 | amd64_read_pci_cfg(pvt->addr_f1_ctl, K8_DHAR, &pvt->dhar); | 2140 | amd64_read_pci_cfg(pvt->F1, K8_DHAR, &pvt->dhar); |
2150 | amd64_read_dbam_reg(pvt); | 2141 | amd64_read_dbam_reg(pvt); |
2151 | 2142 | ||
2152 | amd64_read_pci_cfg(pvt->misc_f3_ctl, | 2143 | amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare); |
2153 | F10_ONLINE_SPARE, &pvt->online_spare); | ||
2154 | 2144 | ||
2155 | amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCLR_0, &pvt->dclr0); | 2145 | amd64_read_pci_cfg(pvt->F2, F10_DCLR_0, &pvt->dclr0); |
2156 | amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCHR_0, &pvt->dchr0); | 2146 | amd64_read_pci_cfg(pvt->F2, F10_DCHR_0, &pvt->dchr0); |
2157 | 2147 | ||
2158 | if (boot_cpu_data.x86 >= 0x10) { | 2148 | if (boot_cpu_data.x86 >= 0x10) { |
2159 | if (!dct_ganging_enabled(pvt)) { | 2149 | if (!dct_ganging_enabled(pvt)) { |
2160 | amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCLR_1, &pvt->dclr1); | 2150 | amd64_read_pci_cfg(pvt->F2, F10_DCLR_1, &pvt->dclr1); |
2161 | amd64_read_pci_cfg(pvt->dram_f2_ctl, F10_DCHR_1, &pvt->dchr1); | 2151 | amd64_read_pci_cfg(pvt->F2, F10_DCHR_1, &pvt->dchr1); |
2162 | } | 2152 | } |
2163 | amd64_read_pci_cfg(pvt->misc_f3_ctl, EXT_NB_MCA_CFG, &tmp); | 2153 | amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp); |
2164 | } | 2154 | } |
2165 | 2155 | ||
2166 | if (boot_cpu_data.x86 == 0x10 && | 2156 | if (boot_cpu_data.x86 == 0x10 && |
@@ -2249,7 +2239,7 @@ static int amd64_init_csrows(struct mem_ctl_info *mci) | |||
2249 | 2239 | ||
2250 | pvt = mci->pvt_info; | 2240 | pvt = mci->pvt_info; |
2251 | 2241 | ||
2252 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCFG, &pvt->nbcfg); | 2242 | amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &pvt->nbcfg); |
2253 | 2243 | ||
2254 | debugf0("NBCFG= 0x%x CHIPKILL= %s DRAM ECC= %s\n", pvt->nbcfg, | 2244 | debugf0("NBCFG= 0x%x CHIPKILL= %s DRAM ECC= %s\n", pvt->nbcfg, |
2255 | (pvt->nbcfg & K8_NBCFG_CHIPKILL) ? "Enabled" : "Disabled", | 2245 | (pvt->nbcfg & K8_NBCFG_CHIPKILL) ? "Enabled" : "Disabled", |
@@ -2394,20 +2384,20 @@ static void amd64_enable_ecc_error_reporting(struct mem_ctl_info *mci) | |||
2394 | struct amd64_pvt *pvt = mci->pvt_info; | 2384 | struct amd64_pvt *pvt = mci->pvt_info; |
2395 | u32 value, mask = K8_NBCTL_CECCEn | K8_NBCTL_UECCEn; | 2385 | u32 value, mask = K8_NBCTL_CECCEn | K8_NBCTL_UECCEn; |
2396 | 2386 | ||
2397 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCTL, &value); | 2387 | amd64_read_pci_cfg(pvt->F3, K8_NBCTL, &value); |
2398 | 2388 | ||
2399 | /* turn on UECCn and CECCEn bits */ | 2389 | /* turn on UECCn and CECCEn bits */ |
2400 | pvt->old_nbctl = value & mask; | 2390 | pvt->old_nbctl = value & mask; |
2401 | pvt->nbctl_mcgctl_saved = 1; | 2391 | pvt->nbctl_mcgctl_saved = 1; |
2402 | 2392 | ||
2403 | value |= mask; | 2393 | value |= mask; |
2404 | pci_write_config_dword(pvt->misc_f3_ctl, K8_NBCTL, value); | 2394 | pci_write_config_dword(pvt->F3, K8_NBCTL, value); |
2405 | 2395 | ||
2406 | if (amd64_toggle_ecc_err_reporting(pvt, ON)) | 2396 | if (amd64_toggle_ecc_err_reporting(pvt, ON)) |
2407 | amd64_printk(KERN_WARNING, "Error enabling ECC reporting over " | 2397 | amd64_printk(KERN_WARNING, "Error enabling ECC reporting over " |
2408 | "MCGCTL!\n"); | 2398 | "MCGCTL!\n"); |
2409 | 2399 | ||
2410 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCFG, &value); | 2400 | amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &value); |
2411 | 2401 | ||
2412 | debugf0("NBCFG(1)= 0x%x CHIPKILL= %s ECC_ENABLE= %s\n", value, | 2402 | debugf0("NBCFG(1)= 0x%x CHIPKILL= %s ECC_ENABLE= %s\n", value, |
2413 | (value & K8_NBCFG_CHIPKILL) ? "Enabled" : "Disabled", | 2403 | (value & K8_NBCFG_CHIPKILL) ? "Enabled" : "Disabled", |
@@ -2422,9 +2412,9 @@ static void amd64_enable_ecc_error_reporting(struct mem_ctl_info *mci) | |||
2422 | 2412 | ||
2423 | /* Attempt to turn on DRAM ECC Enable */ | 2413 | /* Attempt to turn on DRAM ECC Enable */ |
2424 | value |= K8_NBCFG_ECC_ENABLE; | 2414 | value |= K8_NBCFG_ECC_ENABLE; |
2425 | pci_write_config_dword(pvt->misc_f3_ctl, K8_NBCFG, value); | 2415 | pci_write_config_dword(pvt->F3, K8_NBCFG, value); |
2426 | 2416 | ||
2427 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCFG, &value); | 2417 | amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &value); |
2428 | 2418 | ||
2429 | if (!(value & K8_NBCFG_ECC_ENABLE)) { | 2419 | if (!(value & K8_NBCFG_ECC_ENABLE)) { |
2430 | amd64_printk(KERN_WARNING, | 2420 | amd64_printk(KERN_WARNING, |
@@ -2452,17 +2442,17 @@ static void amd64_restore_ecc_error_reporting(struct amd64_pvt *pvt) | |||
2452 | if (!pvt->nbctl_mcgctl_saved) | 2442 | if (!pvt->nbctl_mcgctl_saved) |
2453 | return; | 2443 | return; |
2454 | 2444 | ||
2455 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCTL, &value); | 2445 | amd64_read_pci_cfg(pvt->F3, K8_NBCTL, &value); |
2456 | value &= ~mask; | 2446 | value &= ~mask; |
2457 | value |= pvt->old_nbctl; | 2447 | value |= pvt->old_nbctl; |
2458 | 2448 | ||
2459 | pci_write_config_dword(pvt->misc_f3_ctl, K8_NBCTL, value); | 2449 | pci_write_config_dword(pvt->F3, K8_NBCTL, value); |
2460 | 2450 | ||
2461 | /* restore previous BIOS DRAM ECC "off" setting which we force-enabled */ | 2451 | /* restore previous BIOS DRAM ECC "off" setting which we force-enabled */ |
2462 | if (!pvt->flags.nb_ecc_prev) { | 2452 | if (!pvt->flags.nb_ecc_prev) { |
2463 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCFG, &value); | 2453 | amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &value); |
2464 | value &= ~K8_NBCFG_ECC_ENABLE; | 2454 | value &= ~K8_NBCFG_ECC_ENABLE; |
2465 | pci_write_config_dword(pvt->misc_f3_ctl, K8_NBCFG, value); | 2455 | pci_write_config_dword(pvt->F3, K8_NBCFG, value); |
2466 | } | 2456 | } |
2467 | 2457 | ||
2468 | /* restore the NB Enable MCGCTL bit */ | 2458 | /* restore the NB Enable MCGCTL bit */ |
@@ -2488,13 +2478,13 @@ static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) | |||
2488 | u8 ecc_enabled = 0; | 2478 | u8 ecc_enabled = 0; |
2489 | bool nb_mce_en = false; | 2479 | bool nb_mce_en = false; |
2490 | 2480 | ||
2491 | amd64_read_pci_cfg(pvt->misc_f3_ctl, K8_NBCFG, &value); | 2481 | amd64_read_pci_cfg(pvt->F3, K8_NBCFG, &value); |
2492 | 2482 | ||
2493 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); | 2483 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); |
2494 | if (!ecc_enabled) | 2484 | if (!ecc_enabled) |
2495 | amd64_printk(KERN_NOTICE, "This node reports that Memory ECC " | 2485 | amd64_printk(KERN_NOTICE, "This node reports that Memory ECC " |
2496 | "is currently disabled, set F3x%x[22] (%s).\n", | 2486 | "is currently disabled, set F3x%x[22] (%s).\n", |
2497 | K8_NBCFG, pci_name(pvt->misc_f3_ctl)); | 2487 | K8_NBCFG, pci_name(pvt->F3)); |
2498 | else | 2488 | else |
2499 | amd64_printk(KERN_INFO, "ECC is enabled by BIOS.\n"); | 2489 | amd64_printk(KERN_INFO, "ECC is enabled by BIOS.\n"); |
2500 | 2490 | ||
@@ -2554,7 +2544,7 @@ static void amd64_setup_mci_misc_attributes(struct mem_ctl_info *mci) | |||
2554 | mci->mod_name = EDAC_MOD_STR; | 2544 | mci->mod_name = EDAC_MOD_STR; |
2555 | mci->mod_ver = EDAC_AMD64_VERSION; | 2545 | mci->mod_ver = EDAC_AMD64_VERSION; |
2556 | mci->ctl_name = pvt->ctl_name; | 2546 | mci->ctl_name = pvt->ctl_name; |
2557 | mci->dev_name = pci_name(pvt->dram_f2_ctl); | 2547 | mci->dev_name = pci_name(pvt->F2); |
2558 | mci->ctl_page_to_phys = NULL; | 2548 | mci->ctl_page_to_phys = NULL; |
2559 | 2549 | ||
2560 | /* memory scrubber interface */ | 2550 | /* memory scrubber interface */ |
@@ -2611,7 +2601,7 @@ static struct amd64_family_type *amd64_per_family_init(struct amd64_pvt *pvt) | |||
2611 | * later come back in a finish-setup function to perform that final | 2601 | * later come back in a finish-setup function to perform that final |
2612 | * initialization. See also amd64_init_2nd_stage() for that. | 2602 | * initialization. See also amd64_init_2nd_stage() for that. |
2613 | */ | 2603 | */ |
2614 | static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl) | 2604 | static int amd64_probe_one_instance(struct pci_dev *F2) |
2615 | { | 2605 | { |
2616 | struct amd64_pvt *pvt = NULL; | 2606 | struct amd64_pvt *pvt = NULL; |
2617 | struct amd64_family_type *fam_type = NULL; | 2607 | struct amd64_family_type *fam_type = NULL; |
@@ -2622,8 +2612,8 @@ static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl) | |||
2622 | if (!pvt) | 2612 | if (!pvt) |
2623 | goto err_exit; | 2613 | goto err_exit; |
2624 | 2614 | ||
2625 | pvt->mc_node_id = get_node_id(dram_f2_ctl); | 2615 | pvt->mc_node_id = get_node_id(F2); |
2626 | pvt->dram_f2_ctl = dram_f2_ctl; | 2616 | pvt->F2 = F2; |
2627 | 2617 | ||
2628 | ret = -EINVAL; | 2618 | ret = -EINVAL; |
2629 | fam_type = amd64_per_family_init(pvt); | 2619 | fam_type = amd64_per_family_init(pvt); |
@@ -2631,8 +2621,8 @@ static int amd64_probe_one_instance(struct pci_dev *dram_f2_ctl) | |||
2631 | goto err_free; | 2621 | goto err_free; |
2632 | 2622 | ||
2633 | ret = -ENODEV; | 2623 | ret = -ENODEV; |
2634 | err = amd64_reserve_mc_sibling_devices(pvt, fam_type->addr_f1_ctl, | 2624 | err = amd64_reserve_mc_sibling_devices(pvt, fam_type->f1_id, |
2635 | fam_type->misc_f3_ctl); | 2625 | fam_type->f3_id); |
2636 | if (err) | 2626 | if (err) |
2637 | goto err_free; | 2627 | goto err_free; |
2638 | 2628 | ||
@@ -2695,7 +2685,7 @@ static int amd64_init_2nd_stage(struct amd64_pvt *pvt) | |||
2695 | 2685 | ||
2696 | mci->pvt_info = pvt; | 2686 | mci->pvt_info = pvt; |
2697 | 2687 | ||
2698 | mci->dev = &pvt->dram_f2_ctl->dev; | 2688 | mci->dev = &pvt->F2->dev; |
2699 | amd64_setup_mci_misc_attributes(mci); | 2689 | amd64_setup_mci_misc_attributes(mci); |
2700 | 2690 | ||
2701 | if (amd64_init_csrows(mci)) | 2691 | if (amd64_init_csrows(mci)) |
@@ -2839,8 +2829,7 @@ static void amd64_setup_pci_device(void) | |||
2839 | 2829 | ||
2840 | pvt = mci->pvt_info; | 2830 | pvt = mci->pvt_info; |
2841 | amd64_ctl_pci = | 2831 | amd64_ctl_pci = |
2842 | edac_pci_create_generic_ctl(&pvt->dram_f2_ctl->dev, | 2832 | edac_pci_create_generic_ctl(&pvt->F2->dev, EDAC_MOD_STR); |
2843 | EDAC_MOD_STR); | ||
2844 | 2833 | ||
2845 | if (!amd64_ctl_pci) { | 2834 | if (!amd64_ctl_pci) { |
2846 | pr_warning("%s(): Unable to create PCI control\n", | 2835 | pr_warning("%s(): Unable to create PCI control\n", |
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 007b68a436c5..76760a8043ca 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
@@ -386,9 +386,7 @@ struct amd64_pvt { | |||
386 | struct low_ops *ops; | 386 | struct low_ops *ops; |
387 | 387 | ||
388 | /* pci_device handles which we utilize */ | 388 | /* pci_device handles which we utilize */ |
389 | struct pci_dev *addr_f1_ctl; | 389 | struct pci_dev *F1, *F2, *F3; |
390 | struct pci_dev *dram_f2_ctl; | ||
391 | struct pci_dev *misc_f3_ctl; | ||
392 | 390 | ||
393 | int mc_node_id; /* MC index of this MC node */ | 391 | int mc_node_id; /* MC index of this MC node */ |
394 | int ext_model; /* extended model value of this node */ | 392 | int ext_model; /* extended model value of this node */ |
@@ -518,8 +516,7 @@ struct low_ops { | |||
518 | 516 | ||
519 | struct amd64_family_type { | 517 | struct amd64_family_type { |
520 | const char *ctl_name; | 518 | const char *ctl_name; |
521 | u16 addr_f1_ctl; | 519 | u16 f1_id, f3_id; |
522 | u16 misc_f3_ctl; | ||
523 | struct low_ops ops; | 520 | struct low_ops ops; |
524 | }; | 521 | }; |
525 | 522 | ||
diff --git a/drivers/edac/amd64_edac_inj.c b/drivers/edac/amd64_edac_inj.c index 29f1f7a612d9..523ce4a6edc6 100644 --- a/drivers/edac/amd64_edac_inj.c +++ b/drivers/edac/amd64_edac_inj.c | |||
@@ -122,15 +122,13 @@ static ssize_t amd64_inject_read_store(struct mem_ctl_info *mci, | |||
122 | /* Form value to choose 16-byte section of cacheline */ | 122 | /* Form value to choose 16-byte section of cacheline */ |
123 | section = F10_NB_ARRAY_DRAM_ECC | | 123 | section = F10_NB_ARRAY_DRAM_ECC | |
124 | SET_NB_ARRAY_ADDRESS(pvt->injection.section); | 124 | SET_NB_ARRAY_ADDRESS(pvt->injection.section); |
125 | pci_write_config_dword(pvt->misc_f3_ctl, | 125 | pci_write_config_dword(pvt->F3, F10_NB_ARRAY_ADDR, section); |
126 | F10_NB_ARRAY_ADDR, section); | ||
127 | 126 | ||
128 | word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection.word, | 127 | word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection.word, |
129 | pvt->injection.bit_map); | 128 | pvt->injection.bit_map); |
130 | 129 | ||
131 | /* Issue 'word' and 'bit' along with the READ request */ | 130 | /* Issue 'word' and 'bit' along with the READ request */ |
132 | pci_write_config_dword(pvt->misc_f3_ctl, | 131 | pci_write_config_dword(pvt->F3, F10_NB_ARRAY_DATA, word_bits); |
133 | F10_NB_ARRAY_DATA, word_bits); | ||
134 | 132 | ||
135 | debugf0("section=0x%x word_bits=0x%x\n", section, word_bits); | 133 | debugf0("section=0x%x word_bits=0x%x\n", section, word_bits); |
136 | 134 | ||
@@ -157,15 +155,13 @@ static ssize_t amd64_inject_write_store(struct mem_ctl_info *mci, | |||
157 | /* Form value to choose 16-byte section of cacheline */ | 155 | /* Form value to choose 16-byte section of cacheline */ |
158 | section = F10_NB_ARRAY_DRAM_ECC | | 156 | section = F10_NB_ARRAY_DRAM_ECC | |
159 | SET_NB_ARRAY_ADDRESS(pvt->injection.section); | 157 | SET_NB_ARRAY_ADDRESS(pvt->injection.section); |
160 | pci_write_config_dword(pvt->misc_f3_ctl, | 158 | pci_write_config_dword(pvt->F3, F10_NB_ARRAY_ADDR, section); |
161 | F10_NB_ARRAY_ADDR, section); | ||
162 | 159 | ||
163 | word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection.word, | 160 | word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection.word, |
164 | pvt->injection.bit_map); | 161 | pvt->injection.bit_map); |
165 | 162 | ||
166 | /* Issue 'word' and 'bit' along with the READ request */ | 163 | /* Issue 'word' and 'bit' along with the READ request */ |
167 | pci_write_config_dword(pvt->misc_f3_ctl, | 164 | pci_write_config_dword(pvt->F3, F10_NB_ARRAY_DATA, word_bits); |
168 | F10_NB_ARRAY_DATA, word_bits); | ||
169 | 165 | ||
170 | debugf0("section=0x%x word_bits=0x%x\n", section, word_bits); | 166 | debugf0("section=0x%x word_bits=0x%x\n", section, word_bits); |
171 | 167 | ||