From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753117AbbIPUpT (ORCPT ); Wed, 16 Sep 2015 16:45:19 -0400 Received: from mail-bl2on0082.outbound.protection.outlook.com ([65.55.169.82]:1728 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752352AbbIPUpR (ORCPT ); Wed, 16 Sep 2015 16:45:17 -0400 X-Greylist: delayed 865 seconds by postgrey-1.27 at vger.kernel.org; Wed, 16 Sep 2015 16:45:16 EDT Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none;alien8.de; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0NUSEAZ-08-CM6-02 X-M-MSG: From: Aravind Gopalakrishnan To: , , CC: , Subject: [PATCH 2/3] EDAC, amd64_edac: Extend scrub rate programmability feature for F15hM60h Date: Wed, 16 Sep 2015 15:53:30 -0500 Message-ID: <1442436811-23382-3-git-send-email-Aravind.Gopalakrishnan@amd.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1442436811-23382-1-git-send-email-Aravind.Gopalakrishnan@amd.com> References: <1442436811-23382-1-git-send-email-Aravind.Gopalakrishnan@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(50986999)(46102003)(575784001)(101416001)(19580395003)(19580405001)(76176999)(5003940100001)(47776003)(189998001)(48376002)(64706001)(105586002)(87936001)(229853001)(36756003)(86362001)(50466002)(50226001)(106466001)(2201001)(2950100001)(5003600100002)(53416004)(5007970100001)(4001540100001)(11100500001)(5001860100001)(92566002)(62966003)(77156002)(68736005)(5001830100001)(5001770100001)(77096005)(97736004);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0714;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0714;2:BpaDkZ5YBKBNalBDBNBPrZSw7Z0Zi4uDS+E2wc+ym+MpJ8qdKXPR+bJVfh9h8RHhnU52spsr0A0nFtoXfRr+kT3q6zW8CyBsKYKpn9R+9H8GTG/xCVmxoen+erMxbefPEnUYdKMgvk/z5Pb9O6XChH0kTxofWkLWaLWp0fnswCo=;3:DyvGOqBasxB7sqE2CAQFAOWZQ17TDiyQI9Ceg65CF6YFOVD1K5k1PC/O0U8Fabp/G8h3Zovy3ihsjwCP1rphDJ8txP93aV7Ha7NSS1ulDAmeVMhQcMKaLE81WUeiwHzsyWafveBVfiiUx+4dHxElg2h+3ZHtT3WJ3jhM0AO6NJv0bT7dYaGgn+nex7Aq0zQ1CPwm2MkU4ksJHLPDAnMXNBQLoLYkyiZXUVEdfjcG0XKACZ3qy/ZKpXD90US05H2j;25:COC1bkanuj039sRcL9jPk5fK8FBiPD4ouRr/ZejSL7Etvi0bE9GAaC+6otxn+pgiu8VrZtLY3KG5FIQ+NmXsU0XU9EIhYIRk6WfPVJ+bBHP15KSnRrTjaGREHy8AXyTzxmqmLO73NDsgPuWPpLQBAZF/Sgyx8KWz4199CefwuWsPJREtS0skh7IHdzQLBhgQreHNz37QgkvkFU+XfbKss1ZezbtBWvFlOZQrQgAUlgOK/W0WuNJHBpj26n6VTlLY X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0714; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0714;20:yOCcHV/uIxVJfRImdiRql98wpP71WJVpXQhn+ceMMXlfNYWyF8Umv+JYnSiPP2Xwz8wLg4g19NxqK8+bbccY88Qprj7IxS12sx7J0R/VU0srV4eMwJGxZPm3g04kmm4QW6Fz6bz9XBaLwHYXguQz8gnyXxSuINIXwohcj7KsnBum48OtmO2/LZ1te3CSq0TQqM149gChtrxcZhTaHQcDbq8a4Eku9jrQ4rl8vGeXBfNOkUgYeG/PlwaKFj08FK9qa5lyO+3dK9tWD8+Kh8VH94ZudCufmOk/gMfJN4oUEGSaieEmt4GJdIE1T5r20VgLEdnn2dY1v8CLzfPDOdFVEfwzbbC5gOQagYNqpeISiqs43OsmPgEa447QELbZZSwpk31xtbFqMi2qMeAoSDwVtXeUHzt/SSHF2PnNAsxzEwynkC5Uy7NWvLza1sXpfTmeoox4kpe+FQlliWy4GCNa5d/IGv3PUnMSqZBYyCnUHp6hUUcFjJpgLjrPcCpea8kC;4:Px3616e3XtPvsBwKBv7q7qcLc5kCEidqSyJOhqR3FMGzRRtCA2VXlRw47/6VsagfFhJnEGvkFPMHl9LkJlNI33CTIzmUhVMNPtU1lB8V/AaY1iLxel9VTd26BLhoSq/eLvt96ZcT7//+4biK+lXasaJzVYmb0XRPt5bv/wGSHIZXzWPyrwX1rgT3HCbH/2mOAhMjgm4JXhmZt/usqkOSSjf3f+PC47uMmkxk36pK14i60UQV7iXuQ4X63UzVbV9rJ2Y9vpkWA4yxJ2oJoZAZehEu//9+FfyhZWTsx9EMOawbMvxCk+8Zjfn1wnf5Q6G5rp/A0Zn1d2YSIW0FhNcsdg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(520078)(8121501046)(5005006)(3002001);SRVR:CY1PR12MB0714;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0714; X-Forefront-PRVS: 07013D7479 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0714;23:a/IrfOa6UZXuFLiA+8g4hduC9FvsMGcewpZSR5zJ3?= =?us-ascii?Q?T7562BHwXuCyFjU/KjLKVHdBx9umiaXkG4isWImdDHkWqXSfpcNQA60IXmRv?= =?us-ascii?Q?yvueDUIKMndCSHJgGpbx/eftdUvThgE5e9v5SaCU+29VT73OLh64xjRpHXz3?= =?us-ascii?Q?EasSaLToffVa6xhkYB6OdMcCv8TO37MRCQsYaak0hwK3PyFN4wLmK644vMzR?= =?us-ascii?Q?trnSS1aq/Fpv7zdweDZ3YRfZUzuf6YKfoBU/PYzitsmv+H8gj6pXJgFQcvKr?= =?us-ascii?Q?uXpBg4U2Kb8cKhziPjGMHYSpRbdgiiiN5B37Q3wLFXbSwVwE6jHNHfeeINdI?= =?us-ascii?Q?5ZHgq+8nwIaHrrvr2vXpF5Dz/vdrXdfDIppj+/jxGuBvC3lX8TnneYkadcmy?= =?us-ascii?Q?NLZRPkNdwvtjwEMb+LGvnddN+MYO6hKnZmqWUrAsJKgUcO+ysO+dmuscL6xx?= =?us-ascii?Q?ayUB6cb01F5rJkKcBjMu/AHVhsDsd5IU884jnZQVzTva/vp+NNa1qzGjvxOc?= =?us-ascii?Q?0qhN/cumSBkzMBiB2qUn/wWbl7ItdAB/7/VhxrgDBaGxAiV/Z/h1DVJ2STIG?= =?us-ascii?Q?rPkyT/57sv9TrinHG26JpoIXhdi4HI9hxsX5MWbEPbGUMPJqMO2EzNx7pKfS?= =?us-ascii?Q?V7Nk2erkMXXWQGneJkLp3WdSCTxR8TovNrNW918vuka739UiF8eg9Ilaew3V?= =?us-ascii?Q?x6ntVqJLpFlA6XRexO5kNn8oKbFMl5uL69Jxb7eiUmlsIXvx7pWHDWQEMqLC?= =?us-ascii?Q?wy/0hU7BU9mhtxb+ryS/pKP8fBT8VemPtP4lAt+2a/iA+zNTZwm6yB83rgPT?= =?us-ascii?Q?M7CmeHamkL4JivKxnTc2SQAHN6Pl55gh/w1a4Hf3mf0CWVOeKFDdq0T9lcmS?= =?us-ascii?Q?Lhviju9FWGrkrRd7IbDMj7/2fthRuYoekSm/ZPzeTQHVpZIALO5LGe5TcTuE?= =?us-ascii?Q?i3uTvBcK3QfmD1CNyB3YRO2PHBV0tnCOxdilwS9xhXG4E+H0X5V/OTDIRj0w?= =?us-ascii?Q?j0qO+zFOuga4EVEjP8qmP/+s1OUBXTHYYZswjwcXEsLlQnxVnFhJPK09F3TG?= =?us-ascii?Q?5cxCuZ9V0aOjGO2YUz2GA9pQfm+zUwENwHJTjNLvMANVdlF36f74ep3lt9PK?= =?us-ascii?Q?YZ81+kcUfP+Fe+N+Ny5TPeBh4oJXbMi?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0714;5:mzAsysHsepr+Vg9axT7BASikh+ZXRqKaesYch7TNnlN9jaiAA+NZ3NG9JUN4PTNEg2WoyXCU8Cp9+x17dXYPeib5JS8aQSkEEtuhmEx6nUjURrARy32yTxS7H+YtgpXdeiJt6ngIvZu7tmhkYHGx5w==;24:uI6ByKjOZWEPdIxaF7WwdR8cthqX22gxzndeM23RDTciwNxDARW46ZaCHXWpIsC6nzaXsbprjNcbskouTVWGRK41yPSePSFgX/rGdfOV7kc=;20:RbJlW3pQaSBdSfaGHA241i8GhvERIyKBDVs5YPwKWIGflrtAKXEMnuVieWc/roL10TXJy9UWhleh9bubPGWzYg== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Sep 2015 20:30:38.4773 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0714 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For F15h M60h processor, the scrub rate control register has moved to F2 of PCI config space and is at a different offset from earlier processors. The minimun recommended scrub rate is also different. (Refer D18F2x1c8_dct[1:0][DramScrub] on Fam15hM60h BKDG) Modify the set_scrub_rate() and get_scrub_rate() functions so that they are aware of these changes. Fixing couple of indentation issues since I am touching the file. Tested on F15hM60h, Fam15h Models 00h-0fh and Fam10h systems and it works fine. Signed-off-by: Aravind Gopalakrishnan --- drivers/edac/amd64_edac.c | 53 ++++++++++++++++++++++++++++++++++++++--------- drivers/edac/amd64_edac.h | 3 +++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 73aea40..1ec4a13 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -173,7 +173,7 @@ static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct, * scan the scrub rate mapping table for a close or matching bandwidth value to * issue. If requested is too big, then use last maximum value found. */ -static int __set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) +static u32 find_scrub_rate(u32 new_bw, u32 min_rate, u32 *scrub_bw) { u32 scrubval; int i; @@ -200,28 +200,52 @@ static int __set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) } scrubval = scrubrates[i].scrubval; + *scrub_bw = scrubval ? scrubrates[i].bandwidth : 0; - pci_write_bits32(ctl, SCRCTRL, scrubval, 0x001F); + return scrubval; +} - if (scrubval) - return scrubrates[i].bandwidth; +static inline void __set_scrub_rate(struct pci_dev *ctl, int offset, + u32 scrubval) +{ + pci_write_bits32(ctl, offset, scrubval, SCRMASK); - return 0; } static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw) { struct amd64_pvt *pvt = mci->pvt_info; u32 min_scrubrate = 0x5; + u32 scrubrate, scrub_bw; if (pvt->fam == 0xf) min_scrubrate = 0x0; + else if (pvt->fam == 0x15 && pvt->model == 0x60) + min_scrubrate = 0x6; /* Erratum #505 */ if (pvt->fam == 0x15 && pvt->model < 0x10) f15h_select_dct(pvt, 0); - return __set_scrub_rate(pvt->F3, bw, min_scrubrate); + scrubrate = find_scrub_rate(bw, min_scrubrate, &scrub_bw); + + /* Scrub rate control register moved to F2 register space for + * F15hM60h andit is per DCT now. So, need to select the DCT + * using DCT_CFG_SEL first and then program the scrubrate + */ + if (pvt->fam == 0x15 && pvt->model == 0x60) { + f15h_select_dct(pvt, 0); + __set_scrub_rate(pvt->F2, F15H_M60H_SCRCTRL, scrubrate); + f15h_select_dct(pvt, 1); + __set_scrub_rate(pvt->F2, F15H_M60H_SCRCTRL, scrubrate); + + goto scrub_out; + } + + __set_scrub_rate(pvt->F3, SCRCTRL, scrubrate); + +scrub_out: + return scrub_bw; } static int get_scrub_rate(struct mem_ctl_info *mci) @@ -234,9 +258,18 @@ static int get_scrub_rate(struct mem_ctl_info *mci) if (pvt->fam == 0x15 && pvt->model < 0x10) f15h_select_dct(pvt, 0); - amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval); + if (pvt->fam == 0x15 && pvt->model == 0x60) { + /* Since we mirror the same scrubrate value across + * both DCTs, it is enough to read the value off one of + * the DCT registers. + */ + f15h_select_dct(pvt, 0); + amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval); + } else { + amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval); + } - scrubval = scrubval & 0x001F; + scrubval = scrubval & SCRMASK; for (i = 0; i < ARRAY_SIZE(scrubrates); i++) { if (scrubrates[i].scrubval == scrubval) { @@ -1316,7 +1349,7 @@ static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct, * F16h and F15h model 30h have only limited cs_modes. */ static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct, - unsigned cs_mode, int cs_mask_nr) + unsigned cs_mode, int cs_mask_nr) { WARN_ON(cs_mode > 12); @@ -1666,7 +1699,7 @@ static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range, } static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range, - u64 sys_addr, int *chan_sel) + u64 sys_addr, int *chan_sel) { int cs_found = -EINVAL; int num_dcts_intlv = 0; diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 4bdec75..15c0eb4 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -255,6 +255,8 @@ #define DCT_SEL_HI 0x114 +#define F15H_M60H_SCRCTRL 0x1C8 + /* * Function 3 - Misc Control */ @@ -269,6 +271,7 @@ #define NBSL_PP_OBS 0x2 #define SCRCTRL 0x58 +#define SCRMASK 0x1F #define F10_ONLINE_SPARE 0xB0 #define online_spare_swap_done(pvt, c) (((pvt)->online_spare >> (1 + 2 * (c))) & 0x1) -- 2.5.0