From 09e4b0cd26e800c203c1de071b83d879a09bb0dc Mon Sep 17 00:00:00 2001 From: Eugeni Dodonov Date: Mon, 5 Sep 2011 16:23:11 -0300 Subject: [PATCH] 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 --- man/intel_gpu_top.1 | 9 +++++++++ tools/intel_gpu_top.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/man/intel_gpu_top.1 b/man/intel_gpu_top.1 index 79c9c0e..2cbbec9 100644 --- a/man/intel_gpu_top.1 +++ b/man/intel_gpu_top.1 @@ -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 diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c index 64ce828..11823f0 100644 --- a/tools/intel_gpu_top.c +++ b/tools/intel_gpu_top.c @@ -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 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)) { -- 2.7.4