xref: /titanic_44/usr/src/cmd/powertop/common/powertop.h (revision 9bbf5ba14ae201f78f3d6b47a9fac96d68649275)
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 #ifndef __INCLUDE_GUARD_POWERTOP_H_
41b47b5b34SRafael Vanoni #define	__INCLUDE_GUARD_POWERTOP_H_
42b47b5b34SRafael Vanoni 
43b47b5b34SRafael Vanoni #include <sys/types.h>
44b47b5b34SRafael Vanoni #include <libintl.h>
45b47b5b34SRafael Vanoni #include <sys/processor.h>
46b47b5b34SRafael Vanoni 
47b47b5b34SRafael Vanoni #define	max(A, B)		(((A) < (B)) ? (B) : (A))
48b47b5b34SRafael Vanoni 
49b47b5b34SRafael Vanoni #define	_(STRING)		gettext(STRING)
50b47b5b34SRafael Vanoni 
51*9bbf5ba1SRafael Vanoni #define	TITLE			"OpenSolaris PowerTOP version 1.2"
52b47b5b34SRafael Vanoni #define	COPYRIGHT_INTEL		"(C) 2009 Intel Corporation"
53b47b5b34SRafael Vanoni 
54b47b5b34SRafael Vanoni /*
55b47b5b34SRafael Vanoni  * Exit values. stdlib.h defines EXIT_SUCCESS as 0 and
56b47b5b34SRafael Vanoni  * EXIT_FAILURE as 1
57b47b5b34SRafael Vanoni  */
58b47b5b34SRafael Vanoni #define	EXIT_USAGE		2
59b47b5b34SRafael Vanoni 
60b47b5b34SRafael Vanoni /*
61b47b5b34SRafael Vanoni  * PowerTOP Features
62b47b5b34SRafael Vanoni  * These may not be available everywhere
63b47b5b34SRafael Vanoni  */
64b47b5b34SRafael Vanoni #define	FEATURE_CSTATE		0x01
65b47b5b34SRafael Vanoni #define	FEATURE_PSTATE		0x02
66b47b5b34SRafael Vanoni #define	FEATURE_EVENTS		0x04
67b47b5b34SRafael Vanoni #define	FEATURE_TURBO		0x08
68b47b5b34SRafael Vanoni 
69b47b5b34SRafael Vanoni #define	BIT_DEPTH_BUF		10
70b47b5b34SRafael Vanoni 
71b47b5b34SRafael Vanoni #define	INTERVAL_DEFAULT	5.0
72b47b5b34SRafael Vanoni #define	INTERVAL_MAX		100.0
73b47b5b34SRafael Vanoni #define	INTERVAL_UPDATE(l)						\
74b47b5b34SRafael Vanoni 	((l/INTERVAL_DEFAULT) * INTERVAL_DEFAULT + INTERVAL_DEFAULT)
75b47b5b34SRafael Vanoni 
76b47b5b34SRafael Vanoni #define	STATE_NAME_MAX		16
77b47b5b34SRafael Vanoni #define	EVENT_NAME_MAX 		64
78b47b5b34SRafael Vanoni #define	EVENT_NUM_MAX 		100
79b47b5b34SRafael Vanoni #define	NSTATES			32
80b47b5b34SRafael Vanoni 
81b47b5b34SRafael Vanoni /*
82b47b5b34SRafael Vanoni  * Available op modes
83b47b5b34SRafael Vanoni  */
84636423dbSRafael Vanoni #define	PT_MODE_DEFAULT		0x01
85636423dbSRafael Vanoni #define	PT_MODE_DUMP		0x02
86636423dbSRafael Vanoni #define	PT_MODE_VERBOSE		0x04
87636423dbSRafael Vanoni #define	PT_MODE_CPU		0x08
88b47b5b34SRafael Vanoni 
89636423dbSRafael Vanoni #define	PT_ON_DEFAULT		(g_op_mode & PT_MODE_DEFAULT)
90636423dbSRafael Vanoni #define	PT_ON_DUMP		(g_op_mode & PT_MODE_DUMP)
91636423dbSRafael Vanoni #define	PT_ON_VERBOSE		(g_op_mode & PT_MODE_VERBOSE)
92636423dbSRafael Vanoni #define	PT_ON_CPU		(g_op_mode & PT_MODE_CPU)
93b47b5b34SRafael Vanoni 
94b47b5b34SRafael Vanoni /*
95b47b5b34SRafael Vanoni  * Structures and typedefs
96b47b5b34SRafael Vanoni  */
97b47b5b34SRafael Vanoni struct line {
98b47b5b34SRafael Vanoni 	char		*string;
99b47b5b34SRafael Vanoni 	int		count;
100b47b5b34SRafael Vanoni };
101b47b5b34SRafael Vanoni 
102b47b5b34SRafael Vanoni typedef struct event_info {
103b47b5b34SRafael Vanoni 	char		offender_name[EVENT_NAME_MAX];
104b47b5b34SRafael Vanoni 	char		offense_name[EVENT_NAME_MAX];
105b47b5b34SRafael Vanoni 	uint64_t	total_count;
106b47b5b34SRafael Vanoni } event_info_t;
107b47b5b34SRafael Vanoni 
108b47b5b34SRafael Vanoni /*
109b47b5b34SRafael Vanoni  * P/C state information
110b47b5b34SRafael Vanoni  */
111b47b5b34SRafael Vanoni typedef struct state_info {
112b47b5b34SRafael Vanoni 	char		name[STATE_NAME_MAX];
113b47b5b34SRafael Vanoni 	hrtime_t	total_time;
114b47b5b34SRafael Vanoni 	hrtime_t	last_time;
115636423dbSRafael Vanoni 	uint64_t	events;
116b47b5b34SRafael Vanoni } state_info_t;
117b47b5b34SRafael Vanoni 
118b47b5b34SRafael Vanoni typedef struct freq_state_info {
119b47b5b34SRafael Vanoni 	uint64_t	speed;
120b47b5b34SRafael Vanoni 	hrtime_t	total_time;
121b47b5b34SRafael Vanoni } freq_state_info_t;
122b47b5b34SRafael Vanoni 
123b47b5b34SRafael Vanoni typedef struct cpu_power_info {
124b47b5b34SRafael Vanoni 	uint64_t	current_pstate;
125636423dbSRafael Vanoni 	uint64_t	speed_accounted;
126b47b5b34SRafael Vanoni 	hrtime_t	time_accounted;
127b47b5b34SRafael Vanoni 	hrtime_t	dtrace_time;
128b47b5b34SRafael Vanoni } cpu_power_info_t;
129b47b5b34SRafael Vanoni 
130b47b5b34SRafael Vanoni /*
131b47b5b34SRafael Vanoni  * Turbo mode information
132b47b5b34SRafael Vanoni  */
133b47b5b34SRafael Vanoni typedef struct turbo_info {
134b47b5b34SRafael Vanoni 	uint64_t	t_mcnt;
135b47b5b34SRafael Vanoni 	uint64_t	t_acnt;
136b47b5b34SRafael Vanoni } turbo_info_t;
137b47b5b34SRafael Vanoni 
138b47b5b34SRafael Vanoni /*
139*9bbf5ba1SRafael Vanoni  * Suggestions
140b47b5b34SRafael Vanoni  */
141*9bbf5ba1SRafael Vanoni typedef	void		(sugg_func_t)(void);
142*9bbf5ba1SRafael Vanoni 
143*9bbf5ba1SRafael Vanoni typedef struct suggestion {
144*9bbf5ba1SRafael Vanoni 	char *text;
145*9bbf5ba1SRafael Vanoni 	char key;
146*9bbf5ba1SRafael Vanoni 	char *sb_msg;
147*9bbf5ba1SRafael Vanoni 	int weight;
148*9bbf5ba1SRafael Vanoni 	int slice;
149*9bbf5ba1SRafael Vanoni 	sugg_func_t *func;
150*9bbf5ba1SRafael Vanoni 	struct suggestion *prev;
151*9bbf5ba1SRafael Vanoni 	struct suggestion *next;
152*9bbf5ba1SRafael Vanoni } sugg_t;
153b47b5b34SRafael Vanoni 
154b47b5b34SRafael Vanoni extern int			g_bit_depth;
155b47b5b34SRafael Vanoni 
156b47b5b34SRafael Vanoni /*
157b47b5b34SRafael Vanoni  * Event accounting
158b47b5b34SRafael Vanoni  */
159b47b5b34SRafael Vanoni extern int 			g_total_events;
160636423dbSRafael Vanoni extern int 			g_top_events;
161b47b5b34SRafael Vanoni 
162b47b5b34SRafael Vanoni /*
163b47b5b34SRafael Vanoni  * Interval
164b47b5b34SRafael Vanoni  */
165b47b5b34SRafael Vanoni extern double 			g_ticktime, g_ticktime_usr;
166b47b5b34SRafael Vanoni extern double 			g_interval;
167b47b5b34SRafael Vanoni 
168b47b5b34SRafael Vanoni /*
169b47b5b34SRafael Vanoni  * Command line arguments
170b47b5b34SRafael Vanoni  */
171b47b5b34SRafael Vanoni extern uchar_t			g_op_mode;
172b47b5b34SRafael Vanoni extern uint_t			g_observed_cpu;
173b47b5b34SRafael Vanoni extern boolean_t		g_gui;
174b47b5b34SRafael Vanoni /*
175b47b5b34SRafael Vanoni  * Event info array
176b47b5b34SRafael Vanoni  */
177b47b5b34SRafael Vanoni extern event_info_t    		g_event_info[EVENT_NUM_MAX];
178b47b5b34SRafael Vanoni 
179b47b5b34SRafael Vanoni /*
180b47b5b34SRafael Vanoni  * Lookup table, sequential CPU id to Solaris CPU id
181b47b5b34SRafael Vanoni  */
182b47b5b34SRafael Vanoni extern processorid_t 		*g_cpu_table;
183b47b5b34SRafael Vanoni 
184b47b5b34SRafael Vanoni /*
185b47b5b34SRafael Vanoni  * Number of idle/frequency states
186b47b5b34SRafael Vanoni  */
187b47b5b34SRafael Vanoni extern int			g_npstates;
188b47b5b34SRafael Vanoni extern int			g_max_cstate;
189b47b5b34SRafael Vanoni extern int			g_longest_cstate;
190b47b5b34SRafael Vanoni 
191b47b5b34SRafael Vanoni /*
192b47b5b34SRafael Vanoni  * Total time, used to display different idle states
193b47b5b34SRafael Vanoni  */
194b47b5b34SRafael Vanoni extern hrtime_t			g_total_c_time;
195b47b5b34SRafael Vanoni 
196b47b5b34SRafael Vanoni /*
197b47b5b34SRafael Vanoni  * P/C state info arrays
198b47b5b34SRafael Vanoni  */
199b47b5b34SRafael Vanoni extern state_info_t		g_cstate_info[NSTATES];
200b47b5b34SRafael Vanoni extern freq_state_info_t	g_pstate_info[NSTATES];
201b47b5b34SRafael Vanoni 
202*9bbf5ba1SRafael Vanoni extern uint_t			g_features;
203b47b5b34SRafael Vanoni extern uint_t			g_ncpus;
204b47b5b34SRafael Vanoni extern uint_t			g_ncpus_observed;
205b47b5b34SRafael Vanoni 
206b47b5b34SRafael Vanoni extern cpu_power_info_t		*g_cpu_power_states;
207b47b5b34SRafael Vanoni 
208b47b5b34SRafael Vanoni /*
209b47b5b34SRafael Vanoni  * Turbo mode related information
210b47b5b34SRafael Vanoni  */
211b47b5b34SRafael Vanoni extern boolean_t		g_turbo_supported;
212b47b5b34SRafael Vanoni extern double			g_turbo_ratio;
213b47b5b34SRafael Vanoni 
214*9bbf5ba1SRafael Vanoni extern sugg_t			*g_curr_sugg;
215b47b5b34SRafael Vanoni 
216b47b5b34SRafael Vanoni /*
217b47b5b34SRafael Vanoni  * DTrace scripts for the events report
218b47b5b34SRafael Vanoni  */
219b47b5b34SRafael Vanoni extern const char		*g_dtp_events;
220b47b5b34SRafael Vanoni extern const char		*g_dtp_events_v;
221b47b5b34SRafael Vanoni extern const char		*g_dtp_events_c;
222b47b5b34SRafael Vanoni 
223b47b5b34SRafael Vanoni /*
224b47b5b34SRafael Vanoni  * Arguments for dtrace_program_strcompile(). Contents vary according to
225b47b5b34SRafael Vanoni  * the specified operation mode.
226b47b5b34SRafael Vanoni  */
227b47b5b34SRafael Vanoni extern uint_t			g_argc;
228b47b5b34SRafael Vanoni extern char			**g_argv;
229b47b5b34SRafael Vanoni 
230b47b5b34SRafael Vanoni /*
231b47b5b34SRafael Vanoni  * Platform specific messages
232b47b5b34SRafael Vanoni  */
233b47b5b34SRafael Vanoni extern const char		*g_msg_idle_state;
234b47b5b34SRafael Vanoni extern const char		*g_msg_freq_state;
235*9bbf5ba1SRafael Vanoni extern const char		*g_msg_freq_enable;
236*9bbf5ba1SRafael Vanoni 
237b47b5b34SRafael Vanoni /*
238b47b5b34SRafael Vanoni  * Suggestions related
239b47b5b34SRafael Vanoni  */
240*9bbf5ba1SRafael Vanoni extern void 		pt_cpufreq_suggest(void);
241*9bbf5ba1SRafael Vanoni extern void		pt_sugg_as_root(void);
242b47b5b34SRafael Vanoni 
243b47b5b34SRafael Vanoni /*
244b47b5b34SRafael Vanoni  * See util.c
245b47b5b34SRafael Vanoni  */
246b47b5b34SRafael Vanoni extern void 		pt_error(char *, ...);
247b47b5b34SRafael Vanoni extern void 		pt_set_progname(char *);
248b47b5b34SRafael Vanoni extern uint_t		enumerate_cpus(void);
249b47b5b34SRafael Vanoni extern void		usage(void);
250b47b5b34SRafael Vanoni extern int		get_bit_depth(void);
251b47b5b34SRafael Vanoni extern void		battery_mod_lookup(void);
252b47b5b34SRafael Vanoni extern int		event_compare(const void *, const void *);
253b47b5b34SRafael Vanoni 
254b47b5b34SRafael Vanoni /*
255b47b5b34SRafael Vanoni  * Display/curses related
256b47b5b34SRafael Vanoni  */
257*9bbf5ba1SRafael Vanoni extern void		pt_display_setup(boolean_t);
258*9bbf5ba1SRafael Vanoni extern void 		pt_display_init_curses(void);
259*9bbf5ba1SRafael Vanoni extern void		pt_display_update(void);
260*9bbf5ba1SRafael Vanoni extern void 		pt_display_title_bar(void);
261*9bbf5ba1SRafael Vanoni extern void		pt_display_status_bar(void);
262*9bbf5ba1SRafael Vanoni extern void		pt_display_mod_status_bar(char *);
263*9bbf5ba1SRafael Vanoni extern void 		pt_display_states(void);
264*9bbf5ba1SRafael Vanoni extern void		pt_display_acpi_power(uint32_t, double, double, double,
265636423dbSRafael Vanoni 	uint32_t);
266*9bbf5ba1SRafael Vanoni extern void 		pt_display_wakeups(double);
267*9bbf5ba1SRafael Vanoni extern void 		pt_display_events(double);
268*9bbf5ba1SRafael Vanoni extern void 		pt_display_suggestions(char *);
269b47b5b34SRafael Vanoni 
270b47b5b34SRafael Vanoni /*
271b47b5b34SRafael Vanoni  * Suggestions
272b47b5b34SRafael Vanoni  */
273*9bbf5ba1SRafael Vanoni extern void 		pt_sugg_add(char *, int, char, char *, sugg_func_t *);
274*9bbf5ba1SRafael Vanoni extern int		pt_sugg_remove(sugg_func_t *);
275*9bbf5ba1SRafael Vanoni extern void 		pt_sugg_pick(void);
276*9bbf5ba1SRafael Vanoni 
277*9bbf5ba1SRafael Vanoni /*
278*9bbf5ba1SRafael Vanoni  * Battery
279*9bbf5ba1SRafael Vanoni  */
280*9bbf5ba1SRafael Vanoni extern void 		pt_battery_print(void);
281b47b5b34SRafael Vanoni 
282b47b5b34SRafael Vanoni /*
283b47b5b34SRafael Vanoni  * DTrace stats
284b47b5b34SRafael Vanoni  */
285b47b5b34SRafael Vanoni extern int 		pt_cpufreq_stat_prepare(void);
286636423dbSRafael Vanoni extern int 		pt_cpufreq_stat_collect(double);
287b47b5b34SRafael Vanoni extern int 		pt_cpuidle_stat_prepare(void);
288636423dbSRafael Vanoni extern int 		pt_cpuidle_stat_collect(double);
289b47b5b34SRafael Vanoni extern int 		pt_events_stat_prepare(void);
290b47b5b34SRafael Vanoni extern int 		pt_events_stat_collect(void);
291b47b5b34SRafael Vanoni 
292b47b5b34SRafael Vanoni /*
293b47b5b34SRafael Vanoni  * Turbo mode related routines
294b47b5b34SRafael Vanoni  */
295b47b5b34SRafael Vanoni extern int		pt_turbo_stat_prepare(void);
296b47b5b34SRafael Vanoni extern int		pt_turbo_stat_collect(void);
297b47b5b34SRafael Vanoni 
298b47b5b34SRafael Vanoni #endif /* __INCLUDE_GUARD_POWERTOP_H_ */
299