diff options
-rw-r--r-- | drivers/edac/amd64_edac.c | 28 | ||||
-rw-r--r-- | drivers/edac/amd64_edac.h | 2 |
2 files changed, 29 insertions, 1 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 601142a0738..e17de90ba6c 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -944,12 +944,13 @@ static u64 get_error_address(struct mce *m) | |||
944 | 944 | ||
945 | static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range) | 945 | static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range) |
946 | { | 946 | { |
947 | struct cpuinfo_x86 *c = &boot_cpu_data; | ||
947 | int off = range << 3; | 948 | int off = range << 3; |
948 | 949 | ||
949 | amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo); | 950 | amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo); |
950 | amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo); | 951 | amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo); |
951 | 952 | ||
952 | if (boot_cpu_data.x86 == 0xf) | 953 | if (c->x86 == 0xf) |
953 | return; | 954 | return; |
954 | 955 | ||
955 | if (!dram_rw(pvt, range)) | 956 | if (!dram_rw(pvt, range)) |
@@ -957,6 +958,31 @@ static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range) | |||
957 | 958 | ||
958 | amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi); | 959 | amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi); |
959 | amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi); | 960 | amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi); |
961 | |||
962 | /* Factor in CC6 save area by reading dst node's limit reg */ | ||
963 | if (c->x86 == 0x15) { | ||
964 | struct pci_dev *f1 = NULL; | ||
965 | u8 nid = dram_dst_node(pvt, range); | ||
966 | u32 llim; | ||
967 | |||
968 | f1 = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0x18 + nid, 1)); | ||
969 | if (WARN_ON(!f1)) | ||
970 | return; | ||
971 | |||
972 | amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim); | ||
973 | |||
974 | pvt->ranges[range].lim.lo &= GENMASK(0, 15); | ||
975 | |||
976 | /* {[39:27],111b} */ | ||
977 | pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16; | ||
978 | |||
979 | pvt->ranges[range].lim.hi &= GENMASK(0, 7); | ||
980 | |||
981 | /* [47:40] */ | ||
982 | pvt->ranges[range].lim.hi |= llim >> 13; | ||
983 | |||
984 | pci_dev_put(f1); | ||
985 | } | ||
960 | } | 986 | } |
961 | 987 | ||
962 | static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, | 988 | static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, |
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 11be36a311e..0110930c82e 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
@@ -196,6 +196,8 @@ | |||
196 | 196 | ||
197 | #define DCT_CFG_SEL 0x10C | 197 | #define DCT_CFG_SEL 0x10C |
198 | 198 | ||
199 | #define DRAM_LOCAL_NODE_LIM 0x124 | ||
200 | |||
199 | #define DRAM_BASE_HI 0x140 | 201 | #define DRAM_BASE_HI 0x140 |
200 | #define DRAM_LIMIT_HI 0x144 | 202 | #define DRAM_LIMIT_HI 0x144 |
201 | 203 | ||