From patchwork Wed Sep 18 04:12:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 2904721 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6A8B6BFF05 for ; Wed, 18 Sep 2013 04:20:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7D34920203 for ; Wed, 18 Sep 2013 04:20:23 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 8E37A201FF for ; Wed, 18 Sep 2013 04:20:22 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8CDACE702A for ; Tue, 17 Sep 2013 21:20:22 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail.bwidawsk.net (bwidawsk.net [166.78.191.112]) by gabe.freedesktop.org (Postfix) with ESMTP id 332B3E5C0A for ; Tue, 17 Sep 2013 21:13:31 -0700 (PDT) Received: by mail.bwidawsk.net (Postfix, from userid 5001) id 7068F59E17; Tue, 17 Sep 2013 21:13:30 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from lundgren.intel.com (c-24-21-100-90.hsd1.or.comcast.net [24.21.100.90]) by mail.bwidawsk.net (Postfix) with ESMTPSA id 40CCF59E1C; Tue, 17 Sep 2013 21:13:07 -0700 (PDT) From: Ben Widawsky To: Intel GFX Date: Tue, 17 Sep 2013 21:12:53 -0700 Message-Id: <1379477575-2164-12-git-send-email-benjamin.widawsky@intel.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1379477575-2164-1-git-send-email-benjamin.widawsky@intel.com> References: <1379477575-2164-1-git-send-email-benjamin.widawsky@intel.com> Cc: Bryan Bell , Ben Widawsky , Ben Widawsky Subject: [Intel-gfx] [PATCH 12/14] intel_l3_parity: Actually support multiple slices X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Ben Widawsky --- tools/intel_l3_parity.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/tools/intel_l3_parity.c b/tools/intel_l3_parity.c index c98eb80..ed7034a 100644 --- a/tools/intel_l3_parity.c +++ b/tools/intel_l3_parity.c @@ -41,19 +41,28 @@ static unsigned int devid; /* L3 size is always a function of banks. The number of banks cannot be * determined by number of slices however */ -#define MAX_BANKS 4 -#define NUM_BANKS \ - ((devid == PCI_CHIP_IVYBRIDGE_GT1 || devid == PCI_CHIP_IVYBRIDGE_M_GT1) ? 2 : 4) +static inline int num_banks(void) { + if (IS_HSW_GT3(devid)) + return 8; /* 4 per each slice */ + else if (IS_HSW_GT1(devid) || + devid == PCI_CHIP_IVYBRIDGE_GT1 || + devid == PCI_CHIP_IVYBRIDGE_M_GT1) + return 2; + else + return 4; +} #define NUM_SUBBANKS 8 #define BYTES_PER_BANK (128 << 10) /* Each row addresses [up to] 4b. This multiplied by the number of subbanks * will give the L3 size per bank. * TODO: Row size is fixed on IVB, and variable on HSW.*/ #define MAX_ROW (1<<12) -#define L3_SIZE ((MAX_ROW * 4) * NUM_SUBBANKS * NUM_BANKS) -#define NUM_REGS (NUM_BANKS * NUM_SUBBANKS) -#define MAX_SLICES 1 -#define REAL_MAX_SLICES 1 +#define MAX_BANKS_PER_SLICE 4 +#define NUM_REGS (MAX_BANKS_PER_SLICE * NUM_SUBBANKS) +#define MAX_SLICES (IS_HSW_GT3(devid) ? 2 : 1) +#define REAL_MAX_SLICES 2 +/* TODO support SLM config */ +#define L3_SIZE ((MAX_ROW * 4) * NUM_SUBBANKS * num_banks()) struct __attribute__ ((__packed__)) l3_log_register { uint32_t row0_enable : 1; @@ -62,7 +71,7 @@ struct __attribute__ ((__packed__)) l3_log_register { uint32_t row1_enable : 1; uint32_t rsvd1 : 4; uint32_t row1 : 11; -} l3logs[REAL_MAX_SLICES][MAX_BANKS][NUM_SUBBANKS]; +} l3logs[REAL_MAX_SLICES][MAX_BANKS_PER_SLICE][NUM_SUBBANKS]; static int which_slice = -1; #define for_each_slice(__i) \ @@ -74,16 +83,16 @@ static void dumpit(int slice) { int i, j; - for (i = 0; i < NUM_BANKS; i++) { + for (i = 0; i < MAX_BANKS_PER_SLICE; i++) { for (j = 0; j < NUM_SUBBANKS; j++) { struct l3_log_register *reg = &l3logs[slice][i][j]; if (reg->row0_enable) - printf("Row %d, Bank %d, Subbank %d is disabled\n", - reg->row0, i, j); + printf("Slice %d, Row %d, Bank %d, Subbank %d is disabled\n", + slice, reg->row0, i, j); if (reg->row1_enable) - printf("Row %d, Bank %d, Subbank %d is disabled\n", - reg->row1, i, j); + printf("Slice %d, Row %d, Bank %d, Subbank %d is disabled\n", + slice, reg->row1, i, j); } } } @@ -160,6 +169,8 @@ int main(int argc, char *argv[]) ret = asprintf(&path[0], "/sys/class/drm/card%d/l3_parity", device); assert(ret != -1); + ret = asprintf(&path[1], "/sys/class/drm/card%d/l3_parity_slice_1", device); + assert(ret != -1); for_each_slice(i) { fd[i] = open(path[i], O_RDWR); @@ -201,9 +212,9 @@ int main(int argc, char *argv[]) exit(EXIT_SUCCESS); case 'H': printf("Number of slices: %d\n", MAX_SLICES); - printf("Number of banks: %d\n", NUM_BANKS); + printf("Number of banks: %d\n", num_banks()); printf("Subbanks per bank: %d\n", NUM_SUBBANKS); - printf("L3 size: %dK\n", L3_SIZE >> 10); + printf("Max L3 size: %dK\n", L3_SIZE >> 10); exit(EXIT_SUCCESS); case 'r': row = atoi(optarg); @@ -212,7 +223,7 @@ int main(int argc, char *argv[]) break; case 'b': bank = atoi(optarg); - if (bank >= NUM_BANKS) + if (bank >= num_banks() || bank >= MAX_BANKS_PER_SLICE) exit(EXIT_FAILURE); break; case 's': @@ -222,7 +233,7 @@ int main(int argc, char *argv[]) break; case 'w': which_slice = atoi(optarg); - if (which_slice > 1) + if (which_slice >= MAX_SLICES) exit(EXIT_FAILURE); break; case 'd':