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 <sys/processor.h>
45b47b5b34SRafael Vanoni 
46b47b5b34SRafael Vanoni #define	max(A, B)		(((A) < (B)) ? (B) : (A))
47b47b5b34SRafael Vanoni 
489bbf5ba1SRafael Vanoni #define	TITLE			"OpenSolaris PowerTOP version 1.2"
49b47b5b34SRafael Vanoni #define	COPYRIGHT_INTEL		"(C) 2009 Intel Corporation"
50b47b5b34SRafael Vanoni 
51b47b5b34SRafael Vanoni /*
52b47b5b34SRafael Vanoni  * Exit values. stdlib.h defines EXIT_SUCCESS as 0 and
53b47b5b34SRafael Vanoni  * EXIT_FAILURE as 1
54b47b5b34SRafael Vanoni  */
55b47b5b34SRafael Vanoni #define	EXIT_USAGE		2
56b47b5b34SRafael Vanoni 
57b47b5b34SRafael Vanoni /*
58b47b5b34SRafael Vanoni  * PowerTOP Features
59b47b5b34SRafael Vanoni  * These may not be available everywhere
60b47b5b34SRafael Vanoni  */
61b47b5b34SRafael Vanoni #define	FEATURE_CSTATE		0x01
62b47b5b34SRafael Vanoni #define	FEATURE_PSTATE		0x02
63b47b5b34SRafael Vanoni #define	FEATURE_EVENTS		0x04
64b47b5b34SRafael Vanoni #define	FEATURE_TURBO		0x08
65b47b5b34SRafael Vanoni 
66b47b5b34SRafael Vanoni #define	BIT_DEPTH_BUF		10
67b47b5b34SRafael Vanoni 
68b47b5b34SRafael Vanoni #define	INTERVAL_DEFAULT	5.0
69*2d83778aSRafael Vanoni #define	INTERVAL_MAX		30.0
70b47b5b34SRafael Vanoni #define	INTERVAL_UPDATE(l)						\
71b47b5b34SRafael Vanoni 	((l/INTERVAL_DEFAULT) * INTERVAL_DEFAULT + INTERVAL_DEFAULT)
72b47b5b34SRafael Vanoni 
73b47b5b34SRafael Vanoni #define	STATE_NAME_MAX		16
74b47b5b34SRafael Vanoni #define	EVENT_NAME_MAX 		64
75b47b5b34SRafael Vanoni #define	EVENT_NUM_MAX 		100
76b47b5b34SRafael Vanoni #define	NSTATES			32
77b47b5b34SRafael Vanoni 
78b47b5b34SRafael Vanoni /*
79*2d83778aSRafael Vanoni  * Available op modes. The PT_ON_* macros allow for a simple way of checking
80*2d83778aSRafael Vanoni  * under which mode PowerTOP is operating.
81b47b5b34SRafael Vanoni  */
82636423dbSRafael Vanoni #define	PT_MODE_DEFAULT		0x01
83636423dbSRafael Vanoni #define	PT_MODE_DUMP		0x02
84636423dbSRafael Vanoni #define	PT_MODE_VERBOSE		0x04
85636423dbSRafael Vanoni #define	PT_MODE_CPU		0x08
86*2d83778aSRafael Vanoni #define	PT_MODE_TIME		0x10
87b47b5b34SRafael Vanoni 
88636423dbSRafael Vanoni #define	PT_ON_DEFAULT		(g_op_mode & PT_MODE_DEFAULT)
89636423dbSRafael Vanoni #define	PT_ON_DUMP		(g_op_mode & PT_MODE_DUMP)
90636423dbSRafael Vanoni #define	PT_ON_VERBOSE		(g_op_mode & PT_MODE_VERBOSE)
91636423dbSRafael Vanoni #define	PT_ON_CPU		(g_op_mode & PT_MODE_CPU)
92*2d83778aSRafael Vanoni #define	PT_ON_TIME		(g_op_mode & PT_MODE_TIME)
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 /*
1399bbf5ba1SRafael Vanoni  * Suggestions
140b47b5b34SRafael Vanoni  */
1419bbf5ba1SRafael Vanoni typedef	void		(sugg_func_t)(void);
1429bbf5ba1SRafael Vanoni 
1439bbf5ba1SRafael Vanoni typedef struct suggestion {
1449bbf5ba1SRafael Vanoni 	char *text;
1459bbf5ba1SRafael Vanoni 	char key;
1469bbf5ba1SRafael Vanoni 	char *sb_msg;
1479bbf5ba1SRafael Vanoni 	int weight;
1489bbf5ba1SRafael Vanoni 	int slice;
1499bbf5ba1SRafael Vanoni 	sugg_func_t *func;
1509bbf5ba1SRafael Vanoni 	struct suggestion *prev;
1519bbf5ba1SRafael Vanoni 	struct suggestion *next;
1529bbf5ba1SRafael 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  * Command line arguments
164b47b5b34SRafael Vanoni  */
165b47b5b34SRafael Vanoni extern uchar_t			g_op_mode;
166b47b5b34SRafael Vanoni extern uint_t			g_observed_cpu;
167b47b5b34SRafael Vanoni extern boolean_t		g_gui;
168b47b5b34SRafael Vanoni /*
169b47b5b34SRafael Vanoni  * Event info array
170b47b5b34SRafael Vanoni  */
171b47b5b34SRafael Vanoni extern event_info_t    		g_event_info[EVENT_NUM_MAX];
172b47b5b34SRafael Vanoni 
173b47b5b34SRafael Vanoni /*
174b47b5b34SRafael Vanoni  * Lookup table, sequential CPU id to Solaris CPU id
175b47b5b34SRafael Vanoni  */
176b47b5b34SRafael Vanoni extern processorid_t 		*g_cpu_table;
177b47b5b34SRafael Vanoni 
178b47b5b34SRafael Vanoni /*
179b47b5b34SRafael Vanoni  * Number of idle/frequency states
180b47b5b34SRafael Vanoni  */
181b47b5b34SRafael Vanoni extern int			g_npstates;
182b47b5b34SRafael Vanoni extern int			g_max_cstate;
183b47b5b34SRafael Vanoni extern int			g_longest_cstate;
184b47b5b34SRafael Vanoni 
185b47b5b34SRafael Vanoni /*
186b47b5b34SRafael Vanoni  * Total time, used to display different idle states
187b47b5b34SRafael Vanoni  */
188b47b5b34SRafael Vanoni extern hrtime_t			g_total_c_time;
189b47b5b34SRafael Vanoni 
190b47b5b34SRafael Vanoni /*
191*2d83778aSRafael Vanoni  * Current interval length
192*2d83778aSRafael Vanoni  */
193*2d83778aSRafael Vanoni extern double			g_interval_length;
194*2d83778aSRafael Vanoni 
195*2d83778aSRafael Vanoni /*
196b47b5b34SRafael Vanoni  * P/C state info arrays
197b47b5b34SRafael Vanoni  */
198b47b5b34SRafael Vanoni extern state_info_t		g_cstate_info[NSTATES];
199b47b5b34SRafael Vanoni extern freq_state_info_t	g_pstate_info[NSTATES];
200b47b5b34SRafael Vanoni 
2019bbf5ba1SRafael Vanoni extern uint_t			g_features;
202b47b5b34SRafael Vanoni extern uint_t			g_ncpus;
203b47b5b34SRafael Vanoni extern uint_t			g_ncpus_observed;
204b47b5b34SRafael Vanoni 
205b47b5b34SRafael Vanoni extern cpu_power_info_t		*g_cpu_power_states;
206b47b5b34SRafael Vanoni 
207b47b5b34SRafael Vanoni /*
208b47b5b34SRafael Vanoni  * Turbo mode related information
209b47b5b34SRafael Vanoni  */
210b47b5b34SRafael Vanoni extern boolean_t		g_turbo_supported;
211b47b5b34SRafael Vanoni extern double			g_turbo_ratio;
212b47b5b34SRafael Vanoni 
2139bbf5ba1SRafael Vanoni extern sugg_t			*g_curr_sugg;
214b47b5b34SRafael Vanoni 
215b47b5b34SRafael Vanoni /*
216b47b5b34SRafael Vanoni  * DTrace scripts for the events report
217b47b5b34SRafael Vanoni  */
218b47b5b34SRafael Vanoni extern const char		*g_dtp_events;
219b47b5b34SRafael Vanoni extern const char		*g_dtp_events_v;
220b47b5b34SRafael Vanoni extern const char		*g_dtp_events_c;
221b47b5b34SRafael Vanoni 
222b47b5b34SRafael Vanoni /*
223b47b5b34SRafael Vanoni  * Arguments for dtrace_program_strcompile(). Contents vary according to
224b47b5b34SRafael Vanoni  * the specified operation mode.
225b47b5b34SRafael Vanoni  */
226b47b5b34SRafael Vanoni extern uint_t			g_argc;
227b47b5b34SRafael Vanoni extern char			**g_argv;
228b47b5b34SRafael Vanoni 
229b47b5b34SRafael Vanoni /*
230b47b5b34SRafael Vanoni  * Platform specific messages
231b47b5b34SRafael Vanoni  */
232b47b5b34SRafael Vanoni extern const char		*g_msg_idle_state;
233b47b5b34SRafael Vanoni extern const char		*g_msg_freq_state;
2349bbf5ba1SRafael Vanoni extern const char		*g_msg_freq_enable;
2359bbf5ba1SRafael Vanoni 
236b47b5b34SRafael Vanoni /*
237*2d83778aSRafael Vanoni  * Flags for signal handling
238*2d83778aSRafael Vanoni  */
239*2d83778aSRafael Vanoni extern boolean_t		g_sig_resize;
240*2d83778aSRafael Vanoni 
241*2d83778aSRafael Vanoni extern void		pt_sig_handler(int);
242*2d83778aSRafael Vanoni 
243*2d83778aSRafael Vanoni /*
244b47b5b34SRafael Vanoni  * Suggestions related
245b47b5b34SRafael Vanoni  */
2469bbf5ba1SRafael Vanoni extern void 		pt_cpufreq_suggest(void);
2479bbf5ba1SRafael Vanoni extern void		pt_sugg_as_root(void);
248b47b5b34SRafael Vanoni 
249b47b5b34SRafael Vanoni /*
250b47b5b34SRafael Vanoni  * See util.c
251b47b5b34SRafael Vanoni  */
252b47b5b34SRafael Vanoni extern void 		pt_error(char *, ...);
253b47b5b34SRafael Vanoni extern void 		pt_set_progname(char *);
254*2d83778aSRafael Vanoni extern uint_t		pt_enumerate_cpus(void);
255*2d83778aSRafael Vanoni extern void		pt_usage(void);
256*2d83778aSRafael Vanoni extern int		pt_get_bit_depth(void);
257*2d83778aSRafael Vanoni extern void		pt_battery_mod_lookup(void);
258*2d83778aSRafael Vanoni extern int		pt_event_compare(const void *, const void *);
259b47b5b34SRafael Vanoni 
260b47b5b34SRafael Vanoni /*
261b47b5b34SRafael Vanoni  * Display/curses related
262b47b5b34SRafael Vanoni  */
2639bbf5ba1SRafael Vanoni extern void		pt_display_setup(boolean_t);
2649bbf5ba1SRafael Vanoni extern void 		pt_display_init_curses(void);
2659bbf5ba1SRafael Vanoni extern void		pt_display_update(void);
2669bbf5ba1SRafael Vanoni extern void 		pt_display_title_bar(void);
2679bbf5ba1SRafael Vanoni extern void		pt_display_status_bar(void);
2689bbf5ba1SRafael Vanoni extern void		pt_display_mod_status_bar(char *);
2699bbf5ba1SRafael Vanoni extern void 		pt_display_states(void);
2709bbf5ba1SRafael Vanoni extern void		pt_display_acpi_power(uint32_t, double, double, double,
271636423dbSRafael Vanoni 	uint32_t);
2729bbf5ba1SRafael Vanoni extern void 		pt_display_wakeups(double);
2739bbf5ba1SRafael Vanoni extern void 		pt_display_events(double);
2749bbf5ba1SRafael Vanoni extern void 		pt_display_suggestions(char *);
275*2d83778aSRafael Vanoni extern void		pt_display_resize(void);
276b47b5b34SRafael Vanoni 
277b47b5b34SRafael Vanoni /*
278b47b5b34SRafael Vanoni  * Suggestions
279b47b5b34SRafael Vanoni  */
2809bbf5ba1SRafael Vanoni extern void 		pt_sugg_add(char *, int, char, char *, sugg_func_t *);
2819bbf5ba1SRafael Vanoni extern int		pt_sugg_remove(sugg_func_t *);
2829bbf5ba1SRafael Vanoni extern void 		pt_sugg_pick(void);
2839bbf5ba1SRafael Vanoni 
2849bbf5ba1SRafael Vanoni /*
2859bbf5ba1SRafael Vanoni  * Battery
2869bbf5ba1SRafael Vanoni  */
2879bbf5ba1SRafael Vanoni extern void 		pt_battery_print(void);
288b47b5b34SRafael Vanoni 
289b47b5b34SRafael Vanoni /*
290b47b5b34SRafael Vanoni  * DTrace stats
291b47b5b34SRafael Vanoni  */
292b47b5b34SRafael Vanoni extern int 		pt_cpufreq_stat_prepare(void);
293636423dbSRafael Vanoni extern int 		pt_cpufreq_stat_collect(double);
294b47b5b34SRafael Vanoni extern int 		pt_cpuidle_stat_prepare(void);
295636423dbSRafael Vanoni extern int 		pt_cpuidle_stat_collect(double);
296b47b5b34SRafael Vanoni extern int 		pt_events_stat_prepare(void);
297b47b5b34SRafael Vanoni extern int 		pt_events_stat_collect(void);
298b47b5b34SRafael Vanoni 
299b47b5b34SRafael Vanoni /*
300b47b5b34SRafael Vanoni  * Turbo mode related routines
301b47b5b34SRafael Vanoni  */
302b47b5b34SRafael Vanoni extern int		pt_turbo_stat_prepare(void);
303b47b5b34SRafael Vanoni extern int		pt_turbo_stat_collect(void);
304b47b5b34SRafael Vanoni 
305b47b5b34SRafael Vanoni #endif /* __INCLUDE_GUARD_POWERTOP_H_ */
306