intel_gpu_top: suport command line parameters and variable samples per

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>
This commit is contained in:
Eugeni Dodonov 2011-09-05 16:23:11 -03:00
parent 6194c75c8f
commit 09e4b0cd26
2 changed files with 55 additions and 4 deletions

View File

@ -4,11 +4,20 @@
.SH NAME .SH NAME
intel_gpu_top \- Display a top-like summary of Intel GPU usage intel_gpu_top \- Display a top-like summary of Intel GPU usage
.SH SYNOPSIS .SH SYNOPSIS
.nf
.B intel_gpu_top .B intel_gpu_top
.B intel_gpu_top [ parameters ]
.SH DESCRIPTION .SH DESCRIPTION
.B intel_gpu_top .B intel_gpu_top
is a tool to display usage information of an Intel GPU. It requires root is a tool to display usage information of an Intel GPU. It requires root
privilege to map the graphics device. 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 .PP
Note that idle units are not Note that idle units are not
displayed, so an entirely idle GPU will only display the ring status and displayed, so an entirely idle GPU will only display the ring status and

View 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)); (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) int main(int argc, char **argv)
{ {
struct pci_device *pci_dev; struct pci_device *pci_dev;
@ -408,7 +425,32 @@ int main(int argc, char **argv)
.name = "blitter", .name = "blitter",
.mmio = 0x22030, .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(); pci_dev = intel_get_pci_device();
devid = pci_dev->device_id; devid = pci_dev->device_id;
@ -432,8 +474,8 @@ int main(int argc, char **argv)
for (;;) { for (;;) {
int j; int j;
unsigned long long t1, ti, tf; unsigned long long t1, ti, tf;
unsigned long long def_sleep = 1000000 / SAMPLES_PER_SEC; unsigned long long def_sleep = 1000000 / samples_per_sec;
unsigned long long last_samples_per_sec = SAMPLES_PER_SEC; unsigned long long last_samples_per_sec = samples_per_sec;
char clear_screen[] = {0x1b, '[', 'H', char clear_screen[] = {0x1b, '[', 'H',
0x1b, '[', 'J', 0x1b, '[', 'J',
0x0}; 0x0};
@ -447,7 +489,7 @@ int main(int argc, char **argv)
ring_reset(&bsd6_ring); ring_reset(&bsd6_ring);
ring_reset(&blt_ring); ring_reset(&blt_ring);
for (i = 0; i < SAMPLES_PER_SEC; i++) { for (i = 0; i < samples_per_sec; i++) {
long long interval; long long interval;
ti = gettime(); ti = gettime();
if (IS_965(devid)) { if (IS_965(devid)) {