intel_gpu_top: suport command line parameters and variable samples per
authorEugeni Dodonov <eugeni.dodonov@intel.com>
Mon, 5 Sep 2011 19:23:11 +0000 (16:23 -0300)
committerEugeni Dodonov <eugeni.dodonov@intel.com>
Mon, 5 Sep 2011 22:11:45 +0000 (19:11 -0300)
second

This patch adds support for getopt, and adds two default parameters to it:
-h to show usage notes; and -s to allow user to define number of samples
to acquire per second.

Manpage documentation is also adjusted accordingly.

Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
man/intel_gpu_top.1
tools/intel_gpu_top.c

index 79c9c0e..2cbbec9 100644 (file)
@@ -4,11 +4,20 @@
 .SH NAME
 intel_gpu_top \- Display a top-like summary of Intel GPU usage
 .SH SYNOPSIS
+.nf
 .B intel_gpu_top
+.B intel_gpu_top [ parameters ]
 .SH DESCRIPTION
 .B intel_gpu_top
 is a tool to display usage information of an Intel GPU.  It requires root
 privilege to map the graphics device.
+.SS Options
+.TP
+.B -s [samples per second]
+number of samples to acquire per second
+.TP
+.B -h
+show usage notes
 .PP
 Note that idle units are not
 displayed, so an entirely idle GPU will only display the ring status and
index 64ce828..11823f0 100644 (file)
@@ -392,6 +392,23 @@ static void ring_print(struct ring *ring, unsigned long samples_per_sec)
               (int)((ring->full / samples_to_percent_ratio) / ring->size));
 }
 
+static void
+usage(const char *appname)
+{
+       printf("intel_gpu_top - Display a top-like summary of Intel GPU usage\n"
+                       "\n"
+                       "usage: %s [parameters]\n"
+                       "\n"
+                       "The following parameters apply:\n"
+                       "[-s <samples>]       samples per seconds (default %d)\n"
+                       "[-h]                 show this help screen\n"
+                       "\n",
+                       appname,
+                       SAMPLES_PER_SEC
+                 );
+       return;
+}
+
 int main(int argc, char **argv)
 {
        struct pci_device *pci_dev;
@@ -408,7 +425,32 @@ int main(int argc, char **argv)
                .name = "blitter",
                .mmio = 0x22030,
        };
-       int i;
+       int i, ch;
+       int samples_per_sec = SAMPLES_PER_SEC;
+
+       /* Parse options? */
+       while ((ch = getopt(argc, argv, "s:h")) != -1)
+       {
+               switch (ch) {
+               case 's': samples_per_sec = atoi(optarg);
+                       if (samples_per_sec < 100) {
+                               fprintf(stderr, "Error: samples per second must be >= 100\n");
+                               exit(1);
+                       }
+                       break;
+               case 'h':
+                       usage(argv[0]);
+                       exit(0);
+                       break;
+               default:
+                       fprintf(stderr, "Invalid flag %c!\n", (char)optopt);
+                       usage(argv[0]);
+                       exit(1);
+                       break;
+               }
+       }
+       argc -= optind;
+       argv += optind;
 
        pci_dev = intel_get_pci_device();
        devid = pci_dev->device_id;
@@ -432,8 +474,8 @@ int main(int argc, char **argv)
        for (;;) {
                int j;
                unsigned long long t1, ti, tf;
-               unsigned long long def_sleep = 1000000 / SAMPLES_PER_SEC;
-               unsigned long long last_samples_per_sec = SAMPLES_PER_SEC;
+               unsigned long long def_sleep = 1000000 / samples_per_sec;
+               unsigned long long last_samples_per_sec = samples_per_sec;
                char clear_screen[] = {0x1b, '[', 'H',
                                       0x1b, '[', 'J',
                                       0x0};
@@ -447,7 +489,7 @@ int main(int argc, char **argv)
                ring_reset(&bsd6_ring);
                ring_reset(&blt_ring);
 
-               for (i = 0; i < SAMPLES_PER_SEC; i++) {
+               for (i = 0; i < samples_per_sec; i++) {
                        long long interval;
                        ti = gettime();
                        if (IS_965(devid)) {