From 564f4a4fe6eb241405c6c43c4839bcf88d3498d1 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 12 Sep 2013 13:46:19 +1000 Subject: tools: give rdfunc diff-per-second and watch functionality Signed-off-by: Ben Skeggs --- bin/nv_rdfunc.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 12 deletions(-) (limited to 'bin') diff --git a/bin/nv_rdfunc.h b/bin/nv_rdfunc.h index bca7cca3a..5ace077bd 100644 --- a/bin/nv_rdfunc.h +++ b/bin/nv_rdfunc.h @@ -20,14 +20,25 @@ main(int argc, char **argv) struct nouveau_object *device; struct nv_device_class args; char *rstr = NULL; - int quiet = 0; + enum { + NORMAL, + QUIET, + RATES, + WATCH, + } mode = NORMAL; + struct { + u64 addr; + u32 data; + } *data = NULL; + int mdata = 1; + int ndata = 0; int ret, c; - while ((c = getopt(argc, argv, "-q")) != -1) { + while ((c = getopt(argc, argv, "-qrw")) != -1) { switch (c) { - case 'q': - quiet = 1; - break; + case 'q': mode = QUIET; break; + case 'r': mode = RATES; break; + case 'w': mode = WATCH; break; case 1: if (rstr) return 1; @@ -70,13 +81,16 @@ main(int argc, char **argv) case ',': rstr++; case '\0': - while (cnt--) { - CAST val = READ(reg); - if (quiet) - printk(FMTDATA"\n", val); - else - printk(NAME" "FMTADDR" "FMTDATA"\n", reg, val); - reg += sizeof(CAST); + if (ndata + cnt >= mdata) { + while (ndata + cnt > mdata) + mdata <<= 1; + assert(data = realloc(data, sizeof(*data) * mdata)); + } + + for (; cnt; cnt--, reg += sizeof(CAST)) { + data[ndata].addr = reg; + data[ndata].data = READ(reg); + ndata++; } break; default: @@ -84,5 +98,46 @@ main(int argc, char **argv) } } + switch (mode) { + case NORMAL: + for (c = 0; c < ndata; c++) { + printf(NAME" "FMTADDR" "FMTDATA"\n", + data[c].addr, data[c].data); + } + break; + case QUIET: + for (c = 0; c < ndata; c++) { + printf(FMTDATA"\n", data[c].data); + } + break; + case RATES: + while (1) { + for (c = 0; c < ndata; c++) { + CAST next = READ(data[c].addr); + printf(NAME" "FMTADDR" "FMTDATA" "FMTDATA" %d/s\n", + data[c].addr, data[c].data, next, + next - data[c].data); + data[c].data = next; + } + sleep(1); + } + break; + case WATCH: + while (1) { + for (c = 0; c < ndata; c++) { + CAST next = READ(data[c].addr); + if (next != data[c].data) { + printf(NAME" "FMTADDR" "FMTDATA"\n", + data[c].addr, next); + data[c].data = next; + } + } + } + break; + default: + assert(0); + return 1; + } + return 0; } -- cgit v1.2.1