summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/intel_gpu_top.c65
1 files changed, 36 insertions, 29 deletions
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index 8fcd82d..8c771f3 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -117,11 +117,6 @@ uint64_t last_stats[STATS_COUNT];
* the tools usage on other systems.
*/
-#ifdef HAVE_LINUX_FEATURES
-
-#define BATTERY "BAT1"
-#define DEBUGFS "/sys/kernel/debug/dri/0/"
-
struct cpudata
{
unsigned long user, system, idle, nice, total;
@@ -140,9 +135,14 @@ struct powerdata
float watts_gfx;
};
+
+#define BATTERY "BAT1"
+#define DEBUGFS "/sys/kernel/debug/dri/0/"
+
static void
get_cpu_stat(struct cpudata *cpu)
{
+#ifdef __linux__
FILE *file;
char temp[10];
char line[255];
@@ -154,6 +154,11 @@ get_cpu_stat(struct cpudata *cpu)
sscanf(line, "%s %lu %lu %lu %lu", temp, &cpu->user, &cpu->nice, &cpu->system,
&cpu->idle);
cpu->total = cpu->user + cpu->system + cpu->idle + cpu->nice;
+#else
+ /* We are not on Linux, give a warning on compile */
+#warning Non-Linux OS detected, CPU statistics will not be collected!
+ cpu->total = cpu->user = cpu->system = cpu->idle = cpu->nice = 0;
+#endif
}
@@ -169,15 +174,21 @@ get_cpu_stat(struct cpudata *cpu)
static char*
get_battery_file(char *battery)
{
+#ifdef __linux__
/* The format is /proc/acpi/battery/BAT?/state */
char *temp = (char *)malloc(sizeof(char) * (35 * strlen(battery)));
sprintf(temp, "/proc/acpi/battery/%s/state", battery);
return temp;
+#else
+#warning Non-Linux OS detected, skipping battery detection
+ return NULL;
+#endif
}
static void
get_power_stat(struct powerdata *power, const char *battery_file, char *debugfs, float elapsed_time)
{
+#ifdef __linux__
FILE *file;
char line[255];
long rate, voltage;
@@ -237,26 +248,30 @@ get_power_stat(struct powerdata *power, const char *battery_file, char *debugfs,
sscanf(line, "GFX power: %lu\n", &tmp);
power->watts_gfx = (float) tmp / 1000;
}
+#else
+ /* We are not on Linux, give a warning on compile */
+#warning Non-Linux OS detected, POWER statistics will not be collected!
+ power->watts = power->watts_gfx = power->watts_chipset = -1;
+#endif
}
-static void linux_print_header(FILE *out)
+static void system_print_header(FILE *out)
{
fprintf(out, "utime\tstime\tpower\tpower.chipset\tpower.gfx\t");
}
-static void linux_print(FILE *out, struct cpudata *cpu, struct cpudata *oldcpu,
+static void system_print(FILE *out, struct cpudata *cpu, struct cpudata *oldcpu,
struct powerdata *power)
{
- float uload, sload;
- uload = (float) ((cpu->user - oldcpu->user) * 100) / (cpu->total - oldcpu->total);
- sload = (float) ((cpu->system - oldcpu->system) * 100) / (cpu->total - oldcpu->total);
+ float uload=-1, sload=-1;
+ if (cpu->total > 0) {
+ uload = (float) ((cpu->user - oldcpu->user) * 100) / (cpu->total - oldcpu->total);
+ sload = (float) ((cpu->system - oldcpu->system) * 100) / (cpu->total - oldcpu->total);
+ }
fprintf(out, "%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t",
uload, sload, power->watts, power->watts_chipset, power->watts_gfx);
}
-#endif
-
-
static unsigned long
gettime(void)
{
@@ -575,11 +590,11 @@ int main(int argc, char **argv)
char *cmd=NULL;
int interactive=1;
-#ifdef HAVE_LINUX_FEATURES
struct cpudata oldcpu, cpu;
struct powerdata power;
char *battery = BATTERY, *battery_file = NULL;
char *debugfs = DEBUGFS;
+#ifdef __linux__
int do_perf=0;
char *perf_output=NULL;
#endif
@@ -603,7 +618,7 @@ int main(int argc, char **argv)
}
else {
output = fopen(optarg, "w");
-#if HAVE_LINUX_FEATURES
+#if __linux__
perf_output = (char *)malloc(strlen(optarg) + 5);
sprintf(perf_output, "%s.perf", optarg);
#endif
@@ -615,8 +630,8 @@ int main(int argc, char **argv)
}
break;
case 'p':
-#ifndef HAVE_LINUX_FEATURES
- fprintf(stderr, "Error: Linux-specific bits not enabled\n");
+#ifndef __linux__
+ fprintf(stderr, "Error: perf tracing not available on non-Linux OS\n");
exit(1);
#else
do_perf=1;
@@ -641,7 +656,7 @@ int main(int argc, char **argv)
intel_get_mmio(pci_dev);
init_instdone_definitions(devid);
-#ifdef HAVE_LINUX_FEATURES
+#ifdef __linux__
if (do_perf) {
int perf_pid = fork();
if (perf_pid < 0) {
@@ -713,13 +728,11 @@ int main(int argc, char **argv)
ring_init(&blt_ring);
}
-#ifdef HAVE_LINUX_FEATURES
/* Calculate initial stats */
/* Battery */
battery_file = get_battery_file(battery);
/* CPU */
get_cpu_stat(&oldcpu);
-#endif
/* Initialize GPU stats */
if (HAS_STATS_REGS(devid)) {
@@ -814,13 +827,11 @@ int main(int argc, char **argv)
time_diff = (t2 - t1) / 1000000.0;
elapsed_time += time_diff;
-#ifdef HAVE_LINUX_FEATURES
/* CPU */
get_cpu_stat(&cpu);
/* Power */
get_power_stat(&power, battery_file, debugfs, time_diff);
-#endif
if (interactive) {
printf("%s", clear_screen);
@@ -861,9 +872,7 @@ int main(int argc, char **argv)
/* Print headers for columns at first run */
if (print_headers) {
fprintf(output, "# time\t");
-#ifdef HAVE_LINUX_FEATURES
- linux_print_header(output);
-#endif
+ system_print_header(output);
ring_print_header(output, &render_ring);
ring_print_header(output, &bsd_ring);
ring_print_header(output, &bsd6_ring);
@@ -883,10 +892,8 @@ int main(int argc, char **argv)
/* Print statistics */
fprintf(output, "%.2f\t", elapsed_time);
-#ifdef HAVE_LINUX_FEATURES
- linux_print(output, &cpu, &oldcpu, &power);
+ system_print(output, &cpu, &oldcpu, &power);
oldcpu = cpu;
-#endif
ring_log(&render_ring, last_samples_per_sec, output);
ring_log(&bsd_ring, last_samples_per_sec, output);
ring_log(&bsd6_ring, last_samples_per_sec, output);
@@ -929,7 +936,7 @@ int main(int argc, char **argv)
fclose(output);
intel_register_access_fini();
-#if HAVE_LINUX_FEATURES
+#if __linux__
if (perf_output != NULL)
free(perf_output);
#endif