xref: /titanic_53/usr/src/cmd/powertop/common/powertop.h (revision 636423db672c14451a65835f534789270ebd4dc9)
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 
51b47b5b34SRafael Vanoni #define	TITLE			"OpenSolaris PowerTOP version 1.1"
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  * Display colors
83b47b5b34SRafael Vanoni  */
84b47b5b34SRafael Vanoni #define	PT_COLOR_DEFAULT	1
85b47b5b34SRafael Vanoni #define	PT_COLOR_HEADER_BAR	2
86b47b5b34SRafael Vanoni #define	PT_COLOR_ERROR		3
87b47b5b34SRafael Vanoni #define	PT_COLOR_RED		4
88b47b5b34SRafael Vanoni #define	PT_COLOR_YELLOW		5
89b47b5b34SRafael Vanoni #define	PT_COLOR_GREEN		6
90b47b5b34SRafael Vanoni #define	PT_COLOR_BRIGHT		7
91b47b5b34SRafael Vanoni #define	PT_COLOR_BLUE		8
92b47b5b34SRafael Vanoni 
93b47b5b34SRafael Vanoni /*
94b47b5b34SRafael Vanoni  * Constants for setup_windows()
95b47b5b34SRafael Vanoni  */
96b47b5b34SRafael Vanoni #define	SINGLE_LINE_SW 		1
97b47b5b34SRafael Vanoni #define	LENGTH_SUGG_SW		2
98b47b5b34SRafael Vanoni #define	TITLE_LINE		1
99b47b5b34SRafael Vanoni #define	BLANK_LINE		1
100b47b5b34SRafael Vanoni #define	NEXT_LINE		1
101*636423dbSRafael Vanoni #define	PT_BAR_NSLOTS		10
102*636423dbSRafael Vanoni #define	PT_BAR_LENGTH		40
103b47b5b34SRafael Vanoni 
104b47b5b34SRafael Vanoni /*
105b47b5b34SRafael Vanoni  * Available op modes
106b47b5b34SRafael Vanoni  */
107*636423dbSRafael Vanoni #define	PT_MODE_DEFAULT		0x01
108*636423dbSRafael Vanoni #define	PT_MODE_DUMP		0x02
109*636423dbSRafael Vanoni #define	PT_MODE_VERBOSE		0x04
110*636423dbSRafael Vanoni #define	PT_MODE_CPU		0x08
111b47b5b34SRafael Vanoni 
112*636423dbSRafael Vanoni #define	PT_ON_DEFAULT		(g_op_mode & PT_MODE_DEFAULT)
113*636423dbSRafael Vanoni #define	PT_ON_DUMP		(g_op_mode & PT_MODE_DUMP)
114*636423dbSRafael Vanoni #define	PT_ON_VERBOSE		(g_op_mode & PT_MODE_VERBOSE)
115*636423dbSRafael Vanoni #define	PT_ON_CPU		(g_op_mode & PT_MODE_CPU)
116b47b5b34SRafael Vanoni 
117b47b5b34SRafael Vanoni /*
118b47b5b34SRafael Vanoni  * Structures and typedefs
119b47b5b34SRafael Vanoni  */
120b47b5b34SRafael Vanoni struct line {
121b47b5b34SRafael Vanoni 	char		*string;
122b47b5b34SRafael Vanoni 	int		count;
123b47b5b34SRafael Vanoni };
124b47b5b34SRafael Vanoni 
125b47b5b34SRafael Vanoni typedef struct event_info {
126b47b5b34SRafael Vanoni 	char		offender_name[EVENT_NAME_MAX];
127b47b5b34SRafael Vanoni 	char		offense_name[EVENT_NAME_MAX];
128b47b5b34SRafael Vanoni 	uint64_t	total_count;
129b47b5b34SRafael Vanoni } event_info_t;
130b47b5b34SRafael Vanoni 
131b47b5b34SRafael Vanoni /*
132b47b5b34SRafael Vanoni  * P/C state information
133b47b5b34SRafael Vanoni  */
134b47b5b34SRafael Vanoni typedef struct state_info {
135b47b5b34SRafael Vanoni 	char		name[STATE_NAME_MAX];
136b47b5b34SRafael Vanoni 	hrtime_t	total_time;
137b47b5b34SRafael Vanoni 	hrtime_t	last_time;
138*636423dbSRafael Vanoni 	uint64_t	events;
139b47b5b34SRafael Vanoni } state_info_t;
140b47b5b34SRafael Vanoni 
141b47b5b34SRafael Vanoni typedef struct freq_state_info {
142b47b5b34SRafael Vanoni 	uint64_t	speed;
143b47b5b34SRafael Vanoni 	hrtime_t	total_time;
144b47b5b34SRafael Vanoni } freq_state_info_t;
145b47b5b34SRafael Vanoni 
146b47b5b34SRafael Vanoni typedef struct cpu_power_info {
147b47b5b34SRafael Vanoni 	uint64_t	current_pstate;
148*636423dbSRafael Vanoni 	uint64_t	speed_accounted;
149b47b5b34SRafael Vanoni 	hrtime_t	time_accounted;
150b47b5b34SRafael Vanoni 	hrtime_t	dtrace_time;
151b47b5b34SRafael Vanoni } cpu_power_info_t;
152b47b5b34SRafael Vanoni 
153b47b5b34SRafael Vanoni /*
154b47b5b34SRafael Vanoni  * Turbo mode information
155b47b5b34SRafael Vanoni  */
156b47b5b34SRafael Vanoni typedef struct turbo_info {
157b47b5b34SRafael Vanoni 	uint64_t	t_mcnt;
158b47b5b34SRafael Vanoni 	uint64_t	t_acnt;
159b47b5b34SRafael Vanoni } turbo_info_t;
160b47b5b34SRafael Vanoni 
161b47b5b34SRafael Vanoni typedef	void			(suggestion_func)(void);
162b47b5b34SRafael Vanoni 
163b47b5b34SRafael Vanoni /*
164b47b5b34SRafael Vanoni  * Global variables
165b47b5b34SRafael Vanoni  */
166b47b5b34SRafael Vanoni extern double			g_displaytime;
167b47b5b34SRafael Vanoni 
168b47b5b34SRafael Vanoni extern int			g_bit_depth;
169b47b5b34SRafael Vanoni 
170b47b5b34SRafael Vanoni /*
171b47b5b34SRafael Vanoni  * Event accounting
172b47b5b34SRafael Vanoni  */
173b47b5b34SRafael Vanoni extern int 			g_total_events;
174*636423dbSRafael Vanoni extern int 			g_top_events;
175b47b5b34SRafael Vanoni 
176b47b5b34SRafael Vanoni /*
177b47b5b34SRafael Vanoni  * Interval
178b47b5b34SRafael Vanoni  */
179b47b5b34SRafael Vanoni extern double 			g_ticktime, g_ticktime_usr;
180b47b5b34SRafael Vanoni extern double 			g_interval;
181b47b5b34SRafael Vanoni 
182b47b5b34SRafael Vanoni /*
183b47b5b34SRafael Vanoni  * Command line arguments
184b47b5b34SRafael Vanoni  */
185b47b5b34SRafael Vanoni extern uchar_t			g_op_mode;
186b47b5b34SRafael Vanoni extern uint_t			g_observed_cpu;
187b47b5b34SRafael Vanoni extern boolean_t		g_gui;
188b47b5b34SRafael Vanoni /*
189b47b5b34SRafael Vanoni  * Event info array
190b47b5b34SRafael Vanoni  */
191b47b5b34SRafael Vanoni extern event_info_t    		g_event_info[EVENT_NUM_MAX];
192b47b5b34SRafael Vanoni 
193b47b5b34SRafael Vanoni /*
194b47b5b34SRafael Vanoni  * Lookup table, sequential CPU id to Solaris CPU id
195b47b5b34SRafael Vanoni  */
196b47b5b34SRafael Vanoni extern processorid_t 		*g_cpu_table;
197b47b5b34SRafael Vanoni 
198b47b5b34SRafael Vanoni /*
199b47b5b34SRafael Vanoni  * Number of idle/frequency states
200b47b5b34SRafael Vanoni  */
201b47b5b34SRafael Vanoni extern int			g_npstates;
202b47b5b34SRafael Vanoni extern int			g_max_cstate;
203b47b5b34SRafael Vanoni extern int			g_longest_cstate;
204b47b5b34SRafael Vanoni 
205b47b5b34SRafael Vanoni /*
206b47b5b34SRafael Vanoni  * Total time, used to display different idle states
207b47b5b34SRafael Vanoni  */
208b47b5b34SRafael Vanoni extern hrtime_t			g_total_c_time;
209b47b5b34SRafael Vanoni 
210b47b5b34SRafael Vanoni /*
211b47b5b34SRafael Vanoni  * P/C state info arrays
212b47b5b34SRafael Vanoni  */
213b47b5b34SRafael Vanoni extern state_info_t		g_cstate_info[NSTATES];
214b47b5b34SRafael Vanoni extern freq_state_info_t	g_pstate_info[NSTATES];
215b47b5b34SRafael Vanoni 
216b47b5b34SRafael Vanoni extern uint_t			g_ncpus;
217b47b5b34SRafael Vanoni extern uint_t			g_ncpus_observed;
218b47b5b34SRafael Vanoni 
219*636423dbSRafael Vanoni extern char 			g_status_bar_slots[PT_BAR_NSLOTS]
220*636423dbSRafael Vanoni 	[PT_BAR_LENGTH];
221b47b5b34SRafael Vanoni 
222b47b5b34SRafael Vanoni extern cpu_power_info_t		*g_cpu_power_states;
223b47b5b34SRafael Vanoni 
224b47b5b34SRafael Vanoni /*
225b47b5b34SRafael Vanoni  * Turbo mode related information
226b47b5b34SRafael Vanoni  */
227b47b5b34SRafael Vanoni extern boolean_t		g_turbo_supported;
228b47b5b34SRafael Vanoni extern double			g_turbo_ratio;
229b47b5b34SRafael Vanoni 
230b47b5b34SRafael Vanoni extern char 			g_suggestion_key;
231b47b5b34SRafael Vanoni extern suggestion_func 		*g_suggestion_activate;
232b47b5b34SRafael Vanoni 
233b47b5b34SRafael Vanoni /*
234b47b5b34SRafael Vanoni  * DTrace scripts for the events report
235b47b5b34SRafael Vanoni  */
236b47b5b34SRafael Vanoni extern const char		*g_dtp_events;
237b47b5b34SRafael Vanoni extern const char		*g_dtp_events_v;
238b47b5b34SRafael Vanoni extern const char		*g_dtp_events_c;
239b47b5b34SRafael Vanoni 
240b47b5b34SRafael Vanoni /*
241b47b5b34SRafael Vanoni  * Arguments for dtrace_program_strcompile(). Contents vary according to
242b47b5b34SRafael Vanoni  * the specified operation mode.
243b47b5b34SRafael Vanoni  */
244b47b5b34SRafael Vanoni extern uint_t			g_argc;
245b47b5b34SRafael Vanoni extern char			**g_argv;
246b47b5b34SRafael Vanoni 
247b47b5b34SRafael Vanoni /*
248b47b5b34SRafael Vanoni  * Platform specific messages
249b47b5b34SRafael Vanoni  */
250b47b5b34SRafael Vanoni extern const char 		*g_msg_idle_state;
251b47b5b34SRafael Vanoni extern const char 		*g_msg_freq_state;
252b47b5b34SRafael Vanoni /*
253b47b5b34SRafael Vanoni  * Suggestions related
254b47b5b34SRafael Vanoni  */
255b47b5b34SRafael Vanoni extern void 		suggest_p_state(void);
256b47b5b34SRafael Vanoni extern void		suggest_as_root(void);
257b47b5b34SRafael Vanoni 
258b47b5b34SRafael Vanoni /*
259b47b5b34SRafael Vanoni  * See util.c
260b47b5b34SRafael Vanoni  */
261b47b5b34SRafael Vanoni extern void 		pt_error(char *, ...);
262b47b5b34SRafael Vanoni extern void 		pt_set_progname(char *);
263b47b5b34SRafael Vanoni extern uint_t		enumerate_cpus(void);
264b47b5b34SRafael Vanoni extern void		usage(void);
265b47b5b34SRafael Vanoni extern int		get_bit_depth(void);
266b47b5b34SRafael Vanoni extern void		battery_mod_lookup(void);
267b47b5b34SRafael Vanoni extern int		event_compare(const void *, const void *);
268b47b5b34SRafael Vanoni 
269b47b5b34SRafael Vanoni /*
270b47b5b34SRafael Vanoni  * Display/curses related
271b47b5b34SRafael Vanoni  */
272b47b5b34SRafael Vanoni extern void 		show_title_bar(void);
273b47b5b34SRafael Vanoni extern void 		setup_windows(void);
274b47b5b34SRafael Vanoni extern void 		initialize_curses(void);
275*636423dbSRafael Vanoni extern void		show_acpi_power_line(uint32_t, double, double, double,
276*636423dbSRafael Vanoni 	uint32_t);
277b47b5b34SRafael Vanoni extern void 		show_cstates();
278*636423dbSRafael Vanoni extern void 		show_wakeups(double);
279*636423dbSRafael Vanoni extern void 		show_eventstats(double);
280*636423dbSRafael Vanoni extern void 		show_suggestion(char *);
281b47b5b34SRafael Vanoni extern void 		cleanup_curses(void);
282b47b5b34SRafael Vanoni extern void		update_windows(void);
283b47b5b34SRafael Vanoni 
284b47b5b34SRafael Vanoni /*
285b47b5b34SRafael Vanoni  * Suggestions
286b47b5b34SRafael Vanoni  */
287b47b5b34SRafael Vanoni extern void 		pick_suggestion(void);
288*636423dbSRafael Vanoni extern void 		add_suggestion(char *, int, char, char *,
289*636423dbSRafael Vanoni 	suggestion_func *);
290b47b5b34SRafael Vanoni extern void 		reset_suggestions(void);
291b47b5b34SRafael Vanoni extern void 		print_all_suggestions(void);
292b47b5b34SRafael Vanoni extern void 		print_battery(void);
293b47b5b34SRafael Vanoni 
294b47b5b34SRafael Vanoni /*
295b47b5b34SRafael Vanoni  * DTrace stats
296b47b5b34SRafael Vanoni  */
297b47b5b34SRafael Vanoni extern int 		pt_cpufreq_stat_prepare(void);
298*636423dbSRafael Vanoni extern int 		pt_cpufreq_stat_collect(double);
299b47b5b34SRafael Vanoni extern int 		pt_cpuidle_stat_prepare(void);
300*636423dbSRafael Vanoni extern int 		pt_cpuidle_stat_collect(double);
301b47b5b34SRafael Vanoni extern int 		pt_events_stat_prepare(void);
302b47b5b34SRafael Vanoni extern int 		pt_events_stat_collect(void);
303b47b5b34SRafael Vanoni 
304b47b5b34SRafael Vanoni /*
305b47b5b34SRafael Vanoni  * Turbo mode related routines
306b47b5b34SRafael Vanoni  */
307b47b5b34SRafael Vanoni extern int		pt_turbo_stat_prepare(void);
308b47b5b34SRafael Vanoni extern int		pt_turbo_stat_collect(void);
309b47b5b34SRafael Vanoni 
310b47b5b34SRafael Vanoni #endif /* __INCLUDE_GUARD_POWERTOP_H_ */
311