From fa68e7a77c3c27dba1f667039dd6b3be61c81049 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Mon, 19 Sep 2011 17:34:45 +0200 Subject: [PATCH] --- yaml --- r: 271551 b: refs/heads/master c: 73ba85937b2a07b6401ba0b7ca06a112762de9f7 h: refs/heads/master i: 271549: 6b32b53e94e7c412a5991d93fac93a093933c229 271547: 0f4bac9ba35332f78bf487ca695f840aa7b2d6a0 271543: db766de7015736f34e050e6ebef33b69054afc64 271535: 6e2c0053a789819ff90cd8da9f29ba4202e0d874 271519: b2538392cbe65abc73c24c6b5c9270a84ec7f36a 271487: ffecfe70e10bd6eef08fbbc6209dc95a06f7f04d v: v3 --- [refs] | 2 +- trunk/drivers/edac/amd64_edac.c | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 968c6634fac8..b2847443b8bd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b0b07a2bd4fbb6198d4e7142337214eeb77c417a +refs/heads/master: 73ba85937b2a07b6401ba0b7ca06a112762de9f7 diff --git a/trunk/drivers/edac/amd64_edac.c b/trunk/drivers/edac/amd64_edac.c index 9bf0b6228529..367756a48ebe 100644 --- a/trunk/drivers/edac/amd64_edac.c +++ b/trunk/drivers/edac/amd64_edac.c @@ -114,10 +114,22 @@ static int f10_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val, return __amd64_read_pci_cfg_dword(pvt->F2, addr, val, func); } +/* + * Select DCT to which PCI cfg accesses are routed + */ +static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct) +{ + u32 reg = 0; + + amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®); + reg &= 0xfffffffe; + reg |= dct; + amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg); +} + static int f15_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val, const char *func) { - u32 reg = 0; u8 dct = 0; if (addr >= 0x140 && addr <= 0x1a0) { @@ -125,10 +137,7 @@ static int f15_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val, addr -= 0x100; } - amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®); - reg &= 0xfffffffe; - reg |= dct; - amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg); + f15h_select_dct(pvt, dct); return __amd64_read_pci_cfg_dword(pvt->F2, addr, val, func); } @@ -198,6 +207,10 @@ static int amd64_set_scrub_rate(struct mem_ctl_info *mci, u32 bw) if (boot_cpu_data.x86 == 0xf) min_scrubrate = 0x0; + /* F15h Erratum #505 */ + if (boot_cpu_data.x86 == 0x15) + f15h_select_dct(pvt, 0); + return __amd64_set_scrub_rate(pvt->F3, bw, min_scrubrate); } @@ -207,6 +220,10 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci) u32 scrubval = 0; int i, retval = -EINVAL; + /* F15h Erratum #505 */ + if (boot_cpu_data.x86 == 0x15) + f15h_select_dct(pvt, 0); + amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval); scrubval = scrubval & 0x001F;