aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/amd64_edac.h
diff options
context:
space:
mode:
authorBorislav Petkov <borislav.petkov@amd.com>2010-10-08 12:32:29 -0400
committerBorislav Petkov <borislav.petkov@amd.com>2011-03-17 09:46:11 -0400
commitb2b0c605436e343a9a24f00e7fc8fb89a8316e20 (patch)
treeafc2d4300b7ad6e8b8c92d02cdf176e55fddc689 /drivers/edac/amd64_edac.h
parentb6a280bb96e0981a527d26cfb0fad203cb9bd808 (diff)
amd64_edac: Add support for F15h DCT PCI config accesses
F15h "multiplexes" between the configuration space of the two DRAM controllers by toggling D18F1x10C[DctCfgSel] while F10h has a different set of registers for DCT0, and DCT1 in extended PCI config space. Add DCT configuration space accessors per family thus wrapping all the different access prerequisites. Clean up code while at it, shorten names. Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
Diffstat (limited to 'drivers/edac/amd64_edac.h')
-rw-r--r--drivers/edac/amd64_edac.h49
1 files changed, 25 insertions, 24 deletions
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h
index 613ec72b0f6..91c266b9f6c 100644
--- a/drivers/edac/amd64_edac.h
+++ b/drivers/edac/amd64_edac.h
@@ -184,6 +184,7 @@
184 /* NOTE: Extra mask bit vs K8 */ 184 /* NOTE: Extra mask bit vs K8 */
185#define f10_dhar_offset(dhar) ((dhar & F10_DHAR_OFFSET_MASK) << 16) 185#define f10_dhar_offset(dhar) ((dhar & F10_DHAR_OFFSET_MASK) << 16)
186 186
187#define DCT_CFG_SEL 0x10C
187 188
188/* F10 High BASE/LIMIT registers */ 189/* F10 High BASE/LIMIT registers */
189#define F10_DRAM_BASE_HIGH 0x140 190#define F10_DRAM_BASE_HIGH 0x140
@@ -257,14 +258,14 @@
257 258
258 259
259#define F10_DCTL_SEL_LOW 0x110 260#define F10_DCTL_SEL_LOW 0x110
260#define dct_sel_baseaddr(pvt) ((pvt->dram_ctl_select_low) & 0xFFFFF800) 261#define dct_sel_baseaddr(pvt) ((pvt->dct_sel_low) & 0xFFFFF800)
261#define dct_sel_interleave_addr(pvt) (((pvt->dram_ctl_select_low) >> 6) & 0x3) 262#define dct_sel_interleave_addr(pvt) (((pvt->dct_sel_low) >> 6) & 0x3)
262#define dct_high_range_enabled(pvt) (pvt->dram_ctl_select_low & BIT(0)) 263#define dct_high_range_enabled(pvt) (pvt->dct_sel_low & BIT(0))
263#define dct_interleave_enabled(pvt) (pvt->dram_ctl_select_low & BIT(2)) 264#define dct_interleave_enabled(pvt) (pvt->dct_sel_low & BIT(2))
264#define dct_ganging_enabled(pvt) (pvt->dram_ctl_select_low & BIT(4)) 265#define dct_ganging_enabled(pvt) (pvt->dct_sel_low & BIT(4))
265#define dct_data_intlv_enabled(pvt) (pvt->dram_ctl_select_low & BIT(5)) 266#define dct_data_intlv_enabled(pvt) (pvt->dct_sel_low & BIT(5))
266#define dct_dram_enabled(pvt) (pvt->dram_ctl_select_low & BIT(8)) 267#define dct_dram_enabled(pvt) (pvt->dct_sel_low & BIT(8))
267#define dct_memory_cleared(pvt) (pvt->dram_ctl_select_low & BIT(10)) 268#define dct_memory_cleared(pvt) (pvt->dct_sel_low & BIT(10))
268 269
269#define F10_DCTL_SEL_HIGH 0x114 270#define F10_DCTL_SEL_HIGH 0x114
270 271
@@ -380,9 +381,11 @@ static inline int get_node_id(struct pci_dev *pdev)
380 return PCI_SLOT(pdev->devfn) - 0x18; 381 return PCI_SLOT(pdev->devfn) - 0x18;
381} 382}
382 383
383enum amd64_chipset_families { 384enum amd_families {
384 K8_CPUS = 0, 385 K8_CPUS = 0,
385 F10_CPUS, 386 F10_CPUS,
387 F15_CPUS,
388 NUM_FAMILIES,
386}; 389};
387 390
388/* Error injection control structure */ 391/* Error injection control structure */
@@ -448,9 +451,9 @@ struct amd64_pvt {
448 u64 top_mem; /* top of memory below 4GB */ 451 u64 top_mem; /* top of memory below 4GB */
449 u64 top_mem2; /* top of memory above 4GB */ 452 u64 top_mem2; /* top of memory above 4GB */
450 453
451 u32 dram_ctl_select_low; /* DRAM Controller Select Low Reg */ 454 u32 dct_sel_low; /* DRAM Controller Select Low Reg */
452 u32 dram_ctl_select_high; /* DRAM Controller Select High Reg */ 455 u32 dct_sel_hi; /* DRAM Controller Select High Reg */
453 u32 online_spare; /* On-Line spare Reg */ 456 u32 online_spare; /* On-Line spare Reg */
454 457
455 /* x4 or x8 syndromes in use */ 458 /* x4 or x8 syndromes in use */
456 u8 syn_type; 459 u8 syn_type;
@@ -519,6 +522,8 @@ struct low_ops {
519 void (*map_sysaddr_to_csrow) (struct mem_ctl_info *mci, 522 void (*map_sysaddr_to_csrow) (struct mem_ctl_info *mci,
520 struct err_regs *info, u64 SystemAddr); 523 struct err_regs *info, u64 SystemAddr);
521 int (*dbam_to_cs) (struct amd64_pvt *pvt, int cs_mode); 524 int (*dbam_to_cs) (struct amd64_pvt *pvt, int cs_mode);
525 int (*read_dct_pci_cfg) (struct amd64_pvt *pvt, int offset,
526 u32 *val, const char *func);
522}; 527};
523 528
524struct amd64_family_type { 529struct amd64_family_type {
@@ -527,21 +532,17 @@ struct amd64_family_type {
527 struct low_ops ops; 532 struct low_ops ops;
528}; 533};
529 534
530static inline int amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset, 535int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
531 u32 *val, const char *func) 536 u32 val, const char *func);
532{
533 int err = 0;
534 537
535 err = pci_read_config_dword(pdev, offset, val); 538#define amd64_read_pci_cfg(pdev, offset, val) \
536 if (err) 539 __amd64_read_pci_cfg_dword(pdev, offset, val, __func__)
537 amd64_warn("%s: error reading F%dx%x.\n",
538 func, PCI_FUNC(pdev->devfn), offset);
539 540
540 return err; 541#define amd64_write_pci_cfg(pdev, offset, val) \
541} 542 __amd64_write_pci_cfg_dword(pdev, offset, val, __func__)
542 543
543#define amd64_read_pci_cfg(pdev, offset, val) \ 544#define amd64_read_dct_pci_cfg(pvt, offset, val) \
544 amd64_read_pci_cfg_dword(pdev, offset, val, __func__) 545 pvt->ops->read_dct_pci_cfg(pvt, offset, val, __func__)
545 546
546/* 547/*
547 * For future CPU versions, verify the following as new 'slow' rates appear and 548 * For future CPU versions, verify the following as new 'slow' rates appear and