1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <linux/module.h>
66#include <linux/ctype.h>
67#include <linux/init.h>
68#include <linux/pci.h>
69#include <linux/pci_ids.h>
70#include <linux/slab.h>
71#include <linux/mmzone.h>
72#include <linux/edac.h>
73#include <asm/msr.h>
74#include "edac_core.h"
75#include "edac_mce_amd.h"
76
77#define amd64_printk(level, fmt, arg...) \
78 edac_printk(level, "amd64", fmt, ##arg)
79
80#define amd64_mc_printk(mci, level, fmt, arg...) \
81 edac_mc_chipset_printk(mci, level, "amd64", fmt, ##arg)
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132#define EDAC_AMD64_VERSION " Ver: 3.2.0 " __DATE__
133#define EDAC_MOD_STR "amd64_edac"
134
135#define EDAC_MAX_NUMNODES 8
136
137
138#define OPTERON_CPU_LE_REV_C 0
139#define OPTERON_CPU_REV_D 1
140#define OPTERON_CPU_REV_E 2
141
142
143#define OPTERON_CPU_REV_F 4
144#define OPTERON_CPU_REV_FA 5
145
146
147#define MAX_CS_COUNT 8
148#define DRAM_REG_COUNT 8
149
150
151
152
153
154
155
156
157
158
159#define K8_DRAM_BASE_LOW 0x40
160#define K8_DRAM_LIMIT_LOW 0x44
161#define K8_DHAR 0xf0
162
163#define DHAR_VALID BIT(0)
164#define F10_DRAM_MEM_HOIST_VALID BIT(1)
165
166#define DHAR_BASE_MASK 0xff000000
167#define dhar_base(dhar) (dhar & DHAR_BASE_MASK)
168
169#define K8_DHAR_OFFSET_MASK 0x0000ff00
170#define k8_dhar_offset(dhar) ((dhar & K8_DHAR_OFFSET_MASK) << 16)
171
172#define F10_DHAR_OFFSET_MASK 0x0000ff80
173
174#define f10_dhar_offset(dhar) ((dhar & F10_DHAR_OFFSET_MASK) << 16)
175
176
177
178#define F10_DRAM_BASE_HIGH 0x140
179#define F10_DRAM_LIMIT_HIGH 0x144
180
181
182
183
184
185#define K8_DCSB0 0x40
186#define F10_DCSB1 0x140
187
188#define K8_DCSB_CS_ENABLE BIT(0)
189#define K8_DCSB_NPT_SPARE BIT(1)
190#define K8_DCSB_NPT_TESTFAIL BIT(2)
191
192
193
194
195
196#define REV_E_DCSB_BASE_BITS (0xFFE0FE00ULL)
197#define REV_E_DCS_SHIFT 4
198
199#define REV_F_F1Xh_DCSB_BASE_BITS (0x1FF83FE0ULL)
200#define REV_F_F1Xh_DCS_SHIFT 8
201
202
203
204
205
206#define REV_F_DCSB_BASE_BITS (0x1FF83FE0ULL)
207#define REV_F_DCS_SHIFT 8
208
209
210#define K8_DCSM0 0x60
211#define F10_DCSM1 0x160
212
213
214#define REV_E_DCSM_MASK_BITS 0x3FE0FE00
215
216
217#define REV_E_DCS_NOTUSED_BITS 0x01F01FFF
218
219
220#define REV_F_F1Xh_DCSM_MASK_BITS 0x1FF83FE0
221
222
223#define REV_F_F1Xh_DCS_NOTUSED_BITS 0x07C01FFF
224
225#define DBAM0 0x80
226#define DBAM1 0x180
227
228
229#define DBAM_DIMM(i, reg) ((((reg) >> (4*i))) & 0xF)
230
231#define DBAM_MAX_VALUE 11
232
233
234#define F10_DCLR_0 0x90
235#define F10_DCLR_1 0x190
236#define REVE_WIDTH_128 BIT(16)
237#define F10_WIDTH_128 BIT(11)
238
239
240#define F10_DCHR_0 0x94
241#define F10_DCHR_1 0x194
242
243#define F10_DCHR_FOUR_RANK_DIMM BIT(18)
244#define F10_DCHR_Ddr3Mode BIT(8)
245#define F10_DCHR_MblMode BIT(6)
246
247
248#define F10_DCTL_SEL_LOW 0x110
249
250#define dct_sel_baseaddr(pvt) \
251 ((pvt->dram_ctl_select_low) & 0xFFFFF800)
252
253#define dct_sel_interleave_addr(pvt) \
254 (((pvt->dram_ctl_select_low) >> 6) & 0x3)
255
256enum {
257 F10_DCTL_SEL_LOW_DctSelHiRngEn = BIT(0),
258 F10_DCTL_SEL_LOW_DctSelIntLvEn = BIT(2),
259 F10_DCTL_SEL_LOW_DctGangEn = BIT(4),
260 F10_DCTL_SEL_LOW_DctDatIntLv = BIT(5),
261 F10_DCTL_SEL_LOW_DramEnable = BIT(8),
262 F10_DCTL_SEL_LOW_MemCleared = BIT(10),
263};
264
265#define dct_high_range_enabled(pvt) \
266 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_DctSelHiRngEn)
267
268#define dct_interleave_enabled(pvt) \
269 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_DctSelIntLvEn)
270
271#define dct_ganging_enabled(pvt) \
272 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_DctGangEn)
273
274#define dct_data_intlv_enabled(pvt) \
275 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_DctDatIntLv)
276
277#define dct_dram_enabled(pvt) \
278 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_DramEnable)
279
280#define dct_memory_cleared(pvt) \
281 (pvt->dram_ctl_select_low & F10_DCTL_SEL_LOW_MemCleared)
282
283
284#define F10_DCTL_SEL_HIGH 0x114
285
286
287
288
289
290#define K8_NBCTL 0x40
291
292
293#define K8_NBCTL_CECCEn BIT(0)
294
295
296#define K8_NBCTL_UECCEn BIT(1)
297
298#define K8_NBCFG 0x44
299#define K8_NBCFG_CHIPKILL BIT(23)
300#define K8_NBCFG_ECC_ENABLE BIT(22)
301
302#define K8_NBSL 0x48
303
304
305
306#define F10_NBSL_EXT_ERR_RES 0x0
307#define F10_NBSL_EXT_ERR_ECC 0x8
308
309
310#define F10_NBSL_EXT_ERR_LINK_PROTO 0xB
311#define F10_NBSL_EXT_ERR_L3_PROTO 0xB
312
313#define F10_NBSL_EXT_ERR_NB_ARRAY 0xC
314#define F10_NBSL_EXT_ERR_DRAM_PARITY 0xD
315#define F10_NBSL_EXT_ERR_LINK_RETRY 0xE
316
317
318#define F10_NBSL_EXT_ERR_GART_WALK 0xF
319#define F10_NBSL_EXT_ERR_DEV_WALK 0xF
320
321
322#define F10_NBSL_EXT_ERR_L3_DATA 0x1C
323#define F10_NBSL_EXT_ERR_L3_TAG 0x1D
324#define F10_NBSL_EXT_ERR_L3_LRU 0x1E
325
326
327#define K8_NBSL_EXT_ERR_ECC 0x0
328#define K8_NBSL_EXT_ERR_CRC 0x1
329#define K8_NBSL_EXT_ERR_SYNC 0x2
330#define K8_NBSL_EXT_ERR_MST 0x3
331#define K8_NBSL_EXT_ERR_TGT 0x4
332#define K8_NBSL_EXT_ERR_GART 0x5
333#define K8_NBSL_EXT_ERR_RMW 0x6
334#define K8_NBSL_EXT_ERR_WDT 0x7
335#define K8_NBSL_EXT_ERR_CHIPKILL_ECC 0x8
336#define K8_NBSL_EXT_ERR_DRAM_PARITY 0xD
337
338
339
340
341
342#define K8_NBSL_PP_SRC 0x0
343#define K8_NBSL_PP_RES 0x1
344#define K8_NBSL_PP_OBS 0x2
345#define K8_NBSL_PP_GENERIC 0x3
346
347#define EXTRACT_ERR_CPU_MAP(x) ((x) & 0xF)
348
349#define K8_NBEAL 0x50
350#define K8_NBEAH 0x54
351#define K8_SCRCTRL 0x58
352
353#define F10_NB_CFG_LOW 0x88
354#define F10_NB_CFG_LOW_ENABLE_EXT_CFG BIT(14)
355
356#define F10_NB_CFG_HIGH 0x8C
357
358#define F10_ONLINE_SPARE 0xB0
359#define F10_ONLINE_SPARE_SWAPDONE0(x) ((x) & BIT(1))
360#define F10_ONLINE_SPARE_SWAPDONE1(x) ((x) & BIT(3))
361#define F10_ONLINE_SPARE_BADDRAM_CS0(x) (((x) >> 4) & 0x00000007)
362#define F10_ONLINE_SPARE_BADDRAM_CS1(x) (((x) >> 8) & 0x00000007)
363
364#define F10_NB_ARRAY_ADDR 0xB8
365
366#define F10_NB_ARRAY_DRAM_ECC 0x80000000
367
368
369#define SET_NB_ARRAY_ADDRESS(section) (((section) & 0x3) << 1)
370
371#define F10_NB_ARRAY_DATA 0xBC
372
373#define SET_NB_DRAM_INJECTION_WRITE(word, bits) \
374 (BIT(((word) & 0xF) + 20) | \
375 BIT(17) | bits)
376
377#define SET_NB_DRAM_INJECTION_READ(word, bits) \
378 (BIT(((word) & 0xF) + 20) | \
379 BIT(16) | bits)
380
381#define K8_NBCAP 0xE8
382#define K8_NBCAP_CORES (BIT(12)|BIT(13))
383#define K8_NBCAP_CHIPKILL BIT(4)
384#define K8_NBCAP_SECDED BIT(3)
385#define K8_NBCAP_8_NODE BIT(2)
386#define K8_NBCAP_DUAL_NODE BIT(1)
387#define K8_NBCAP_DCT_DUAL BIT(0)
388
389
390
391
392#define K8_MSR_MCGCTL 0x017b
393#define K8_MSR_MCGCTL_NBE BIT(4)
394
395#define K8_MSR_MC4CTL 0x0410
396#define K8_MSR_MC4STAT 0x0411
397#define K8_MSR_MC4ADDR 0x0412
398
399
400static inline int get_node_id(struct pci_dev *pdev)
401{
402 return PCI_SLOT(pdev->devfn) - 0x18;
403}
404
405enum amd64_chipset_families {
406 K8_CPUS = 0,
407 F10_CPUS,
408 F11_CPUS,
409};
410
411
412struct error_injection {
413 u32 section;
414 u32 word;
415 u32 bit_map;
416};
417
418struct amd64_pvt {
419
420 struct pci_dev *addr_f1_ctl;
421 struct pci_dev *dram_f2_ctl;
422 struct pci_dev *misc_f3_ctl;
423
424 int mc_node_id;
425 int ext_model;
426
427 struct low_ops *ops;
428
429 int channel_count;
430
431
432 u32 dclr0;
433 u32 dclr1;
434 u32 dchr0;
435 u32 dchr1;
436 u32 nbcap;
437 u32 nbcfg;
438 u32 ext_nbcfg;
439 u32 dhar;
440 u32 dbam0;
441 u32 dbam1;
442
443
444 u32 dcsb0[MAX_CS_COUNT];
445 u32 dcsb1[MAX_CS_COUNT];
446
447
448 u32 dcsm0[MAX_CS_COUNT];
449 u32 dcsm1[MAX_CS_COUNT];
450
451
452
453
454
455 u64 dram_base[DRAM_REG_COUNT];
456 u64 dram_limit[DRAM_REG_COUNT];
457 u8 dram_IntlvSel[DRAM_REG_COUNT];
458 u8 dram_IntlvEn[DRAM_REG_COUNT];
459 u8 dram_DstNode[DRAM_REG_COUNT];
460 u8 dram_rw_en[DRAM_REG_COUNT];
461
462
463
464
465
466
467 u32 dcsb_base;
468 u32 dcsm_mask;
469 u32 cs_count;
470 u32 num_dcsm;
471 u32 dcs_mask_notused;
472 u32 dcs_shift;
473
474 u64 top_mem;
475 u64 top_mem2;
476
477 u32 dram_ctl_select_low;
478 u32 dram_ctl_select_high;
479 u32 online_spare;
480
481
482 struct err_regs ctl_error_info;
483
484
485 struct error_injection injection;
486
487
488 u32 nbctl_mcgctl_saved;
489 u32 old_nbctl;
490 unsigned long old_mcgctl;
491
492
493 u32 mc_type_index;
494
495
496 struct flags {
497 unsigned long cf8_extcfg:1;
498 } flags;
499};
500
501struct scrubrate {
502 u32 scrubval;
503 u32 bandwidth;
504};
505
506extern struct scrubrate scrubrates[23];
507extern u32 revf_quad_ddr2_shift[16];
508extern const char *tt_msgs[4];
509extern const char *ll_msgs[4];
510extern const char *rrrr_msgs[16];
511extern const char *to_msgs[2];
512extern const char *pp_msgs[4];
513extern const char *ii_msgs[4];
514extern const char *ext_msgs[32];
515extern const char *htlink_msgs[8];
516
517#ifdef CONFIG_EDAC_DEBUG
518#define NUM_DBG_ATTRS 9
519#else
520#define NUM_DBG_ATTRS 0
521#endif
522
523#ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
524#define NUM_INJ_ATTRS 5
525#else
526#define NUM_INJ_ATTRS 0
527#endif
528
529extern struct mcidev_sysfs_attribute amd64_dbg_attrs[NUM_DBG_ATTRS],
530 amd64_inj_attrs[NUM_INJ_ATTRS];
531
532
533
534
535
536struct low_ops {
537 int (*probe_valid_hardware)(struct amd64_pvt *pvt);
538 int (*early_channel_count)(struct amd64_pvt *pvt);
539
540 u64 (*get_error_address)(struct mem_ctl_info *mci,
541 struct err_regs *info);
542 void (*read_dram_base_limit)(struct amd64_pvt *pvt, int dram);
543 void (*read_dram_ctl_register)(struct amd64_pvt *pvt);
544 void (*map_sysaddr_to_csrow)(struct mem_ctl_info *mci,
545 struct err_regs *info,
546 u64 SystemAddr);
547 int (*dbam_map_to_pages)(struct amd64_pvt *pvt, int dram_map);
548};
549
550struct amd64_family_type {
551 const char *ctl_name;
552 u16 addr_f1_ctl;
553 u16 misc_f3_ctl;
554 struct low_ops ops;
555};
556
557static struct amd64_family_type amd64_family_types[];
558
559static inline const char *get_amd_family_name(int index)
560{
561 return amd64_family_types[index].ctl_name;
562}
563
564static inline struct low_ops *family_ops(int index)
565{
566 return &amd64_family_types[index].ops;
567}
568
569
570
571
572
573#define K8_MIN_SCRUB_RATE_BITS 0x0
574#define F10_MIN_SCRUB_RATE_BITS 0x5
575#define F11_MIN_SCRUB_RATE_BITS 0x6
576
577int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
578 u64 *hole_offset, u64 *hole_size);
579