Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/edac/amd64_edac.c
26278 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
#include <linux/ras.h>
3
#include <linux/string_choices.h>
4
#include "amd64_edac.h"
5
#include <asm/amd/nb.h>
6
#include <asm/amd/node.h>
7
8
static struct edac_pci_ctl_info *pci_ctl;
9
10
/*
11
* Set by command line parameter. If BIOS has enabled the ECC, this override is
12
* cleared to prevent re-enabling the hardware by this driver.
13
*/
14
static int ecc_enable_override;
15
module_param(ecc_enable_override, int, 0644);
16
17
static struct msr __percpu *msrs;
18
19
static inline u32 get_umc_reg(struct amd64_pvt *pvt, u32 reg)
20
{
21
if (!pvt->flags.zn_regs_v2)
22
return reg;
23
24
switch (reg) {
25
case UMCCH_ADDR_MASK_SEC: return UMCCH_ADDR_MASK_SEC_DDR5;
26
case UMCCH_DIMM_CFG: return UMCCH_DIMM_CFG_DDR5;
27
}
28
29
WARN_ONCE(1, "%s: unknown register 0x%x", __func__, reg);
30
return 0;
31
}
32
33
/* Per-node stuff */
34
static struct ecc_settings **ecc_stngs;
35
36
/* Device for the PCI component */
37
static struct device *pci_ctl_dev;
38
39
/*
40
* Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
41
* bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
42
* or higher value'.
43
*
44
*FIXME: Produce a better mapping/linearisation.
45
*/
46
static const struct scrubrate {
47
u32 scrubval; /* bit pattern for scrub rate */
48
u32 bandwidth; /* bandwidth consumed (bytes/sec) */
49
} scrubrates[] = {
50
{ 0x01, 1600000000UL},
51
{ 0x02, 800000000UL},
52
{ 0x03, 400000000UL},
53
{ 0x04, 200000000UL},
54
{ 0x05, 100000000UL},
55
{ 0x06, 50000000UL},
56
{ 0x07, 25000000UL},
57
{ 0x08, 12284069UL},
58
{ 0x09, 6274509UL},
59
{ 0x0A, 3121951UL},
60
{ 0x0B, 1560975UL},
61
{ 0x0C, 781440UL},
62
{ 0x0D, 390720UL},
63
{ 0x0E, 195300UL},
64
{ 0x0F, 97650UL},
65
{ 0x10, 48854UL},
66
{ 0x11, 24427UL},
67
{ 0x12, 12213UL},
68
{ 0x13, 6101UL},
69
{ 0x14, 3051UL},
70
{ 0x15, 1523UL},
71
{ 0x16, 761UL},
72
{ 0x00, 0UL}, /* scrubbing off */
73
};
74
75
int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
76
u32 *val, const char *func)
77
{
78
int err = 0;
79
80
err = pci_read_config_dword(pdev, offset, val);
81
if (err)
82
amd64_warn("%s: error reading F%dx%03x.\n",
83
func, PCI_FUNC(pdev->devfn), offset);
84
85
return pcibios_err_to_errno(err);
86
}
87
88
int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
89
u32 val, const char *func)
90
{
91
int err = 0;
92
93
err = pci_write_config_dword(pdev, offset, val);
94
if (err)
95
amd64_warn("%s: error writing to F%dx%03x.\n",
96
func, PCI_FUNC(pdev->devfn), offset);
97
98
return pcibios_err_to_errno(err);
99
}
100
101
/*
102
* Select DCT to which PCI cfg accesses are routed
103
*/
104
static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
105
{
106
u32 reg = 0;
107
108
amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, &reg);
109
reg &= (pvt->model == 0x30) ? ~3 : ~1;
110
reg |= dct;
111
amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
112
}
113
114
/*
115
*
116
* Depending on the family, F2 DCT reads need special handling:
117
*
118
* K8: has a single DCT only and no address offsets >= 0x100
119
*
120
* F10h: each DCT has its own set of regs
121
* DCT0 -> F2x040..
122
* DCT1 -> F2x140..
123
*
124
* F16h: has only 1 DCT
125
*
126
* F15h: we select which DCT we access using F1x10C[DctCfgSel]
127
*/
128
static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
129
int offset, u32 *val)
130
{
131
switch (pvt->fam) {
132
case 0xf:
133
if (dct || offset >= 0x100)
134
return -EINVAL;
135
break;
136
137
case 0x10:
138
if (dct) {
139
/*
140
* Note: If ganging is enabled, barring the regs
141
* F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
142
* return 0. (cf. Section 2.8.1 F10h BKDG)
143
*/
144
if (dct_ganging_enabled(pvt))
145
return 0;
146
147
offset += 0x100;
148
}
149
break;
150
151
case 0x15:
152
/*
153
* F15h: F2x1xx addresses do not map explicitly to DCT1.
154
* We should select which DCT we access using F1x10C[DctCfgSel]
155
*/
156
dct = (dct && pvt->model == 0x30) ? 3 : dct;
157
f15h_select_dct(pvt, dct);
158
break;
159
160
case 0x16:
161
if (dct)
162
return -EINVAL;
163
break;
164
165
default:
166
break;
167
}
168
return amd64_read_pci_cfg(pvt->F2, offset, val);
169
}
170
171
/*
172
* Memory scrubber control interface. For K8, memory scrubbing is handled by
173
* hardware and can involve L2 cache, dcache as well as the main memory. With
174
* F10, this is extended to L3 cache scrubbing on CPU models sporting that
175
* functionality.
176
*
177
* This causes the "units" for the scrubbing speed to vary from 64 byte blocks
178
* (dram) over to cache lines. This is nasty, so we will use bandwidth in
179
* bytes/sec for the setting.
180
*
181
* Currently, we only do dram scrubbing. If the scrubbing is done in software on
182
* other archs, we might not have access to the caches directly.
183
*/
184
185
/*
186
* Scan the scrub rate mapping table for a close or matching bandwidth value to
187
* issue. If requested is too big, then use last maximum value found.
188
*/
189
static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
190
{
191
u32 scrubval;
192
int i;
193
194
/*
195
* map the configured rate (new_bw) to a value specific to the AMD64
196
* memory controller and apply to register. Search for the first
197
* bandwidth entry that is greater or equal than the setting requested
198
* and program that. If at last entry, turn off DRAM scrubbing.
199
*
200
* If no suitable bandwidth is found, turn off DRAM scrubbing entirely
201
* by falling back to the last element in scrubrates[].
202
*/
203
for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
204
/*
205
* skip scrub rates which aren't recommended
206
* (see F10 BKDG, F3x58)
207
*/
208
if (scrubrates[i].scrubval < min_rate)
209
continue;
210
211
if (scrubrates[i].bandwidth <= new_bw)
212
break;
213
}
214
215
scrubval = scrubrates[i].scrubval;
216
217
if (pvt->fam == 0x15 && pvt->model == 0x60) {
218
f15h_select_dct(pvt, 0);
219
pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
220
f15h_select_dct(pvt, 1);
221
pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
222
} else {
223
pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
224
}
225
226
if (scrubval)
227
return scrubrates[i].bandwidth;
228
229
return 0;
230
}
231
232
static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
233
{
234
struct amd64_pvt *pvt = mci->pvt_info;
235
u32 min_scrubrate = 0x5;
236
237
if (pvt->fam == 0xf)
238
min_scrubrate = 0x0;
239
240
if (pvt->fam == 0x15) {
241
/* Erratum #505 */
242
if (pvt->model < 0x10)
243
f15h_select_dct(pvt, 0);
244
245
if (pvt->model == 0x60)
246
min_scrubrate = 0x6;
247
}
248
return __set_scrub_rate(pvt, bw, min_scrubrate);
249
}
250
251
static int get_scrub_rate(struct mem_ctl_info *mci)
252
{
253
struct amd64_pvt *pvt = mci->pvt_info;
254
int i, retval = -EINVAL;
255
u32 scrubval = 0;
256
257
if (pvt->fam == 0x15) {
258
/* Erratum #505 */
259
if (pvt->model < 0x10)
260
f15h_select_dct(pvt, 0);
261
262
if (pvt->model == 0x60)
263
amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
264
else
265
amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
266
} else {
267
amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
268
}
269
270
scrubval = scrubval & 0x001F;
271
272
for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
273
if (scrubrates[i].scrubval == scrubval) {
274
retval = scrubrates[i].bandwidth;
275
break;
276
}
277
}
278
return retval;
279
}
280
281
/*
282
* returns true if the SysAddr given by sys_addr matches the
283
* DRAM base/limit associated with node_id
284
*/
285
static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
286
{
287
u64 addr;
288
289
/* The K8 treats this as a 40-bit value. However, bits 63-40 will be
290
* all ones if the most significant implemented address bit is 1.
291
* Here we discard bits 63-40. See section 3.4.2 of AMD publication
292
* 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
293
* Application Programming.
294
*/
295
addr = sys_addr & 0x000000ffffffffffull;
296
297
return ((addr >= get_dram_base(pvt, nid)) &&
298
(addr <= get_dram_limit(pvt, nid)));
299
}
300
301
/*
302
* Attempt to map a SysAddr to a node. On success, return a pointer to the
303
* mem_ctl_info structure for the node that the SysAddr maps to.
304
*
305
* On failure, return NULL.
306
*/
307
static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
308
u64 sys_addr)
309
{
310
struct amd64_pvt *pvt;
311
u8 node_id;
312
u32 intlv_en, bits;
313
314
/*
315
* Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
316
* 3.4.4.2) registers to map the SysAddr to a node ID.
317
*/
318
pvt = mci->pvt_info;
319
320
/*
321
* The value of this field should be the same for all DRAM Base
322
* registers. Therefore we arbitrarily choose to read it from the
323
* register for node 0.
324
*/
325
intlv_en = dram_intlv_en(pvt, 0);
326
327
if (intlv_en == 0) {
328
for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
329
if (base_limit_match(pvt, sys_addr, node_id))
330
goto found;
331
}
332
goto err_no_match;
333
}
334
335
if (unlikely((intlv_en != 0x01) &&
336
(intlv_en != 0x03) &&
337
(intlv_en != 0x07))) {
338
amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
339
return NULL;
340
}
341
342
bits = (((u32) sys_addr) >> 12) & intlv_en;
343
344
for (node_id = 0; ; ) {
345
if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
346
break; /* intlv_sel field matches */
347
348
if (++node_id >= DRAM_RANGES)
349
goto err_no_match;
350
}
351
352
/* sanity test for sys_addr */
353
if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
354
amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
355
"range for node %d with node interleaving enabled.\n",
356
__func__, sys_addr, node_id);
357
return NULL;
358
}
359
360
found:
361
return edac_mc_find((int)node_id);
362
363
err_no_match:
364
edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
365
(unsigned long)sys_addr);
366
367
return NULL;
368
}
369
370
/*
371
* compute the CS base address of the @csrow on the DRAM controller @dct.
372
* For details see F2x[5C:40] in the processor's BKDG
373
*/
374
static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
375
u64 *base, u64 *mask)
376
{
377
u64 csbase, csmask, base_bits, mask_bits;
378
u8 addr_shift;
379
380
if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
381
csbase = pvt->csels[dct].csbases[csrow];
382
csmask = pvt->csels[dct].csmasks[csrow];
383
base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
384
mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
385
addr_shift = 4;
386
387
/*
388
* F16h and F15h, models 30h and later need two addr_shift values:
389
* 8 for high and 6 for low (cf. F16h BKDG).
390
*/
391
} else if (pvt->fam == 0x16 ||
392
(pvt->fam == 0x15 && pvt->model >= 0x30)) {
393
csbase = pvt->csels[dct].csbases[csrow];
394
csmask = pvt->csels[dct].csmasks[csrow >> 1];
395
396
*base = (csbase & GENMASK_ULL(15, 5)) << 6;
397
*base |= (csbase & GENMASK_ULL(30, 19)) << 8;
398
399
*mask = ~0ULL;
400
/* poke holes for the csmask */
401
*mask &= ~((GENMASK_ULL(15, 5) << 6) |
402
(GENMASK_ULL(30, 19) << 8));
403
404
*mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
405
*mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
406
407
return;
408
} else {
409
csbase = pvt->csels[dct].csbases[csrow];
410
csmask = pvt->csels[dct].csmasks[csrow >> 1];
411
addr_shift = 8;
412
413
if (pvt->fam == 0x15)
414
base_bits = mask_bits =
415
GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
416
else
417
base_bits = mask_bits =
418
GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
419
}
420
421
*base = (csbase & base_bits) << addr_shift;
422
423
*mask = ~0ULL;
424
/* poke holes for the csmask */
425
*mask &= ~(mask_bits << addr_shift);
426
/* OR them in */
427
*mask |= (csmask & mask_bits) << addr_shift;
428
}
429
430
#define for_each_chip_select(i, dct, pvt) \
431
for (i = 0; i < pvt->csels[dct].b_cnt; i++)
432
433
#define chip_select_base(i, dct, pvt) \
434
pvt->csels[dct].csbases[i]
435
436
#define for_each_chip_select_mask(i, dct, pvt) \
437
for (i = 0; i < pvt->csels[dct].m_cnt; i++)
438
439
#define for_each_umc(i) \
440
for (i = 0; i < pvt->max_mcs; i++)
441
442
/*
443
* @input_addr is an InputAddr associated with the node given by mci. Return the
444
* csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
445
*/
446
static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
447
{
448
struct amd64_pvt *pvt;
449
int csrow;
450
u64 base, mask;
451
452
pvt = mci->pvt_info;
453
454
for_each_chip_select(csrow, 0, pvt) {
455
if (!csrow_enabled(csrow, 0, pvt))
456
continue;
457
458
get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
459
460
mask = ~mask;
461
462
if ((input_addr & mask) == (base & mask)) {
463
edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
464
(unsigned long)input_addr, csrow,
465
pvt->mc_node_id);
466
467
return csrow;
468
}
469
}
470
edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
471
(unsigned long)input_addr, pvt->mc_node_id);
472
473
return -1;
474
}
475
476
/*
477
* Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
478
* for the node represented by mci. Info is passed back in *hole_base,
479
* *hole_offset, and *hole_size. Function returns 0 if info is valid or 1 if
480
* info is invalid. Info may be invalid for either of the following reasons:
481
*
482
* - The revision of the node is not E or greater. In this case, the DRAM Hole
483
* Address Register does not exist.
484
*
485
* - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
486
* indicating that its contents are not valid.
487
*
488
* The values passed back in *hole_base, *hole_offset, and *hole_size are
489
* complete 32-bit values despite the fact that the bitfields in the DHAR
490
* only represent bits 31-24 of the base and offset values.
491
*/
492
static int get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
493
u64 *hole_offset, u64 *hole_size)
494
{
495
struct amd64_pvt *pvt = mci->pvt_info;
496
497
/* only revE and later have the DRAM Hole Address Register */
498
if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
499
edac_dbg(1, " revision %d for node %d does not support DHAR\n",
500
pvt->ext_model, pvt->mc_node_id);
501
return 1;
502
}
503
504
/* valid for Fam10h and above */
505
if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
506
edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
507
return 1;
508
}
509
510
if (!dhar_valid(pvt)) {
511
edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
512
pvt->mc_node_id);
513
return 1;
514
}
515
516
/* This node has Memory Hoisting */
517
518
/* +------------------+--------------------+--------------------+-----
519
* | memory | DRAM hole | relocated |
520
* | [0, (x - 1)] | [x, 0xffffffff] | addresses from |
521
* | | | DRAM hole |
522
* | | | [0x100000000, |
523
* | | | (0x100000000+ |
524
* | | | (0xffffffff-x))] |
525
* +------------------+--------------------+--------------------+-----
526
*
527
* Above is a diagram of physical memory showing the DRAM hole and the
528
* relocated addresses from the DRAM hole. As shown, the DRAM hole
529
* starts at address x (the base address) and extends through address
530
* 0xffffffff. The DRAM Hole Address Register (DHAR) relocates the
531
* addresses in the hole so that they start at 0x100000000.
532
*/
533
534
*hole_base = dhar_base(pvt);
535
*hole_size = (1ULL << 32) - *hole_base;
536
537
*hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
538
: k8_dhar_offset(pvt);
539
540
edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
541
pvt->mc_node_id, (unsigned long)*hole_base,
542
(unsigned long)*hole_offset, (unsigned long)*hole_size);
543
544
return 0;
545
}
546
547
#ifdef CONFIG_EDAC_DEBUG
548
#define EDAC_DCT_ATTR_SHOW(reg) \
549
static ssize_t reg##_show(struct device *dev, \
550
struct device_attribute *mattr, char *data) \
551
{ \
552
struct mem_ctl_info *mci = to_mci(dev); \
553
struct amd64_pvt *pvt = mci->pvt_info; \
554
\
555
return sprintf(data, "0x%016llx\n", (u64)pvt->reg); \
556
}
557
558
EDAC_DCT_ATTR_SHOW(dhar);
559
EDAC_DCT_ATTR_SHOW(dbam0);
560
EDAC_DCT_ATTR_SHOW(top_mem);
561
EDAC_DCT_ATTR_SHOW(top_mem2);
562
563
static ssize_t dram_hole_show(struct device *dev, struct device_attribute *mattr,
564
char *data)
565
{
566
struct mem_ctl_info *mci = to_mci(dev);
567
568
u64 hole_base = 0;
569
u64 hole_offset = 0;
570
u64 hole_size = 0;
571
572
get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
573
574
return sprintf(data, "%llx %llx %llx\n", hole_base, hole_offset,
575
hole_size);
576
}
577
578
/*
579
* update NUM_DBG_ATTRS in case you add new members
580
*/
581
static DEVICE_ATTR(dhar, S_IRUGO, dhar_show, NULL);
582
static DEVICE_ATTR(dbam, S_IRUGO, dbam0_show, NULL);
583
static DEVICE_ATTR(topmem, S_IRUGO, top_mem_show, NULL);
584
static DEVICE_ATTR(topmem2, S_IRUGO, top_mem2_show, NULL);
585
static DEVICE_ATTR_RO(dram_hole);
586
587
static struct attribute *dbg_attrs[] = {
588
&dev_attr_dhar.attr,
589
&dev_attr_dbam.attr,
590
&dev_attr_topmem.attr,
591
&dev_attr_topmem2.attr,
592
&dev_attr_dram_hole.attr,
593
NULL
594
};
595
596
static const struct attribute_group dbg_group = {
597
.attrs = dbg_attrs,
598
};
599
600
static ssize_t inject_section_show(struct device *dev,
601
struct device_attribute *mattr, char *buf)
602
{
603
struct mem_ctl_info *mci = to_mci(dev);
604
struct amd64_pvt *pvt = mci->pvt_info;
605
return sprintf(buf, "0x%x\n", pvt->injection.section);
606
}
607
608
/*
609
* store error injection section value which refers to one of 4 16-byte sections
610
* within a 64-byte cacheline
611
*
612
* range: 0..3
613
*/
614
static ssize_t inject_section_store(struct device *dev,
615
struct device_attribute *mattr,
616
const char *data, size_t count)
617
{
618
struct mem_ctl_info *mci = to_mci(dev);
619
struct amd64_pvt *pvt = mci->pvt_info;
620
unsigned long value;
621
int ret;
622
623
ret = kstrtoul(data, 10, &value);
624
if (ret < 0)
625
return ret;
626
627
if (value > 3) {
628
amd64_warn("%s: invalid section 0x%lx\n", __func__, value);
629
return -EINVAL;
630
}
631
632
pvt->injection.section = (u32) value;
633
return count;
634
}
635
636
static ssize_t inject_word_show(struct device *dev,
637
struct device_attribute *mattr, char *buf)
638
{
639
struct mem_ctl_info *mci = to_mci(dev);
640
struct amd64_pvt *pvt = mci->pvt_info;
641
return sprintf(buf, "0x%x\n", pvt->injection.word);
642
}
643
644
/*
645
* store error injection word value which refers to one of 9 16-bit word of the
646
* 16-byte (128-bit + ECC bits) section
647
*
648
* range: 0..8
649
*/
650
static ssize_t inject_word_store(struct device *dev,
651
struct device_attribute *mattr,
652
const char *data, size_t count)
653
{
654
struct mem_ctl_info *mci = to_mci(dev);
655
struct amd64_pvt *pvt = mci->pvt_info;
656
unsigned long value;
657
int ret;
658
659
ret = kstrtoul(data, 10, &value);
660
if (ret < 0)
661
return ret;
662
663
if (value > 8) {
664
amd64_warn("%s: invalid word 0x%lx\n", __func__, value);
665
return -EINVAL;
666
}
667
668
pvt->injection.word = (u32) value;
669
return count;
670
}
671
672
static ssize_t inject_ecc_vector_show(struct device *dev,
673
struct device_attribute *mattr,
674
char *buf)
675
{
676
struct mem_ctl_info *mci = to_mci(dev);
677
struct amd64_pvt *pvt = mci->pvt_info;
678
return sprintf(buf, "0x%x\n", pvt->injection.bit_map);
679
}
680
681
/*
682
* store 16 bit error injection vector which enables injecting errors to the
683
* corresponding bit within the error injection word above. When used during a
684
* DRAM ECC read, it holds the contents of the of the DRAM ECC bits.
685
*/
686
static ssize_t inject_ecc_vector_store(struct device *dev,
687
struct device_attribute *mattr,
688
const char *data, size_t count)
689
{
690
struct mem_ctl_info *mci = to_mci(dev);
691
struct amd64_pvt *pvt = mci->pvt_info;
692
unsigned long value;
693
int ret;
694
695
ret = kstrtoul(data, 16, &value);
696
if (ret < 0)
697
return ret;
698
699
if (value & 0xFFFF0000) {
700
amd64_warn("%s: invalid EccVector: 0x%lx\n", __func__, value);
701
return -EINVAL;
702
}
703
704
pvt->injection.bit_map = (u32) value;
705
return count;
706
}
707
708
/*
709
* Do a DRAM ECC read. Assemble staged values in the pvt area, format into
710
* fields needed by the injection registers and read the NB Array Data Port.
711
*/
712
static ssize_t inject_read_store(struct device *dev,
713
struct device_attribute *mattr,
714
const char *data, size_t count)
715
{
716
struct mem_ctl_info *mci = to_mci(dev);
717
struct amd64_pvt *pvt = mci->pvt_info;
718
unsigned long value;
719
u32 section, word_bits;
720
int ret;
721
722
ret = kstrtoul(data, 10, &value);
723
if (ret < 0)
724
return ret;
725
726
/* Form value to choose 16-byte section of cacheline */
727
section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
728
729
amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
730
731
word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection);
732
733
/* Issue 'word' and 'bit' along with the READ request */
734
amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
735
736
edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
737
738
return count;
739
}
740
741
/*
742
* Do a DRAM ECC write. Assemble staged values in the pvt area and format into
743
* fields needed by the injection registers.
744
*/
745
static ssize_t inject_write_store(struct device *dev,
746
struct device_attribute *mattr,
747
const char *data, size_t count)
748
{
749
struct mem_ctl_info *mci = to_mci(dev);
750
struct amd64_pvt *pvt = mci->pvt_info;
751
u32 section, word_bits, tmp;
752
unsigned long value;
753
int ret;
754
755
ret = kstrtoul(data, 10, &value);
756
if (ret < 0)
757
return ret;
758
759
/* Form value to choose 16-byte section of cacheline */
760
section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
761
762
amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
763
764
word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection);
765
766
pr_notice_once("Don't forget to decrease MCE polling interval in\n"
767
"/sys/bus/machinecheck/devices/machinecheck<CPUNUM>/check_interval\n"
768
"so that you can get the error report faster.\n");
769
770
on_each_cpu(disable_caches, NULL, 1);
771
772
/* Issue 'word' and 'bit' along with the READ request */
773
amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
774
775
retry:
776
/* wait until injection happens */
777
amd64_read_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, &tmp);
778
if (tmp & F10_NB_ARR_ECC_WR_REQ) {
779
cpu_relax();
780
goto retry;
781
}
782
783
on_each_cpu(enable_caches, NULL, 1);
784
785
edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
786
787
return count;
788
}
789
790
/*
791
* update NUM_INJ_ATTRS in case you add new members
792
*/
793
794
static DEVICE_ATTR_RW(inject_section);
795
static DEVICE_ATTR_RW(inject_word);
796
static DEVICE_ATTR_RW(inject_ecc_vector);
797
static DEVICE_ATTR_WO(inject_write);
798
static DEVICE_ATTR_WO(inject_read);
799
800
static struct attribute *inj_attrs[] = {
801
&dev_attr_inject_section.attr,
802
&dev_attr_inject_word.attr,
803
&dev_attr_inject_ecc_vector.attr,
804
&dev_attr_inject_write.attr,
805
&dev_attr_inject_read.attr,
806
NULL
807
};
808
809
static umode_t inj_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
810
{
811
struct device *dev = kobj_to_dev(kobj);
812
struct mem_ctl_info *mci = container_of(dev, struct mem_ctl_info, dev);
813
struct amd64_pvt *pvt = mci->pvt_info;
814
815
/* Families which have that injection hw */
816
if (pvt->fam >= 0x10 && pvt->fam <= 0x16)
817
return attr->mode;
818
819
return 0;
820
}
821
822
static const struct attribute_group inj_group = {
823
.attrs = inj_attrs,
824
.is_visible = inj_is_visible,
825
};
826
#endif /* CONFIG_EDAC_DEBUG */
827
828
/*
829
* Return the DramAddr that the SysAddr given by @sys_addr maps to. It is
830
* assumed that sys_addr maps to the node given by mci.
831
*
832
* The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
833
* 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
834
* SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
835
* then it is also involved in translating a SysAddr to a DramAddr. Sections
836
* 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
837
* These parts of the documentation are unclear. I interpret them as follows:
838
*
839
* When node n receives a SysAddr, it processes the SysAddr as follows:
840
*
841
* 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
842
* Limit registers for node n. If the SysAddr is not within the range
843
* specified by the base and limit values, then node n ignores the Sysaddr
844
* (since it does not map to node n). Otherwise continue to step 2 below.
845
*
846
* 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
847
* disabled so skip to step 3 below. Otherwise see if the SysAddr is within
848
* the range of relocated addresses (starting at 0x100000000) from the DRAM
849
* hole. If not, skip to step 3 below. Else get the value of the
850
* DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
851
* offset defined by this value from the SysAddr.
852
*
853
* 3. Obtain the base address for node n from the DRAMBase field of the DRAM
854
* Base register for node n. To obtain the DramAddr, subtract the base
855
* address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
856
*/
857
static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
858
{
859
struct amd64_pvt *pvt = mci->pvt_info;
860
u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
861
int ret;
862
863
dram_base = get_dram_base(pvt, pvt->mc_node_id);
864
865
ret = get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
866
if (!ret) {
867
if ((sys_addr >= (1ULL << 32)) &&
868
(sys_addr < ((1ULL << 32) + hole_size))) {
869
/* use DHAR to translate SysAddr to DramAddr */
870
dram_addr = sys_addr - hole_offset;
871
872
edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
873
(unsigned long)sys_addr,
874
(unsigned long)dram_addr);
875
876
return dram_addr;
877
}
878
}
879
880
/*
881
* Translate the SysAddr to a DramAddr as shown near the start of
882
* section 3.4.4 (p. 70). Although sys_addr is a 64-bit value, the k8
883
* only deals with 40-bit values. Therefore we discard bits 63-40 of
884
* sys_addr below. If bit 39 of sys_addr is 1 then the bits we
885
* discard are all 1s. Otherwise the bits we discard are all 0s. See
886
* section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
887
* Programmer's Manual Volume 1 Application Programming.
888
*/
889
dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
890
891
edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
892
(unsigned long)sys_addr, (unsigned long)dram_addr);
893
return dram_addr;
894
}
895
896
/*
897
* @intlv_en is the value of the IntlvEn field from a DRAM Base register
898
* (section 3.4.4.1). Return the number of bits from a SysAddr that are used
899
* for node interleaving.
900
*/
901
static int num_node_interleave_bits(unsigned intlv_en)
902
{
903
static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
904
int n;
905
906
BUG_ON(intlv_en > 7);
907
n = intlv_shift_table[intlv_en];
908
return n;
909
}
910
911
/* Translate the DramAddr given by @dram_addr to an InputAddr. */
912
static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
913
{
914
struct amd64_pvt *pvt;
915
int intlv_shift;
916
u64 input_addr;
917
918
pvt = mci->pvt_info;
919
920
/*
921
* See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
922
* concerning translating a DramAddr to an InputAddr.
923
*/
924
intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
925
input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
926
(dram_addr & 0xfff);
927
928
edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
929
intlv_shift, (unsigned long)dram_addr,
930
(unsigned long)input_addr);
931
932
return input_addr;
933
}
934
935
/*
936
* Translate the SysAddr represented by @sys_addr to an InputAddr. It is
937
* assumed that @sys_addr maps to the node given by mci.
938
*/
939
static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
940
{
941
u64 input_addr;
942
943
input_addr =
944
dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
945
946
edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
947
(unsigned long)sys_addr, (unsigned long)input_addr);
948
949
return input_addr;
950
}
951
952
/* Map the Error address to a PAGE and PAGE OFFSET. */
953
static inline void error_address_to_page_and_offset(u64 error_address,
954
struct err_info *err)
955
{
956
err->page = (u32) (error_address >> PAGE_SHIFT);
957
err->offset = ((u32) error_address) & ~PAGE_MASK;
958
}
959
960
/*
961
* @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
962
* Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
963
* of a node that detected an ECC memory error. mci represents the node that
964
* the error address maps to (possibly different from the node that detected
965
* the error). Return the number of the csrow that sys_addr maps to, or -1 on
966
* error.
967
*/
968
static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
969
{
970
int csrow;
971
972
csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
973
974
if (csrow == -1)
975
amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
976
"address 0x%lx\n", (unsigned long)sys_addr);
977
return csrow;
978
}
979
980
/*
981
* See AMD PPR DF::LclNodeTypeMap
982
*
983
* This register gives information for nodes of the same type within a system.
984
*
985
* Reading this register from a GPU node will tell how many GPU nodes are in the
986
* system and what the lowest AMD Node ID value is for the GPU nodes. Use this
987
* info to fixup the Linux logical "Node ID" value set in the AMD NB code and EDAC.
988
*/
989
static struct local_node_map {
990
u16 node_count;
991
u16 base_node_id;
992
} gpu_node_map;
993
994
#define PCI_DEVICE_ID_AMD_MI200_DF_F1 0x14d1
995
#define REG_LOCAL_NODE_TYPE_MAP 0x144
996
997
/* Local Node Type Map (LNTM) fields */
998
#define LNTM_NODE_COUNT GENMASK(27, 16)
999
#define LNTM_BASE_NODE_ID GENMASK(11, 0)
1000
1001
static int gpu_get_node_map(struct amd64_pvt *pvt)
1002
{
1003
struct pci_dev *pdev;
1004
int ret;
1005
u32 tmp;
1006
1007
/*
1008
* Mapping of nodes from hardware-provided AMD Node ID to a
1009
* Linux logical one is applicable for MI200 models. Therefore,
1010
* return early for other heterogeneous systems.
1011
*/
1012
if (pvt->F3->device != PCI_DEVICE_ID_AMD_MI200_DF_F3)
1013
return 0;
1014
1015
/*
1016
* Node ID 0 is reserved for CPUs. Therefore, a non-zero Node ID
1017
* means the values have been already cached.
1018
*/
1019
if (gpu_node_map.base_node_id)
1020
return 0;
1021
1022
pdev = pci_get_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_MI200_DF_F1, NULL);
1023
if (!pdev) {
1024
ret = -ENODEV;
1025
goto out;
1026
}
1027
1028
ret = pci_read_config_dword(pdev, REG_LOCAL_NODE_TYPE_MAP, &tmp);
1029
if (ret) {
1030
ret = pcibios_err_to_errno(ret);
1031
goto out;
1032
}
1033
1034
gpu_node_map.node_count = FIELD_GET(LNTM_NODE_COUNT, tmp);
1035
gpu_node_map.base_node_id = FIELD_GET(LNTM_BASE_NODE_ID, tmp);
1036
1037
out:
1038
pci_dev_put(pdev);
1039
return ret;
1040
}
1041
1042
static int fixup_node_id(int node_id, struct mce *m)
1043
{
1044
/* MCA_IPID[InstanceIdHi] give the AMD Node ID for the bank. */
1045
u8 nid = (m->ipid >> 44) & 0xF;
1046
1047
if (smca_get_bank_type(m->extcpu, m->bank) != SMCA_UMC_V2)
1048
return node_id;
1049
1050
/* Nodes below the GPU base node are CPU nodes and don't need a fixup. */
1051
if (nid < gpu_node_map.base_node_id)
1052
return node_id;
1053
1054
/* Convert the hardware-provided AMD Node ID to a Linux logical one. */
1055
return nid - gpu_node_map.base_node_id + 1;
1056
}
1057
1058
static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
1059
1060
/*
1061
* Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
1062
* are ECC capable.
1063
*/
1064
static unsigned long dct_determine_edac_cap(struct amd64_pvt *pvt)
1065
{
1066
unsigned long edac_cap = EDAC_FLAG_NONE;
1067
u8 bit;
1068
1069
bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
1070
? 19
1071
: 17;
1072
1073
if (pvt->dclr0 & BIT(bit))
1074
edac_cap = EDAC_FLAG_SECDED;
1075
1076
return edac_cap;
1077
}
1078
1079
static unsigned long umc_determine_edac_cap(struct amd64_pvt *pvt)
1080
{
1081
u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
1082
unsigned long edac_cap = EDAC_FLAG_NONE;
1083
1084
for_each_umc(i) {
1085
if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
1086
continue;
1087
1088
umc_en_mask |= BIT(i);
1089
1090
/* UMC Configuration bit 12 (DimmEccEn) */
1091
if (pvt->umc[i].umc_cfg & BIT(12))
1092
dimm_ecc_en_mask |= BIT(i);
1093
}
1094
1095
if (umc_en_mask == dimm_ecc_en_mask)
1096
edac_cap = EDAC_FLAG_SECDED;
1097
1098
return edac_cap;
1099
}
1100
1101
/*
1102
* debug routine to display the memory sizes of all logical DIMMs and its
1103
* CSROWs
1104
*/
1105
static void dct_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1106
{
1107
u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
1108
u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
1109
int dimm, size0, size1;
1110
1111
if (pvt->fam == 0xf) {
1112
/* K8 families < revF not supported yet */
1113
if (pvt->ext_model < K8_REV_F)
1114
return;
1115
1116
WARN_ON(ctrl != 0);
1117
}
1118
1119
if (pvt->fam == 0x10) {
1120
dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
1121
: pvt->dbam0;
1122
dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
1123
pvt->csels[1].csbases :
1124
pvt->csels[0].csbases;
1125
} else if (ctrl) {
1126
dbam = pvt->dbam0;
1127
dcsb = pvt->csels[1].csbases;
1128
}
1129
edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
1130
ctrl, dbam);
1131
1132
edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
1133
1134
/* Dump memory sizes for DIMM and its CSROWs */
1135
for (dimm = 0; dimm < 4; dimm++) {
1136
size0 = 0;
1137
if (dcsb[dimm * 2] & DCSB_CS_ENABLE)
1138
/*
1139
* For F15m60h, we need multiplier for LRDIMM cs_size
1140
* calculation. We pass dimm value to the dbam_to_cs
1141
* mapper so we can find the multiplier from the
1142
* corresponding DCSM.
1143
*/
1144
size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
1145
DBAM_DIMM(dimm, dbam),
1146
dimm);
1147
1148
size1 = 0;
1149
if (dcsb[dimm * 2 + 1] & DCSB_CS_ENABLE)
1150
size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
1151
DBAM_DIMM(dimm, dbam),
1152
dimm);
1153
1154
amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1155
dimm * 2, size0,
1156
dimm * 2 + 1, size1);
1157
}
1158
}
1159
1160
1161
static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
1162
{
1163
edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
1164
1165
if (pvt->dram_type == MEM_LRDDR3) {
1166
u32 dcsm = pvt->csels[chan].csmasks[0];
1167
/*
1168
* It's assumed all LRDIMMs in a DCT are going to be of
1169
* same 'type' until proven otherwise. So, use a cs
1170
* value of '0' here to get dcsm value.
1171
*/
1172
edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
1173
}
1174
1175
edac_dbg(1, "All DIMMs support ECC: %s\n", str_yes_no(dclr & BIT(19)));
1176
1177
1178
edac_dbg(1, " PAR/ERR parity: %s\n",
1179
str_enabled_disabled(dclr & BIT(8)));
1180
1181
if (pvt->fam == 0x10)
1182
edac_dbg(1, " DCT 128bit mode width: %s\n",
1183
(dclr & BIT(11)) ? "128b" : "64b");
1184
1185
edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
1186
str_yes_no(dclr & BIT(12)),
1187
str_yes_no(dclr & BIT(13)),
1188
str_yes_no(dclr & BIT(14)),
1189
str_yes_no(dclr & BIT(15)));
1190
}
1191
1192
#define CS_EVEN_PRIMARY BIT(0)
1193
#define CS_ODD_PRIMARY BIT(1)
1194
#define CS_EVEN_SECONDARY BIT(2)
1195
#define CS_ODD_SECONDARY BIT(3)
1196
#define CS_3R_INTERLEAVE BIT(4)
1197
1198
#define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
1199
#define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
1200
1201
static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
1202
{
1203
u8 base, count = 0;
1204
int cs_mode = 0;
1205
1206
if (csrow_enabled(2 * dimm, ctrl, pvt))
1207
cs_mode |= CS_EVEN_PRIMARY;
1208
1209
if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
1210
cs_mode |= CS_ODD_PRIMARY;
1211
1212
if (csrow_sec_enabled(2 * dimm, ctrl, pvt))
1213
cs_mode |= CS_EVEN_SECONDARY;
1214
1215
if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
1216
cs_mode |= CS_ODD_SECONDARY;
1217
1218
/*
1219
* 3 Rank inteleaving support.
1220
* There should be only three bases enabled and their two masks should
1221
* be equal.
1222
*/
1223
for_each_chip_select(base, ctrl, pvt)
1224
count += csrow_enabled(base, ctrl, pvt);
1225
1226
if (count == 3 &&
1227
pvt->csels[ctrl].csmasks[0] == pvt->csels[ctrl].csmasks[1]) {
1228
edac_dbg(1, "3R interleaving in use.\n");
1229
cs_mode |= CS_3R_INTERLEAVE;
1230
}
1231
1232
return cs_mode;
1233
}
1234
1235
static int calculate_cs_size(u32 mask, unsigned int cs_mode)
1236
{
1237
int msb, weight, num_zero_bits;
1238
u32 deinterleaved_mask;
1239
1240
if (!mask)
1241
return 0;
1242
1243
/*
1244
* The number of zero bits in the mask is equal to the number of bits
1245
* in a full mask minus the number of bits in the current mask.
1246
*
1247
* The MSB is the number of bits in the full mask because BIT[0] is
1248
* always 0.
1249
*
1250
* In the special 3 Rank interleaving case, a single bit is flipped
1251
* without swapping with the most significant bit. This can be handled
1252
* by keeping the MSB where it is and ignoring the single zero bit.
1253
*/
1254
msb = fls(mask) - 1;
1255
weight = hweight_long(mask);
1256
num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE);
1257
1258
/* Take the number of zero bits off from the top of the mask. */
1259
deinterleaved_mask = GENMASK(msb - num_zero_bits, 1);
1260
edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", deinterleaved_mask);
1261
1262
return (deinterleaved_mask >> 2) + 1;
1263
}
1264
1265
static int __addr_mask_to_cs_size(u32 addr_mask, u32 addr_mask_sec,
1266
unsigned int cs_mode, int csrow_nr, int dimm)
1267
{
1268
int size;
1269
1270
edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1271
edac_dbg(1, " Primary AddrMask: 0x%x\n", addr_mask);
1272
1273
/* Register [31:1] = Address [39:9]. Size is in kBs here. */
1274
size = calculate_cs_size(addr_mask, cs_mode);
1275
1276
edac_dbg(1, " Secondary AddrMask: 0x%x\n", addr_mask_sec);
1277
size += calculate_cs_size(addr_mask_sec, cs_mode);
1278
1279
/* Return size in MBs. */
1280
return size >> 10;
1281
}
1282
1283
static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1284
unsigned int cs_mode, int csrow_nr)
1285
{
1286
u32 addr_mask = 0, addr_mask_sec = 0;
1287
int cs_mask_nr = csrow_nr;
1288
int dimm, size = 0;
1289
1290
/* No Chip Selects are enabled. */
1291
if (!cs_mode)
1292
return size;
1293
1294
/* Requested size of an even CS but none are enabled. */
1295
if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1296
return size;
1297
1298
/* Requested size of an odd CS but none are enabled. */
1299
if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1300
return size;
1301
1302
/*
1303
* Family 17h introduced systems with one mask per DIMM,
1304
* and two Chip Selects per DIMM.
1305
*
1306
* CS0 and CS1 -> MASK0 / DIMM0
1307
* CS2 and CS3 -> MASK1 / DIMM1
1308
*
1309
* Family 19h Model 10h introduced systems with one mask per Chip Select,
1310
* and two Chip Selects per DIMM.
1311
*
1312
* CS0 -> MASK0 -> DIMM0
1313
* CS1 -> MASK1 -> DIMM0
1314
* CS2 -> MASK2 -> DIMM1
1315
* CS3 -> MASK3 -> DIMM1
1316
*
1317
* Keep the mask number equal to the Chip Select number for newer systems,
1318
* and shift the mask number for older systems.
1319
*/
1320
dimm = csrow_nr >> 1;
1321
1322
if (!pvt->flags.zn_regs_v2)
1323
cs_mask_nr >>= 1;
1324
1325
if (cs_mode & (CS_EVEN_PRIMARY | CS_ODD_PRIMARY))
1326
addr_mask = pvt->csels[umc].csmasks[cs_mask_nr];
1327
1328
if (cs_mode & (CS_EVEN_SECONDARY | CS_ODD_SECONDARY))
1329
addr_mask_sec = pvt->csels[umc].csmasks_sec[cs_mask_nr];
1330
1331
return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, dimm);
1332
}
1333
1334
static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1335
{
1336
int dimm, size0, size1, cs0, cs1, cs_mode;
1337
1338
edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
1339
1340
for (dimm = 0; dimm < 2; dimm++) {
1341
cs0 = dimm * 2;
1342
cs1 = dimm * 2 + 1;
1343
1344
cs_mode = umc_get_cs_mode(dimm, ctrl, pvt);
1345
1346
size0 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs0);
1347
size1 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs1);
1348
1349
amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1350
cs0, size0,
1351
cs1, size1);
1352
}
1353
}
1354
1355
static void umc_dump_misc_regs(struct amd64_pvt *pvt)
1356
{
1357
struct amd64_umc *umc;
1358
u32 i;
1359
1360
for_each_umc(i) {
1361
umc = &pvt->umc[i];
1362
1363
edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
1364
edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
1365
edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
1366
edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
1367
edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
1368
1369
edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
1370
i, str_yes_no(umc->umc_cap_hi & BIT(30)),
1371
str_yes_no(umc->umc_cap_hi & BIT(31)));
1372
edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
1373
i, str_yes_no(umc->umc_cfg & BIT(12)));
1374
edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
1375
i, str_yes_no(umc->dimm_cfg & BIT(6)));
1376
edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
1377
i, str_yes_no(umc->dimm_cfg & BIT(7)));
1378
1379
umc_debug_display_dimm_sizes(pvt, i);
1380
}
1381
}
1382
1383
static void dct_dump_misc_regs(struct amd64_pvt *pvt)
1384
{
1385
edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
1386
1387
edac_dbg(1, " NB two channel DRAM capable: %s\n",
1388
str_yes_no(pvt->nbcap & NBCAP_DCT_DUAL));
1389
1390
edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
1391
str_yes_no(pvt->nbcap & NBCAP_SECDED),
1392
str_yes_no(pvt->nbcap & NBCAP_CHIPKILL));
1393
1394
debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
1395
1396
edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
1397
1398
edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
1399
pvt->dhar, dhar_base(pvt),
1400
(pvt->fam == 0xf) ? k8_dhar_offset(pvt)
1401
: f10_dhar_offset(pvt));
1402
1403
dct_debug_display_dimm_sizes(pvt, 0);
1404
1405
/* everything below this point is Fam10h and above */
1406
if (pvt->fam == 0xf)
1407
return;
1408
1409
dct_debug_display_dimm_sizes(pvt, 1);
1410
1411
/* Only if NOT ganged does dclr1 have valid info */
1412
if (!dct_ganging_enabled(pvt))
1413
debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
1414
1415
edac_dbg(1, " DramHoleValid: %s\n", str_yes_no(dhar_valid(pvt)));
1416
1417
amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
1418
}
1419
1420
/*
1421
* See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
1422
*/
1423
static void dct_prep_chip_selects(struct amd64_pvt *pvt)
1424
{
1425
if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
1426
pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1427
pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
1428
} else if (pvt->fam == 0x15 && pvt->model == 0x30) {
1429
pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
1430
pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
1431
} else {
1432
pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1433
pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
1434
}
1435
}
1436
1437
static void umc_prep_chip_selects(struct amd64_pvt *pvt)
1438
{
1439
int umc;
1440
1441
for_each_umc(umc) {
1442
pvt->csels[umc].b_cnt = 4;
1443
pvt->csels[umc].m_cnt = pvt->flags.zn_regs_v2 ? 4 : 2;
1444
}
1445
}
1446
1447
static void umc_read_base_mask(struct amd64_pvt *pvt)
1448
{
1449
u32 umc_base_reg, umc_base_reg_sec;
1450
u32 umc_mask_reg, umc_mask_reg_sec;
1451
u32 base_reg, base_reg_sec;
1452
u32 mask_reg, mask_reg_sec;
1453
u32 *base, *base_sec;
1454
u32 *mask, *mask_sec;
1455
int cs, umc;
1456
u32 tmp;
1457
1458
for_each_umc(umc) {
1459
umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
1460
umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
1461
1462
for_each_chip_select(cs, umc, pvt) {
1463
base = &pvt->csels[umc].csbases[cs];
1464
base_sec = &pvt->csels[umc].csbases_sec[cs];
1465
1466
base_reg = umc_base_reg + (cs * 4);
1467
base_reg_sec = umc_base_reg_sec + (cs * 4);
1468
1469
if (!amd_smn_read(pvt->mc_node_id, base_reg, &tmp)) {
1470
*base = tmp;
1471
edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
1472
umc, cs, *base, base_reg);
1473
}
1474
1475
if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, &tmp)) {
1476
*base_sec = tmp;
1477
edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
1478
umc, cs, *base_sec, base_reg_sec);
1479
}
1480
}
1481
1482
umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
1483
umc_mask_reg_sec = get_umc_base(umc) + get_umc_reg(pvt, UMCCH_ADDR_MASK_SEC);
1484
1485
for_each_chip_select_mask(cs, umc, pvt) {
1486
mask = &pvt->csels[umc].csmasks[cs];
1487
mask_sec = &pvt->csels[umc].csmasks_sec[cs];
1488
1489
mask_reg = umc_mask_reg + (cs * 4);
1490
mask_reg_sec = umc_mask_reg_sec + (cs * 4);
1491
1492
if (!amd_smn_read(pvt->mc_node_id, mask_reg, &tmp)) {
1493
*mask = tmp;
1494
edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
1495
umc, cs, *mask, mask_reg);
1496
}
1497
1498
if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, &tmp)) {
1499
*mask_sec = tmp;
1500
edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
1501
umc, cs, *mask_sec, mask_reg_sec);
1502
}
1503
}
1504
}
1505
}
1506
1507
/*
1508
* Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
1509
*/
1510
static void dct_read_base_mask(struct amd64_pvt *pvt)
1511
{
1512
int cs;
1513
1514
for_each_chip_select(cs, 0, pvt) {
1515
int reg0 = DCSB0 + (cs * 4);
1516
int reg1 = DCSB1 + (cs * 4);
1517
u32 *base0 = &pvt->csels[0].csbases[cs];
1518
u32 *base1 = &pvt->csels[1].csbases[cs];
1519
1520
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1521
edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1522
cs, *base0, reg0);
1523
1524
if (pvt->fam == 0xf)
1525
continue;
1526
1527
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1528
edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1529
cs, *base1, (pvt->fam == 0x10) ? reg1
1530
: reg0);
1531
}
1532
1533
for_each_chip_select_mask(cs, 0, pvt) {
1534
int reg0 = DCSM0 + (cs * 4);
1535
int reg1 = DCSM1 + (cs * 4);
1536
u32 *mask0 = &pvt->csels[0].csmasks[cs];
1537
u32 *mask1 = &pvt->csels[1].csmasks[cs];
1538
1539
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1540
edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1541
cs, *mask0, reg0);
1542
1543
if (pvt->fam == 0xf)
1544
continue;
1545
1546
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1547
edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1548
cs, *mask1, (pvt->fam == 0x10) ? reg1
1549
: reg0);
1550
}
1551
}
1552
1553
static void umc_determine_memory_type(struct amd64_pvt *pvt)
1554
{
1555
struct amd64_umc *umc;
1556
u32 i;
1557
1558
for_each_umc(i) {
1559
umc = &pvt->umc[i];
1560
1561
if (!(umc->sdp_ctrl & UMC_SDP_INIT)) {
1562
umc->dram_type = MEM_EMPTY;
1563
continue;
1564
}
1565
1566
/*
1567
* Check if the system supports the "DDR Type" field in UMC Config
1568
* and has DDR5 DIMMs in use.
1569
*/
1570
if (pvt->flags.zn_regs_v2 && ((umc->umc_cfg & GENMASK(2, 0)) == 0x1)) {
1571
if (umc->dimm_cfg & BIT(5))
1572
umc->dram_type = MEM_LRDDR5;
1573
else if (umc->dimm_cfg & BIT(4))
1574
umc->dram_type = MEM_RDDR5;
1575
else
1576
umc->dram_type = MEM_DDR5;
1577
} else {
1578
if (umc->dimm_cfg & BIT(5))
1579
umc->dram_type = MEM_LRDDR4;
1580
else if (umc->dimm_cfg & BIT(4))
1581
umc->dram_type = MEM_RDDR4;
1582
else
1583
umc->dram_type = MEM_DDR4;
1584
}
1585
1586
edac_dbg(1, " UMC%d DIMM type: %s\n", i, edac_mem_types[umc->dram_type]);
1587
}
1588
}
1589
1590
static void dct_determine_memory_type(struct amd64_pvt *pvt)
1591
{
1592
u32 dram_ctrl, dcsm;
1593
1594
switch (pvt->fam) {
1595
case 0xf:
1596
if (pvt->ext_model >= K8_REV_F)
1597
goto ddr3;
1598
1599
pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1600
return;
1601
1602
case 0x10:
1603
if (pvt->dchr0 & DDR3_MODE)
1604
goto ddr3;
1605
1606
pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1607
return;
1608
1609
case 0x15:
1610
if (pvt->model < 0x60)
1611
goto ddr3;
1612
1613
/*
1614
* Model 0x60h needs special handling:
1615
*
1616
* We use a Chip Select value of '0' to obtain dcsm.
1617
* Theoretically, it is possible to populate LRDIMMs of different
1618
* 'Rank' value on a DCT. But this is not the common case. So,
1619
* it's reasonable to assume all DIMMs are going to be of same
1620
* 'type' until proven otherwise.
1621
*/
1622
amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1623
dcsm = pvt->csels[0].csmasks[0];
1624
1625
if (((dram_ctrl >> 8) & 0x7) == 0x2)
1626
pvt->dram_type = MEM_DDR4;
1627
else if (pvt->dclr0 & BIT(16))
1628
pvt->dram_type = MEM_DDR3;
1629
else if (dcsm & 0x3)
1630
pvt->dram_type = MEM_LRDDR3;
1631
else
1632
pvt->dram_type = MEM_RDDR3;
1633
1634
return;
1635
1636
case 0x16:
1637
goto ddr3;
1638
1639
default:
1640
WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1641
pvt->dram_type = MEM_EMPTY;
1642
}
1643
1644
edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
1645
return;
1646
1647
ddr3:
1648
pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1649
}
1650
1651
/* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1652
static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1653
{
1654
u16 mce_nid = topology_amd_node_id(m->extcpu);
1655
struct mem_ctl_info *mci;
1656
u8 start_bit = 1;
1657
u8 end_bit = 47;
1658
u64 addr;
1659
1660
mci = edac_mc_find(mce_nid);
1661
if (!mci)
1662
return 0;
1663
1664
pvt = mci->pvt_info;
1665
1666
if (pvt->fam == 0xf) {
1667
start_bit = 3;
1668
end_bit = 39;
1669
}
1670
1671
addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1672
1673
/*
1674
* Erratum 637 workaround
1675
*/
1676
if (pvt->fam == 0x15) {
1677
u64 cc6_base, tmp_addr;
1678
u32 tmp;
1679
u8 intlv_en;
1680
1681
if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1682
return addr;
1683
1684
1685
amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1686
intlv_en = tmp >> 21 & 0x7;
1687
1688
/* add [47:27] + 3 trailing bits */
1689
cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1690
1691
/* reverse and add DramIntlvEn */
1692
cc6_base |= intlv_en ^ 0x7;
1693
1694
/* pin at [47:24] */
1695
cc6_base <<= 24;
1696
1697
if (!intlv_en)
1698
return cc6_base | (addr & GENMASK_ULL(23, 0));
1699
1700
amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1701
1702
/* faster log2 */
1703
tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1704
1705
/* OR DramIntlvSel into bits [14:12] */
1706
tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1707
1708
/* add remaining [11:0] bits from original MC4_ADDR */
1709
tmp_addr |= addr & GENMASK_ULL(11, 0);
1710
1711
return cc6_base | tmp_addr;
1712
}
1713
1714
return addr;
1715
}
1716
1717
static struct pci_dev *pci_get_related_function(unsigned int vendor,
1718
unsigned int device,
1719
struct pci_dev *related)
1720
{
1721
struct pci_dev *dev = NULL;
1722
1723
while ((dev = pci_get_device(vendor, device, dev))) {
1724
if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1725
(dev->bus->number == related->bus->number) &&
1726
(PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1727
break;
1728
}
1729
1730
return dev;
1731
}
1732
1733
static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1734
{
1735
struct amd_northbridge *nb;
1736
struct pci_dev *f1 = NULL;
1737
unsigned int pci_func;
1738
int off = range << 3;
1739
u32 llim;
1740
1741
amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1742
amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1743
1744
if (pvt->fam == 0xf)
1745
return;
1746
1747
if (!dram_rw(pvt, range))
1748
return;
1749
1750
amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1751
amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1752
1753
/* F15h: factor in CC6 save area by reading dst node's limit reg */
1754
if (pvt->fam != 0x15)
1755
return;
1756
1757
nb = node_to_amd_nb(dram_dst_node(pvt, range));
1758
if (WARN_ON(!nb))
1759
return;
1760
1761
if (pvt->model == 0x60)
1762
pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1763
else if (pvt->model == 0x30)
1764
pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1765
else
1766
pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1767
1768
f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1769
if (WARN_ON(!f1))
1770
return;
1771
1772
amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1773
1774
pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1775
1776
/* {[39:27],111b} */
1777
pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1778
1779
pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1780
1781
/* [47:40] */
1782
pvt->ranges[range].lim.hi |= llim >> 13;
1783
1784
pci_dev_put(f1);
1785
}
1786
1787
static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1788
struct err_info *err)
1789
{
1790
struct amd64_pvt *pvt = mci->pvt_info;
1791
1792
error_address_to_page_and_offset(sys_addr, err);
1793
1794
/*
1795
* Find out which node the error address belongs to. This may be
1796
* different from the node that detected the error.
1797
*/
1798
err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1799
if (!err->src_mci) {
1800
amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1801
(unsigned long)sys_addr);
1802
err->err_code = ERR_NODE;
1803
return;
1804
}
1805
1806
/* Now map the sys_addr to a CSROW */
1807
err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1808
if (err->csrow < 0) {
1809
err->err_code = ERR_CSROW;
1810
return;
1811
}
1812
1813
/* CHIPKILL enabled */
1814
if (pvt->nbcfg & NBCFG_CHIPKILL) {
1815
err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1816
if (err->channel < 0) {
1817
/*
1818
* Syndrome didn't map, so we don't know which of the
1819
* 2 DIMMs is in error. So we need to ID 'both' of them
1820
* as suspect.
1821
*/
1822
amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1823
"possible error reporting race\n",
1824
err->syndrome);
1825
err->err_code = ERR_CHANNEL;
1826
return;
1827
}
1828
} else {
1829
/*
1830
* non-chipkill ecc mode
1831
*
1832
* The k8 documentation is unclear about how to determine the
1833
* channel number when using non-chipkill memory. This method
1834
* was obtained from email communication with someone at AMD.
1835
* (Wish the email was placed in this comment - norsk)
1836
*/
1837
err->channel = ((sys_addr & BIT(3)) != 0);
1838
}
1839
}
1840
1841
static int ddr2_cs_size(unsigned i, bool dct_width)
1842
{
1843
unsigned shift = 0;
1844
1845
if (i <= 2)
1846
shift = i;
1847
else if (!(i & 0x1))
1848
shift = i >> 1;
1849
else
1850
shift = (i + 1) >> 1;
1851
1852
return 128 << (shift + !!dct_width);
1853
}
1854
1855
static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1856
unsigned cs_mode, int cs_mask_nr)
1857
{
1858
u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1859
1860
if (pvt->ext_model >= K8_REV_F) {
1861
WARN_ON(cs_mode > 11);
1862
return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1863
}
1864
else if (pvt->ext_model >= K8_REV_D) {
1865
unsigned diff;
1866
WARN_ON(cs_mode > 10);
1867
1868
/*
1869
* the below calculation, besides trying to win an obfuscated C
1870
* contest, maps cs_mode values to DIMM chip select sizes. The
1871
* mappings are:
1872
*
1873
* cs_mode CS size (mb)
1874
* ======= ============
1875
* 0 32
1876
* 1 64
1877
* 2 128
1878
* 3 128
1879
* 4 256
1880
* 5 512
1881
* 6 256
1882
* 7 512
1883
* 8 1024
1884
* 9 1024
1885
* 10 2048
1886
*
1887
* Basically, it calculates a value with which to shift the
1888
* smallest CS size of 32MB.
1889
*
1890
* ddr[23]_cs_size have a similar purpose.
1891
*/
1892
diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1893
1894
return 32 << (cs_mode - diff);
1895
}
1896
else {
1897
WARN_ON(cs_mode > 6);
1898
return 32 << cs_mode;
1899
}
1900
}
1901
1902
static int ddr3_cs_size(unsigned i, bool dct_width)
1903
{
1904
unsigned shift = 0;
1905
int cs_size = 0;
1906
1907
if (i == 0 || i == 3 || i == 4)
1908
cs_size = -1;
1909
else if (i <= 2)
1910
shift = i;
1911
else if (i == 12)
1912
shift = 7;
1913
else if (!(i & 0x1))
1914
shift = i >> 1;
1915
else
1916
shift = (i + 1) >> 1;
1917
1918
if (cs_size != -1)
1919
cs_size = (128 * (1 << !!dct_width)) << shift;
1920
1921
return cs_size;
1922
}
1923
1924
static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1925
{
1926
unsigned shift = 0;
1927
int cs_size = 0;
1928
1929
if (i < 4 || i == 6)
1930
cs_size = -1;
1931
else if (i == 12)
1932
shift = 7;
1933
else if (!(i & 0x1))
1934
shift = i >> 1;
1935
else
1936
shift = (i + 1) >> 1;
1937
1938
if (cs_size != -1)
1939
cs_size = rank_multiply * (128 << shift);
1940
1941
return cs_size;
1942
}
1943
1944
static int ddr4_cs_size(unsigned i)
1945
{
1946
int cs_size = 0;
1947
1948
if (i == 0)
1949
cs_size = -1;
1950
else if (i == 1)
1951
cs_size = 1024;
1952
else
1953
/* Min cs_size = 1G */
1954
cs_size = 1024 * (1 << (i >> 1));
1955
1956
return cs_size;
1957
}
1958
1959
static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1960
unsigned cs_mode, int cs_mask_nr)
1961
{
1962
u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1963
1964
WARN_ON(cs_mode > 11);
1965
1966
if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1967
return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1968
else
1969
return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1970
}
1971
1972
/*
1973
* F15h supports only 64bit DCT interfaces
1974
*/
1975
static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1976
unsigned cs_mode, int cs_mask_nr)
1977
{
1978
WARN_ON(cs_mode > 12);
1979
1980
return ddr3_cs_size(cs_mode, false);
1981
}
1982
1983
/* F15h M60h supports DDR4 mapping as well.. */
1984
static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1985
unsigned cs_mode, int cs_mask_nr)
1986
{
1987
int cs_size;
1988
u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1989
1990
WARN_ON(cs_mode > 12);
1991
1992
if (pvt->dram_type == MEM_DDR4) {
1993
if (cs_mode > 9)
1994
return -1;
1995
1996
cs_size = ddr4_cs_size(cs_mode);
1997
} else if (pvt->dram_type == MEM_LRDDR3) {
1998
unsigned rank_multiply = dcsm & 0xf;
1999
2000
if (rank_multiply == 3)
2001
rank_multiply = 4;
2002
cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
2003
} else {
2004
/* Minimum cs size is 512mb for F15hM60h*/
2005
if (cs_mode == 0x1)
2006
return -1;
2007
2008
cs_size = ddr3_cs_size(cs_mode, false);
2009
}
2010
2011
return cs_size;
2012
}
2013
2014
/*
2015
* F16h and F15h model 30h have only limited cs_modes.
2016
*/
2017
static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2018
unsigned cs_mode, int cs_mask_nr)
2019
{
2020
WARN_ON(cs_mode > 12);
2021
2022
if (cs_mode == 6 || cs_mode == 8 ||
2023
cs_mode == 9 || cs_mode == 12)
2024
return -1;
2025
else
2026
return ddr3_cs_size(cs_mode, false);
2027
}
2028
2029
static void read_dram_ctl_register(struct amd64_pvt *pvt)
2030
{
2031
2032
if (pvt->fam == 0xf)
2033
return;
2034
2035
if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
2036
edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
2037
pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
2038
2039
edac_dbg(0, " DCTs operate in %s mode\n",
2040
(dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
2041
2042
if (!dct_ganging_enabled(pvt))
2043
edac_dbg(0, " Address range split per DCT: %s\n",
2044
str_yes_no(dct_high_range_enabled(pvt)));
2045
2046
edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
2047
str_enabled_disabled(dct_data_intlv_enabled(pvt)),
2048
str_yes_no(dct_memory_cleared(pvt)));
2049
2050
edac_dbg(0, " channel interleave: %s, "
2051
"interleave bits selector: 0x%x\n",
2052
str_enabled_disabled(dct_interleave_enabled(pvt)),
2053
dct_sel_interleave_addr(pvt));
2054
}
2055
2056
amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
2057
}
2058
2059
/*
2060
* Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
2061
* 2.10.12 Memory Interleaving Modes).
2062
*/
2063
static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2064
u8 intlv_en, int num_dcts_intlv,
2065
u32 dct_sel)
2066
{
2067
u8 channel = 0;
2068
u8 select;
2069
2070
if (!(intlv_en))
2071
return (u8)(dct_sel);
2072
2073
if (num_dcts_intlv == 2) {
2074
select = (sys_addr >> 8) & 0x3;
2075
channel = select ? 0x3 : 0;
2076
} else if (num_dcts_intlv == 4) {
2077
u8 intlv_addr = dct_sel_interleave_addr(pvt);
2078
switch (intlv_addr) {
2079
case 0x4:
2080
channel = (sys_addr >> 8) & 0x3;
2081
break;
2082
case 0x5:
2083
channel = (sys_addr >> 9) & 0x3;
2084
break;
2085
}
2086
}
2087
return channel;
2088
}
2089
2090
/*
2091
* Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
2092
* Interleaving Modes.
2093
*/
2094
static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2095
bool hi_range_sel, u8 intlv_en)
2096
{
2097
u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
2098
2099
if (dct_ganging_enabled(pvt))
2100
return 0;
2101
2102
if (hi_range_sel)
2103
return dct_sel_high;
2104
2105
/*
2106
* see F2x110[DctSelIntLvAddr] - channel interleave mode
2107
*/
2108
if (dct_interleave_enabled(pvt)) {
2109
u8 intlv_addr = dct_sel_interleave_addr(pvt);
2110
2111
/* return DCT select function: 0=DCT0, 1=DCT1 */
2112
if (!intlv_addr)
2113
return sys_addr >> 6 & 1;
2114
2115
if (intlv_addr & 0x2) {
2116
u8 shift = intlv_addr & 0x1 ? 9 : 6;
2117
u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
2118
2119
return ((sys_addr >> shift) & 1) ^ temp;
2120
}
2121
2122
if (intlv_addr & 0x4) {
2123
u8 shift = intlv_addr & 0x1 ? 9 : 8;
2124
2125
return (sys_addr >> shift) & 1;
2126
}
2127
2128
return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
2129
}
2130
2131
if (dct_high_range_enabled(pvt))
2132
return ~dct_sel_high & 1;
2133
2134
return 0;
2135
}
2136
2137
/* Convert the sys_addr to the normalized DCT address */
2138
static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
2139
u64 sys_addr, bool hi_rng,
2140
u32 dct_sel_base_addr)
2141
{
2142
u64 chan_off;
2143
u64 dram_base = get_dram_base(pvt, range);
2144
u64 hole_off = f10_dhar_offset(pvt);
2145
u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
2146
2147
if (hi_rng) {
2148
/*
2149
* if
2150
* base address of high range is below 4Gb
2151
* (bits [47:27] at [31:11])
2152
* DRAM address space on this DCT is hoisted above 4Gb &&
2153
* sys_addr > 4Gb
2154
*
2155
* remove hole offset from sys_addr
2156
* else
2157
* remove high range offset from sys_addr
2158
*/
2159
if ((!(dct_sel_base_addr >> 16) ||
2160
dct_sel_base_addr < dhar_base(pvt)) &&
2161
dhar_valid(pvt) &&
2162
(sys_addr >= BIT_64(32)))
2163
chan_off = hole_off;
2164
else
2165
chan_off = dct_sel_base_off;
2166
} else {
2167
/*
2168
* if
2169
* we have a valid hole &&
2170
* sys_addr > 4Gb
2171
*
2172
* remove hole
2173
* else
2174
* remove dram base to normalize to DCT address
2175
*/
2176
if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
2177
chan_off = hole_off;
2178
else
2179
chan_off = dram_base;
2180
}
2181
2182
return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
2183
}
2184
2185
/*
2186
* checks if the csrow passed in is marked as SPARED, if so returns the new
2187
* spare row
2188
*/
2189
static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
2190
{
2191
int tmp_cs;
2192
2193
if (online_spare_swap_done(pvt, dct) &&
2194
csrow == online_spare_bad_dramcs(pvt, dct)) {
2195
2196
for_each_chip_select(tmp_cs, dct, pvt) {
2197
if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
2198
csrow = tmp_cs;
2199
break;
2200
}
2201
}
2202
}
2203
return csrow;
2204
}
2205
2206
/*
2207
* Iterate over the DRAM DCT "base" and "mask" registers looking for a
2208
* SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
2209
*
2210
* Return:
2211
* -EINVAL: NOT FOUND
2212
* 0..csrow = Chip-Select Row
2213
*/
2214
static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
2215
{
2216
struct mem_ctl_info *mci;
2217
struct amd64_pvt *pvt;
2218
u64 cs_base, cs_mask;
2219
int cs_found = -EINVAL;
2220
int csrow;
2221
2222
mci = edac_mc_find(nid);
2223
if (!mci)
2224
return cs_found;
2225
2226
pvt = mci->pvt_info;
2227
2228
edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
2229
2230
for_each_chip_select(csrow, dct, pvt) {
2231
if (!csrow_enabled(csrow, dct, pvt))
2232
continue;
2233
2234
get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
2235
2236
edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
2237
csrow, cs_base, cs_mask);
2238
2239
cs_mask = ~cs_mask;
2240
2241
edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
2242
(in_addr & cs_mask), (cs_base & cs_mask));
2243
2244
if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
2245
if (pvt->fam == 0x15 && pvt->model >= 0x30) {
2246
cs_found = csrow;
2247
break;
2248
}
2249
cs_found = f10_process_possible_spare(pvt, dct, csrow);
2250
2251
edac_dbg(1, " MATCH csrow=%d\n", cs_found);
2252
break;
2253
}
2254
}
2255
return cs_found;
2256
}
2257
2258
/*
2259
* See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
2260
* swapped with a region located at the bottom of memory so that the GPU can use
2261
* the interleaved region and thus two channels.
2262
*/
2263
static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
2264
{
2265
u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
2266
2267
if (pvt->fam == 0x10) {
2268
/* only revC3 and revE have that feature */
2269
if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
2270
return sys_addr;
2271
}
2272
2273
amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
2274
2275
if (!(swap_reg & 0x1))
2276
return sys_addr;
2277
2278
swap_base = (swap_reg >> 3) & 0x7f;
2279
swap_limit = (swap_reg >> 11) & 0x7f;
2280
rgn_size = (swap_reg >> 20) & 0x7f;
2281
tmp_addr = sys_addr >> 27;
2282
2283
if (!(sys_addr >> 34) &&
2284
(((tmp_addr >= swap_base) &&
2285
(tmp_addr <= swap_limit)) ||
2286
(tmp_addr < rgn_size)))
2287
return sys_addr ^ (u64)swap_base << 27;
2288
2289
return sys_addr;
2290
}
2291
2292
/* For a given @dram_range, check if @sys_addr falls within it. */
2293
static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2294
u64 sys_addr, int *chan_sel)
2295
{
2296
int cs_found = -EINVAL;
2297
u64 chan_addr;
2298
u32 dct_sel_base;
2299
u8 channel;
2300
bool high_range = false;
2301
2302
u8 node_id = dram_dst_node(pvt, range);
2303
u8 intlv_en = dram_intlv_en(pvt, range);
2304
u32 intlv_sel = dram_intlv_sel(pvt, range);
2305
2306
edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2307
range, sys_addr, get_dram_limit(pvt, range));
2308
2309
if (dhar_valid(pvt) &&
2310
dhar_base(pvt) <= sys_addr &&
2311
sys_addr < BIT_64(32)) {
2312
amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2313
sys_addr);
2314
return -EINVAL;
2315
}
2316
2317
if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
2318
return -EINVAL;
2319
2320
sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
2321
2322
dct_sel_base = dct_sel_baseaddr(pvt);
2323
2324
/*
2325
* check whether addresses >= DctSelBaseAddr[47:27] are to be used to
2326
* select between DCT0 and DCT1.
2327
*/
2328
if (dct_high_range_enabled(pvt) &&
2329
!dct_ganging_enabled(pvt) &&
2330
((sys_addr >> 27) >= (dct_sel_base >> 11)))
2331
high_range = true;
2332
2333
channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
2334
2335
chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
2336
high_range, dct_sel_base);
2337
2338
/* Remove node interleaving, see F1x120 */
2339
if (intlv_en)
2340
chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
2341
(chan_addr & 0xfff);
2342
2343
/* remove channel interleave */
2344
if (dct_interleave_enabled(pvt) &&
2345
!dct_high_range_enabled(pvt) &&
2346
!dct_ganging_enabled(pvt)) {
2347
2348
if (dct_sel_interleave_addr(pvt) != 1) {
2349
if (dct_sel_interleave_addr(pvt) == 0x3)
2350
/* hash 9 */
2351
chan_addr = ((chan_addr >> 10) << 9) |
2352
(chan_addr & 0x1ff);
2353
else
2354
/* A[6] or hash 6 */
2355
chan_addr = ((chan_addr >> 7) << 6) |
2356
(chan_addr & 0x3f);
2357
} else
2358
/* A[12] */
2359
chan_addr = ((chan_addr >> 13) << 12) |
2360
(chan_addr & 0xfff);
2361
}
2362
2363
edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2364
2365
cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
2366
2367
if (cs_found >= 0)
2368
*chan_sel = channel;
2369
2370
return cs_found;
2371
}
2372
2373
static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2374
u64 sys_addr, int *chan_sel)
2375
{
2376
int cs_found = -EINVAL;
2377
int num_dcts_intlv = 0;
2378
u64 chan_addr, chan_offset;
2379
u64 dct_base, dct_limit;
2380
u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
2381
u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
2382
2383
u64 dhar_offset = f10_dhar_offset(pvt);
2384
u8 intlv_addr = dct_sel_interleave_addr(pvt);
2385
u8 node_id = dram_dst_node(pvt, range);
2386
u8 intlv_en = dram_intlv_en(pvt, range);
2387
2388
amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
2389
amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
2390
2391
dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
2392
dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
2393
2394
edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2395
range, sys_addr, get_dram_limit(pvt, range));
2396
2397
if (!(get_dram_base(pvt, range) <= sys_addr) &&
2398
!(get_dram_limit(pvt, range) >= sys_addr))
2399
return -EINVAL;
2400
2401
if (dhar_valid(pvt) &&
2402
dhar_base(pvt) <= sys_addr &&
2403
sys_addr < BIT_64(32)) {
2404
amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2405
sys_addr);
2406
return -EINVAL;
2407
}
2408
2409
/* Verify sys_addr is within DCT Range. */
2410
dct_base = (u64) dct_sel_baseaddr(pvt);
2411
dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2412
2413
if (!(dct_cont_base_reg & BIT(0)) &&
2414
!(dct_base <= (sys_addr >> 27) &&
2415
dct_limit >= (sys_addr >> 27)))
2416
return -EINVAL;
2417
2418
/* Verify number of dct's that participate in channel interleaving. */
2419
num_dcts_intlv = (int) hweight8(intlv_en);
2420
2421
if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2422
return -EINVAL;
2423
2424
if (pvt->model >= 0x60)
2425
channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2426
else
2427
channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2428
num_dcts_intlv, dct_sel);
2429
2430
/* Verify we stay within the MAX number of channels allowed */
2431
if (channel > 3)
2432
return -EINVAL;
2433
2434
leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2435
2436
/* Get normalized DCT addr */
2437
if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2438
chan_offset = dhar_offset;
2439
else
2440
chan_offset = dct_base << 27;
2441
2442
chan_addr = sys_addr - chan_offset;
2443
2444
/* remove channel interleave */
2445
if (num_dcts_intlv == 2) {
2446
if (intlv_addr == 0x4)
2447
chan_addr = ((chan_addr >> 9) << 8) |
2448
(chan_addr & 0xff);
2449
else if (intlv_addr == 0x5)
2450
chan_addr = ((chan_addr >> 10) << 9) |
2451
(chan_addr & 0x1ff);
2452
else
2453
return -EINVAL;
2454
2455
} else if (num_dcts_intlv == 4) {
2456
if (intlv_addr == 0x4)
2457
chan_addr = ((chan_addr >> 10) << 8) |
2458
(chan_addr & 0xff);
2459
else if (intlv_addr == 0x5)
2460
chan_addr = ((chan_addr >> 11) << 9) |
2461
(chan_addr & 0x1ff);
2462
else
2463
return -EINVAL;
2464
}
2465
2466
if (dct_offset_en) {
2467
amd64_read_pci_cfg(pvt->F1,
2468
DRAM_CONT_HIGH_OFF + (int) channel * 4,
2469
&tmp);
2470
chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2471
}
2472
2473
f15h_select_dct(pvt, channel);
2474
2475
edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2476
2477
/*
2478
* Find Chip select:
2479
* if channel = 3, then alias it to 1. This is because, in F15 M30h,
2480
* there is support for 4 DCT's, but only 2 are currently functional.
2481
* They are DCT0 and DCT3. But we have read all registers of DCT3 into
2482
* pvt->csels[1]. So we need to use '1' here to get correct info.
2483
* Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2484
*/
2485
alias_channel = (channel == 3) ? 1 : channel;
2486
2487
cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2488
2489
if (cs_found >= 0)
2490
*chan_sel = alias_channel;
2491
2492
return cs_found;
2493
}
2494
2495
static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2496
u64 sys_addr,
2497
int *chan_sel)
2498
{
2499
int cs_found = -EINVAL;
2500
unsigned range;
2501
2502
for (range = 0; range < DRAM_RANGES; range++) {
2503
if (!dram_rw(pvt, range))
2504
continue;
2505
2506
if (pvt->fam == 0x15 && pvt->model >= 0x30)
2507
cs_found = f15_m30h_match_to_this_node(pvt, range,
2508
sys_addr,
2509
chan_sel);
2510
2511
else if ((get_dram_base(pvt, range) <= sys_addr) &&
2512
(get_dram_limit(pvt, range) >= sys_addr)) {
2513
cs_found = f1x_match_to_this_node(pvt, range,
2514
sys_addr, chan_sel);
2515
if (cs_found >= 0)
2516
break;
2517
}
2518
}
2519
return cs_found;
2520
}
2521
2522
/*
2523
* For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2524
* a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2525
*
2526
* The @sys_addr is usually an error address received from the hardware
2527
* (MCX_ADDR).
2528
*/
2529
static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2530
struct err_info *err)
2531
{
2532
struct amd64_pvt *pvt = mci->pvt_info;
2533
2534
error_address_to_page_and_offset(sys_addr, err);
2535
2536
err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2537
if (err->csrow < 0) {
2538
err->err_code = ERR_CSROW;
2539
return;
2540
}
2541
2542
/*
2543
* We need the syndromes for channel detection only when we're
2544
* ganged. Otherwise @chan should already contain the channel at
2545
* this point.
2546
*/
2547
if (dct_ganging_enabled(pvt))
2548
err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2549
}
2550
2551
/*
2552
* These are tables of eigenvectors (one per line) which can be used for the
2553
* construction of the syndrome tables. The modified syndrome search algorithm
2554
* uses those to find the symbol in error and thus the DIMM.
2555
*
2556
* Algorithm courtesy of Ross LaFetra from AMD.
2557
*/
2558
static const u16 x4_vectors[] = {
2559
0x2f57, 0x1afe, 0x66cc, 0xdd88,
2560
0x11eb, 0x3396, 0x7f4c, 0xeac8,
2561
0x0001, 0x0002, 0x0004, 0x0008,
2562
0x1013, 0x3032, 0x4044, 0x8088,
2563
0x106b, 0x30d6, 0x70fc, 0xe0a8,
2564
0x4857, 0xc4fe, 0x13cc, 0x3288,
2565
0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2566
0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2567
0x15c1, 0x2a42, 0x89ac, 0x4758,
2568
0x2b03, 0x1602, 0x4f0c, 0xca08,
2569
0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2570
0x8ba7, 0x465e, 0x244c, 0x1cc8,
2571
0x2b87, 0x164e, 0x642c, 0xdc18,
2572
0x40b9, 0x80de, 0x1094, 0x20e8,
2573
0x27db, 0x1eb6, 0x9dac, 0x7b58,
2574
0x11c1, 0x2242, 0x84ac, 0x4c58,
2575
0x1be5, 0x2d7a, 0x5e34, 0xa718,
2576
0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2577
0x4c97, 0xc87e, 0x11fc, 0x33a8,
2578
0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2579
0x16b3, 0x3d62, 0x4f34, 0x8518,
2580
0x1e2f, 0x391a, 0x5cac, 0xf858,
2581
0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2582
0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2583
0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2584
0x4397, 0xc27e, 0x17fc, 0x3ea8,
2585
0x1617, 0x3d3e, 0x6464, 0xb8b8,
2586
0x23ff, 0x12aa, 0xab6c, 0x56d8,
2587
0x2dfb, 0x1ba6, 0x913c, 0x7328,
2588
0x185d, 0x2ca6, 0x7914, 0x9e28,
2589
0x171b, 0x3e36, 0x7d7c, 0xebe8,
2590
0x4199, 0x82ee, 0x19f4, 0x2e58,
2591
0x4807, 0xc40e, 0x130c, 0x3208,
2592
0x1905, 0x2e0a, 0x5804, 0xac08,
2593
0x213f, 0x132a, 0xadfc, 0x5ba8,
2594
0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2595
};
2596
2597
static const u16 x8_vectors[] = {
2598
0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2599
0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2600
0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2601
0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2602
0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2603
0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2604
0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2605
0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2606
0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2607
0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2608
0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2609
0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2610
0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2611
0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2612
0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2613
0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2614
0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2615
0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2616
0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2617
};
2618
2619
static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2620
unsigned v_dim)
2621
{
2622
unsigned int i, err_sym;
2623
2624
for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2625
u16 s = syndrome;
2626
unsigned v_idx = err_sym * v_dim;
2627
unsigned v_end = (err_sym + 1) * v_dim;
2628
2629
/* walk over all 16 bits of the syndrome */
2630
for (i = 1; i < (1U << 16); i <<= 1) {
2631
2632
/* if bit is set in that eigenvector... */
2633
if (v_idx < v_end && vectors[v_idx] & i) {
2634
u16 ev_comp = vectors[v_idx++];
2635
2636
/* ... and bit set in the modified syndrome, */
2637
if (s & i) {
2638
/* remove it. */
2639
s ^= ev_comp;
2640
2641
if (!s)
2642
return err_sym;
2643
}
2644
2645
} else if (s & i)
2646
/* can't get to zero, move to next symbol */
2647
break;
2648
}
2649
}
2650
2651
edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2652
return -1;
2653
}
2654
2655
static int map_err_sym_to_channel(int err_sym, int sym_size)
2656
{
2657
if (sym_size == 4)
2658
switch (err_sym) {
2659
case 0x20:
2660
case 0x21:
2661
return 0;
2662
case 0x22:
2663
case 0x23:
2664
return 1;
2665
default:
2666
return err_sym >> 4;
2667
}
2668
/* x8 symbols */
2669
else
2670
switch (err_sym) {
2671
/* imaginary bits not in a DIMM */
2672
case 0x10:
2673
WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2674
err_sym);
2675
return -1;
2676
case 0x11:
2677
return 0;
2678
case 0x12:
2679
return 1;
2680
default:
2681
return err_sym >> 3;
2682
}
2683
return -1;
2684
}
2685
2686
static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2687
{
2688
struct amd64_pvt *pvt = mci->pvt_info;
2689
int err_sym = -1;
2690
2691
if (pvt->ecc_sym_sz == 8)
2692
err_sym = decode_syndrome(syndrome, x8_vectors,
2693
ARRAY_SIZE(x8_vectors),
2694
pvt->ecc_sym_sz);
2695
else if (pvt->ecc_sym_sz == 4)
2696
err_sym = decode_syndrome(syndrome, x4_vectors,
2697
ARRAY_SIZE(x4_vectors),
2698
pvt->ecc_sym_sz);
2699
else {
2700
amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2701
return err_sym;
2702
}
2703
2704
return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2705
}
2706
2707
static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2708
u8 ecc_type)
2709
{
2710
enum hw_event_mc_err_type err_type;
2711
const char *string;
2712
2713
if (ecc_type == 2)
2714
err_type = HW_EVENT_ERR_CORRECTED;
2715
else if (ecc_type == 1)
2716
err_type = HW_EVENT_ERR_UNCORRECTED;
2717
else if (ecc_type == 3)
2718
err_type = HW_EVENT_ERR_DEFERRED;
2719
else {
2720
WARN(1, "Something is rotten in the state of Denmark.\n");
2721
return;
2722
}
2723
2724
switch (err->err_code) {
2725
case DECODE_OK:
2726
string = "";
2727
break;
2728
case ERR_NODE:
2729
string = "Failed to map error addr to a node";
2730
break;
2731
case ERR_CSROW:
2732
string = "Failed to map error addr to a csrow";
2733
break;
2734
case ERR_CHANNEL:
2735
string = "Unknown syndrome - possible error reporting race";
2736
break;
2737
case ERR_SYND:
2738
string = "MCA_SYND not valid - unknown syndrome and csrow";
2739
break;
2740
case ERR_NORM_ADDR:
2741
string = "Cannot decode normalized address";
2742
break;
2743
default:
2744
string = "WTF error";
2745
break;
2746
}
2747
2748
edac_mc_handle_error(err_type, mci, 1,
2749
err->page, err->offset, err->syndrome,
2750
err->csrow, err->channel, -1,
2751
string, "");
2752
}
2753
2754
static inline void decode_bus_error(int node_id, struct mce *m)
2755
{
2756
struct mem_ctl_info *mci;
2757
struct amd64_pvt *pvt;
2758
u8 ecc_type = (m->status >> 45) & 0x3;
2759
u8 xec = XEC(m->status, 0x1f);
2760
u16 ec = EC(m->status);
2761
u64 sys_addr;
2762
struct err_info err;
2763
2764
mci = edac_mc_find(node_id);
2765
if (!mci)
2766
return;
2767
2768
pvt = mci->pvt_info;
2769
2770
/* Bail out early if this was an 'observed' error */
2771
if (PP(ec) == NBSL_PP_OBS)
2772
return;
2773
2774
/* Do only ECC errors */
2775
if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2776
return;
2777
2778
memset(&err, 0, sizeof(err));
2779
2780
sys_addr = get_error_address(pvt, m);
2781
2782
if (ecc_type == 2)
2783
err.syndrome = extract_syndrome(m->status);
2784
2785
pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2786
2787
__log_ecc_error(mci, &err, ecc_type);
2788
}
2789
2790
/*
2791
* To find the UMC channel represented by this bank we need to match on its
2792
* instance_id. The instance_id of a bank is held in the lower 32 bits of its
2793
* IPID.
2794
*
2795
* Currently, we can derive the channel number by looking at the 6th nibble in
2796
* the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2797
* number.
2798
*
2799
* For DRAM ECC errors, the Chip Select number is given in bits [2:0] of
2800
* the MCA_SYND[ErrorInformation] field.
2801
*/
2802
static void umc_get_err_info(struct mce *m, struct err_info *err)
2803
{
2804
err->channel = (m->ipid & GENMASK(31, 0)) >> 20;
2805
err->csrow = m->synd & 0x7;
2806
}
2807
2808
static void decode_umc_error(int node_id, struct mce *m)
2809
{
2810
u8 ecc_type = (m->status >> 45) & 0x3;
2811
struct mem_ctl_info *mci;
2812
unsigned long sys_addr;
2813
struct amd64_pvt *pvt;
2814
struct atl_err a_err;
2815
struct err_info err;
2816
2817
node_id = fixup_node_id(node_id, m);
2818
2819
mci = edac_mc_find(node_id);
2820
if (!mci)
2821
return;
2822
2823
pvt = mci->pvt_info;
2824
2825
memset(&err, 0, sizeof(err));
2826
2827
if (m->status & MCI_STATUS_DEFERRED)
2828
ecc_type = 3;
2829
2830
if (!(m->status & MCI_STATUS_SYNDV)) {
2831
err.err_code = ERR_SYND;
2832
goto log_error;
2833
}
2834
2835
if (ecc_type == 2) {
2836
u8 length = (m->synd >> 18) & 0x3f;
2837
2838
if (length)
2839
err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
2840
else
2841
err.err_code = ERR_CHANNEL;
2842
}
2843
2844
pvt->ops->get_err_info(m, &err);
2845
2846
a_err.addr = m->addr;
2847
a_err.ipid = m->ipid;
2848
a_err.cpu = m->extcpu;
2849
2850
sys_addr = amd_convert_umc_mca_addr_to_sys_addr(&a_err);
2851
if (IS_ERR_VALUE(sys_addr)) {
2852
err.err_code = ERR_NORM_ADDR;
2853
goto log_error;
2854
}
2855
2856
error_address_to_page_and_offset(sys_addr, &err);
2857
2858
log_error:
2859
__log_ecc_error(mci, &err, ecc_type);
2860
}
2861
2862
/*
2863
* Use pvt->F3 which contains the F3 CPU PCI device to get the related
2864
* F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2865
*/
2866
static int
2867
reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
2868
{
2869
/* Reserve the ADDRESS MAP Device */
2870
pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2871
if (!pvt->F1) {
2872
edac_dbg(1, "F1 not found: device 0x%x\n", pci_id1);
2873
return -ENODEV;
2874
}
2875
2876
/* Reserve the DCT Device */
2877
pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2878
if (!pvt->F2) {
2879
pci_dev_put(pvt->F1);
2880
pvt->F1 = NULL;
2881
2882
edac_dbg(1, "F2 not found: device 0x%x\n", pci_id2);
2883
return -ENODEV;
2884
}
2885
2886
if (!pci_ctl_dev)
2887
pci_ctl_dev = &pvt->F2->dev;
2888
2889
edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2890
edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2891
edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2892
2893
return 0;
2894
}
2895
2896
static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
2897
{
2898
pvt->ecc_sym_sz = 4;
2899
2900
if (pvt->fam >= 0x10) {
2901
u32 tmp;
2902
2903
amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2904
/* F16h has only DCT0, so no need to read dbam1. */
2905
if (pvt->fam != 0x16)
2906
amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2907
2908
/* F10h, revD and later can do x8 ECC too. */
2909
if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2910
pvt->ecc_sym_sz = 8;
2911
}
2912
}
2913
2914
/*
2915
* Retrieve the hardware registers of the memory controller.
2916
*/
2917
static void umc_read_mc_regs(struct amd64_pvt *pvt)
2918
{
2919
u8 nid = pvt->mc_node_id;
2920
struct amd64_umc *umc;
2921
u32 i, tmp, umc_base;
2922
2923
/* Read registers from each UMC */
2924
for_each_umc(i) {
2925
2926
umc_base = get_umc_base(i);
2927
umc = &pvt->umc[i];
2928
2929
if (!amd_smn_read(nid, umc_base + get_umc_reg(pvt, UMCCH_DIMM_CFG), &tmp))
2930
umc->dimm_cfg = tmp;
2931
2932
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &tmp))
2933
umc->umc_cfg = tmp;
2934
2935
if (!amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &tmp))
2936
umc->sdp_ctrl = tmp;
2937
2938
if (!amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &tmp))
2939
umc->ecc_ctrl = tmp;
2940
2941
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &tmp))
2942
umc->umc_cap_hi = tmp;
2943
}
2944
}
2945
2946
/*
2947
* Retrieve the hardware registers of the memory controller (this includes the
2948
* 'Address Map' and 'Misc' device regs)
2949
*/
2950
static void dct_read_mc_regs(struct amd64_pvt *pvt)
2951
{
2952
unsigned int range;
2953
u64 msr_val;
2954
2955
/*
2956
* Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2957
* those are Read-As-Zero.
2958
*/
2959
rdmsrq(MSR_K8_TOP_MEM1, pvt->top_mem);
2960
edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
2961
2962
/* Check first whether TOP_MEM2 is enabled: */
2963
rdmsrq(MSR_AMD64_SYSCFG, msr_val);
2964
if (msr_val & BIT(21)) {
2965
rdmsrq(MSR_K8_TOP_MEM2, pvt->top_mem2);
2966
edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2967
} else {
2968
edac_dbg(0, " TOP_MEM2 disabled\n");
2969
}
2970
2971
amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2972
2973
read_dram_ctl_register(pvt);
2974
2975
for (range = 0; range < DRAM_RANGES; range++) {
2976
u8 rw;
2977
2978
/* read settings for this DRAM range */
2979
read_dram_base_limit_regs(pvt, range);
2980
2981
rw = dram_rw(pvt, range);
2982
if (!rw)
2983
continue;
2984
2985
edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2986
range,
2987
get_dram_base(pvt, range),
2988
get_dram_limit(pvt, range));
2989
2990
edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2991
dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2992
(rw & 0x1) ? "R" : "-",
2993
(rw & 0x2) ? "W" : "-",
2994
dram_intlv_sel(pvt, range),
2995
dram_dst_node(pvt, range));
2996
}
2997
2998
amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2999
amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
3000
3001
amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
3002
3003
amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
3004
amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
3005
3006
if (!dct_ganging_enabled(pvt)) {
3007
amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
3008
amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
3009
}
3010
3011
determine_ecc_sym_sz(pvt);
3012
}
3013
3014
/*
3015
* NOTE: CPU Revision Dependent code
3016
*
3017
* Input:
3018
* @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
3019
* k8 private pointer to -->
3020
* DRAM Bank Address mapping register
3021
* node_id
3022
* DCL register where dual_channel_active is
3023
*
3024
* The DBAM register consists of 4 sets of 4 bits each definitions:
3025
*
3026
* Bits: CSROWs
3027
* 0-3 CSROWs 0 and 1
3028
* 4-7 CSROWs 2 and 3
3029
* 8-11 CSROWs 4 and 5
3030
* 12-15 CSROWs 6 and 7
3031
*
3032
* Values range from: 0 to 15
3033
* The meaning of the values depends on CPU revision and dual-channel state,
3034
* see relevant BKDG more info.
3035
*
3036
* The memory controller provides for total of only 8 CSROWs in its current
3037
* architecture. Each "pair" of CSROWs normally represents just one DIMM in
3038
* single channel or two (2) DIMMs in dual channel mode.
3039
*
3040
* The following code logic collapses the various tables for CSROW based on CPU
3041
* revision.
3042
*
3043
* Returns:
3044
* The number of PAGE_SIZE pages on the specified CSROW number it
3045
* encompasses
3046
*
3047
*/
3048
static u32 dct_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
3049
{
3050
u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
3051
u32 cs_mode, nr_pages;
3052
3053
csrow_nr >>= 1;
3054
cs_mode = DBAM_DIMM(csrow_nr, dbam);
3055
3056
nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
3057
nr_pages <<= 20 - PAGE_SHIFT;
3058
3059
edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
3060
csrow_nr, dct, cs_mode);
3061
edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3062
3063
return nr_pages;
3064
}
3065
3066
static u32 umc_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
3067
{
3068
int csrow_nr = csrow_nr_orig;
3069
u32 cs_mode, nr_pages;
3070
3071
cs_mode = umc_get_cs_mode(csrow_nr >> 1, dct, pvt);
3072
3073
nr_pages = umc_addr_mask_to_cs_size(pvt, dct, cs_mode, csrow_nr);
3074
nr_pages <<= 20 - PAGE_SHIFT;
3075
3076
edac_dbg(0, "csrow: %d, channel: %d, cs_mode %d\n",
3077
csrow_nr_orig, dct, cs_mode);
3078
edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3079
3080
return nr_pages;
3081
}
3082
3083
static void umc_init_csrows(struct mem_ctl_info *mci)
3084
{
3085
struct amd64_pvt *pvt = mci->pvt_info;
3086
enum edac_type edac_mode = EDAC_NONE;
3087
enum dev_type dev_type = DEV_UNKNOWN;
3088
struct dimm_info *dimm;
3089
u8 umc, cs;
3090
3091
if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
3092
edac_mode = EDAC_S16ECD16ED;
3093
dev_type = DEV_X16;
3094
} else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
3095
edac_mode = EDAC_S8ECD8ED;
3096
dev_type = DEV_X8;
3097
} else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
3098
edac_mode = EDAC_S4ECD4ED;
3099
dev_type = DEV_X4;
3100
} else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
3101
edac_mode = EDAC_SECDED;
3102
}
3103
3104
for_each_umc(umc) {
3105
for_each_chip_select(cs, umc, pvt) {
3106
if (!csrow_enabled(cs, umc, pvt))
3107
continue;
3108
3109
dimm = mci->csrows[cs]->channels[umc]->dimm;
3110
3111
edac_dbg(1, "MC node: %d, csrow: %d\n",
3112
pvt->mc_node_id, cs);
3113
3114
dimm->nr_pages = umc_get_csrow_nr_pages(pvt, umc, cs);
3115
dimm->mtype = pvt->umc[umc].dram_type;
3116
dimm->edac_mode = edac_mode;
3117
dimm->dtype = dev_type;
3118
dimm->grain = 64;
3119
}
3120
}
3121
}
3122
3123
/*
3124
* Initialize the array of csrow attribute instances, based on the values
3125
* from pci config hardware registers.
3126
*/
3127
static void dct_init_csrows(struct mem_ctl_info *mci)
3128
{
3129
struct amd64_pvt *pvt = mci->pvt_info;
3130
enum edac_type edac_mode = EDAC_NONE;
3131
struct csrow_info *csrow;
3132
struct dimm_info *dimm;
3133
int nr_pages = 0;
3134
int i, j;
3135
u32 val;
3136
3137
amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
3138
3139
pvt->nbcfg = val;
3140
3141
edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
3142
pvt->mc_node_id, val,
3143
!!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
3144
3145
/*
3146
* We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
3147
*/
3148
for_each_chip_select(i, 0, pvt) {
3149
bool row_dct0 = !!csrow_enabled(i, 0, pvt);
3150
bool row_dct1 = false;
3151
3152
if (pvt->fam != 0xf)
3153
row_dct1 = !!csrow_enabled(i, 1, pvt);
3154
3155
if (!row_dct0 && !row_dct1)
3156
continue;
3157
3158
csrow = mci->csrows[i];
3159
3160
edac_dbg(1, "MC node: %d, csrow: %d\n",
3161
pvt->mc_node_id, i);
3162
3163
if (row_dct0) {
3164
nr_pages = dct_get_csrow_nr_pages(pvt, 0, i);
3165
csrow->channels[0]->dimm->nr_pages = nr_pages;
3166
}
3167
3168
/* K8 has only one DCT */
3169
if (pvt->fam != 0xf && row_dct1) {
3170
int row_dct1_pages = dct_get_csrow_nr_pages(pvt, 1, i);
3171
3172
csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3173
nr_pages += row_dct1_pages;
3174
}
3175
3176
edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3177
3178
/* Determine DIMM ECC mode: */
3179
if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3180
edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3181
? EDAC_S4ECD4ED
3182
: EDAC_SECDED;
3183
}
3184
3185
for (j = 0; j < pvt->max_mcs; j++) {
3186
dimm = csrow->channels[j]->dimm;
3187
dimm->mtype = pvt->dram_type;
3188
dimm->edac_mode = edac_mode;
3189
dimm->grain = 64;
3190
}
3191
}
3192
}
3193
3194
/* get all cores on this DCT */
3195
static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3196
{
3197
int cpu;
3198
3199
for_each_online_cpu(cpu)
3200
if (topology_amd_node_id(cpu) == nid)
3201
cpumask_set_cpu(cpu, mask);
3202
}
3203
3204
/* check MCG_CTL on all the cpus on this node */
3205
static bool nb_mce_bank_enabled_on_node(u16 nid)
3206
{
3207
cpumask_var_t mask;
3208
int cpu, nbe;
3209
bool ret = false;
3210
3211
if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3212
amd64_warn("%s: Error allocating mask\n", __func__);
3213
return false;
3214
}
3215
3216
get_cpus_on_this_dct_cpumask(mask, nid);
3217
3218
rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3219
3220
for_each_cpu(cpu, mask) {
3221
struct msr *reg = per_cpu_ptr(msrs, cpu);
3222
nbe = reg->l & MSR_MCGCTL_NBE;
3223
3224
edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3225
cpu, reg->q, str_enabled_disabled(nbe));
3226
3227
if (!nbe)
3228
goto out;
3229
}
3230
ret = true;
3231
3232
out:
3233
free_cpumask_var(mask);
3234
return ret;
3235
}
3236
3237
static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3238
{
3239
cpumask_var_t cmask;
3240
int cpu;
3241
3242
if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3243
amd64_warn("%s: error allocating mask\n", __func__);
3244
return -ENOMEM;
3245
}
3246
3247
get_cpus_on_this_dct_cpumask(cmask, nid);
3248
3249
rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3250
3251
for_each_cpu(cpu, cmask) {
3252
3253
struct msr *reg = per_cpu_ptr(msrs, cpu);
3254
3255
if (on) {
3256
if (reg->l & MSR_MCGCTL_NBE)
3257
s->flags.nb_mce_enable = 1;
3258
3259
reg->l |= MSR_MCGCTL_NBE;
3260
} else {
3261
/*
3262
* Turn off NB MCE reporting only when it was off before
3263
*/
3264
if (!s->flags.nb_mce_enable)
3265
reg->l &= ~MSR_MCGCTL_NBE;
3266
}
3267
}
3268
wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3269
3270
free_cpumask_var(cmask);
3271
3272
return 0;
3273
}
3274
3275
static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3276
struct pci_dev *F3)
3277
{
3278
bool ret = true;
3279
u32 value, mask = 0x3; /* UECC/CECC enable */
3280
3281
if (toggle_ecc_err_reporting(s, nid, ON)) {
3282
amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3283
return false;
3284
}
3285
3286
amd64_read_pci_cfg(F3, NBCTL, &value);
3287
3288
s->old_nbctl = value & mask;
3289
s->nbctl_valid = true;
3290
3291
value |= mask;
3292
amd64_write_pci_cfg(F3, NBCTL, value);
3293
3294
amd64_read_pci_cfg(F3, NBCFG, &value);
3295
3296
edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3297
nid, value, !!(value & NBCFG_ECC_ENABLE));
3298
3299
if (!(value & NBCFG_ECC_ENABLE)) {
3300
amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3301
3302
s->flags.nb_ecc_prev = 0;
3303
3304
/* Attempt to turn on DRAM ECC Enable */
3305
value |= NBCFG_ECC_ENABLE;
3306
amd64_write_pci_cfg(F3, NBCFG, value);
3307
3308
amd64_read_pci_cfg(F3, NBCFG, &value);
3309
3310
if (!(value & NBCFG_ECC_ENABLE)) {
3311
amd64_warn("Hardware rejected DRAM ECC enable,"
3312
"check memory DIMM configuration.\n");
3313
ret = false;
3314
} else {
3315
amd64_info("Hardware accepted DRAM ECC Enable\n");
3316
}
3317
} else {
3318
s->flags.nb_ecc_prev = 1;
3319
}
3320
3321
edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3322
nid, value, !!(value & NBCFG_ECC_ENABLE));
3323
3324
return ret;
3325
}
3326
3327
static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3328
struct pci_dev *F3)
3329
{
3330
u32 value, mask = 0x3; /* UECC/CECC enable */
3331
3332
if (!s->nbctl_valid)
3333
return;
3334
3335
amd64_read_pci_cfg(F3, NBCTL, &value);
3336
value &= ~mask;
3337
value |= s->old_nbctl;
3338
3339
amd64_write_pci_cfg(F3, NBCTL, value);
3340
3341
/* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3342
if (!s->flags.nb_ecc_prev) {
3343
amd64_read_pci_cfg(F3, NBCFG, &value);
3344
value &= ~NBCFG_ECC_ENABLE;
3345
amd64_write_pci_cfg(F3, NBCFG, value);
3346
}
3347
3348
/* restore the NB Enable MCGCTL bit */
3349
if (toggle_ecc_err_reporting(s, nid, OFF))
3350
amd64_warn("Error restoring NB MCGCTL settings!\n");
3351
}
3352
3353
static bool dct_ecc_enabled(struct amd64_pvt *pvt)
3354
{
3355
u16 nid = pvt->mc_node_id;
3356
bool nb_mce_en = false;
3357
u8 ecc_en = 0;
3358
u32 value;
3359
3360
amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3361
3362
ecc_en = !!(value & NBCFG_ECC_ENABLE);
3363
3364
nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3365
if (!nb_mce_en)
3366
edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3367
MSR_IA32_MCG_CTL, nid);
3368
3369
edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, str_enabled_disabled(ecc_en));
3370
3371
return ecc_en && nb_mce_en;
3372
}
3373
3374
static bool umc_ecc_enabled(struct amd64_pvt *pvt)
3375
{
3376
struct amd64_umc *umc;
3377
bool ecc_en = false;
3378
int i;
3379
3380
/* Check whether at least one UMC is enabled: */
3381
for_each_umc(i) {
3382
umc = &pvt->umc[i];
3383
3384
if (umc->sdp_ctrl & UMC_SDP_INIT &&
3385
umc->umc_cap_hi & UMC_ECC_ENABLED) {
3386
ecc_en = true;
3387
break;
3388
}
3389
}
3390
3391
edac_dbg(3, "Node %d: DRAM ECC %s.\n", pvt->mc_node_id, str_enabled_disabled(ecc_en));
3392
3393
return ecc_en;
3394
}
3395
3396
static inline void
3397
umc_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3398
{
3399
u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3400
3401
for_each_umc(i) {
3402
if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3403
ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3404
cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3405
3406
dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3407
dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3408
}
3409
}
3410
3411
/* Set chipkill only if ECC is enabled: */
3412
if (ecc_en) {
3413
mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3414
3415
if (!cpk_en)
3416
return;
3417
3418
if (dev_x4)
3419
mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3420
else if (dev_x16)
3421
mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3422
else
3423
mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3424
}
3425
}
3426
3427
static void dct_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3428
{
3429
struct amd64_pvt *pvt = mci->pvt_info;
3430
3431
mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3432
mci->edac_ctl_cap = EDAC_FLAG_NONE;
3433
3434
if (pvt->nbcap & NBCAP_SECDED)
3435
mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3436
3437
if (pvt->nbcap & NBCAP_CHIPKILL)
3438
mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3439
3440
mci->edac_cap = dct_determine_edac_cap(pvt);
3441
mci->mod_name = EDAC_MOD_STR;
3442
mci->ctl_name = pvt->ctl_name;
3443
mci->dev_name = pci_name(pvt->F3);
3444
mci->ctl_page_to_phys = NULL;
3445
3446
/* memory scrubber interface */
3447
mci->set_sdram_scrub_rate = set_scrub_rate;
3448
mci->get_sdram_scrub_rate = get_scrub_rate;
3449
3450
dct_init_csrows(mci);
3451
}
3452
3453
static void umc_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3454
{
3455
struct amd64_pvt *pvt = mci->pvt_info;
3456
3457
mci->mtype_cap = MEM_FLAG_DDR4 | MEM_FLAG_RDDR4;
3458
mci->edac_ctl_cap = EDAC_FLAG_NONE;
3459
3460
umc_determine_edac_ctl_cap(mci, pvt);
3461
3462
mci->edac_cap = umc_determine_edac_cap(pvt);
3463
mci->mod_name = EDAC_MOD_STR;
3464
mci->ctl_name = pvt->ctl_name;
3465
mci->dev_name = pci_name(pvt->F3);
3466
mci->ctl_page_to_phys = NULL;
3467
3468
umc_init_csrows(mci);
3469
}
3470
3471
static int dct_hw_info_get(struct amd64_pvt *pvt)
3472
{
3473
int ret = reserve_mc_sibling_devs(pvt, pvt->f1_id, pvt->f2_id);
3474
3475
if (ret)
3476
return ret;
3477
3478
dct_prep_chip_selects(pvt);
3479
dct_read_base_mask(pvt);
3480
dct_read_mc_regs(pvt);
3481
dct_determine_memory_type(pvt);
3482
3483
return 0;
3484
}
3485
3486
static int umc_hw_info_get(struct amd64_pvt *pvt)
3487
{
3488
pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3489
if (!pvt->umc)
3490
return -ENOMEM;
3491
3492
umc_prep_chip_selects(pvt);
3493
umc_read_base_mask(pvt);
3494
umc_read_mc_regs(pvt);
3495
umc_determine_memory_type(pvt);
3496
3497
return 0;
3498
}
3499
3500
/*
3501
* The CPUs have one channel per UMC, so UMC number is equivalent to a
3502
* channel number. The GPUs have 8 channels per UMC, so the UMC number no
3503
* longer works as a channel number.
3504
*
3505
* The channel number within a GPU UMC is given in MCA_IPID[15:12].
3506
* However, the IDs are split such that two UMC values go to one UMC, and
3507
* the channel numbers are split in two groups of four.
3508
*
3509
* Refer to comment on gpu_get_umc_base().
3510
*
3511
* For example,
3512
* UMC0 CH[3:0] = 0x0005[3:0]000
3513
* UMC0 CH[7:4] = 0x0015[3:0]000
3514
* UMC1 CH[3:0] = 0x0025[3:0]000
3515
* UMC1 CH[7:4] = 0x0035[3:0]000
3516
*/
3517
static void gpu_get_err_info(struct mce *m, struct err_info *err)
3518
{
3519
u8 ch = (m->ipid & GENMASK(31, 0)) >> 20;
3520
u8 phy = ((m->ipid >> 12) & 0xf);
3521
3522
err->channel = ch % 2 ? phy + 4 : phy;
3523
err->csrow = phy;
3524
}
3525
3526
static int gpu_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
3527
unsigned int cs_mode, int csrow_nr)
3528
{
3529
u32 addr_mask = pvt->csels[umc].csmasks[csrow_nr];
3530
u32 addr_mask_sec = pvt->csels[umc].csmasks_sec[csrow_nr];
3531
3532
return __addr_mask_to_cs_size(addr_mask, addr_mask_sec, cs_mode, csrow_nr, csrow_nr >> 1);
3533
}
3534
3535
static void gpu_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
3536
{
3537
int size, cs_mode, cs = 0;
3538
3539
edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
3540
3541
cs_mode = CS_EVEN_PRIMARY | CS_ODD_PRIMARY;
3542
3543
for_each_chip_select(cs, ctrl, pvt) {
3544
size = gpu_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs);
3545
amd64_info(EDAC_MC ": %d: %5dMB\n", cs, size);
3546
}
3547
}
3548
3549
static void gpu_dump_misc_regs(struct amd64_pvt *pvt)
3550
{
3551
struct amd64_umc *umc;
3552
u32 i;
3553
3554
for_each_umc(i) {
3555
umc = &pvt->umc[i];
3556
3557
edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
3558
edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
3559
edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
3560
edac_dbg(1, "UMC%d All HBMs support ECC: yes\n", i);
3561
3562
gpu_debug_display_dimm_sizes(pvt, i);
3563
}
3564
}
3565
3566
static u32 gpu_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
3567
{
3568
u32 nr_pages;
3569
int cs_mode = CS_EVEN_PRIMARY | CS_ODD_PRIMARY;
3570
3571
nr_pages = gpu_addr_mask_to_cs_size(pvt, dct, cs_mode, csrow_nr);
3572
nr_pages <<= 20 - PAGE_SHIFT;
3573
3574
edac_dbg(0, "csrow: %d, channel: %d\n", csrow_nr, dct);
3575
edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3576
3577
return nr_pages;
3578
}
3579
3580
static void gpu_init_csrows(struct mem_ctl_info *mci)
3581
{
3582
struct amd64_pvt *pvt = mci->pvt_info;
3583
struct dimm_info *dimm;
3584
u8 umc, cs;
3585
3586
for_each_umc(umc) {
3587
for_each_chip_select(cs, umc, pvt) {
3588
if (!csrow_enabled(cs, umc, pvt))
3589
continue;
3590
3591
dimm = mci->csrows[umc]->channels[cs]->dimm;
3592
3593
edac_dbg(1, "MC node: %d, csrow: %d\n",
3594
pvt->mc_node_id, cs);
3595
3596
dimm->nr_pages = gpu_get_csrow_nr_pages(pvt, umc, cs);
3597
dimm->edac_mode = EDAC_SECDED;
3598
dimm->mtype = pvt->dram_type;
3599
dimm->dtype = DEV_X16;
3600
dimm->grain = 64;
3601
}
3602
}
3603
}
3604
3605
static void gpu_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3606
{
3607
struct amd64_pvt *pvt = mci->pvt_info;
3608
3609
mci->mtype_cap = MEM_FLAG_HBM2;
3610
mci->edac_ctl_cap = EDAC_FLAG_SECDED;
3611
3612
mci->edac_cap = EDAC_FLAG_EC;
3613
mci->mod_name = EDAC_MOD_STR;
3614
mci->ctl_name = pvt->ctl_name;
3615
mci->dev_name = pci_name(pvt->F3);
3616
mci->ctl_page_to_phys = NULL;
3617
3618
gpu_init_csrows(mci);
3619
}
3620
3621
/* ECC is enabled by default on GPU nodes */
3622
static bool gpu_ecc_enabled(struct amd64_pvt *pvt)
3623
{
3624
return true;
3625
}
3626
3627
static inline u32 gpu_get_umc_base(struct amd64_pvt *pvt, u8 umc, u8 channel)
3628
{
3629
/*
3630
* On CPUs, there is one channel per UMC, so UMC numbering equals
3631
* channel numbering. On GPUs, there are eight channels per UMC,
3632
* so the channel numbering is different from UMC numbering.
3633
*
3634
* On CPU nodes channels are selected in 6th nibble
3635
* UMC chY[3:0]= [(chY*2 + 1) : (chY*2)]50000;
3636
*
3637
* On GPU nodes channels are selected in 3rd nibble
3638
* HBM chX[3:0]= [Y ]5X[3:0]000;
3639
* HBM chX[7:4]= [Y+1]5X[3:0]000
3640
*
3641
* On MI300 APU nodes, same as GPU nodes but channels are selected
3642
* in the base address of 0x90000
3643
*/
3644
umc *= 2;
3645
3646
if (channel >= 4)
3647
umc++;
3648
3649
return pvt->gpu_umc_base + (umc << 20) + ((channel % 4) << 12);
3650
}
3651
3652
static void gpu_read_mc_regs(struct amd64_pvt *pvt)
3653
{
3654
u8 nid = pvt->mc_node_id;
3655
struct amd64_umc *umc;
3656
u32 i, tmp, umc_base;
3657
3658
/* Read registers from each UMC */
3659
for_each_umc(i) {
3660
umc_base = gpu_get_umc_base(pvt, i, 0);
3661
umc = &pvt->umc[i];
3662
3663
if (!amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &tmp))
3664
umc->umc_cfg = tmp;
3665
3666
if (!amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &tmp))
3667
umc->sdp_ctrl = tmp;
3668
3669
if (!amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &tmp))
3670
umc->ecc_ctrl = tmp;
3671
}
3672
}
3673
3674
static void gpu_read_base_mask(struct amd64_pvt *pvt)
3675
{
3676
u32 base_reg, mask_reg;
3677
u32 *base, *mask;
3678
int umc, cs;
3679
3680
for_each_umc(umc) {
3681
for_each_chip_select(cs, umc, pvt) {
3682
base_reg = gpu_get_umc_base(pvt, umc, cs) + UMCCH_BASE_ADDR;
3683
base = &pvt->csels[umc].csbases[cs];
3684
3685
if (!amd_smn_read(pvt->mc_node_id, base_reg, base)) {
3686
edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
3687
umc, cs, *base, base_reg);
3688
}
3689
3690
mask_reg = gpu_get_umc_base(pvt, umc, cs) + UMCCH_ADDR_MASK;
3691
mask = &pvt->csels[umc].csmasks[cs];
3692
3693
if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask)) {
3694
edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
3695
umc, cs, *mask, mask_reg);
3696
}
3697
}
3698
}
3699
}
3700
3701
static void gpu_prep_chip_selects(struct amd64_pvt *pvt)
3702
{
3703
int umc;
3704
3705
for_each_umc(umc) {
3706
pvt->csels[umc].b_cnt = 8;
3707
pvt->csels[umc].m_cnt = 8;
3708
}
3709
}
3710
3711
static int gpu_hw_info_get(struct amd64_pvt *pvt)
3712
{
3713
int ret;
3714
3715
ret = gpu_get_node_map(pvt);
3716
if (ret)
3717
return ret;
3718
3719
pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3720
if (!pvt->umc)
3721
return -ENOMEM;
3722
3723
gpu_prep_chip_selects(pvt);
3724
gpu_read_base_mask(pvt);
3725
gpu_read_mc_regs(pvt);
3726
3727
return 0;
3728
}
3729
3730
static void hw_info_put(struct amd64_pvt *pvt)
3731
{
3732
pci_dev_put(pvt->F1);
3733
pci_dev_put(pvt->F2);
3734
kfree(pvt->umc);
3735
}
3736
3737
static struct low_ops umc_ops = {
3738
.hw_info_get = umc_hw_info_get,
3739
.ecc_enabled = umc_ecc_enabled,
3740
.setup_mci_misc_attrs = umc_setup_mci_misc_attrs,
3741
.dump_misc_regs = umc_dump_misc_regs,
3742
.get_err_info = umc_get_err_info,
3743
};
3744
3745
static struct low_ops gpu_ops = {
3746
.hw_info_get = gpu_hw_info_get,
3747
.ecc_enabled = gpu_ecc_enabled,
3748
.setup_mci_misc_attrs = gpu_setup_mci_misc_attrs,
3749
.dump_misc_regs = gpu_dump_misc_regs,
3750
.get_err_info = gpu_get_err_info,
3751
};
3752
3753
/* Use Family 16h versions for defaults and adjust as needed below. */
3754
static struct low_ops dct_ops = {
3755
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
3756
.dbam_to_cs = f16_dbam_to_chip_select,
3757
.hw_info_get = dct_hw_info_get,
3758
.ecc_enabled = dct_ecc_enabled,
3759
.setup_mci_misc_attrs = dct_setup_mci_misc_attrs,
3760
.dump_misc_regs = dct_dump_misc_regs,
3761
};
3762
3763
static int per_family_init(struct amd64_pvt *pvt)
3764
{
3765
pvt->ext_model = boot_cpu_data.x86_model >> 4;
3766
pvt->stepping = boot_cpu_data.x86_stepping;
3767
pvt->model = boot_cpu_data.x86_model;
3768
pvt->fam = boot_cpu_data.x86;
3769
pvt->max_mcs = 2;
3770
3771
/*
3772
* Decide on which ops group to use here and do any family/model
3773
* overrides below.
3774
*/
3775
if (pvt->fam >= 0x17)
3776
pvt->ops = &umc_ops;
3777
else
3778
pvt->ops = &dct_ops;
3779
3780
switch (pvt->fam) {
3781
case 0xf:
3782
pvt->ctl_name = (pvt->ext_model >= K8_REV_F) ?
3783
"K8 revF or later" : "K8 revE or earlier";
3784
pvt->f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP;
3785
pvt->f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL;
3786
pvt->ops->map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow;
3787
pvt->ops->dbam_to_cs = k8_dbam_to_chip_select;
3788
break;
3789
3790
case 0x10:
3791
pvt->ctl_name = "F10h";
3792
pvt->f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP;
3793
pvt->f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM;
3794
pvt->ops->dbam_to_cs = f10_dbam_to_chip_select;
3795
break;
3796
3797
case 0x15:
3798
switch (pvt->model) {
3799
case 0x30:
3800
pvt->ctl_name = "F15h_M30h";
3801
pvt->f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
3802
pvt->f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2;
3803
break;
3804
case 0x60:
3805
pvt->ctl_name = "F15h_M60h";
3806
pvt->f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
3807
pvt->f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2;
3808
pvt->ops->dbam_to_cs = f15_m60h_dbam_to_chip_select;
3809
break;
3810
case 0x13:
3811
/* Richland is only client */
3812
return -ENODEV;
3813
default:
3814
pvt->ctl_name = "F15h";
3815
pvt->f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1;
3816
pvt->f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2;
3817
pvt->ops->dbam_to_cs = f15_dbam_to_chip_select;
3818
break;
3819
}
3820
break;
3821
3822
case 0x16:
3823
switch (pvt->model) {
3824
case 0x30:
3825
pvt->ctl_name = "F16h_M30h";
3826
pvt->f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1;
3827
pvt->f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2;
3828
break;
3829
default:
3830
pvt->ctl_name = "F16h";
3831
pvt->f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1;
3832
pvt->f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2;
3833
break;
3834
}
3835
break;
3836
3837
case 0x17:
3838
switch (pvt->model) {
3839
case 0x10 ... 0x2f:
3840
pvt->ctl_name = "F17h_M10h";
3841
break;
3842
case 0x30 ... 0x3f:
3843
pvt->ctl_name = "F17h_M30h";
3844
pvt->max_mcs = 8;
3845
break;
3846
case 0x60 ... 0x6f:
3847
pvt->ctl_name = "F17h_M60h";
3848
break;
3849
case 0x70 ... 0x7f:
3850
pvt->ctl_name = "F17h_M70h";
3851
break;
3852
default:
3853
pvt->ctl_name = "F17h";
3854
break;
3855
}
3856
break;
3857
3858
case 0x18:
3859
pvt->ctl_name = "F18h";
3860
break;
3861
3862
case 0x19:
3863
switch (pvt->model) {
3864
case 0x00 ... 0x0f:
3865
pvt->ctl_name = "F19h";
3866
pvt->max_mcs = 8;
3867
break;
3868
case 0x10 ... 0x1f:
3869
pvt->ctl_name = "F19h_M10h";
3870
pvt->max_mcs = 12;
3871
pvt->flags.zn_regs_v2 = 1;
3872
break;
3873
case 0x20 ... 0x2f:
3874
pvt->ctl_name = "F19h_M20h";
3875
break;
3876
case 0x30 ... 0x3f:
3877
if (pvt->F3->device == PCI_DEVICE_ID_AMD_MI200_DF_F3) {
3878
pvt->ctl_name = "MI200";
3879
pvt->max_mcs = 4;
3880
pvt->dram_type = MEM_HBM2;
3881
pvt->gpu_umc_base = 0x50000;
3882
pvt->ops = &gpu_ops;
3883
} else {
3884
pvt->ctl_name = "F19h_M30h";
3885
pvt->max_mcs = 8;
3886
}
3887
break;
3888
case 0x50 ... 0x5f:
3889
pvt->ctl_name = "F19h_M50h";
3890
break;
3891
case 0x60 ... 0x6f:
3892
pvt->ctl_name = "F19h_M60h";
3893
pvt->flags.zn_regs_v2 = 1;
3894
break;
3895
case 0x70 ... 0x7f:
3896
pvt->ctl_name = "F19h_M70h";
3897
pvt->max_mcs = 4;
3898
pvt->flags.zn_regs_v2 = 1;
3899
break;
3900
case 0x90 ... 0x9f:
3901
pvt->ctl_name = "F19h_M90h";
3902
pvt->max_mcs = 4;
3903
pvt->dram_type = MEM_HBM3;
3904
pvt->gpu_umc_base = 0x90000;
3905
pvt->ops = &gpu_ops;
3906
break;
3907
case 0xa0 ... 0xaf:
3908
pvt->ctl_name = "F19h_MA0h";
3909
pvt->max_mcs = 12;
3910
pvt->flags.zn_regs_v2 = 1;
3911
break;
3912
}
3913
break;
3914
3915
case 0x1A:
3916
switch (pvt->model) {
3917
case 0x00 ... 0x1f:
3918
pvt->ctl_name = "F1Ah";
3919
pvt->max_mcs = 12;
3920
pvt->flags.zn_regs_v2 = 1;
3921
break;
3922
case 0x40 ... 0x4f:
3923
pvt->ctl_name = "F1Ah_M40h";
3924
pvt->flags.zn_regs_v2 = 1;
3925
break;
3926
}
3927
break;
3928
3929
default:
3930
amd64_err("Unsupported family!\n");
3931
return -ENODEV;
3932
}
3933
3934
return 0;
3935
}
3936
3937
static const struct attribute_group *amd64_edac_attr_groups[] = {
3938
#ifdef CONFIG_EDAC_DEBUG
3939
&dbg_group,
3940
&inj_group,
3941
#endif
3942
NULL
3943
};
3944
3945
/*
3946
* For heterogeneous and APU models EDAC CHIP_SELECT and CHANNEL layers
3947
* should be swapped to fit into the layers.
3948
*/
3949
static unsigned int get_layer_size(struct amd64_pvt *pvt, u8 layer)
3950
{
3951
bool is_gpu = (pvt->ops == &gpu_ops);
3952
3953
if (!layer)
3954
return is_gpu ? pvt->max_mcs
3955
: pvt->csels[0].b_cnt;
3956
else
3957
return is_gpu ? pvt->csels[0].b_cnt
3958
: pvt->max_mcs;
3959
}
3960
3961
static int init_one_instance(struct amd64_pvt *pvt)
3962
{
3963
struct mem_ctl_info *mci = NULL;
3964
struct edac_mc_layer layers[2];
3965
int ret = -ENOMEM;
3966
3967
layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3968
layers[0].size = get_layer_size(pvt, 0);
3969
layers[0].is_virt_csrow = true;
3970
layers[1].type = EDAC_MC_LAYER_CHANNEL;
3971
layers[1].size = get_layer_size(pvt, 1);
3972
layers[1].is_virt_csrow = false;
3973
3974
mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3975
if (!mci)
3976
return ret;
3977
3978
mci->pvt_info = pvt;
3979
mci->pdev = &pvt->F3->dev;
3980
3981
pvt->ops->setup_mci_misc_attrs(mci);
3982
3983
ret = -ENODEV;
3984
if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3985
edac_dbg(1, "failed edac_mc_add_mc()\n");
3986
edac_mc_free(mci);
3987
return ret;
3988
}
3989
3990
return 0;
3991
}
3992
3993
static bool instance_has_memory(struct amd64_pvt *pvt)
3994
{
3995
bool cs_enabled = false;
3996
int cs = 0, dct = 0;
3997
3998
for (dct = 0; dct < pvt->max_mcs; dct++) {
3999
for_each_chip_select(cs, dct, pvt)
4000
cs_enabled |= csrow_enabled(cs, dct, pvt);
4001
}
4002
4003
return cs_enabled;
4004
}
4005
4006
static int probe_one_instance(unsigned int nid)
4007
{
4008
struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
4009
struct amd64_pvt *pvt = NULL;
4010
struct ecc_settings *s;
4011
int ret;
4012
4013
ret = -ENOMEM;
4014
s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
4015
if (!s)
4016
goto err_out;
4017
4018
ecc_stngs[nid] = s;
4019
4020
pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
4021
if (!pvt)
4022
goto err_settings;
4023
4024
pvt->mc_node_id = nid;
4025
pvt->F3 = F3;
4026
4027
ret = per_family_init(pvt);
4028
if (ret < 0)
4029
goto err_enable;
4030
4031
ret = pvt->ops->hw_info_get(pvt);
4032
if (ret < 0)
4033
goto err_enable;
4034
4035
ret = 0;
4036
if (!instance_has_memory(pvt)) {
4037
amd64_info("Node %d: No DIMMs detected.\n", nid);
4038
goto err_enable;
4039
}
4040
4041
if (!pvt->ops->ecc_enabled(pvt)) {
4042
ret = -ENODEV;
4043
4044
if (!ecc_enable_override)
4045
goto err_enable;
4046
4047
if (boot_cpu_data.x86 >= 0x17) {
4048
amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
4049
goto err_enable;
4050
} else
4051
amd64_warn("Forcing ECC on!\n");
4052
4053
if (!enable_ecc_error_reporting(s, nid, F3))
4054
goto err_enable;
4055
}
4056
4057
ret = init_one_instance(pvt);
4058
if (ret < 0) {
4059
amd64_err("Error probing instance: %d\n", nid);
4060
4061
if (boot_cpu_data.x86 < 0x17)
4062
restore_ecc_error_reporting(s, nid, F3);
4063
4064
goto err_enable;
4065
}
4066
4067
amd64_info("%s detected (node %d).\n", pvt->ctl_name, pvt->mc_node_id);
4068
4069
/* Display and decode various registers for debug purposes. */
4070
pvt->ops->dump_misc_regs(pvt);
4071
4072
return ret;
4073
4074
err_enable:
4075
hw_info_put(pvt);
4076
kfree(pvt);
4077
4078
err_settings:
4079
kfree(s);
4080
ecc_stngs[nid] = NULL;
4081
4082
err_out:
4083
return ret;
4084
}
4085
4086
static void remove_one_instance(unsigned int nid)
4087
{
4088
struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
4089
struct ecc_settings *s = ecc_stngs[nid];
4090
struct mem_ctl_info *mci;
4091
struct amd64_pvt *pvt;
4092
4093
/* Remove from EDAC CORE tracking list */
4094
mci = edac_mc_del_mc(&F3->dev);
4095
if (!mci)
4096
return;
4097
4098
pvt = mci->pvt_info;
4099
4100
restore_ecc_error_reporting(s, nid, F3);
4101
4102
kfree(ecc_stngs[nid]);
4103
ecc_stngs[nid] = NULL;
4104
4105
/* Free the EDAC CORE resources */
4106
mci->pvt_info = NULL;
4107
4108
hw_info_put(pvt);
4109
kfree(pvt);
4110
edac_mc_free(mci);
4111
}
4112
4113
static void setup_pci_device(void)
4114
{
4115
if (pci_ctl)
4116
return;
4117
4118
pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
4119
if (!pci_ctl) {
4120
pr_warn("%s(): Unable to create PCI control\n", __func__);
4121
pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
4122
}
4123
}
4124
4125
static const struct x86_cpu_id amd64_cpuids[] = {
4126
X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
4127
X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
4128
X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
4129
X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
4130
X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
4131
X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
4132
X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
4133
X86_MATCH_VENDOR_FAM(AMD, 0x1A, NULL),
4134
{ }
4135
};
4136
MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
4137
4138
static int __init amd64_edac_init(void)
4139
{
4140
const char *owner;
4141
int err = -ENODEV;
4142
int i;
4143
4144
if (ghes_get_devices())
4145
return -EBUSY;
4146
4147
owner = edac_get_owner();
4148
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
4149
return -EBUSY;
4150
4151
if (!x86_match_cpu(amd64_cpuids))
4152
return -ENODEV;
4153
4154
if (!amd_nb_num())
4155
return -ENODEV;
4156
4157
opstate_init();
4158
4159
err = -ENOMEM;
4160
ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
4161
if (!ecc_stngs)
4162
goto err_free;
4163
4164
msrs = msrs_alloc();
4165
if (!msrs)
4166
goto err_free;
4167
4168
for (i = 0; i < amd_nb_num(); i++) {
4169
err = probe_one_instance(i);
4170
if (err) {
4171
/* unwind properly */
4172
while (--i >= 0)
4173
remove_one_instance(i);
4174
4175
goto err_pci;
4176
}
4177
}
4178
4179
if (!edac_has_mcs()) {
4180
err = -ENODEV;
4181
goto err_pci;
4182
}
4183
4184
/* register stuff with EDAC MCE */
4185
if (boot_cpu_data.x86 >= 0x17) {
4186
amd_register_ecc_decoder(decode_umc_error);
4187
} else {
4188
amd_register_ecc_decoder(decode_bus_error);
4189
setup_pci_device();
4190
}
4191
4192
#ifdef CONFIG_X86_32
4193
amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
4194
#endif
4195
4196
return 0;
4197
4198
err_pci:
4199
pci_ctl_dev = NULL;
4200
4201
msrs_free(msrs);
4202
msrs = NULL;
4203
4204
err_free:
4205
kfree(ecc_stngs);
4206
ecc_stngs = NULL;
4207
4208
return err;
4209
}
4210
4211
static void __exit amd64_edac_exit(void)
4212
{
4213
int i;
4214
4215
if (pci_ctl)
4216
edac_pci_release_generic_ctl(pci_ctl);
4217
4218
/* unregister from EDAC MCE */
4219
if (boot_cpu_data.x86 >= 0x17)
4220
amd_unregister_ecc_decoder(decode_umc_error);
4221
else
4222
amd_unregister_ecc_decoder(decode_bus_error);
4223
4224
for (i = 0; i < amd_nb_num(); i++)
4225
remove_one_instance(i);
4226
4227
kfree(ecc_stngs);
4228
ecc_stngs = NULL;
4229
4230
pci_ctl_dev = NULL;
4231
4232
msrs_free(msrs);
4233
msrs = NULL;
4234
}
4235
4236
module_init(amd64_edac_init);
4237
module_exit(amd64_edac_exit);
4238
4239
MODULE_LICENSE("GPL");
4240
MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, Dave Peterson, Thayne Harbaugh; AMD");
4241
MODULE_DESCRIPTION("MC support for AMD64 memory controllers");
4242
4243
module_param(edac_op_state, int, 0444);
4244
MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
4245
4246