summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-09-12 13:46:19 +1000
committerBen Skeggs <bskeggs@redhat.com>2013-11-05 16:15:44 +1000
commit564f4a4fe6eb241405c6c43c4839bcf88d3498d1 (patch)
tree3b55105c6d3eb5c9aa5a56bb3272394c0569928f /bin
parent4279cdfc8fff22dd9c56b3b43c2a3c822790a25e (diff)
downloadnouveau-564f4a4fe6eb241405c6c43c4839bcf88d3498d1.tar.gz
tools: give rdfunc diff-per-second and watch functionality
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'bin')
-rw-r--r--bin/nv_rdfunc.h79
1 files changed, 67 insertions, 12 deletions
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;
}