0001
0002 #include "amd64_edac.h"
0003 #include <asm/amd_nb.h>
0004
0005 static struct edac_pci_ctl_info *pci_ctl;
0006
0007
0008
0009
0010
0011 static int ecc_enable_override;
0012 module_param(ecc_enable_override, int, 0644);
0013
0014 static struct msr __percpu *msrs;
0015
0016 static struct amd64_family_type *fam_type;
0017
0018 static inline u32 get_umc_reg(u32 reg)
0019 {
0020 if (!fam_type->flags.zn_regs_v2)
0021 return reg;
0022
0023 switch (reg) {
0024 case UMCCH_ADDR_CFG: return UMCCH_ADDR_CFG_DDR5;
0025 case UMCCH_ADDR_MASK_SEC: return UMCCH_ADDR_MASK_SEC_DDR5;
0026 case UMCCH_DIMM_CFG: return UMCCH_DIMM_CFG_DDR5;
0027 }
0028
0029 WARN_ONCE(1, "%s: unknown register 0x%x", __func__, reg);
0030 return 0;
0031 }
0032
0033
0034 static struct ecc_settings **ecc_stngs;
0035
0036
0037 static struct device *pci_ctl_dev;
0038
0039
0040
0041
0042
0043
0044
0045
0046 static const struct scrubrate {
0047 u32 scrubval;
0048 u32 bandwidth;
0049 } scrubrates[] = {
0050 { 0x01, 1600000000UL},
0051 { 0x02, 800000000UL},
0052 { 0x03, 400000000UL},
0053 { 0x04, 200000000UL},
0054 { 0x05, 100000000UL},
0055 { 0x06, 50000000UL},
0056 { 0x07, 25000000UL},
0057 { 0x08, 12284069UL},
0058 { 0x09, 6274509UL},
0059 { 0x0A, 3121951UL},
0060 { 0x0B, 1560975UL},
0061 { 0x0C, 781440UL},
0062 { 0x0D, 390720UL},
0063 { 0x0E, 195300UL},
0064 { 0x0F, 97650UL},
0065 { 0x10, 48854UL},
0066 { 0x11, 24427UL},
0067 { 0x12, 12213UL},
0068 { 0x13, 6101UL},
0069 { 0x14, 3051UL},
0070 { 0x15, 1523UL},
0071 { 0x16, 761UL},
0072 { 0x00, 0UL},
0073 };
0074
0075 int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
0076 u32 *val, const char *func)
0077 {
0078 int err = 0;
0079
0080 err = pci_read_config_dword(pdev, offset, val);
0081 if (err)
0082 amd64_warn("%s: error reading F%dx%03x.\n",
0083 func, PCI_FUNC(pdev->devfn), offset);
0084
0085 return err;
0086 }
0087
0088 int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
0089 u32 val, const char *func)
0090 {
0091 int err = 0;
0092
0093 err = pci_write_config_dword(pdev, offset, val);
0094 if (err)
0095 amd64_warn("%s: error writing to F%dx%03x.\n",
0096 func, PCI_FUNC(pdev->devfn), offset);
0097
0098 return err;
0099 }
0100
0101
0102
0103
0104 static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
0105 {
0106 u32 reg = 0;
0107
0108 amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®);
0109 reg &= (pvt->model == 0x30) ? ~3 : ~1;
0110 reg |= dct;
0111 amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
0112 }
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
0129 int offset, u32 *val)
0130 {
0131 switch (pvt->fam) {
0132 case 0xf:
0133 if (dct || offset >= 0x100)
0134 return -EINVAL;
0135 break;
0136
0137 case 0x10:
0138 if (dct) {
0139
0140
0141
0142
0143
0144 if (dct_ganging_enabled(pvt))
0145 return 0;
0146
0147 offset += 0x100;
0148 }
0149 break;
0150
0151 case 0x15:
0152
0153
0154
0155
0156 dct = (dct && pvt->model == 0x30) ? 3 : dct;
0157 f15h_select_dct(pvt, dct);
0158 break;
0159
0160 case 0x16:
0161 if (dct)
0162 return -EINVAL;
0163 break;
0164
0165 default:
0166 break;
0167 }
0168 return amd64_read_pci_cfg(pvt->F2, offset, val);
0169 }
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 static inline void __f17h_set_scrubval(struct amd64_pvt *pvt, u32 scrubval)
0186 {
0187
0188
0189
0190
0191
0192 if (scrubval >= 0x5 && scrubval <= 0x14) {
0193 scrubval -= 0x5;
0194 pci_write_bits32(pvt->F6, F17H_SCR_LIMIT_ADDR, scrubval, 0xF);
0195 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 1, 0x1);
0196 } else {
0197 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 0, 0x1);
0198 }
0199 }
0200
0201
0202
0203
0204 static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
0205 {
0206 u32 scrubval;
0207 int i;
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
0219
0220
0221
0222
0223 if (scrubrates[i].scrubval < min_rate)
0224 continue;
0225
0226 if (scrubrates[i].bandwidth <= new_bw)
0227 break;
0228 }
0229
0230 scrubval = scrubrates[i].scrubval;
0231
0232 if (pvt->umc) {
0233 __f17h_set_scrubval(pvt, scrubval);
0234 } else if (pvt->fam == 0x15 && pvt->model == 0x60) {
0235 f15h_select_dct(pvt, 0);
0236 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
0237 f15h_select_dct(pvt, 1);
0238 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
0239 } else {
0240 pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
0241 }
0242
0243 if (scrubval)
0244 return scrubrates[i].bandwidth;
0245
0246 return 0;
0247 }
0248
0249 static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
0250 {
0251 struct amd64_pvt *pvt = mci->pvt_info;
0252 u32 min_scrubrate = 0x5;
0253
0254 if (pvt->fam == 0xf)
0255 min_scrubrate = 0x0;
0256
0257 if (pvt->fam == 0x15) {
0258
0259 if (pvt->model < 0x10)
0260 f15h_select_dct(pvt, 0);
0261
0262 if (pvt->model == 0x60)
0263 min_scrubrate = 0x6;
0264 }
0265 return __set_scrub_rate(pvt, bw, min_scrubrate);
0266 }
0267
0268 static int get_scrub_rate(struct mem_ctl_info *mci)
0269 {
0270 struct amd64_pvt *pvt = mci->pvt_info;
0271 int i, retval = -EINVAL;
0272 u32 scrubval = 0;
0273
0274 if (pvt->umc) {
0275 amd64_read_pci_cfg(pvt->F6, F17H_SCR_BASE_ADDR, &scrubval);
0276 if (scrubval & BIT(0)) {
0277 amd64_read_pci_cfg(pvt->F6, F17H_SCR_LIMIT_ADDR, &scrubval);
0278 scrubval &= 0xF;
0279 scrubval += 0x5;
0280 } else {
0281 scrubval = 0;
0282 }
0283 } else if (pvt->fam == 0x15) {
0284
0285 if (pvt->model < 0x10)
0286 f15h_select_dct(pvt, 0);
0287
0288 if (pvt->model == 0x60)
0289 amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
0290 else
0291 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
0292 } else {
0293 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
0294 }
0295
0296 scrubval = scrubval & 0x001F;
0297
0298 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
0299 if (scrubrates[i].scrubval == scrubval) {
0300 retval = scrubrates[i].bandwidth;
0301 break;
0302 }
0303 }
0304 return retval;
0305 }
0306
0307
0308
0309
0310
0311 static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
0312 {
0313 u64 addr;
0314
0315
0316
0317
0318
0319
0320
0321 addr = sys_addr & 0x000000ffffffffffull;
0322
0323 return ((addr >= get_dram_base(pvt, nid)) &&
0324 (addr <= get_dram_limit(pvt, nid)));
0325 }
0326
0327
0328
0329
0330
0331
0332
0333 static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
0334 u64 sys_addr)
0335 {
0336 struct amd64_pvt *pvt;
0337 u8 node_id;
0338 u32 intlv_en, bits;
0339
0340
0341
0342
0343
0344 pvt = mci->pvt_info;
0345
0346
0347
0348
0349
0350
0351 intlv_en = dram_intlv_en(pvt, 0);
0352
0353 if (intlv_en == 0) {
0354 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
0355 if (base_limit_match(pvt, sys_addr, node_id))
0356 goto found;
0357 }
0358 goto err_no_match;
0359 }
0360
0361 if (unlikely((intlv_en != 0x01) &&
0362 (intlv_en != 0x03) &&
0363 (intlv_en != 0x07))) {
0364 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
0365 return NULL;
0366 }
0367
0368 bits = (((u32) sys_addr) >> 12) & intlv_en;
0369
0370 for (node_id = 0; ; ) {
0371 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
0372 break;
0373
0374 if (++node_id >= DRAM_RANGES)
0375 goto err_no_match;
0376 }
0377
0378
0379 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
0380 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
0381 "range for node %d with node interleaving enabled.\n",
0382 __func__, sys_addr, node_id);
0383 return NULL;
0384 }
0385
0386 found:
0387 return edac_mc_find((int)node_id);
0388
0389 err_no_match:
0390 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
0391 (unsigned long)sys_addr);
0392
0393 return NULL;
0394 }
0395
0396
0397
0398
0399
0400 static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
0401 u64 *base, u64 *mask)
0402 {
0403 u64 csbase, csmask, base_bits, mask_bits;
0404 u8 addr_shift;
0405
0406 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
0407 csbase = pvt->csels[dct].csbases[csrow];
0408 csmask = pvt->csels[dct].csmasks[csrow];
0409 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
0410 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
0411 addr_shift = 4;
0412
0413
0414
0415
0416
0417 } else if (pvt->fam == 0x16 ||
0418 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
0419 csbase = pvt->csels[dct].csbases[csrow];
0420 csmask = pvt->csels[dct].csmasks[csrow >> 1];
0421
0422 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
0423 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
0424
0425 *mask = ~0ULL;
0426
0427 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
0428 (GENMASK_ULL(30, 19) << 8));
0429
0430 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
0431 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
0432
0433 return;
0434 } else {
0435 csbase = pvt->csels[dct].csbases[csrow];
0436 csmask = pvt->csels[dct].csmasks[csrow >> 1];
0437 addr_shift = 8;
0438
0439 if (pvt->fam == 0x15)
0440 base_bits = mask_bits =
0441 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
0442 else
0443 base_bits = mask_bits =
0444 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
0445 }
0446
0447 *base = (csbase & base_bits) << addr_shift;
0448
0449 *mask = ~0ULL;
0450
0451 *mask &= ~(mask_bits << addr_shift);
0452
0453 *mask |= (csmask & mask_bits) << addr_shift;
0454 }
0455
0456 #define for_each_chip_select(i, dct, pvt) \
0457 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
0458
0459 #define chip_select_base(i, dct, pvt) \
0460 pvt->csels[dct].csbases[i]
0461
0462 #define for_each_chip_select_mask(i, dct, pvt) \
0463 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
0464
0465 #define for_each_umc(i) \
0466 for (i = 0; i < fam_type->max_mcs; i++)
0467
0468
0469
0470
0471
0472 static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
0473 {
0474 struct amd64_pvt *pvt;
0475 int csrow;
0476 u64 base, mask;
0477
0478 pvt = mci->pvt_info;
0479
0480 for_each_chip_select(csrow, 0, pvt) {
0481 if (!csrow_enabled(csrow, 0, pvt))
0482 continue;
0483
0484 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
0485
0486 mask = ~mask;
0487
0488 if ((input_addr & mask) == (base & mask)) {
0489 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
0490 (unsigned long)input_addr, csrow,
0491 pvt->mc_node_id);
0492
0493 return csrow;
0494 }
0495 }
0496 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
0497 (unsigned long)input_addr, pvt->mc_node_id);
0498
0499 return -1;
0500 }
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518 static int get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
0519 u64 *hole_offset, u64 *hole_size)
0520 {
0521 struct amd64_pvt *pvt = mci->pvt_info;
0522
0523
0524 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
0525 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
0526 pvt->ext_model, pvt->mc_node_id);
0527 return 1;
0528 }
0529
0530
0531 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
0532 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
0533 return 1;
0534 }
0535
0536 if (!dhar_valid(pvt)) {
0537 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
0538 pvt->mc_node_id);
0539 return 1;
0540 }
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 *hole_base = dhar_base(pvt);
0561 *hole_size = (1ULL << 32) - *hole_base;
0562
0563 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
0564 : k8_dhar_offset(pvt);
0565
0566 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
0567 pvt->mc_node_id, (unsigned long)*hole_base,
0568 (unsigned long)*hole_offset, (unsigned long)*hole_size);
0569
0570 return 0;
0571 }
0572
0573 #ifdef CONFIG_EDAC_DEBUG
0574 #define EDAC_DCT_ATTR_SHOW(reg) \
0575 static ssize_t reg##_show(struct device *dev, \
0576 struct device_attribute *mattr, char *data) \
0577 { \
0578 struct mem_ctl_info *mci = to_mci(dev); \
0579 struct amd64_pvt *pvt = mci->pvt_info; \
0580 \
0581 return sprintf(data, "0x%016llx\n", (u64)pvt->reg); \
0582 }
0583
0584 EDAC_DCT_ATTR_SHOW(dhar);
0585 EDAC_DCT_ATTR_SHOW(dbam0);
0586 EDAC_DCT_ATTR_SHOW(top_mem);
0587 EDAC_DCT_ATTR_SHOW(top_mem2);
0588
0589 static ssize_t dram_hole_show(struct device *dev, struct device_attribute *mattr,
0590 char *data)
0591 {
0592 struct mem_ctl_info *mci = to_mci(dev);
0593
0594 u64 hole_base = 0;
0595 u64 hole_offset = 0;
0596 u64 hole_size = 0;
0597
0598 get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
0599
0600 return sprintf(data, "%llx %llx %llx\n", hole_base, hole_offset,
0601 hole_size);
0602 }
0603
0604
0605
0606
0607 static DEVICE_ATTR(dhar, S_IRUGO, dhar_show, NULL);
0608 static DEVICE_ATTR(dbam, S_IRUGO, dbam0_show, NULL);
0609 static DEVICE_ATTR(topmem, S_IRUGO, top_mem_show, NULL);
0610 static DEVICE_ATTR(topmem2, S_IRUGO, top_mem2_show, NULL);
0611 static DEVICE_ATTR_RO(dram_hole);
0612
0613 static struct attribute *dbg_attrs[] = {
0614 &dev_attr_dhar.attr,
0615 &dev_attr_dbam.attr,
0616 &dev_attr_topmem.attr,
0617 &dev_attr_topmem2.attr,
0618 &dev_attr_dram_hole.attr,
0619 NULL
0620 };
0621
0622 static const struct attribute_group dbg_group = {
0623 .attrs = dbg_attrs,
0624 };
0625
0626 static ssize_t inject_section_show(struct device *dev,
0627 struct device_attribute *mattr, char *buf)
0628 {
0629 struct mem_ctl_info *mci = to_mci(dev);
0630 struct amd64_pvt *pvt = mci->pvt_info;
0631 return sprintf(buf, "0x%x\n", pvt->injection.section);
0632 }
0633
0634
0635
0636
0637
0638
0639
0640 static ssize_t inject_section_store(struct device *dev,
0641 struct device_attribute *mattr,
0642 const char *data, size_t count)
0643 {
0644 struct mem_ctl_info *mci = to_mci(dev);
0645 struct amd64_pvt *pvt = mci->pvt_info;
0646 unsigned long value;
0647 int ret;
0648
0649 ret = kstrtoul(data, 10, &value);
0650 if (ret < 0)
0651 return ret;
0652
0653 if (value > 3) {
0654 amd64_warn("%s: invalid section 0x%lx\n", __func__, value);
0655 return -EINVAL;
0656 }
0657
0658 pvt->injection.section = (u32) value;
0659 return count;
0660 }
0661
0662 static ssize_t inject_word_show(struct device *dev,
0663 struct device_attribute *mattr, char *buf)
0664 {
0665 struct mem_ctl_info *mci = to_mci(dev);
0666 struct amd64_pvt *pvt = mci->pvt_info;
0667 return sprintf(buf, "0x%x\n", pvt->injection.word);
0668 }
0669
0670
0671
0672
0673
0674
0675
0676 static ssize_t inject_word_store(struct device *dev,
0677 struct device_attribute *mattr,
0678 const char *data, size_t count)
0679 {
0680 struct mem_ctl_info *mci = to_mci(dev);
0681 struct amd64_pvt *pvt = mci->pvt_info;
0682 unsigned long value;
0683 int ret;
0684
0685 ret = kstrtoul(data, 10, &value);
0686 if (ret < 0)
0687 return ret;
0688
0689 if (value > 8) {
0690 amd64_warn("%s: invalid word 0x%lx\n", __func__, value);
0691 return -EINVAL;
0692 }
0693
0694 pvt->injection.word = (u32) value;
0695 return count;
0696 }
0697
0698 static ssize_t inject_ecc_vector_show(struct device *dev,
0699 struct device_attribute *mattr,
0700 char *buf)
0701 {
0702 struct mem_ctl_info *mci = to_mci(dev);
0703 struct amd64_pvt *pvt = mci->pvt_info;
0704 return sprintf(buf, "0x%x\n", pvt->injection.bit_map);
0705 }
0706
0707
0708
0709
0710
0711
0712 static ssize_t inject_ecc_vector_store(struct device *dev,
0713 struct device_attribute *mattr,
0714 const char *data, size_t count)
0715 {
0716 struct mem_ctl_info *mci = to_mci(dev);
0717 struct amd64_pvt *pvt = mci->pvt_info;
0718 unsigned long value;
0719 int ret;
0720
0721 ret = kstrtoul(data, 16, &value);
0722 if (ret < 0)
0723 return ret;
0724
0725 if (value & 0xFFFF0000) {
0726 amd64_warn("%s: invalid EccVector: 0x%lx\n", __func__, value);
0727 return -EINVAL;
0728 }
0729
0730 pvt->injection.bit_map = (u32) value;
0731 return count;
0732 }
0733
0734
0735
0736
0737
0738 static ssize_t inject_read_store(struct device *dev,
0739 struct device_attribute *mattr,
0740 const char *data, size_t count)
0741 {
0742 struct mem_ctl_info *mci = to_mci(dev);
0743 struct amd64_pvt *pvt = mci->pvt_info;
0744 unsigned long value;
0745 u32 section, word_bits;
0746 int ret;
0747
0748 ret = kstrtoul(data, 10, &value);
0749 if (ret < 0)
0750 return ret;
0751
0752
0753 section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
0754
0755 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
0756
0757 word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection);
0758
0759
0760 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
0761
0762 edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
0763
0764 return count;
0765 }
0766
0767
0768
0769
0770
0771 static ssize_t inject_write_store(struct device *dev,
0772 struct device_attribute *mattr,
0773 const char *data, size_t count)
0774 {
0775 struct mem_ctl_info *mci = to_mci(dev);
0776 struct amd64_pvt *pvt = mci->pvt_info;
0777 u32 section, word_bits, tmp;
0778 unsigned long value;
0779 int ret;
0780
0781 ret = kstrtoul(data, 10, &value);
0782 if (ret < 0)
0783 return ret;
0784
0785
0786 section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
0787
0788 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
0789
0790 word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection);
0791
0792 pr_notice_once("Don't forget to decrease MCE polling interval in\n"
0793 "/sys/bus/machinecheck/devices/machinecheck<CPUNUM>/check_interval\n"
0794 "so that you can get the error report faster.\n");
0795
0796 on_each_cpu(disable_caches, NULL, 1);
0797
0798
0799 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
0800
0801 retry:
0802
0803 amd64_read_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, &tmp);
0804 if (tmp & F10_NB_ARR_ECC_WR_REQ) {
0805 cpu_relax();
0806 goto retry;
0807 }
0808
0809 on_each_cpu(enable_caches, NULL, 1);
0810
0811 edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
0812
0813 return count;
0814 }
0815
0816
0817
0818
0819
0820 static DEVICE_ATTR_RW(inject_section);
0821 static DEVICE_ATTR_RW(inject_word);
0822 static DEVICE_ATTR_RW(inject_ecc_vector);
0823 static DEVICE_ATTR_WO(inject_write);
0824 static DEVICE_ATTR_WO(inject_read);
0825
0826 static struct attribute *inj_attrs[] = {
0827 &dev_attr_inject_section.attr,
0828 &dev_attr_inject_word.attr,
0829 &dev_attr_inject_ecc_vector.attr,
0830 &dev_attr_inject_write.attr,
0831 &dev_attr_inject_read.attr,
0832 NULL
0833 };
0834
0835 static umode_t inj_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
0836 {
0837 struct device *dev = kobj_to_dev(kobj);
0838 struct mem_ctl_info *mci = container_of(dev, struct mem_ctl_info, dev);
0839 struct amd64_pvt *pvt = mci->pvt_info;
0840
0841
0842 if (pvt->fam >= 0x10 && pvt->fam <= 0x16)
0843 return attr->mode;
0844
0845 return 0;
0846 }
0847
0848 static const struct attribute_group inj_group = {
0849 .attrs = inj_attrs,
0850 .is_visible = inj_is_visible,
0851 };
0852 #endif
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883 static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
0884 {
0885 struct amd64_pvt *pvt = mci->pvt_info;
0886 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
0887 int ret;
0888
0889 dram_base = get_dram_base(pvt, pvt->mc_node_id);
0890
0891 ret = get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
0892 if (!ret) {
0893 if ((sys_addr >= (1ULL << 32)) &&
0894 (sys_addr < ((1ULL << 32) + hole_size))) {
0895
0896 dram_addr = sys_addr - hole_offset;
0897
0898 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
0899 (unsigned long)sys_addr,
0900 (unsigned long)dram_addr);
0901
0902 return dram_addr;
0903 }
0904 }
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
0916
0917 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
0918 (unsigned long)sys_addr, (unsigned long)dram_addr);
0919 return dram_addr;
0920 }
0921
0922
0923
0924
0925
0926
0927 static int num_node_interleave_bits(unsigned intlv_en)
0928 {
0929 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
0930 int n;
0931
0932 BUG_ON(intlv_en > 7);
0933 n = intlv_shift_table[intlv_en];
0934 return n;
0935 }
0936
0937
0938 static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
0939 {
0940 struct amd64_pvt *pvt;
0941 int intlv_shift;
0942 u64 input_addr;
0943
0944 pvt = mci->pvt_info;
0945
0946
0947
0948
0949
0950 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
0951 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
0952 (dram_addr & 0xfff);
0953
0954 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
0955 intlv_shift, (unsigned long)dram_addr,
0956 (unsigned long)input_addr);
0957
0958 return input_addr;
0959 }
0960
0961
0962
0963
0964
0965 static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
0966 {
0967 u64 input_addr;
0968
0969 input_addr =
0970 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
0971
0972 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
0973 (unsigned long)sys_addr, (unsigned long)input_addr);
0974
0975 return input_addr;
0976 }
0977
0978
0979 static inline void error_address_to_page_and_offset(u64 error_address,
0980 struct err_info *err)
0981 {
0982 err->page = (u32) (error_address >> PAGE_SHIFT);
0983 err->offset = ((u32) error_address) & ~PAGE_MASK;
0984 }
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994 static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
0995 {
0996 int csrow;
0997
0998 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
0999
1000 if (csrow == -1)
1001 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
1002 "address 0x%lx\n", (unsigned long)sys_addr);
1003 return csrow;
1004 }
1005
1006
1007 static DEFINE_MUTEX(df_indirect_mutex);
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021 #define DF_BROADCAST 0xFF
1022 static int __df_indirect_read(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo)
1023 {
1024 struct pci_dev *F4;
1025 u32 ficaa;
1026 int err = -ENODEV;
1027
1028 if (node >= amd_nb_num())
1029 goto out;
1030
1031 F4 = node_to_amd_nb(node)->link;
1032 if (!F4)
1033 goto out;
1034
1035 ficaa = (instance_id == DF_BROADCAST) ? 0 : 1;
1036 ficaa |= reg & 0x3FC;
1037 ficaa |= (func & 0x7) << 11;
1038 ficaa |= instance_id << 16;
1039
1040 mutex_lock(&df_indirect_mutex);
1041
1042 err = pci_write_config_dword(F4, 0x5C, ficaa);
1043 if (err) {
1044 pr_warn("Error writing DF Indirect FICAA, FICAA=0x%x\n", ficaa);
1045 goto out_unlock;
1046 }
1047
1048 err = pci_read_config_dword(F4, 0x98, lo);
1049 if (err)
1050 pr_warn("Error reading DF Indirect FICAD LO, FICAA=0x%x.\n", ficaa);
1051
1052 out_unlock:
1053 mutex_unlock(&df_indirect_mutex);
1054
1055 out:
1056 return err;
1057 }
1058
1059 static int df_indirect_read_instance(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo)
1060 {
1061 return __df_indirect_read(node, func, reg, instance_id, lo);
1062 }
1063
1064 static int df_indirect_read_broadcast(u16 node, u8 func, u16 reg, u32 *lo)
1065 {
1066 return __df_indirect_read(node, func, reg, DF_BROADCAST, lo);
1067 }
1068
1069 struct addr_ctx {
1070 u64 ret_addr;
1071 u32 tmp;
1072 u16 nid;
1073 u8 inst_id;
1074 };
1075
1076 static int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)
1077 {
1078 u64 dram_base_addr, dram_limit_addr, dram_hole_base;
1079
1080 u8 die_id_shift, die_id_mask, socket_id_shift, socket_id_mask;
1081 u8 intlv_num_dies, intlv_num_chan, intlv_num_sockets;
1082 u8 intlv_addr_sel, intlv_addr_bit;
1083 u8 num_intlv_bits, hashed_bit;
1084 u8 lgcy_mmio_hole_en, base = 0;
1085 u8 cs_mask, cs_id = 0;
1086 bool hash_enabled = false;
1087
1088 struct addr_ctx ctx;
1089
1090 memset(&ctx, 0, sizeof(ctx));
1091
1092
1093 ctx.ret_addr = norm_addr;
1094
1095 ctx.nid = nid;
1096 ctx.inst_id = umc;
1097
1098
1099 if (df_indirect_read_instance(nid, 0, 0x1B4, umc, &ctx.tmp))
1100 goto out_err;
1101
1102
1103 if (ctx.tmp & BIT(0)) {
1104 u64 hi_addr_offset = (ctx.tmp & GENMASK_ULL(31, 20)) << 8;
1105
1106 if (norm_addr >= hi_addr_offset) {
1107 ctx.ret_addr -= hi_addr_offset;
1108 base = 1;
1109 }
1110 }
1111
1112
1113 if (df_indirect_read_instance(nid, 0, 0x110 + (8 * base), umc, &ctx.tmp))
1114 goto out_err;
1115
1116
1117 if (!(ctx.tmp & BIT(0))) {
1118 pr_err("%s: Invalid DramBaseAddress range: 0x%x.\n",
1119 __func__, ctx.tmp);
1120 goto out_err;
1121 }
1122
1123 lgcy_mmio_hole_en = ctx.tmp & BIT(1);
1124 intlv_num_chan = (ctx.tmp >> 4) & 0xF;
1125 intlv_addr_sel = (ctx.tmp >> 8) & 0x7;
1126 dram_base_addr = (ctx.tmp & GENMASK_ULL(31, 12)) << 16;
1127
1128
1129 if (intlv_addr_sel > 3) {
1130 pr_err("%s: Invalid interleave address select %d.\n",
1131 __func__, intlv_addr_sel);
1132 goto out_err;
1133 }
1134
1135
1136 if (df_indirect_read_instance(nid, 0, 0x114 + (8 * base), umc, &ctx.tmp))
1137 goto out_err;
1138
1139 intlv_num_sockets = (ctx.tmp >> 8) & 0x1;
1140 intlv_num_dies = (ctx.tmp >> 10) & 0x3;
1141 dram_limit_addr = ((ctx.tmp & GENMASK_ULL(31, 12)) << 16) | GENMASK_ULL(27, 0);
1142
1143 intlv_addr_bit = intlv_addr_sel + 8;
1144
1145
1146 switch (intlv_num_chan) {
1147 case 0: intlv_num_chan = 0; break;
1148 case 1: intlv_num_chan = 1; break;
1149 case 3: intlv_num_chan = 2; break;
1150 case 5: intlv_num_chan = 3; break;
1151 case 7: intlv_num_chan = 4; break;
1152
1153 case 8: intlv_num_chan = 1;
1154 hash_enabled = true;
1155 break;
1156 default:
1157 pr_err("%s: Invalid number of interleaved channels %d.\n",
1158 __func__, intlv_num_chan);
1159 goto out_err;
1160 }
1161
1162 num_intlv_bits = intlv_num_chan;
1163
1164 if (intlv_num_dies > 2) {
1165 pr_err("%s: Invalid number of interleaved nodes/dies %d.\n",
1166 __func__, intlv_num_dies);
1167 goto out_err;
1168 }
1169
1170 num_intlv_bits += intlv_num_dies;
1171
1172
1173 num_intlv_bits += intlv_num_sockets;
1174
1175
1176 if (num_intlv_bits > 4) {
1177 pr_err("%s: Invalid interleave bits %d.\n",
1178 __func__, num_intlv_bits);
1179 goto out_err;
1180 }
1181
1182 if (num_intlv_bits > 0) {
1183 u64 temp_addr_x, temp_addr_i, temp_addr_y;
1184 u8 die_id_bit, sock_id_bit, cs_fabric_id;
1185
1186
1187
1188
1189
1190
1191
1192 if (df_indirect_read_instance(nid, 0, 0x50, umc, &ctx.tmp))
1193 goto out_err;
1194
1195 cs_fabric_id = (ctx.tmp >> 8) & 0xFF;
1196 die_id_bit = 0;
1197
1198
1199 if (intlv_num_chan) {
1200 die_id_bit = intlv_num_chan;
1201 cs_mask = (1 << die_id_bit) - 1;
1202 cs_id = cs_fabric_id & cs_mask;
1203 }
1204
1205 sock_id_bit = die_id_bit;
1206
1207
1208 if (intlv_num_dies || intlv_num_sockets)
1209 if (df_indirect_read_broadcast(nid, 1, 0x208, &ctx.tmp))
1210 goto out_err;
1211
1212
1213 if (intlv_num_dies) {
1214 sock_id_bit = die_id_bit + intlv_num_dies;
1215 die_id_shift = (ctx.tmp >> 24) & 0xF;
1216 die_id_mask = (ctx.tmp >> 8) & 0xFF;
1217
1218 cs_id |= ((cs_fabric_id & die_id_mask) >> die_id_shift) << die_id_bit;
1219 }
1220
1221
1222 if (intlv_num_sockets) {
1223 socket_id_shift = (ctx.tmp >> 28) & 0xF;
1224 socket_id_mask = (ctx.tmp >> 16) & 0xFF;
1225
1226 cs_id |= ((cs_fabric_id & socket_id_mask) >> socket_id_shift) << sock_id_bit;
1227 }
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237 temp_addr_y = ctx.ret_addr & GENMASK_ULL(intlv_addr_bit - 1, 0);
1238 temp_addr_i = (cs_id << intlv_addr_bit);
1239 temp_addr_x = (ctx.ret_addr & GENMASK_ULL(63, intlv_addr_bit)) << num_intlv_bits;
1240 ctx.ret_addr = temp_addr_x | temp_addr_i | temp_addr_y;
1241 }
1242
1243
1244 ctx.ret_addr += dram_base_addr;
1245
1246
1247 if (lgcy_mmio_hole_en) {
1248 if (df_indirect_read_broadcast(nid, 0, 0x104, &ctx.tmp))
1249 goto out_err;
1250
1251 dram_hole_base = ctx.tmp & GENMASK(31, 24);
1252 if (ctx.ret_addr >= dram_hole_base)
1253 ctx.ret_addr += (BIT_ULL(32) - dram_hole_base);
1254 }
1255
1256 if (hash_enabled) {
1257
1258 hashed_bit = (ctx.ret_addr >> 12) ^
1259 (ctx.ret_addr >> 18) ^
1260 (ctx.ret_addr >> 21) ^
1261 (ctx.ret_addr >> 30) ^
1262 cs_id;
1263
1264 hashed_bit &= BIT(0);
1265
1266 if (hashed_bit != ((ctx.ret_addr >> intlv_addr_bit) & BIT(0)))
1267 ctx.ret_addr ^= BIT(intlv_addr_bit);
1268 }
1269
1270
1271 if (ctx.ret_addr > dram_limit_addr)
1272 goto out_err;
1273
1274 *sys_addr = ctx.ret_addr;
1275 return 0;
1276
1277 out_err:
1278 return -EINVAL;
1279 }
1280
1281 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
1282
1283
1284
1285
1286
1287 static unsigned long determine_edac_cap(struct amd64_pvt *pvt)
1288 {
1289 unsigned long edac_cap = EDAC_FLAG_NONE;
1290 u8 bit;
1291
1292 if (pvt->umc) {
1293 u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
1294
1295 for_each_umc(i) {
1296 if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
1297 continue;
1298
1299 umc_en_mask |= BIT(i);
1300
1301
1302 if (pvt->umc[i].umc_cfg & BIT(12))
1303 dimm_ecc_en_mask |= BIT(i);
1304 }
1305
1306 if (umc_en_mask == dimm_ecc_en_mask)
1307 edac_cap = EDAC_FLAG_SECDED;
1308 } else {
1309 bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
1310 ? 19
1311 : 17;
1312
1313 if (pvt->dclr0 & BIT(bit))
1314 edac_cap = EDAC_FLAG_SECDED;
1315 }
1316
1317 return edac_cap;
1318 }
1319
1320 static void debug_display_dimm_sizes(struct amd64_pvt *, u8);
1321
1322 static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
1323 {
1324 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
1325
1326 if (pvt->dram_type == MEM_LRDDR3) {
1327 u32 dcsm = pvt->csels[chan].csmasks[0];
1328
1329
1330
1331
1332
1333 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
1334 }
1335
1336 edac_dbg(1, "All DIMMs support ECC:%s\n",
1337 (dclr & BIT(19)) ? "yes" : "no");
1338
1339
1340 edac_dbg(1, " PAR/ERR parity: %s\n",
1341 (dclr & BIT(8)) ? "enabled" : "disabled");
1342
1343 if (pvt->fam == 0x10)
1344 edac_dbg(1, " DCT 128bit mode width: %s\n",
1345 (dclr & BIT(11)) ? "128b" : "64b");
1346
1347 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
1348 (dclr & BIT(12)) ? "yes" : "no",
1349 (dclr & BIT(13)) ? "yes" : "no",
1350 (dclr & BIT(14)) ? "yes" : "no",
1351 (dclr & BIT(15)) ? "yes" : "no");
1352 }
1353
1354 #define CS_EVEN_PRIMARY BIT(0)
1355 #define CS_ODD_PRIMARY BIT(1)
1356 #define CS_EVEN_SECONDARY BIT(2)
1357 #define CS_ODD_SECONDARY BIT(3)
1358 #define CS_3R_INTERLEAVE BIT(4)
1359
1360 #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
1361 #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
1362
1363 static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
1364 {
1365 u8 base, count = 0;
1366 int cs_mode = 0;
1367
1368 if (csrow_enabled(2 * dimm, ctrl, pvt))
1369 cs_mode |= CS_EVEN_PRIMARY;
1370
1371 if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
1372 cs_mode |= CS_ODD_PRIMARY;
1373
1374
1375 if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
1376 cs_mode |= CS_ODD_SECONDARY;
1377
1378
1379
1380
1381
1382
1383 for_each_chip_select(base, ctrl, pvt)
1384 count += csrow_enabled(base, ctrl, pvt);
1385
1386 if (count == 3 &&
1387 pvt->csels[ctrl].csmasks[0] == pvt->csels[ctrl].csmasks[1]) {
1388 edac_dbg(1, "3R interleaving in use.\n");
1389 cs_mode |= CS_3R_INTERLEAVE;
1390 }
1391
1392 return cs_mode;
1393 }
1394
1395 static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl)
1396 {
1397 int dimm, size0, size1, cs0, cs1, cs_mode;
1398
1399 edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
1400
1401 for (dimm = 0; dimm < 2; dimm++) {
1402 cs0 = dimm * 2;
1403 cs1 = dimm * 2 + 1;
1404
1405 cs_mode = f17_get_cs_mode(dimm, ctrl, pvt);
1406
1407 size0 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs0);
1408 size1 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs1);
1409
1410 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1411 cs0, size0,
1412 cs1, size1);
1413 }
1414 }
1415
1416 static void __dump_misc_regs_df(struct amd64_pvt *pvt)
1417 {
1418 struct amd64_umc *umc;
1419 u32 i, tmp, umc_base;
1420
1421 for_each_umc(i) {
1422 umc_base = get_umc_base(i);
1423 umc = &pvt->umc[i];
1424
1425 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
1426 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
1427 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
1428 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
1429
1430 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
1431 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
1432
1433 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
1434 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
1435 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
1436
1437 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
1438 i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
1439 (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
1440 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
1441 i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
1442 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
1443 i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
1444 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
1445 i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
1446
1447 if (umc->dram_type == MEM_LRDDR4 || umc->dram_type == MEM_LRDDR5) {
1448 amd_smn_read(pvt->mc_node_id,
1449 umc_base + get_umc_reg(UMCCH_ADDR_CFG),
1450 &tmp);
1451 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
1452 i, 1 << ((tmp >> 4) & 0x3));
1453 }
1454
1455 debug_display_dimm_sizes_df(pvt, i);
1456 }
1457
1458 edac_dbg(1, "F0x104 (DRAM Hole Address): 0x%08x, base: 0x%08x\n",
1459 pvt->dhar, dhar_base(pvt));
1460 }
1461
1462
1463 static void __dump_misc_regs(struct amd64_pvt *pvt)
1464 {
1465 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
1466
1467 edac_dbg(1, " NB two channel DRAM capable: %s\n",
1468 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
1469
1470 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
1471 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
1472 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
1473
1474 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
1475
1476 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
1477
1478 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
1479 pvt->dhar, dhar_base(pvt),
1480 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
1481 : f10_dhar_offset(pvt));
1482
1483 debug_display_dimm_sizes(pvt, 0);
1484
1485
1486 if (pvt->fam == 0xf)
1487 return;
1488
1489 debug_display_dimm_sizes(pvt, 1);
1490
1491
1492 if (!dct_ganging_enabled(pvt))
1493 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
1494 }
1495
1496
1497 static void dump_misc_regs(struct amd64_pvt *pvt)
1498 {
1499 if (pvt->umc)
1500 __dump_misc_regs_df(pvt);
1501 else
1502 __dump_misc_regs(pvt);
1503
1504 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
1505
1506 amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
1507 }
1508
1509
1510
1511
1512 static void prep_chip_selects(struct amd64_pvt *pvt)
1513 {
1514 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
1515 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1516 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
1517 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
1518 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
1519 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
1520 } else if (pvt->fam >= 0x17) {
1521 int umc;
1522
1523 for_each_umc(umc) {
1524 pvt->csels[umc].b_cnt = 4;
1525 pvt->csels[umc].m_cnt = fam_type->flags.zn_regs_v2 ? 4 : 2;
1526 }
1527
1528 } else {
1529 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1530 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
1531 }
1532 }
1533
1534 static void read_umc_base_mask(struct amd64_pvt *pvt)
1535 {
1536 u32 umc_base_reg, umc_base_reg_sec;
1537 u32 umc_mask_reg, umc_mask_reg_sec;
1538 u32 base_reg, base_reg_sec;
1539 u32 mask_reg, mask_reg_sec;
1540 u32 *base, *base_sec;
1541 u32 *mask, *mask_sec;
1542 int cs, umc;
1543
1544 for_each_umc(umc) {
1545 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
1546 umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
1547
1548 for_each_chip_select(cs, umc, pvt) {
1549 base = &pvt->csels[umc].csbases[cs];
1550 base_sec = &pvt->csels[umc].csbases_sec[cs];
1551
1552 base_reg = umc_base_reg + (cs * 4);
1553 base_reg_sec = umc_base_reg_sec + (cs * 4);
1554
1555 if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
1556 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
1557 umc, cs, *base, base_reg);
1558
1559 if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
1560 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
1561 umc, cs, *base_sec, base_reg_sec);
1562 }
1563
1564 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
1565 umc_mask_reg_sec = get_umc_base(umc) + get_umc_reg(UMCCH_ADDR_MASK_SEC);
1566
1567 for_each_chip_select_mask(cs, umc, pvt) {
1568 mask = &pvt->csels[umc].csmasks[cs];
1569 mask_sec = &pvt->csels[umc].csmasks_sec[cs];
1570
1571 mask_reg = umc_mask_reg + (cs * 4);
1572 mask_reg_sec = umc_mask_reg_sec + (cs * 4);
1573
1574 if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
1575 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
1576 umc, cs, *mask, mask_reg);
1577
1578 if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
1579 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
1580 umc, cs, *mask_sec, mask_reg_sec);
1581 }
1582 }
1583 }
1584
1585
1586
1587
1588 static void read_dct_base_mask(struct amd64_pvt *pvt)
1589 {
1590 int cs;
1591
1592 prep_chip_selects(pvt);
1593
1594 if (pvt->umc)
1595 return read_umc_base_mask(pvt);
1596
1597 for_each_chip_select(cs, 0, pvt) {
1598 int reg0 = DCSB0 + (cs * 4);
1599 int reg1 = DCSB1 + (cs * 4);
1600 u32 *base0 = &pvt->csels[0].csbases[cs];
1601 u32 *base1 = &pvt->csels[1].csbases[cs];
1602
1603 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1604 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1605 cs, *base0, reg0);
1606
1607 if (pvt->fam == 0xf)
1608 continue;
1609
1610 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1611 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1612 cs, *base1, (pvt->fam == 0x10) ? reg1
1613 : reg0);
1614 }
1615
1616 for_each_chip_select_mask(cs, 0, pvt) {
1617 int reg0 = DCSM0 + (cs * 4);
1618 int reg1 = DCSM1 + (cs * 4);
1619 u32 *mask0 = &pvt->csels[0].csmasks[cs];
1620 u32 *mask1 = &pvt->csels[1].csmasks[cs];
1621
1622 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1623 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1624 cs, *mask0, reg0);
1625
1626 if (pvt->fam == 0xf)
1627 continue;
1628
1629 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1630 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1631 cs, *mask1, (pvt->fam == 0x10) ? reg1
1632 : reg0);
1633 }
1634 }
1635
1636 static void determine_memory_type_df(struct amd64_pvt *pvt)
1637 {
1638 struct amd64_umc *umc;
1639 u32 i;
1640
1641 for_each_umc(i) {
1642 umc = &pvt->umc[i];
1643
1644 if (!(umc->sdp_ctrl & UMC_SDP_INIT)) {
1645 umc->dram_type = MEM_EMPTY;
1646 continue;
1647 }
1648
1649
1650
1651
1652
1653 if (fam_type->flags.zn_regs_v2 && ((umc->umc_cfg & GENMASK(2, 0)) == 0x1)) {
1654 if (umc->dimm_cfg & BIT(5))
1655 umc->dram_type = MEM_LRDDR5;
1656 else if (umc->dimm_cfg & BIT(4))
1657 umc->dram_type = MEM_RDDR5;
1658 else
1659 umc->dram_type = MEM_DDR5;
1660 } else {
1661 if (umc->dimm_cfg & BIT(5))
1662 umc->dram_type = MEM_LRDDR4;
1663 else if (umc->dimm_cfg & BIT(4))
1664 umc->dram_type = MEM_RDDR4;
1665 else
1666 umc->dram_type = MEM_DDR4;
1667 }
1668
1669 edac_dbg(1, " UMC%d DIMM type: %s\n", i, edac_mem_types[umc->dram_type]);
1670 }
1671 }
1672
1673 static void determine_memory_type(struct amd64_pvt *pvt)
1674 {
1675 u32 dram_ctrl, dcsm;
1676
1677 if (pvt->umc)
1678 return determine_memory_type_df(pvt);
1679
1680 switch (pvt->fam) {
1681 case 0xf:
1682 if (pvt->ext_model >= K8_REV_F)
1683 goto ddr3;
1684
1685 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1686 return;
1687
1688 case 0x10:
1689 if (pvt->dchr0 & DDR3_MODE)
1690 goto ddr3;
1691
1692 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1693 return;
1694
1695 case 0x15:
1696 if (pvt->model < 0x60)
1697 goto ddr3;
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1709 dcsm = pvt->csels[0].csmasks[0];
1710
1711 if (((dram_ctrl >> 8) & 0x7) == 0x2)
1712 pvt->dram_type = MEM_DDR4;
1713 else if (pvt->dclr0 & BIT(16))
1714 pvt->dram_type = MEM_DDR3;
1715 else if (dcsm & 0x3)
1716 pvt->dram_type = MEM_LRDDR3;
1717 else
1718 pvt->dram_type = MEM_RDDR3;
1719
1720 return;
1721
1722 case 0x16:
1723 goto ddr3;
1724
1725 default:
1726 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1727 pvt->dram_type = MEM_EMPTY;
1728 }
1729 return;
1730
1731 ddr3:
1732 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1733 }
1734
1735
1736 static int k8_early_channel_count(struct amd64_pvt *pvt)
1737 {
1738 int flag;
1739
1740 if (pvt->ext_model >= K8_REV_F)
1741
1742 flag = pvt->dclr0 & WIDTH_128;
1743 else
1744
1745 flag = pvt->dclr0 & REVE_WIDTH_128;
1746
1747
1748 pvt->dclr1 = 0;
1749
1750 return (flag) ? 2 : 1;
1751 }
1752
1753
1754 static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1755 {
1756 u16 mce_nid = topology_die_id(m->extcpu);
1757 struct mem_ctl_info *mci;
1758 u8 start_bit = 1;
1759 u8 end_bit = 47;
1760 u64 addr;
1761
1762 mci = edac_mc_find(mce_nid);
1763 if (!mci)
1764 return 0;
1765
1766 pvt = mci->pvt_info;
1767
1768 if (pvt->fam == 0xf) {
1769 start_bit = 3;
1770 end_bit = 39;
1771 }
1772
1773 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1774
1775
1776
1777
1778 if (pvt->fam == 0x15) {
1779 u64 cc6_base, tmp_addr;
1780 u32 tmp;
1781 u8 intlv_en;
1782
1783 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1784 return addr;
1785
1786
1787 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1788 intlv_en = tmp >> 21 & 0x7;
1789
1790
1791 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1792
1793
1794 cc6_base |= intlv_en ^ 0x7;
1795
1796
1797 cc6_base <<= 24;
1798
1799 if (!intlv_en)
1800 return cc6_base | (addr & GENMASK_ULL(23, 0));
1801
1802 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1803
1804
1805 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1806
1807
1808 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1809
1810
1811 tmp_addr |= addr & GENMASK_ULL(11, 0);
1812
1813 return cc6_base | tmp_addr;
1814 }
1815
1816 return addr;
1817 }
1818
1819 static struct pci_dev *pci_get_related_function(unsigned int vendor,
1820 unsigned int device,
1821 struct pci_dev *related)
1822 {
1823 struct pci_dev *dev = NULL;
1824
1825 while ((dev = pci_get_device(vendor, device, dev))) {
1826 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1827 (dev->bus->number == related->bus->number) &&
1828 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1829 break;
1830 }
1831
1832 return dev;
1833 }
1834
1835 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1836 {
1837 struct amd_northbridge *nb;
1838 struct pci_dev *f1 = NULL;
1839 unsigned int pci_func;
1840 int off = range << 3;
1841 u32 llim;
1842
1843 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1844 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1845
1846 if (pvt->fam == 0xf)
1847 return;
1848
1849 if (!dram_rw(pvt, range))
1850 return;
1851
1852 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1853 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1854
1855
1856 if (pvt->fam != 0x15)
1857 return;
1858
1859 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1860 if (WARN_ON(!nb))
1861 return;
1862
1863 if (pvt->model == 0x60)
1864 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1865 else if (pvt->model == 0x30)
1866 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1867 else
1868 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1869
1870 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1871 if (WARN_ON(!f1))
1872 return;
1873
1874 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1875
1876 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1877
1878
1879 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1880
1881 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1882
1883
1884 pvt->ranges[range].lim.hi |= llim >> 13;
1885
1886 pci_dev_put(f1);
1887 }
1888
1889 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1890 struct err_info *err)
1891 {
1892 struct amd64_pvt *pvt = mci->pvt_info;
1893
1894 error_address_to_page_and_offset(sys_addr, err);
1895
1896
1897
1898
1899
1900 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1901 if (!err->src_mci) {
1902 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1903 (unsigned long)sys_addr);
1904 err->err_code = ERR_NODE;
1905 return;
1906 }
1907
1908
1909 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1910 if (err->csrow < 0) {
1911 err->err_code = ERR_CSROW;
1912 return;
1913 }
1914
1915
1916 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1917 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1918 if (err->channel < 0) {
1919
1920
1921
1922
1923
1924 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1925 "possible error reporting race\n",
1926 err->syndrome);
1927 err->err_code = ERR_CHANNEL;
1928 return;
1929 }
1930 } else {
1931
1932
1933
1934
1935
1936
1937
1938
1939 err->channel = ((sys_addr & BIT(3)) != 0);
1940 }
1941 }
1942
1943 static int ddr2_cs_size(unsigned i, bool dct_width)
1944 {
1945 unsigned shift = 0;
1946
1947 if (i <= 2)
1948 shift = i;
1949 else if (!(i & 0x1))
1950 shift = i >> 1;
1951 else
1952 shift = (i + 1) >> 1;
1953
1954 return 128 << (shift + !!dct_width);
1955 }
1956
1957 static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1958 unsigned cs_mode, int cs_mask_nr)
1959 {
1960 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1961
1962 if (pvt->ext_model >= K8_REV_F) {
1963 WARN_ON(cs_mode > 11);
1964 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1965 }
1966 else if (pvt->ext_model >= K8_REV_D) {
1967 unsigned diff;
1968 WARN_ON(cs_mode > 10);
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1995
1996 return 32 << (cs_mode - diff);
1997 }
1998 else {
1999 WARN_ON(cs_mode > 6);
2000 return 32 << cs_mode;
2001 }
2002 }
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012 static int f1x_early_channel_count(struct amd64_pvt *pvt)
2013 {
2014 int i, j, channels = 0;
2015
2016
2017 if (pvt->fam == 0x10 && (pvt->dclr0 & WIDTH_128))
2018 return 2;
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
2029
2030
2031
2032
2033
2034
2035 for (i = 0; i < 2; i++) {
2036 u32 dbam = (i ? pvt->dbam1 : pvt->dbam0);
2037
2038 for (j = 0; j < 4; j++) {
2039 if (DBAM_DIMM(j, dbam) > 0) {
2040 channels++;
2041 break;
2042 }
2043 }
2044 }
2045
2046 if (channels > 2)
2047 channels = 2;
2048
2049 amd64_info("MCT channel count: %d\n", channels);
2050
2051 return channels;
2052 }
2053
2054 static int f17_early_channel_count(struct amd64_pvt *pvt)
2055 {
2056 int i, channels = 0;
2057
2058
2059 for_each_umc(i)
2060 channels += !!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT);
2061
2062 amd64_info("MCT channel count: %d\n", channels);
2063
2064 return channels;
2065 }
2066
2067 static int ddr3_cs_size(unsigned i, bool dct_width)
2068 {
2069 unsigned shift = 0;
2070 int cs_size = 0;
2071
2072 if (i == 0 || i == 3 || i == 4)
2073 cs_size = -1;
2074 else if (i <= 2)
2075 shift = i;
2076 else if (i == 12)
2077 shift = 7;
2078 else if (!(i & 0x1))
2079 shift = i >> 1;
2080 else
2081 shift = (i + 1) >> 1;
2082
2083 if (cs_size != -1)
2084 cs_size = (128 * (1 << !!dct_width)) << shift;
2085
2086 return cs_size;
2087 }
2088
2089 static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
2090 {
2091 unsigned shift = 0;
2092 int cs_size = 0;
2093
2094 if (i < 4 || i == 6)
2095 cs_size = -1;
2096 else if (i == 12)
2097 shift = 7;
2098 else if (!(i & 0x1))
2099 shift = i >> 1;
2100 else
2101 shift = (i + 1) >> 1;
2102
2103 if (cs_size != -1)
2104 cs_size = rank_multiply * (128 << shift);
2105
2106 return cs_size;
2107 }
2108
2109 static int ddr4_cs_size(unsigned i)
2110 {
2111 int cs_size = 0;
2112
2113 if (i == 0)
2114 cs_size = -1;
2115 else if (i == 1)
2116 cs_size = 1024;
2117 else
2118
2119 cs_size = 1024 * (1 << (i >> 1));
2120
2121 return cs_size;
2122 }
2123
2124 static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2125 unsigned cs_mode, int cs_mask_nr)
2126 {
2127 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
2128
2129 WARN_ON(cs_mode > 11);
2130
2131 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
2132 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
2133 else
2134 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
2135 }
2136
2137
2138
2139
2140 static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2141 unsigned cs_mode, int cs_mask_nr)
2142 {
2143 WARN_ON(cs_mode > 12);
2144
2145 return ddr3_cs_size(cs_mode, false);
2146 }
2147
2148
2149 static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2150 unsigned cs_mode, int cs_mask_nr)
2151 {
2152 int cs_size;
2153 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
2154
2155 WARN_ON(cs_mode > 12);
2156
2157 if (pvt->dram_type == MEM_DDR4) {
2158 if (cs_mode > 9)
2159 return -1;
2160
2161 cs_size = ddr4_cs_size(cs_mode);
2162 } else if (pvt->dram_type == MEM_LRDDR3) {
2163 unsigned rank_multiply = dcsm & 0xf;
2164
2165 if (rank_multiply == 3)
2166 rank_multiply = 4;
2167 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
2168 } else {
2169
2170 if (cs_mode == 0x1)
2171 return -1;
2172
2173 cs_size = ddr3_cs_size(cs_mode, false);
2174 }
2175
2176 return cs_size;
2177 }
2178
2179
2180
2181
2182 static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2183 unsigned cs_mode, int cs_mask_nr)
2184 {
2185 WARN_ON(cs_mode > 12);
2186
2187 if (cs_mode == 6 || cs_mode == 8 ||
2188 cs_mode == 9 || cs_mode == 12)
2189 return -1;
2190 else
2191 return ddr3_cs_size(cs_mode, false);
2192 }
2193
2194 static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
2195 unsigned int cs_mode, int csrow_nr)
2196 {
2197 u32 addr_mask_orig, addr_mask_deinterleaved;
2198 u32 msb, weight, num_zero_bits;
2199 int cs_mask_nr = csrow_nr;
2200 int dimm, size = 0;
2201
2202
2203 if (!cs_mode)
2204 return size;
2205
2206
2207 if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
2208 return size;
2209
2210
2211 if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
2212 return size;
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232 dimm = csrow_nr >> 1;
2233
2234 if (!fam_type->flags.zn_regs_v2)
2235 cs_mask_nr >>= 1;
2236
2237
2238 if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
2239 addr_mask_orig = pvt->csels[umc].csmasks_sec[cs_mask_nr];
2240 else
2241 addr_mask_orig = pvt->csels[umc].csmasks[cs_mask_nr];
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254 msb = fls(addr_mask_orig) - 1;
2255 weight = hweight_long(addr_mask_orig);
2256 num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE);
2257
2258
2259 addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
2260
2261 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
2262 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig);
2263 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
2264
2265
2266 size = (addr_mask_deinterleaved >> 2) + 1;
2267
2268
2269 return size >> 10;
2270 }
2271
2272 static void read_dram_ctl_register(struct amd64_pvt *pvt)
2273 {
2274
2275 if (pvt->fam == 0xf)
2276 return;
2277
2278 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
2279 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
2280 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
2281
2282 edac_dbg(0, " DCTs operate in %s mode\n",
2283 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
2284
2285 if (!dct_ganging_enabled(pvt))
2286 edac_dbg(0, " Address range split per DCT: %s\n",
2287 (dct_high_range_enabled(pvt) ? "yes" : "no"));
2288
2289 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
2290 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
2291 (dct_memory_cleared(pvt) ? "yes" : "no"));
2292
2293 edac_dbg(0, " channel interleave: %s, "
2294 "interleave bits selector: 0x%x\n",
2295 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
2296 dct_sel_interleave_addr(pvt));
2297 }
2298
2299 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
2300 }
2301
2302
2303
2304
2305
2306 static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2307 u8 intlv_en, int num_dcts_intlv,
2308 u32 dct_sel)
2309 {
2310 u8 channel = 0;
2311 u8 select;
2312
2313 if (!(intlv_en))
2314 return (u8)(dct_sel);
2315
2316 if (num_dcts_intlv == 2) {
2317 select = (sys_addr >> 8) & 0x3;
2318 channel = select ? 0x3 : 0;
2319 } else if (num_dcts_intlv == 4) {
2320 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2321 switch (intlv_addr) {
2322 case 0x4:
2323 channel = (sys_addr >> 8) & 0x3;
2324 break;
2325 case 0x5:
2326 channel = (sys_addr >> 9) & 0x3;
2327 break;
2328 }
2329 }
2330 return channel;
2331 }
2332
2333
2334
2335
2336
2337 static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2338 bool hi_range_sel, u8 intlv_en)
2339 {
2340 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
2341
2342 if (dct_ganging_enabled(pvt))
2343 return 0;
2344
2345 if (hi_range_sel)
2346 return dct_sel_high;
2347
2348
2349
2350
2351 if (dct_interleave_enabled(pvt)) {
2352 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2353
2354
2355 if (!intlv_addr)
2356 return sys_addr >> 6 & 1;
2357
2358 if (intlv_addr & 0x2) {
2359 u8 shift = intlv_addr & 0x1 ? 9 : 6;
2360 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
2361
2362 return ((sys_addr >> shift) & 1) ^ temp;
2363 }
2364
2365 if (intlv_addr & 0x4) {
2366 u8 shift = intlv_addr & 0x1 ? 9 : 8;
2367
2368 return (sys_addr >> shift) & 1;
2369 }
2370
2371 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
2372 }
2373
2374 if (dct_high_range_enabled(pvt))
2375 return ~dct_sel_high & 1;
2376
2377 return 0;
2378 }
2379
2380
2381 static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
2382 u64 sys_addr, bool hi_rng,
2383 u32 dct_sel_base_addr)
2384 {
2385 u64 chan_off;
2386 u64 dram_base = get_dram_base(pvt, range);
2387 u64 hole_off = f10_dhar_offset(pvt);
2388 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
2389
2390 if (hi_rng) {
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402 if ((!(dct_sel_base_addr >> 16) ||
2403 dct_sel_base_addr < dhar_base(pvt)) &&
2404 dhar_valid(pvt) &&
2405 (sys_addr >= BIT_64(32)))
2406 chan_off = hole_off;
2407 else
2408 chan_off = dct_sel_base_off;
2409 } else {
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
2420 chan_off = hole_off;
2421 else
2422 chan_off = dram_base;
2423 }
2424
2425 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
2426 }
2427
2428
2429
2430
2431
2432 static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
2433 {
2434 int tmp_cs;
2435
2436 if (online_spare_swap_done(pvt, dct) &&
2437 csrow == online_spare_bad_dramcs(pvt, dct)) {
2438
2439 for_each_chip_select(tmp_cs, dct, pvt) {
2440 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
2441 csrow = tmp_cs;
2442 break;
2443 }
2444 }
2445 }
2446 return csrow;
2447 }
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457 static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
2458 {
2459 struct mem_ctl_info *mci;
2460 struct amd64_pvt *pvt;
2461 u64 cs_base, cs_mask;
2462 int cs_found = -EINVAL;
2463 int csrow;
2464
2465 mci = edac_mc_find(nid);
2466 if (!mci)
2467 return cs_found;
2468
2469 pvt = mci->pvt_info;
2470
2471 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
2472
2473 for_each_chip_select(csrow, dct, pvt) {
2474 if (!csrow_enabled(csrow, dct, pvt))
2475 continue;
2476
2477 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
2478
2479 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
2480 csrow, cs_base, cs_mask);
2481
2482 cs_mask = ~cs_mask;
2483
2484 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
2485 (in_addr & cs_mask), (cs_base & cs_mask));
2486
2487 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
2488 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
2489 cs_found = csrow;
2490 break;
2491 }
2492 cs_found = f10_process_possible_spare(pvt, dct, csrow);
2493
2494 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
2495 break;
2496 }
2497 }
2498 return cs_found;
2499 }
2500
2501
2502
2503
2504
2505
2506 static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
2507 {
2508 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
2509
2510 if (pvt->fam == 0x10) {
2511
2512 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
2513 return sys_addr;
2514 }
2515
2516 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
2517
2518 if (!(swap_reg & 0x1))
2519 return sys_addr;
2520
2521 swap_base = (swap_reg >> 3) & 0x7f;
2522 swap_limit = (swap_reg >> 11) & 0x7f;
2523 rgn_size = (swap_reg >> 20) & 0x7f;
2524 tmp_addr = sys_addr >> 27;
2525
2526 if (!(sys_addr >> 34) &&
2527 (((tmp_addr >= swap_base) &&
2528 (tmp_addr <= swap_limit)) ||
2529 (tmp_addr < rgn_size)))
2530 return sys_addr ^ (u64)swap_base << 27;
2531
2532 return sys_addr;
2533 }
2534
2535
2536 static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2537 u64 sys_addr, int *chan_sel)
2538 {
2539 int cs_found = -EINVAL;
2540 u64 chan_addr;
2541 u32 dct_sel_base;
2542 u8 channel;
2543 bool high_range = false;
2544
2545 u8 node_id = dram_dst_node(pvt, range);
2546 u8 intlv_en = dram_intlv_en(pvt, range);
2547 u32 intlv_sel = dram_intlv_sel(pvt, range);
2548
2549 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2550 range, sys_addr, get_dram_limit(pvt, range));
2551
2552 if (dhar_valid(pvt) &&
2553 dhar_base(pvt) <= sys_addr &&
2554 sys_addr < BIT_64(32)) {
2555 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2556 sys_addr);
2557 return -EINVAL;
2558 }
2559
2560 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
2561 return -EINVAL;
2562
2563 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
2564
2565 dct_sel_base = dct_sel_baseaddr(pvt);
2566
2567
2568
2569
2570
2571 if (dct_high_range_enabled(pvt) &&
2572 !dct_ganging_enabled(pvt) &&
2573 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
2574 high_range = true;
2575
2576 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
2577
2578 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
2579 high_range, dct_sel_base);
2580
2581
2582 if (intlv_en)
2583 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
2584 (chan_addr & 0xfff);
2585
2586
2587 if (dct_interleave_enabled(pvt) &&
2588 !dct_high_range_enabled(pvt) &&
2589 !dct_ganging_enabled(pvt)) {
2590
2591 if (dct_sel_interleave_addr(pvt) != 1) {
2592 if (dct_sel_interleave_addr(pvt) == 0x3)
2593
2594 chan_addr = ((chan_addr >> 10) << 9) |
2595 (chan_addr & 0x1ff);
2596 else
2597
2598 chan_addr = ((chan_addr >> 7) << 6) |
2599 (chan_addr & 0x3f);
2600 } else
2601
2602 chan_addr = ((chan_addr >> 13) << 12) |
2603 (chan_addr & 0xfff);
2604 }
2605
2606 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2607
2608 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
2609
2610 if (cs_found >= 0)
2611 *chan_sel = channel;
2612
2613 return cs_found;
2614 }
2615
2616 static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2617 u64 sys_addr, int *chan_sel)
2618 {
2619 int cs_found = -EINVAL;
2620 int num_dcts_intlv = 0;
2621 u64 chan_addr, chan_offset;
2622 u64 dct_base, dct_limit;
2623 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
2624 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
2625
2626 u64 dhar_offset = f10_dhar_offset(pvt);
2627 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2628 u8 node_id = dram_dst_node(pvt, range);
2629 u8 intlv_en = dram_intlv_en(pvt, range);
2630
2631 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
2632 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
2633
2634 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
2635 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
2636
2637 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2638 range, sys_addr, get_dram_limit(pvt, range));
2639
2640 if (!(get_dram_base(pvt, range) <= sys_addr) &&
2641 !(get_dram_limit(pvt, range) >= sys_addr))
2642 return -EINVAL;
2643
2644 if (dhar_valid(pvt) &&
2645 dhar_base(pvt) <= sys_addr &&
2646 sys_addr < BIT_64(32)) {
2647 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2648 sys_addr);
2649 return -EINVAL;
2650 }
2651
2652
2653 dct_base = (u64) dct_sel_baseaddr(pvt);
2654 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2655
2656 if (!(dct_cont_base_reg & BIT(0)) &&
2657 !(dct_base <= (sys_addr >> 27) &&
2658 dct_limit >= (sys_addr >> 27)))
2659 return -EINVAL;
2660
2661
2662 num_dcts_intlv = (int) hweight8(intlv_en);
2663
2664 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2665 return -EINVAL;
2666
2667 if (pvt->model >= 0x60)
2668 channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2669 else
2670 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2671 num_dcts_intlv, dct_sel);
2672
2673
2674 if (channel > 3)
2675 return -EINVAL;
2676
2677 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2678
2679
2680 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2681 chan_offset = dhar_offset;
2682 else
2683 chan_offset = dct_base << 27;
2684
2685 chan_addr = sys_addr - chan_offset;
2686
2687
2688 if (num_dcts_intlv == 2) {
2689 if (intlv_addr == 0x4)
2690 chan_addr = ((chan_addr >> 9) << 8) |
2691 (chan_addr & 0xff);
2692 else if (intlv_addr == 0x5)
2693 chan_addr = ((chan_addr >> 10) << 9) |
2694 (chan_addr & 0x1ff);
2695 else
2696 return -EINVAL;
2697
2698 } else if (num_dcts_intlv == 4) {
2699 if (intlv_addr == 0x4)
2700 chan_addr = ((chan_addr >> 10) << 8) |
2701 (chan_addr & 0xff);
2702 else if (intlv_addr == 0x5)
2703 chan_addr = ((chan_addr >> 11) << 9) |
2704 (chan_addr & 0x1ff);
2705 else
2706 return -EINVAL;
2707 }
2708
2709 if (dct_offset_en) {
2710 amd64_read_pci_cfg(pvt->F1,
2711 DRAM_CONT_HIGH_OFF + (int) channel * 4,
2712 &tmp);
2713 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2714 }
2715
2716 f15h_select_dct(pvt, channel);
2717
2718 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728 alias_channel = (channel == 3) ? 1 : channel;
2729
2730 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2731
2732 if (cs_found >= 0)
2733 *chan_sel = alias_channel;
2734
2735 return cs_found;
2736 }
2737
2738 static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2739 u64 sys_addr,
2740 int *chan_sel)
2741 {
2742 int cs_found = -EINVAL;
2743 unsigned range;
2744
2745 for (range = 0; range < DRAM_RANGES; range++) {
2746 if (!dram_rw(pvt, range))
2747 continue;
2748
2749 if (pvt->fam == 0x15 && pvt->model >= 0x30)
2750 cs_found = f15_m30h_match_to_this_node(pvt, range,
2751 sys_addr,
2752 chan_sel);
2753
2754 else if ((get_dram_base(pvt, range) <= sys_addr) &&
2755 (get_dram_limit(pvt, range) >= sys_addr)) {
2756 cs_found = f1x_match_to_this_node(pvt, range,
2757 sys_addr, chan_sel);
2758 if (cs_found >= 0)
2759 break;
2760 }
2761 }
2762 return cs_found;
2763 }
2764
2765
2766
2767
2768
2769
2770
2771
2772 static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2773 struct err_info *err)
2774 {
2775 struct amd64_pvt *pvt = mci->pvt_info;
2776
2777 error_address_to_page_and_offset(sys_addr, err);
2778
2779 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2780 if (err->csrow < 0) {
2781 err->err_code = ERR_CSROW;
2782 return;
2783 }
2784
2785
2786
2787
2788
2789
2790 if (dct_ganging_enabled(pvt))
2791 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2792 }
2793
2794
2795
2796
2797
2798 static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
2799 {
2800 int dimm, size0, size1;
2801 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
2802 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
2803
2804 if (pvt->fam == 0xf) {
2805
2806 if (pvt->ext_model < K8_REV_F)
2807 return;
2808 else
2809 WARN_ON(ctrl != 0);
2810 }
2811
2812 if (pvt->fam == 0x10) {
2813 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
2814 : pvt->dbam0;
2815 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
2816 pvt->csels[1].csbases :
2817 pvt->csels[0].csbases;
2818 } else if (ctrl) {
2819 dbam = pvt->dbam0;
2820 dcsb = pvt->csels[1].csbases;
2821 }
2822 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
2823 ctrl, dbam);
2824
2825 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
2826
2827
2828 for (dimm = 0; dimm < 4; dimm++) {
2829
2830 size0 = 0;
2831 if (dcsb[dimm*2] & DCSB_CS_ENABLE)
2832
2833
2834
2835
2836
2837
2838 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
2839 DBAM_DIMM(dimm, dbam),
2840 dimm);
2841
2842 size1 = 0;
2843 if (dcsb[dimm*2 + 1] & DCSB_CS_ENABLE)
2844 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
2845 DBAM_DIMM(dimm, dbam),
2846 dimm);
2847
2848 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
2849 dimm * 2, size0,
2850 dimm * 2 + 1, size1);
2851 }
2852 }
2853
2854 static struct amd64_family_type family_types[] = {
2855 [K8_CPUS] = {
2856 .ctl_name = "K8",
2857 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
2858 .f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
2859 .max_mcs = 2,
2860 .ops = {
2861 .early_channel_count = k8_early_channel_count,
2862 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
2863 .dbam_to_cs = k8_dbam_to_chip_select,
2864 }
2865 },
2866 [F10_CPUS] = {
2867 .ctl_name = "F10h",
2868 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
2869 .f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
2870 .max_mcs = 2,
2871 .ops = {
2872 .early_channel_count = f1x_early_channel_count,
2873 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2874 .dbam_to_cs = f10_dbam_to_chip_select,
2875 }
2876 },
2877 [F15_CPUS] = {
2878 .ctl_name = "F15h",
2879 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
2880 .f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
2881 .max_mcs = 2,
2882 .ops = {
2883 .early_channel_count = f1x_early_channel_count,
2884 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2885 .dbam_to_cs = f15_dbam_to_chip_select,
2886 }
2887 },
2888 [F15_M30H_CPUS] = {
2889 .ctl_name = "F15h_M30h",
2890 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
2891 .f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
2892 .max_mcs = 2,
2893 .ops = {
2894 .early_channel_count = f1x_early_channel_count,
2895 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2896 .dbam_to_cs = f16_dbam_to_chip_select,
2897 }
2898 },
2899 [F15_M60H_CPUS] = {
2900 .ctl_name = "F15h_M60h",
2901 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
2902 .f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
2903 .max_mcs = 2,
2904 .ops = {
2905 .early_channel_count = f1x_early_channel_count,
2906 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2907 .dbam_to_cs = f15_m60h_dbam_to_chip_select,
2908 }
2909 },
2910 [F16_CPUS] = {
2911 .ctl_name = "F16h",
2912 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
2913 .f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
2914 .max_mcs = 2,
2915 .ops = {
2916 .early_channel_count = f1x_early_channel_count,
2917 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2918 .dbam_to_cs = f16_dbam_to_chip_select,
2919 }
2920 },
2921 [F16_M30H_CPUS] = {
2922 .ctl_name = "F16h_M30h",
2923 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
2924 .f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
2925 .max_mcs = 2,
2926 .ops = {
2927 .early_channel_count = f1x_early_channel_count,
2928 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2929 .dbam_to_cs = f16_dbam_to_chip_select,
2930 }
2931 },
2932 [F17_CPUS] = {
2933 .ctl_name = "F17h",
2934 .f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
2935 .f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
2936 .max_mcs = 2,
2937 .ops = {
2938 .early_channel_count = f17_early_channel_count,
2939 .dbam_to_cs = f17_addr_mask_to_cs_size,
2940 }
2941 },
2942 [F17_M10H_CPUS] = {
2943 .ctl_name = "F17h_M10h",
2944 .f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
2945 .f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
2946 .max_mcs = 2,
2947 .ops = {
2948 .early_channel_count = f17_early_channel_count,
2949 .dbam_to_cs = f17_addr_mask_to_cs_size,
2950 }
2951 },
2952 [F17_M30H_CPUS] = {
2953 .ctl_name = "F17h_M30h",
2954 .f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
2955 .f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
2956 .max_mcs = 8,
2957 .ops = {
2958 .early_channel_count = f17_early_channel_count,
2959 .dbam_to_cs = f17_addr_mask_to_cs_size,
2960 }
2961 },
2962 [F17_M60H_CPUS] = {
2963 .ctl_name = "F17h_M60h",
2964 .f0_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F0,
2965 .f6_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F6,
2966 .max_mcs = 2,
2967 .ops = {
2968 .early_channel_count = f17_early_channel_count,
2969 .dbam_to_cs = f17_addr_mask_to_cs_size,
2970 }
2971 },
2972 [F17_M70H_CPUS] = {
2973 .ctl_name = "F17h_M70h",
2974 .f0_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F0,
2975 .f6_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F6,
2976 .max_mcs = 2,
2977 .ops = {
2978 .early_channel_count = f17_early_channel_count,
2979 .dbam_to_cs = f17_addr_mask_to_cs_size,
2980 }
2981 },
2982 [F19_CPUS] = {
2983 .ctl_name = "F19h",
2984 .f0_id = PCI_DEVICE_ID_AMD_19H_DF_F0,
2985 .f6_id = PCI_DEVICE_ID_AMD_19H_DF_F6,
2986 .max_mcs = 8,
2987 .ops = {
2988 .early_channel_count = f17_early_channel_count,
2989 .dbam_to_cs = f17_addr_mask_to_cs_size,
2990 }
2991 },
2992 [F19_M10H_CPUS] = {
2993 .ctl_name = "F19h_M10h",
2994 .f0_id = PCI_DEVICE_ID_AMD_19H_M10H_DF_F0,
2995 .f6_id = PCI_DEVICE_ID_AMD_19H_M10H_DF_F6,
2996 .max_mcs = 12,
2997 .flags.zn_regs_v2 = 1,
2998 .ops = {
2999 .early_channel_count = f17_early_channel_count,
3000 .dbam_to_cs = f17_addr_mask_to_cs_size,
3001 }
3002 },
3003 [F19_M50H_CPUS] = {
3004 .ctl_name = "F19h_M50h",
3005 .f0_id = PCI_DEVICE_ID_AMD_19H_M50H_DF_F0,
3006 .f6_id = PCI_DEVICE_ID_AMD_19H_M50H_DF_F6,
3007 .max_mcs = 2,
3008 .ops = {
3009 .early_channel_count = f17_early_channel_count,
3010 .dbam_to_cs = f17_addr_mask_to_cs_size,
3011 }
3012 },
3013 };
3014
3015
3016
3017
3018
3019
3020
3021
3022 static const u16 x4_vectors[] = {
3023 0x2f57, 0x1afe, 0x66cc, 0xdd88,
3024 0x11eb, 0x3396, 0x7f4c, 0xeac8,
3025 0x0001, 0x0002, 0x0004, 0x0008,
3026 0x1013, 0x3032, 0x4044, 0x8088,
3027 0x106b, 0x30d6, 0x70fc, 0xe0a8,
3028 0x4857, 0xc4fe, 0x13cc, 0x3288,
3029 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
3030 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
3031 0x15c1, 0x2a42, 0x89ac, 0x4758,
3032 0x2b03, 0x1602, 0x4f0c, 0xca08,
3033 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
3034 0x8ba7, 0x465e, 0x244c, 0x1cc8,
3035 0x2b87, 0x164e, 0x642c, 0xdc18,
3036 0x40b9, 0x80de, 0x1094, 0x20e8,
3037 0x27db, 0x1eb6, 0x9dac, 0x7b58,
3038 0x11c1, 0x2242, 0x84ac, 0x4c58,
3039 0x1be5, 0x2d7a, 0x5e34, 0xa718,
3040 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
3041 0x4c97, 0xc87e, 0x11fc, 0x33a8,
3042 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
3043 0x16b3, 0x3d62, 0x4f34, 0x8518,
3044 0x1e2f, 0x391a, 0x5cac, 0xf858,
3045 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
3046 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
3047 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
3048 0x4397, 0xc27e, 0x17fc, 0x3ea8,
3049 0x1617, 0x3d3e, 0x6464, 0xb8b8,
3050 0x23ff, 0x12aa, 0xab6c, 0x56d8,
3051 0x2dfb, 0x1ba6, 0x913c, 0x7328,
3052 0x185d, 0x2ca6, 0x7914, 0x9e28,
3053 0x171b, 0x3e36, 0x7d7c, 0xebe8,
3054 0x4199, 0x82ee, 0x19f4, 0x2e58,
3055 0x4807, 0xc40e, 0x130c, 0x3208,
3056 0x1905, 0x2e0a, 0x5804, 0xac08,
3057 0x213f, 0x132a, 0xadfc, 0x5ba8,
3058 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
3059 };
3060
3061 static const u16 x8_vectors[] = {
3062 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
3063 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
3064 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
3065 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
3066 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
3067 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
3068 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
3069 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
3070 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
3071 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
3072 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
3073 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
3074 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
3075 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
3076 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
3077 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
3078 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
3079 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3080 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
3081 };
3082
3083 static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
3084 unsigned v_dim)
3085 {
3086 unsigned int i, err_sym;
3087
3088 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
3089 u16 s = syndrome;
3090 unsigned v_idx = err_sym * v_dim;
3091 unsigned v_end = (err_sym + 1) * v_dim;
3092
3093
3094 for (i = 1; i < (1U << 16); i <<= 1) {
3095
3096
3097 if (v_idx < v_end && vectors[v_idx] & i) {
3098 u16 ev_comp = vectors[v_idx++];
3099
3100
3101 if (s & i) {
3102
3103 s ^= ev_comp;
3104
3105 if (!s)
3106 return err_sym;
3107 }
3108
3109 } else if (s & i)
3110
3111 break;
3112 }
3113 }
3114
3115 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
3116 return -1;
3117 }
3118
3119 static int map_err_sym_to_channel(int err_sym, int sym_size)
3120 {
3121 if (sym_size == 4)
3122 switch (err_sym) {
3123 case 0x20:
3124 case 0x21:
3125 return 0;
3126 case 0x22:
3127 case 0x23:
3128 return 1;
3129 default:
3130 return err_sym >> 4;
3131 }
3132
3133 else
3134 switch (err_sym) {
3135
3136 case 0x10:
3137 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
3138 err_sym);
3139 return -1;
3140 case 0x11:
3141 return 0;
3142 case 0x12:
3143 return 1;
3144 default:
3145 return err_sym >> 3;
3146 }
3147 return -1;
3148 }
3149
3150 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
3151 {
3152 struct amd64_pvt *pvt = mci->pvt_info;
3153 int err_sym = -1;
3154
3155 if (pvt->ecc_sym_sz == 8)
3156 err_sym = decode_syndrome(syndrome, x8_vectors,
3157 ARRAY_SIZE(x8_vectors),
3158 pvt->ecc_sym_sz);
3159 else if (pvt->ecc_sym_sz == 4)
3160 err_sym = decode_syndrome(syndrome, x4_vectors,
3161 ARRAY_SIZE(x4_vectors),
3162 pvt->ecc_sym_sz);
3163 else {
3164 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
3165 return err_sym;
3166 }
3167
3168 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
3169 }
3170
3171 static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
3172 u8 ecc_type)
3173 {
3174 enum hw_event_mc_err_type err_type;
3175 const char *string;
3176
3177 if (ecc_type == 2)
3178 err_type = HW_EVENT_ERR_CORRECTED;
3179 else if (ecc_type == 1)
3180 err_type = HW_EVENT_ERR_UNCORRECTED;
3181 else if (ecc_type == 3)
3182 err_type = HW_EVENT_ERR_DEFERRED;
3183 else {
3184 WARN(1, "Something is rotten in the state of Denmark.\n");
3185 return;
3186 }
3187
3188 switch (err->err_code) {
3189 case DECODE_OK:
3190 string = "";
3191 break;
3192 case ERR_NODE:
3193 string = "Failed to map error addr to a node";
3194 break;
3195 case ERR_CSROW:
3196 string = "Failed to map error addr to a csrow";
3197 break;
3198 case ERR_CHANNEL:
3199 string = "Unknown syndrome - possible error reporting race";
3200 break;
3201 case ERR_SYND:
3202 string = "MCA_SYND not valid - unknown syndrome and csrow";
3203 break;
3204 case ERR_NORM_ADDR:
3205 string = "Cannot decode normalized address";
3206 break;
3207 default:
3208 string = "WTF error";
3209 break;
3210 }
3211
3212 edac_mc_handle_error(err_type, mci, 1,
3213 err->page, err->offset, err->syndrome,
3214 err->csrow, err->channel, -1,
3215 string, "");
3216 }
3217
3218 static inline void decode_bus_error(int node_id, struct mce *m)
3219 {
3220 struct mem_ctl_info *mci;
3221 struct amd64_pvt *pvt;
3222 u8 ecc_type = (m->status >> 45) & 0x3;
3223 u8 xec = XEC(m->status, 0x1f);
3224 u16 ec = EC(m->status);
3225 u64 sys_addr;
3226 struct err_info err;
3227
3228 mci = edac_mc_find(node_id);
3229 if (!mci)
3230 return;
3231
3232 pvt = mci->pvt_info;
3233
3234
3235 if (PP(ec) == NBSL_PP_OBS)
3236 return;
3237
3238
3239 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
3240 return;
3241
3242 memset(&err, 0, sizeof(err));
3243
3244 sys_addr = get_error_address(pvt, m);
3245
3246 if (ecc_type == 2)
3247 err.syndrome = extract_syndrome(m->status);
3248
3249 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
3250
3251 __log_ecc_error(mci, &err, ecc_type);
3252 }
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263 static int find_umc_channel(struct mce *m)
3264 {
3265 return (m->ipid & GENMASK(31, 0)) >> 20;
3266 }
3267
3268 static void decode_umc_error(int node_id, struct mce *m)
3269 {
3270 u8 ecc_type = (m->status >> 45) & 0x3;
3271 struct mem_ctl_info *mci;
3272 struct amd64_pvt *pvt;
3273 struct err_info err;
3274 u64 sys_addr;
3275
3276 mci = edac_mc_find(node_id);
3277 if (!mci)
3278 return;
3279
3280 pvt = mci->pvt_info;
3281
3282 memset(&err, 0, sizeof(err));
3283
3284 if (m->status & MCI_STATUS_DEFERRED)
3285 ecc_type = 3;
3286
3287 err.channel = find_umc_channel(m);
3288
3289 if (!(m->status & MCI_STATUS_SYNDV)) {
3290 err.err_code = ERR_SYND;
3291 goto log_error;
3292 }
3293
3294 if (ecc_type == 2) {
3295 u8 length = (m->synd >> 18) & 0x3f;
3296
3297 if (length)
3298 err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
3299 else
3300 err.err_code = ERR_CHANNEL;
3301 }
3302
3303 err.csrow = m->synd & 0x7;
3304
3305 if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
3306 err.err_code = ERR_NORM_ADDR;
3307 goto log_error;
3308 }
3309
3310 error_address_to_page_and_offset(sys_addr, &err);
3311
3312 log_error:
3313 __log_ecc_error(mci, &err, ecc_type);
3314 }
3315
3316
3317
3318
3319
3320
3321 static int
3322 reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
3323 {
3324 if (pvt->umc) {
3325 pvt->F0 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
3326 if (!pvt->F0) {
3327 edac_dbg(1, "F0 not found, device 0x%x\n", pci_id1);
3328 return -ENODEV;
3329 }
3330
3331 pvt->F6 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
3332 if (!pvt->F6) {
3333 pci_dev_put(pvt->F0);
3334 pvt->F0 = NULL;
3335
3336 edac_dbg(1, "F6 not found: device 0x%x\n", pci_id2);
3337 return -ENODEV;
3338 }
3339
3340 if (!pci_ctl_dev)
3341 pci_ctl_dev = &pvt->F0->dev;
3342
3343 edac_dbg(1, "F0: %s\n", pci_name(pvt->F0));
3344 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
3345 edac_dbg(1, "F6: %s\n", pci_name(pvt->F6));
3346
3347 return 0;
3348 }
3349
3350
3351 pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
3352 if (!pvt->F1) {
3353 edac_dbg(1, "F1 not found: device 0x%x\n", pci_id1);
3354 return -ENODEV;
3355 }
3356
3357
3358 pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
3359 if (!pvt->F2) {
3360 pci_dev_put(pvt->F1);
3361 pvt->F1 = NULL;
3362
3363 edac_dbg(1, "F2 not found: device 0x%x\n", pci_id2);
3364 return -ENODEV;
3365 }
3366
3367 if (!pci_ctl_dev)
3368 pci_ctl_dev = &pvt->F2->dev;
3369
3370 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
3371 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
3372 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
3373
3374 return 0;
3375 }
3376
3377 static void free_mc_sibling_devs(struct amd64_pvt *pvt)
3378 {
3379 if (pvt->umc) {
3380 pci_dev_put(pvt->F0);
3381 pci_dev_put(pvt->F6);
3382 } else {
3383 pci_dev_put(pvt->F1);
3384 pci_dev_put(pvt->F2);
3385 }
3386 }
3387
3388 static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
3389 {
3390 pvt->ecc_sym_sz = 4;
3391
3392 if (pvt->umc) {
3393 u8 i;
3394
3395 for_each_umc(i) {
3396
3397 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3398 if (pvt->umc[i].ecc_ctrl & BIT(9)) {
3399 pvt->ecc_sym_sz = 16;
3400 return;
3401 } else if (pvt->umc[i].ecc_ctrl & BIT(7)) {
3402 pvt->ecc_sym_sz = 8;
3403 return;
3404 }
3405 }
3406 }
3407 } else if (pvt->fam >= 0x10) {
3408 u32 tmp;
3409
3410 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
3411
3412 if (pvt->fam != 0x16)
3413 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
3414
3415
3416 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
3417 pvt->ecc_sym_sz = 8;
3418 }
3419 }
3420
3421
3422
3423
3424 static void __read_mc_regs_df(struct amd64_pvt *pvt)
3425 {
3426 u8 nid = pvt->mc_node_id;
3427 struct amd64_umc *umc;
3428 u32 i, umc_base;
3429
3430
3431 for_each_umc(i) {
3432
3433 umc_base = get_umc_base(i);
3434 umc = &pvt->umc[i];
3435
3436 amd_smn_read(nid, umc_base + get_umc_reg(UMCCH_DIMM_CFG), &umc->dimm_cfg);
3437 amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
3438 amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
3439 amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
3440 amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
3441 }
3442 }
3443
3444
3445
3446
3447
3448 static void read_mc_regs(struct amd64_pvt *pvt)
3449 {
3450 unsigned int range;
3451 u64 msr_val;
3452
3453
3454
3455
3456
3457 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
3458 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
3459
3460
3461 rdmsrl(MSR_AMD64_SYSCFG, msr_val);
3462 if (msr_val & BIT(21)) {
3463 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
3464 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
3465 } else {
3466 edac_dbg(0, " TOP_MEM2 disabled\n");
3467 }
3468
3469 if (pvt->umc) {
3470 __read_mc_regs_df(pvt);
3471 amd64_read_pci_cfg(pvt->F0, DF_DHAR, &pvt->dhar);
3472
3473 goto skip;
3474 }
3475
3476 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
3477
3478 read_dram_ctl_register(pvt);
3479
3480 for (range = 0; range < DRAM_RANGES; range++) {
3481 u8 rw;
3482
3483
3484 read_dram_base_limit_regs(pvt, range);
3485
3486 rw = dram_rw(pvt, range);
3487 if (!rw)
3488 continue;
3489
3490 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
3491 range,
3492 get_dram_base(pvt, range),
3493 get_dram_limit(pvt, range));
3494
3495 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
3496 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
3497 (rw & 0x1) ? "R" : "-",
3498 (rw & 0x2) ? "W" : "-",
3499 dram_intlv_sel(pvt, range),
3500 dram_dst_node(pvt, range));
3501 }
3502
3503 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
3504 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
3505
3506 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
3507
3508 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
3509 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
3510
3511 if (!dct_ganging_enabled(pvt)) {
3512 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
3513 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
3514 }
3515
3516 skip:
3517 read_dct_base_mask(pvt);
3518
3519 determine_memory_type(pvt);
3520
3521 if (!pvt->umc)
3522 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
3523
3524 determine_ecc_sym_sz(pvt);
3525 }
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561 static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
3562 {
3563 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
3564 int csrow_nr = csrow_nr_orig;
3565 u32 cs_mode, nr_pages;
3566
3567 if (!pvt->umc) {
3568 csrow_nr >>= 1;
3569 cs_mode = DBAM_DIMM(csrow_nr, dbam);
3570 } else {
3571 cs_mode = f17_get_cs_mode(csrow_nr >> 1, dct, pvt);
3572 }
3573
3574 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
3575 nr_pages <<= 20 - PAGE_SHIFT;
3576
3577 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
3578 csrow_nr_orig, dct, cs_mode);
3579 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3580
3581 return nr_pages;
3582 }
3583
3584 static int init_csrows_df(struct mem_ctl_info *mci)
3585 {
3586 struct amd64_pvt *pvt = mci->pvt_info;
3587 enum edac_type edac_mode = EDAC_NONE;
3588 enum dev_type dev_type = DEV_UNKNOWN;
3589 struct dimm_info *dimm;
3590 int empty = 1;
3591 u8 umc, cs;
3592
3593 if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
3594 edac_mode = EDAC_S16ECD16ED;
3595 dev_type = DEV_X16;
3596 } else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
3597 edac_mode = EDAC_S8ECD8ED;
3598 dev_type = DEV_X8;
3599 } else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
3600 edac_mode = EDAC_S4ECD4ED;
3601 dev_type = DEV_X4;
3602 } else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
3603 edac_mode = EDAC_SECDED;
3604 }
3605
3606 for_each_umc(umc) {
3607 for_each_chip_select(cs, umc, pvt) {
3608 if (!csrow_enabled(cs, umc, pvt))
3609 continue;
3610
3611 empty = 0;
3612 dimm = mci->csrows[cs]->channels[umc]->dimm;
3613
3614 edac_dbg(1, "MC node: %d, csrow: %d\n",
3615 pvt->mc_node_id, cs);
3616
3617 dimm->nr_pages = get_csrow_nr_pages(pvt, umc, cs);
3618 dimm->mtype = pvt->umc[umc].dram_type;
3619 dimm->edac_mode = edac_mode;
3620 dimm->dtype = dev_type;
3621 dimm->grain = 64;
3622 }
3623 }
3624
3625 return empty;
3626 }
3627
3628
3629
3630
3631
3632 static int init_csrows(struct mem_ctl_info *mci)
3633 {
3634 struct amd64_pvt *pvt = mci->pvt_info;
3635 enum edac_type edac_mode = EDAC_NONE;
3636 struct csrow_info *csrow;
3637 struct dimm_info *dimm;
3638 int i, j, empty = 1;
3639 int nr_pages = 0;
3640 u32 val;
3641
3642 if (pvt->umc)
3643 return init_csrows_df(mci);
3644
3645 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
3646
3647 pvt->nbcfg = val;
3648
3649 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
3650 pvt->mc_node_id, val,
3651 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
3652
3653
3654
3655
3656 for_each_chip_select(i, 0, pvt) {
3657 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
3658 bool row_dct1 = false;
3659
3660 if (pvt->fam != 0xf)
3661 row_dct1 = !!csrow_enabled(i, 1, pvt);
3662
3663 if (!row_dct0 && !row_dct1)
3664 continue;
3665
3666 csrow = mci->csrows[i];
3667 empty = 0;
3668
3669 edac_dbg(1, "MC node: %d, csrow: %d\n",
3670 pvt->mc_node_id, i);
3671
3672 if (row_dct0) {
3673 nr_pages = get_csrow_nr_pages(pvt, 0, i);
3674 csrow->channels[0]->dimm->nr_pages = nr_pages;
3675 }
3676
3677
3678 if (pvt->fam != 0xf && row_dct1) {
3679 int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i);
3680
3681 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3682 nr_pages += row_dct1_pages;
3683 }
3684
3685 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3686
3687
3688 if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3689 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3690 ? EDAC_S4ECD4ED
3691 : EDAC_SECDED;
3692 }
3693
3694 for (j = 0; j < pvt->channel_count; j++) {
3695 dimm = csrow->channels[j]->dimm;
3696 dimm->mtype = pvt->dram_type;
3697 dimm->edac_mode = edac_mode;
3698 dimm->grain = 64;
3699 }
3700 }
3701
3702 return empty;
3703 }
3704
3705
3706 static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3707 {
3708 int cpu;
3709
3710 for_each_online_cpu(cpu)
3711 if (topology_die_id(cpu) == nid)
3712 cpumask_set_cpu(cpu, mask);
3713 }
3714
3715
3716 static bool nb_mce_bank_enabled_on_node(u16 nid)
3717 {
3718 cpumask_var_t mask;
3719 int cpu, nbe;
3720 bool ret = false;
3721
3722 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3723 amd64_warn("%s: Error allocating mask\n", __func__);
3724 return false;
3725 }
3726
3727 get_cpus_on_this_dct_cpumask(mask, nid);
3728
3729 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3730
3731 for_each_cpu(cpu, mask) {
3732 struct msr *reg = per_cpu_ptr(msrs, cpu);
3733 nbe = reg->l & MSR_MCGCTL_NBE;
3734
3735 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3736 cpu, reg->q,
3737 (nbe ? "enabled" : "disabled"));
3738
3739 if (!nbe)
3740 goto out;
3741 }
3742 ret = true;
3743
3744 out:
3745 free_cpumask_var(mask);
3746 return ret;
3747 }
3748
3749 static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3750 {
3751 cpumask_var_t cmask;
3752 int cpu;
3753
3754 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3755 amd64_warn("%s: error allocating mask\n", __func__);
3756 return -ENOMEM;
3757 }
3758
3759 get_cpus_on_this_dct_cpumask(cmask, nid);
3760
3761 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3762
3763 for_each_cpu(cpu, cmask) {
3764
3765 struct msr *reg = per_cpu_ptr(msrs, cpu);
3766
3767 if (on) {
3768 if (reg->l & MSR_MCGCTL_NBE)
3769 s->flags.nb_mce_enable = 1;
3770
3771 reg->l |= MSR_MCGCTL_NBE;
3772 } else {
3773
3774
3775
3776 if (!s->flags.nb_mce_enable)
3777 reg->l &= ~MSR_MCGCTL_NBE;
3778 }
3779 }
3780 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3781
3782 free_cpumask_var(cmask);
3783
3784 return 0;
3785 }
3786
3787 static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3788 struct pci_dev *F3)
3789 {
3790 bool ret = true;
3791 u32 value, mask = 0x3;
3792
3793 if (toggle_ecc_err_reporting(s, nid, ON)) {
3794 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3795 return false;
3796 }
3797
3798 amd64_read_pci_cfg(F3, NBCTL, &value);
3799
3800 s->old_nbctl = value & mask;
3801 s->nbctl_valid = true;
3802
3803 value |= mask;
3804 amd64_write_pci_cfg(F3, NBCTL, value);
3805
3806 amd64_read_pci_cfg(F3, NBCFG, &value);
3807
3808 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3809 nid, value, !!(value & NBCFG_ECC_ENABLE));
3810
3811 if (!(value & NBCFG_ECC_ENABLE)) {
3812 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3813
3814 s->flags.nb_ecc_prev = 0;
3815
3816
3817 value |= NBCFG_ECC_ENABLE;
3818 amd64_write_pci_cfg(F3, NBCFG, value);
3819
3820 amd64_read_pci_cfg(F3, NBCFG, &value);
3821
3822 if (!(value & NBCFG_ECC_ENABLE)) {
3823 amd64_warn("Hardware rejected DRAM ECC enable,"
3824 "check memory DIMM configuration.\n");
3825 ret = false;
3826 } else {
3827 amd64_info("Hardware accepted DRAM ECC Enable\n");
3828 }
3829 } else {
3830 s->flags.nb_ecc_prev = 1;
3831 }
3832
3833 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3834 nid, value, !!(value & NBCFG_ECC_ENABLE));
3835
3836 return ret;
3837 }
3838
3839 static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3840 struct pci_dev *F3)
3841 {
3842 u32 value, mask = 0x3;
3843
3844 if (!s->nbctl_valid)
3845 return;
3846
3847 amd64_read_pci_cfg(F3, NBCTL, &value);
3848 value &= ~mask;
3849 value |= s->old_nbctl;
3850
3851 amd64_write_pci_cfg(F3, NBCTL, value);
3852
3853
3854 if (!s->flags.nb_ecc_prev) {
3855 amd64_read_pci_cfg(F3, NBCFG, &value);
3856 value &= ~NBCFG_ECC_ENABLE;
3857 amd64_write_pci_cfg(F3, NBCFG, value);
3858 }
3859
3860
3861 if (toggle_ecc_err_reporting(s, nid, OFF))
3862 amd64_warn("Error restoring NB MCGCTL settings!\n");
3863 }
3864
3865 static bool ecc_enabled(struct amd64_pvt *pvt)
3866 {
3867 u16 nid = pvt->mc_node_id;
3868 bool nb_mce_en = false;
3869 u8 ecc_en = 0, i;
3870 u32 value;
3871
3872 if (boot_cpu_data.x86 >= 0x17) {
3873 u8 umc_en_mask = 0, ecc_en_mask = 0;
3874 struct amd64_umc *umc;
3875
3876 for_each_umc(i) {
3877 umc = &pvt->umc[i];
3878
3879
3880 if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3881 continue;
3882
3883 umc_en_mask |= BIT(i);
3884
3885 if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3886 ecc_en_mask |= BIT(i);
3887 }
3888
3889
3890 if (umc_en_mask)
3891 ecc_en = umc_en_mask == ecc_en_mask;
3892 else
3893 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3894
3895
3896 nb_mce_en = true;
3897 } else {
3898 amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3899
3900 ecc_en = !!(value & NBCFG_ECC_ENABLE);
3901
3902 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3903 if (!nb_mce_en)
3904 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3905 MSR_IA32_MCG_CTL, nid);
3906 }
3907
3908 edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled"));
3909
3910 if (!ecc_en || !nb_mce_en)
3911 return false;
3912 else
3913 return true;
3914 }
3915
3916 static inline void
3917 f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3918 {
3919 u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3920
3921 for_each_umc(i) {
3922 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3923 ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3924 cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3925
3926 dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3927 dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3928 }
3929 }
3930
3931
3932 if (ecc_en) {
3933 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3934
3935 if (!cpk_en)
3936 return;
3937
3938 if (dev_x4)
3939 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3940 else if (dev_x16)
3941 mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3942 else
3943 mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3944 }
3945 }
3946
3947 static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
3948 {
3949 struct amd64_pvt *pvt = mci->pvt_info;
3950
3951 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3952 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3953
3954 if (pvt->umc) {
3955 f17h_determine_edac_ctl_cap(mci, pvt);
3956 } else {
3957 if (pvt->nbcap & NBCAP_SECDED)
3958 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3959
3960 if (pvt->nbcap & NBCAP_CHIPKILL)
3961 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3962 }
3963
3964 mci->edac_cap = determine_edac_cap(pvt);
3965 mci->mod_name = EDAC_MOD_STR;
3966 mci->ctl_name = fam_type->ctl_name;
3967 mci->dev_name = pci_name(pvt->F3);
3968 mci->ctl_page_to_phys = NULL;
3969
3970
3971 mci->set_sdram_scrub_rate = set_scrub_rate;
3972 mci->get_sdram_scrub_rate = get_scrub_rate;
3973 }
3974
3975
3976
3977
3978 static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
3979 {
3980 pvt->ext_model = boot_cpu_data.x86_model >> 4;
3981 pvt->stepping = boot_cpu_data.x86_stepping;
3982 pvt->model = boot_cpu_data.x86_model;
3983 pvt->fam = boot_cpu_data.x86;
3984
3985 switch (pvt->fam) {
3986 case 0xf:
3987 fam_type = &family_types[K8_CPUS];
3988 pvt->ops = &family_types[K8_CPUS].ops;
3989 break;
3990
3991 case 0x10:
3992 fam_type = &family_types[F10_CPUS];
3993 pvt->ops = &family_types[F10_CPUS].ops;
3994 break;
3995
3996 case 0x15:
3997 if (pvt->model == 0x30) {
3998 fam_type = &family_types[F15_M30H_CPUS];
3999 pvt->ops = &family_types[F15_M30H_CPUS].ops;
4000 break;
4001 } else if (pvt->model == 0x60) {
4002 fam_type = &family_types[F15_M60H_CPUS];
4003 pvt->ops = &family_types[F15_M60H_CPUS].ops;
4004 break;
4005
4006 } else if (pvt->model == 0x13) {
4007 return NULL;
4008 } else {
4009 fam_type = &family_types[F15_CPUS];
4010 pvt->ops = &family_types[F15_CPUS].ops;
4011 }
4012 break;
4013
4014 case 0x16:
4015 if (pvt->model == 0x30) {
4016 fam_type = &family_types[F16_M30H_CPUS];
4017 pvt->ops = &family_types[F16_M30H_CPUS].ops;
4018 break;
4019 }
4020 fam_type = &family_types[F16_CPUS];
4021 pvt->ops = &family_types[F16_CPUS].ops;
4022 break;
4023
4024 case 0x17:
4025 if (pvt->model >= 0x10 && pvt->model <= 0x2f) {
4026 fam_type = &family_types[F17_M10H_CPUS];
4027 pvt->ops = &family_types[F17_M10H_CPUS].ops;
4028 break;
4029 } else if (pvt->model >= 0x30 && pvt->model <= 0x3f) {
4030 fam_type = &family_types[F17_M30H_CPUS];
4031 pvt->ops = &family_types[F17_M30H_CPUS].ops;
4032 break;
4033 } else if (pvt->model >= 0x60 && pvt->model <= 0x6f) {
4034 fam_type = &family_types[F17_M60H_CPUS];
4035 pvt->ops = &family_types[F17_M60H_CPUS].ops;
4036 break;
4037 } else if (pvt->model >= 0x70 && pvt->model <= 0x7f) {
4038 fam_type = &family_types[F17_M70H_CPUS];
4039 pvt->ops = &family_types[F17_M70H_CPUS].ops;
4040 break;
4041 }
4042 fallthrough;
4043 case 0x18:
4044 fam_type = &family_types[F17_CPUS];
4045 pvt->ops = &family_types[F17_CPUS].ops;
4046
4047 if (pvt->fam == 0x18)
4048 family_types[F17_CPUS].ctl_name = "F18h";
4049 break;
4050
4051 case 0x19:
4052 if (pvt->model >= 0x10 && pvt->model <= 0x1f) {
4053 fam_type = &family_types[F19_M10H_CPUS];
4054 pvt->ops = &family_types[F19_M10H_CPUS].ops;
4055 break;
4056 } else if (pvt->model >= 0x20 && pvt->model <= 0x2f) {
4057 fam_type = &family_types[F17_M70H_CPUS];
4058 pvt->ops = &family_types[F17_M70H_CPUS].ops;
4059 fam_type->ctl_name = "F19h_M20h";
4060 break;
4061 } else if (pvt->model >= 0x50 && pvt->model <= 0x5f) {
4062 fam_type = &family_types[F19_M50H_CPUS];
4063 pvt->ops = &family_types[F19_M50H_CPUS].ops;
4064 fam_type->ctl_name = "F19h_M50h";
4065 break;
4066 } else if (pvt->model >= 0xa0 && pvt->model <= 0xaf) {
4067 fam_type = &family_types[F19_M10H_CPUS];
4068 pvt->ops = &family_types[F19_M10H_CPUS].ops;
4069 fam_type->ctl_name = "F19h_MA0h";
4070 break;
4071 }
4072 fam_type = &family_types[F19_CPUS];
4073 pvt->ops = &family_types[F19_CPUS].ops;
4074 family_types[F19_CPUS].ctl_name = "F19h";
4075 break;
4076
4077 default:
4078 amd64_err("Unsupported family!\n");
4079 return NULL;
4080 }
4081
4082 return fam_type;
4083 }
4084
4085 static const struct attribute_group *amd64_edac_attr_groups[] = {
4086 #ifdef CONFIG_EDAC_DEBUG
4087 &dbg_group,
4088 &inj_group,
4089 #endif
4090 NULL
4091 };
4092
4093 static int hw_info_get(struct amd64_pvt *pvt)
4094 {
4095 u16 pci_id1, pci_id2;
4096 int ret;
4097
4098 if (pvt->fam >= 0x17) {
4099 pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
4100 if (!pvt->umc)
4101 return -ENOMEM;
4102
4103 pci_id1 = fam_type->f0_id;
4104 pci_id2 = fam_type->f6_id;
4105 } else {
4106 pci_id1 = fam_type->f1_id;
4107 pci_id2 = fam_type->f2_id;
4108 }
4109
4110 ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
4111 if (ret)
4112 return ret;
4113
4114 read_mc_regs(pvt);
4115
4116 return 0;
4117 }
4118
4119 static void hw_info_put(struct amd64_pvt *pvt)
4120 {
4121 if (pvt->F0 || pvt->F1)
4122 free_mc_sibling_devs(pvt);
4123
4124 kfree(pvt->umc);
4125 }
4126
4127 static int init_one_instance(struct amd64_pvt *pvt)
4128 {
4129 struct mem_ctl_info *mci = NULL;
4130 struct edac_mc_layer layers[2];
4131 int ret = -EINVAL;
4132
4133
4134
4135
4136
4137
4138 pvt->channel_count = pvt->ops->early_channel_count(pvt);
4139 if (pvt->channel_count < 0)
4140 return ret;
4141
4142 ret = -ENOMEM;
4143 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
4144 layers[0].size = pvt->csels[0].b_cnt;
4145 layers[0].is_virt_csrow = true;
4146 layers[1].type = EDAC_MC_LAYER_CHANNEL;
4147
4148
4149
4150
4151
4152
4153 layers[1].size = fam_type->max_mcs;
4154 layers[1].is_virt_csrow = false;
4155
4156 mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
4157 if (!mci)
4158 return ret;
4159
4160 mci->pvt_info = pvt;
4161 mci->pdev = &pvt->F3->dev;
4162
4163 setup_mci_misc_attrs(mci);
4164
4165 if (init_csrows(mci))
4166 mci->edac_cap = EDAC_FLAG_NONE;
4167
4168 ret = -ENODEV;
4169 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
4170 edac_dbg(1, "failed edac_mc_add_mc()\n");
4171 edac_mc_free(mci);
4172 return ret;
4173 }
4174
4175 return 0;
4176 }
4177
4178 static bool instance_has_memory(struct amd64_pvt *pvt)
4179 {
4180 bool cs_enabled = false;
4181 int cs = 0, dct = 0;
4182
4183 for (dct = 0; dct < fam_type->max_mcs; dct++) {
4184 for_each_chip_select(cs, dct, pvt)
4185 cs_enabled |= csrow_enabled(cs, dct, pvt);
4186 }
4187
4188 return cs_enabled;
4189 }
4190
4191 static int probe_one_instance(unsigned int nid)
4192 {
4193 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
4194 struct amd64_pvt *pvt = NULL;
4195 struct ecc_settings *s;
4196 int ret;
4197
4198 ret = -ENOMEM;
4199 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
4200 if (!s)
4201 goto err_out;
4202
4203 ecc_stngs[nid] = s;
4204
4205 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
4206 if (!pvt)
4207 goto err_settings;
4208
4209 pvt->mc_node_id = nid;
4210 pvt->F3 = F3;
4211
4212 ret = -ENODEV;
4213 fam_type = per_family_init(pvt);
4214 if (!fam_type)
4215 goto err_enable;
4216
4217 ret = hw_info_get(pvt);
4218 if (ret < 0)
4219 goto err_enable;
4220
4221 ret = 0;
4222 if (!instance_has_memory(pvt)) {
4223 amd64_info("Node %d: No DIMMs detected.\n", nid);
4224 goto err_enable;
4225 }
4226
4227 if (!ecc_enabled(pvt)) {
4228 ret = -ENODEV;
4229
4230 if (!ecc_enable_override)
4231 goto err_enable;
4232
4233 if (boot_cpu_data.x86 >= 0x17) {
4234 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
4235 goto err_enable;
4236 } else
4237 amd64_warn("Forcing ECC on!\n");
4238
4239 if (!enable_ecc_error_reporting(s, nid, F3))
4240 goto err_enable;
4241 }
4242
4243 ret = init_one_instance(pvt);
4244 if (ret < 0) {
4245 amd64_err("Error probing instance: %d\n", nid);
4246
4247 if (boot_cpu_data.x86 < 0x17)
4248 restore_ecc_error_reporting(s, nid, F3);
4249
4250 goto err_enable;
4251 }
4252
4253 amd64_info("%s %sdetected (node %d).\n", fam_type->ctl_name,
4254 (pvt->fam == 0xf ?
4255 (pvt->ext_model >= K8_REV_F ? "revF or later "
4256 : "revE or earlier ")
4257 : ""), pvt->mc_node_id);
4258
4259 dump_misc_regs(pvt);
4260
4261 return ret;
4262
4263 err_enable:
4264 hw_info_put(pvt);
4265 kfree(pvt);
4266
4267 err_settings:
4268 kfree(s);
4269 ecc_stngs[nid] = NULL;
4270
4271 err_out:
4272 return ret;
4273 }
4274
4275 static void remove_one_instance(unsigned int nid)
4276 {
4277 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
4278 struct ecc_settings *s = ecc_stngs[nid];
4279 struct mem_ctl_info *mci;
4280 struct amd64_pvt *pvt;
4281
4282
4283 mci = edac_mc_del_mc(&F3->dev);
4284 if (!mci)
4285 return;
4286
4287 pvt = mci->pvt_info;
4288
4289 restore_ecc_error_reporting(s, nid, F3);
4290
4291 kfree(ecc_stngs[nid]);
4292 ecc_stngs[nid] = NULL;
4293
4294
4295 mci->pvt_info = NULL;
4296
4297 hw_info_put(pvt);
4298 kfree(pvt);
4299 edac_mc_free(mci);
4300 }
4301
4302 static void setup_pci_device(void)
4303 {
4304 if (pci_ctl)
4305 return;
4306
4307 pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
4308 if (!pci_ctl) {
4309 pr_warn("%s(): Unable to create PCI control\n", __func__);
4310 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
4311 }
4312 }
4313
4314 static const struct x86_cpu_id amd64_cpuids[] = {
4315 X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
4316 X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
4317 X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
4318 X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
4319 X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
4320 X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
4321 X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
4322 { }
4323 };
4324 MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
4325
4326 static int __init amd64_edac_init(void)
4327 {
4328 const char *owner;
4329 int err = -ENODEV;
4330 int i;
4331
4332 owner = edac_get_owner();
4333 if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
4334 return -EBUSY;
4335
4336 if (!x86_match_cpu(amd64_cpuids))
4337 return -ENODEV;
4338
4339 if (!amd_nb_num())
4340 return -ENODEV;
4341
4342 opstate_init();
4343
4344 err = -ENOMEM;
4345 ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
4346 if (!ecc_stngs)
4347 goto err_free;
4348
4349 msrs = msrs_alloc();
4350 if (!msrs)
4351 goto err_free;
4352
4353 for (i = 0; i < amd_nb_num(); i++) {
4354 err = probe_one_instance(i);
4355 if (err) {
4356
4357 while (--i >= 0)
4358 remove_one_instance(i);
4359
4360 goto err_pci;
4361 }
4362 }
4363
4364 if (!edac_has_mcs()) {
4365 err = -ENODEV;
4366 goto err_pci;
4367 }
4368
4369
4370 if (boot_cpu_data.x86 >= 0x17)
4371 amd_register_ecc_decoder(decode_umc_error);
4372 else
4373 amd_register_ecc_decoder(decode_bus_error);
4374
4375 setup_pci_device();
4376
4377 #ifdef CONFIG_X86_32
4378 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
4379 #endif
4380
4381 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
4382
4383 return 0;
4384
4385 err_pci:
4386 pci_ctl_dev = NULL;
4387
4388 msrs_free(msrs);
4389 msrs = NULL;
4390
4391 err_free:
4392 kfree(ecc_stngs);
4393 ecc_stngs = NULL;
4394
4395 return err;
4396 }
4397
4398 static void __exit amd64_edac_exit(void)
4399 {
4400 int i;
4401
4402 if (pci_ctl)
4403 edac_pci_release_generic_ctl(pci_ctl);
4404
4405
4406 if (boot_cpu_data.x86 >= 0x17)
4407 amd_unregister_ecc_decoder(decode_umc_error);
4408 else
4409 amd_unregister_ecc_decoder(decode_bus_error);
4410
4411 for (i = 0; i < amd_nb_num(); i++)
4412 remove_one_instance(i);
4413
4414 kfree(ecc_stngs);
4415 ecc_stngs = NULL;
4416
4417 pci_ctl_dev = NULL;
4418
4419 msrs_free(msrs);
4420 msrs = NULL;
4421 }
4422
4423 module_init(amd64_edac_init);
4424 module_exit(amd64_edac_exit);
4425
4426 MODULE_LICENSE("GPL");
4427 MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
4428 "Dave Peterson, Thayne Harbaugh");
4429 MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
4430 EDAC_AMD64_VERSION);
4431
4432 module_param(edac_op_state, int, 0444);
4433 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");