1b47b5b34SRafael Vanoni /*
2b47b5b34SRafael Vanoni * Copyright 2009, Intel Corporation
3b47b5b34SRafael Vanoni * Copyright 2009, Sun Microsystems, Inc
4b47b5b34SRafael Vanoni *
5b47b5b34SRafael Vanoni * This file is part of PowerTOP
6b47b5b34SRafael Vanoni *
7b47b5b34SRafael Vanoni * This program file is free software; you can redistribute it and/or modify it
8b47b5b34SRafael Vanoni * under the terms of the GNU General Public License as published by the
9b47b5b34SRafael Vanoni * Free Software Foundation; version 2 of the License.
10b47b5b34SRafael Vanoni *
11b47b5b34SRafael Vanoni * This program is distributed in the hope that it will be useful, but WITHOUT
12b47b5b34SRafael Vanoni * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13b47b5b34SRafael Vanoni * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14b47b5b34SRafael Vanoni * for more details.
15b47b5b34SRafael Vanoni *
16b47b5b34SRafael Vanoni * You should have received a copy of the GNU General Public License
17b47b5b34SRafael Vanoni * along with this program in a file named COPYING; if not, write to the
18b47b5b34SRafael Vanoni * Free Software Foundation, Inc.,
19b47b5b34SRafael Vanoni * 51 Franklin Street, Fifth Floor,
20b47b5b34SRafael Vanoni * Boston, MA 02110-1301 USA
21b47b5b34SRafael Vanoni *
22b47b5b34SRafael Vanoni * Authors:
23b47b5b34SRafael Vanoni * Arjan van de Ven <arjan@linux.intel.com>
24b47b5b34SRafael Vanoni * Eric C Saxe <eric.saxe@sun.com>
25b47b5b34SRafael Vanoni * Aubrey Li <aubrey.li@intel.com>
26b47b5b34SRafael Vanoni */
27b47b5b34SRafael Vanoni
28b47b5b34SRafael Vanoni /*
29b47b5b34SRafael Vanoni * GPL Disclaimer
30b47b5b34SRafael Vanoni *
31b47b5b34SRafael Vanoni * For the avoidance of doubt, except that if any license choice other
32b47b5b34SRafael Vanoni * than GPL or LGPL is available it will apply instead, Sun elects to
33b47b5b34SRafael Vanoni * use only the General Public License version 2 (GPLv2) at this time
34b47b5b34SRafael Vanoni * for any software where a choice of GPL license versions is made
35b47b5b34SRafael Vanoni * available with the language indicating that GPLv2 or any later
36b47b5b34SRafael Vanoni * version may be used, or where a choice of which version of the GPL
37b47b5b34SRafael Vanoni * is applied is otherwise unspecified.
38b47b5b34SRafael Vanoni */
39b47b5b34SRafael Vanoni
40b47b5b34SRafael Vanoni #include <stdarg.h>
41b47b5b34SRafael Vanoni #include <stdlib.h>
42b47b5b34SRafael Vanoni #include <libgen.h>
43b47b5b34SRafael Vanoni #include <unistd.h>
44b47b5b34SRafael Vanoni #include <strings.h>
45b47b5b34SRafael Vanoni #include <sys/systeminfo.h>
46b47b5b34SRafael Vanoni #include <kstat.h>
47b47b5b34SRafael Vanoni #include <errno.h>
48b47b5b34SRafael Vanoni #include "powertop.h"
49b47b5b34SRafael Vanoni
50b47b5b34SRafael Vanoni static char PROG_FMT[] = "%s: ";
51b47b5b34SRafael Vanoni static char ERR_FMT[] = ": %s";
52b47b5b34SRafael Vanoni static char *progname;
53b47b5b34SRafael Vanoni
54b47b5b34SRafael Vanoni void
pt_set_progname(char * name)55b47b5b34SRafael Vanoni pt_set_progname(char *name)
56b47b5b34SRafael Vanoni {
57b47b5b34SRafael Vanoni progname = basename(name);
58b47b5b34SRafael Vanoni }
59b47b5b34SRafael Vanoni
60b47b5b34SRafael Vanoni /*PRINTFLIKE1*/
61b47b5b34SRafael Vanoni void
pt_error(char * format,...)62b47b5b34SRafael Vanoni pt_error(char *format, ...)
63b47b5b34SRafael Vanoni {
64b47b5b34SRafael Vanoni int err = errno;
65b47b5b34SRafael Vanoni va_list alist;
66b47b5b34SRafael Vanoni
67b47b5b34SRafael Vanoni if (g_gui)
68b47b5b34SRafael Vanoni return;
69b47b5b34SRafael Vanoni
70b47b5b34SRafael Vanoni if (progname != NULL)
71b47b5b34SRafael Vanoni (void) fprintf(stderr, PROG_FMT, progname);
72b47b5b34SRafael Vanoni
73b47b5b34SRafael Vanoni va_start(alist, format);
74b47b5b34SRafael Vanoni (void) vfprintf(stderr, format, alist);
75b47b5b34SRafael Vanoni va_end(alist);
76b47b5b34SRafael Vanoni
77b47b5b34SRafael Vanoni if (strchr(format, '\n') == NULL)
78*2d83778aSRafael Vanoni (void) fprintf(stderr, ERR_FMT, strerror(err));
79b47b5b34SRafael Vanoni }
80b47b5b34SRafael Vanoni
81b47b5b34SRafael Vanoni /*
82b47b5b34SRafael Vanoni * Returns the number of online CPUs.
83b47b5b34SRafael Vanoni */
84b47b5b34SRafael Vanoni uint_t
pt_enumerate_cpus(void)85*2d83778aSRafael Vanoni pt_enumerate_cpus(void)
86b47b5b34SRafael Vanoni {
87b47b5b34SRafael Vanoni int cpuid;
88b47b5b34SRafael Vanoni int max, cpus_conf;
89b47b5b34SRafael Vanoni uint_t ncpus = 0;
90b47b5b34SRafael Vanoni
91b47b5b34SRafael Vanoni max = sysconf(_SC_CPUID_MAX);
92b47b5b34SRafael Vanoni cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
93b47b5b34SRafael Vanoni
94b47b5b34SRafael Vanoni /* Fall back to one CPU if any of the sysconf calls above failed */
95b47b5b34SRafael Vanoni if (max == -1 || cpus_conf == -1) {
96b47b5b34SRafael Vanoni max = cpus_conf = 1;
97b47b5b34SRafael Vanoni }
98b47b5b34SRafael Vanoni
99b47b5b34SRafael Vanoni if ((g_cpu_table = malloc(cpus_conf * sizeof (processorid_t))) == NULL)
100b47b5b34SRafael Vanoni return (0);
101b47b5b34SRafael Vanoni
102b47b5b34SRafael Vanoni for (cpuid = 0; cpuid < max; cpuid++) {
103b47b5b34SRafael Vanoni if (p_online(cpuid, P_STATUS) != -1) {
104b47b5b34SRafael Vanoni g_cpu_table[ncpus] = cpuid;
105b47b5b34SRafael Vanoni ncpus++;
106b47b5b34SRafael Vanoni }
107b47b5b34SRafael Vanoni }
108b47b5b34SRafael Vanoni return (ncpus);
109b47b5b34SRafael Vanoni }
110b47b5b34SRafael Vanoni
111b47b5b34SRafael Vanoni void
pt_usage(void)112*2d83778aSRafael Vanoni pt_usage(void)
113b47b5b34SRafael Vanoni {
114b47b5b34SRafael Vanoni (void) fprintf(stderr, "%s %s\n\n", TITLE, COPYRIGHT_INTEL);
115*2d83778aSRafael Vanoni (void) fprintf(stderr, "usage: powertop [option]\n");
116b47b5b34SRafael Vanoni (void) fprintf(stderr, " -d, --dump [count] Read wakeups count "
117b47b5b34SRafael Vanoni "times and print list of top offenders\n");
118b47b5b34SRafael Vanoni (void) fprintf(stderr, " -t, --time [interval] Default time to gather "
119*2d83778aSRafael Vanoni "data in seconds [1-30s]\n");
120b47b5b34SRafael Vanoni (void) fprintf(stderr, " -v, --verbose Verbose mode, reports "
121b47b5b34SRafael Vanoni "kernel cyclic activity\n");
122b47b5b34SRafael Vanoni (void) fprintf(stderr, " -c, --cpu [CPU] Only observe a specific"
123b47b5b34SRafael Vanoni " CPU\n");
124b47b5b34SRafael Vanoni (void) fprintf(stderr, " -h, --help Show this help "
125b47b5b34SRafael Vanoni "message\n");
126b47b5b34SRafael Vanoni }
127b47b5b34SRafael Vanoni
128b47b5b34SRafael Vanoni int
pt_get_bit_depth(void)129*2d83778aSRafael Vanoni pt_get_bit_depth(void)
130b47b5b34SRafael Vanoni {
131b47b5b34SRafael Vanoni /*
132b47b5b34SRafael Vanoni * This little routine was derived from isainfo.c to look up
133b47b5b34SRafael Vanoni * the system's bit depth. It feeds a 10 byte long buffer to
134b47b5b34SRafael Vanoni * sysinfo (we only need the first word, sysinfo truncates and
135b47b5b34SRafael Vanoni * \0 terminates the rest) from which we figure out which isa
136b47b5b34SRafael Vanoni * we're running on.
137b47b5b34SRafael Vanoni */
138b47b5b34SRafael Vanoni char buf[BIT_DEPTH_BUF];
139b47b5b34SRafael Vanoni
140b47b5b34SRafael Vanoni if (sysinfo(SI_ARCHITECTURE_64, buf, BIT_DEPTH_BUF) == -1)
141b47b5b34SRafael Vanoni if (sysinfo(SI_ARCHITECTURE_32, buf, BIT_DEPTH_BUF) == -1)
142b47b5b34SRafael Vanoni return (-2);
143b47b5b34SRafael Vanoni
144b47b5b34SRafael Vanoni if (strcmp(buf, "sparc") == 0 || strcmp(buf, "i386") == 0)
145b47b5b34SRafael Vanoni return (32);
146b47b5b34SRafael Vanoni
147b47b5b34SRafael Vanoni if (strcmp(buf, "sparcv9") == 0 || strcmp(buf, "amd64") == 0)
148b47b5b34SRafael Vanoni return (64);
149b47b5b34SRafael Vanoni
150b47b5b34SRafael Vanoni return (-3);
151b47b5b34SRafael Vanoni }
152b47b5b34SRafael Vanoni
153b47b5b34SRafael Vanoni /*
154b47b5b34SRafael Vanoni * Simple integer comparison routine for the event report qsort(3C).
155b47b5b34SRafael Vanoni */
156b47b5b34SRafael Vanoni int
pt_event_compare(const void * p1,const void * p2)157*2d83778aSRafael Vanoni pt_event_compare(const void *p1, const void *p2)
158b47b5b34SRafael Vanoni {
159b47b5b34SRafael Vanoni event_info_t i = *((event_info_t *)p1);
160b47b5b34SRafael Vanoni event_info_t j = *((event_info_t *)p2);
161b47b5b34SRafael Vanoni
162b47b5b34SRafael Vanoni if (i.total_count > j.total_count)
163b47b5b34SRafael Vanoni return (-1);
164b47b5b34SRafael Vanoni
165b47b5b34SRafael Vanoni if (i.total_count < j.total_count)
166b47b5b34SRafael Vanoni return (1);
167b47b5b34SRafael Vanoni
168b47b5b34SRafael Vanoni return (0);
169b47b5b34SRafael Vanoni }
170