From: Ben Widawsky <benjamin.widawsky@intel.com>
To: Intel GFX <intel-gfx@lists.freedesktop.org>
Cc: Bryan Bell <bryan.j.bell@intel.com>,
Ben Widawsky <ben@bwidawsk.net>,
Ben Widawsky <benjamin.widawsky@intel.com>
Subject: [PATCH 09/14] intel_l3_parity: Use getopt for the l3 parity tool
Date: Tue, 17 Sep 2013 21:12:50 -0700 [thread overview]
Message-ID: <1379477575-2164-9-git-send-email-benjamin.widawsky@intel.com> (raw)
In-Reply-To: <1379477575-2164-1-git-send-email-benjamin.widawsky@intel.com>
Add new command line arguments in addition to supporting the old
features. This patch only introduces one feature, the -e argument to
enable a specific row/bank/subbank. Previously you could only enable
all. Otherwise, it has what you expect (we prefer -r -b -s for
specifying the row/bank/subbank).
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
tests/sysfs_l3_parity | 12 ++---
tools/intel_l3_parity.c | 122 ++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 109 insertions(+), 25 deletions(-)
diff --git a/tests/sysfs_l3_parity b/tests/sysfs_l3_parity
index 6f814a1..a0dfad9 100755
--- a/tests/sysfs_l3_parity
+++ b/tests/sysfs_l3_parity
@@ -8,20 +8,20 @@ fi
SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
. $SOURCE_DIR/drm_lib.sh
-$SOURCE_DIR/../tools/intel_l3_parity -c
+$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e
#Check that we can remap a row
-$SOURCE_DIR/../tools/intel_l3_parity 0,0,0
-disabled=`$SOURCE_DIR/../tools/intel_l3_parity | grep -c 'Row 0, Bank 0, Subbank 0 is disabled'`
+$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -d
+disabled=`$SOURCE_DIR/../tools/intel_l3_parity -l | grep -c 'Row 0, Bank 0, Subbank 0 is disabled'`
if [ "$disabled" != "1" ] ; then
echo "Fail"
exit 1
fi
-$SOURCE_DIR/../tools/intel_l3_parity -c
+$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e
#Check that we can clear remaps
-if [ `$SOURCE_DIR/../tools/intel_l3_parity | wc -c` != "0" ] ; then
- echo "Fail"
+if [ `$SOURCE_DIR/../tools/intel_l3_parity -l | wc -c` != "0" ] ; then
+ echo "Fail 2"
exit 1
fi
diff --git a/tools/intel_l3_parity.c b/tools/intel_l3_parity.c
index 715d095..507a522 100644
--- a/tools/intel_l3_parity.c
+++ b/tools/intel_l3_parity.c
@@ -33,12 +33,14 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <getopt.h>
#include "intel_chipset.h"
#include "intel_gpu_tools.h"
#include "drmtest.h"
#define NUM_BANKS 4
#define NUM_SUBBANKS 8
+#define MAX_ROW (1<<12)
#define NUM_REGS (NUM_BANKS * NUM_SUBBANKS)
struct __attribute__ ((__packed__)) l3_log_register {
@@ -93,17 +95,34 @@ static int disable_rbs(int row, int bank, int sbank)
return 0;
}
-static int do_parse(int argc, char *argv[])
+static void enables_rbs(int row, int bank, int sbank)
{
- int row, bank, sbank, i, ret;
+ struct l3_log_register *reg = &l3log[bank][sbank];
- for (i = 1; i < argc; i++) {
- ret = sscanf(argv[i], "%d,%d,%d", &row, &bank, &sbank);
- if (ret != 3)
- return i;
- assert(disable_rbs(row, bank, sbank) == 0);
- }
- return 0;
+ if (!reg->row0_enable && !reg->row1_enable)
+ return;
+
+ if (reg->row1_enable && reg->row1 == row)
+ reg->row1_enable = 0;
+ else if (reg->row0_enable && reg->row0 == row)
+ reg->row0_enable = 0;
+}
+
+static void usage(const char *name)
+{
+ printf("usage: %s [OPTIONS] [ACTION]\n"
+ "Operate on the i915 L3 GPU cache (should be run as root)\n\n"
+ " OPTIONS:\n"
+ " -r, --row=[row] The row to act upon (default 0)\n"
+ " -b, --bank=[bank] The bank to act upon (default 0)\n"
+ " -s, --subbank=[subbank] The subbank to act upon (default 0)\n"
+ " ACTIONS (only 1 may be specified at a time):\n"
+ " -h, --help Display this help\n"
+ " -l, --list List the current L3 logs\n"
+ " -a, --clear-all Clear all disabled rows\n"
+ " -e, --enable Enable row, bank, subbank (undo -d)\n"
+ " -d, --disable=<row,bank,subbank> Disable row, bank, subbank (inline arguments are deprecated. Please use -r, -b, -s instead\n",
+ name);
}
int main(int argc, char *argv[])
@@ -111,7 +130,9 @@ int main(int argc, char *argv[])
const int device = drm_get_card();
char *path;
unsigned int devid;
+ int row = 0, bank = 0, sbank = 0;
int drm_fd, fd, ret;
+ int action = '0';
drm_fd = drm_open_any();
devid = intel_get_drm_devid(drm_fd);
@@ -133,19 +154,82 @@ int main(int argc, char *argv[])
assert(lseek(fd, 0, SEEK_SET) == 0);
- if (argc == 1) {
- dumpit();
- exit(EXIT_SUCCESS);
- } else if (!strncmp("-c", argv[1], 2)) {
- memset(l3log, 0, sizeof(l3log));
- } else {
- ret = do_parse(argc, argv);
- if (ret != 0) {
- fprintf(stderr, "Malformed command line at %s\n", argv[ret]);
- exit(EXIT_FAILURE);
+ while (1) {
+ int c, option_index = 0;
+ static struct option long_options[] = {
+ { "help", no_argument, 0, 'h' },
+ { "list", no_argument, 0, 'l' },
+ { "clear-all", no_argument, 0, 'a' },
+ { "enable", no_argument, 0, 'e' },
+ { "disable", optional_argument, 0, 'd' },
+ { "row", required_argument, 0, 'r' },
+ { "bank", required_argument, 0, 'b' },
+ { "subbank", required_argument, 0, 's' },
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long(argc, argv, "hr:b:s:aled::", long_options,
+ &option_index);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case '?':
+ case 'h':
+ usage(argv[0]);
+ exit(EXIT_SUCCESS);
+ case 'r':
+ row = atoi(optarg);
+ if (row >= MAX_ROW)
+ exit(EXIT_FAILURE);
+ break;
+ case 'b':
+ bank = atoi(optarg);
+ if (bank >= NUM_BANKS)
+ exit(EXIT_FAILURE);
+ break;
+ case 's':
+ sbank = atoi(optarg);
+ if (sbank >= NUM_SUBBANKS)
+ exit(EXIT_FAILURE);
+ break;
+ case 'd':
+ if (optarg) {
+ ret = sscanf(optarg, "%d,%d,%d", &row, &bank, &sbank);
+ if (ret != 3)
+ exit(EXIT_FAILURE);
+ }
+ case 'a':
+ case 'l':
+ case 'e':
+ if (action != '0') {
+ fprintf(stderr, "Only one action may be specified\n");
+ exit(EXIT_FAILURE);
+ }
+ action = c;
+ break;
+ default:
+ abort();
}
}
+ switch (action) {
+ case 'l':
+ dumpit();
+ exit(EXIT_SUCCESS);
+ case 'a':
+ memset(l3log, 0, sizeof(l3log));
+ break;
+ case 'e':
+ enables_rbs(row, bank, sbank);
+ break;
+ case 'd':
+ assert(disable_rbs(row, bank, sbank) == 0);
+ break;
+ default:
+ abort();
+ }
+
ret = write(fd, l3log, NUM_REGS * sizeof(uint32_t));
if (ret == -1) {
perror("Writing sysfs");
--
1.8.4
next prev parent reply other threads:[~2013-09-18 4:13 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-18 4:12 [PATCH 1/6] drm/i915: Fix HSW parity test Ben Widawsky
2013-09-18 4:12 ` [PATCH 2/6] drm/i915: Add second slice l3 remapping Ben Widawsky
2013-09-18 7:36 ` Ville Syrjälä
2013-09-18 16:22 ` Ben Widawsky
2013-09-19 18:13 ` [PATCH] [v3] " Ben Widawsky
2013-09-18 4:12 ` [PATCH 3/6] drm/i915: Make l3 remapping use the ring Ben Widawsky
2013-09-19 18:39 ` Daniel Vetter
2013-09-18 4:12 ` [PATCH 4/6] drm/i915: Keep a list of all contexts Ben Widawsky
2013-09-18 4:12 ` [PATCH 5/6] drm/i915: Do remaps for " Ben Widawsky
2013-09-18 7:48 ` Ville Syrjälä
2013-09-19 1:14 ` Ben Widawsky
2013-09-19 1:17 ` Ben Widawsky
2013-09-19 2:03 ` [PATCH] [v3] " Ben Widawsky
2013-09-18 4:12 ` [PATCH 6/6] drm/i915: s/HAS_L3_GPU_CACHE/HAS_L3_DPF Ben Widawsky
2013-09-18 7:50 ` Ville Syrjälä
2013-09-19 17:47 ` [PATCH] [v2] " Ben Widawsky
2013-09-19 18:01 ` Ben Widawsky
2013-09-19 18:41 ` Daniel Vetter
2013-09-19 19:59 ` Ben Widawsky
2013-09-18 4:12 ` [PATCH 07/14] intel_l3_parity: Fix indentation Ben Widawsky
2013-09-18 4:12 ` [PATCH 08/14] intel_l3_parity: Assert all GEN7+ support Ben Widawsky
2013-09-18 4:12 ` Ben Widawsky [this message]
2013-09-18 4:12 ` [PATCH 10/14] intel_l3_parity: Hardware info argument Ben Widawsky
2013-09-18 4:12 ` [PATCH 11/14] intel_l3_parity: slice support Ben Widawsky
2013-09-18 4:12 ` [PATCH 12/14] intel_l3_parity: Actually support multiple slices Ben Widawsky
2013-09-18 4:12 ` [PATCH 13/14] intel_l3_parity: Support error injection Ben Widawsky
2013-09-18 4:12 ` [PATCH 14/14] intel_l3_parity: Support a daemonic mode Ben Widawsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1379477575-2164-9-git-send-email-benjamin.widawsky@intel.com \
--to=benjamin.widawsky@intel.com \
--cc=ben@bwidawsk.net \
--cc=bryan.j.bell@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox