1*b47b5b34SRafael Vanoni /*
2*b47b5b34SRafael Vanoni  * Copyright 2009, Intel Corporation
3*b47b5b34SRafael Vanoni  * Copyright 2009, Sun Microsystems, Inc
4*b47b5b34SRafael Vanoni  *
5*b47b5b34SRafael Vanoni  * This file is part of PowerTOP
6*b47b5b34SRafael Vanoni  *
7*b47b5b34SRafael Vanoni  * This program file is free software; you can redistribute it and/or modify it
8*b47b5b34SRafael Vanoni  * under the terms of the GNU General Public License as published by the
9*b47b5b34SRafael Vanoni  * Free Software Foundation; version 2 of the License.
10*b47b5b34SRafael Vanoni  *
11*b47b5b34SRafael Vanoni  * This program is distributed in the hope that it will be useful, but WITHOUT
12*b47b5b34SRafael Vanoni  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*b47b5b34SRafael Vanoni  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*b47b5b34SRafael Vanoni  * for more details.
15*b47b5b34SRafael Vanoni  *
16*b47b5b34SRafael Vanoni  * You should have received a copy of the GNU General Public License
17*b47b5b34SRafael Vanoni  * along with this program in a file named COPYING; if not, write to the
18*b47b5b34SRafael Vanoni  * Free Software Foundation, Inc.,
19*b47b5b34SRafael Vanoni  * 51 Franklin Street, Fifth Floor,
20*b47b5b34SRafael Vanoni  * Boston, MA 02110-1301 USA
21*b47b5b34SRafael Vanoni  *
22*b47b5b34SRafael Vanoni  * Authors:
23*b47b5b34SRafael Vanoni  *	Arjan van de Ven <arjan@linux.intel.com>
24*b47b5b34SRafael Vanoni  *	Eric C Saxe <eric.saxe@sun.com>
25*b47b5b34SRafael Vanoni  *	Aubrey Li <aubrey.li@intel.com>
26*b47b5b34SRafael Vanoni  */
27*b47b5b34SRafael Vanoni 
28*b47b5b34SRafael Vanoni /*
29*b47b5b34SRafael Vanoni  * GPL Disclaimer
30*b47b5b34SRafael Vanoni  *
31*b47b5b34SRafael Vanoni  * For the avoidance of doubt, except that if any license choice other
32*b47b5b34SRafael Vanoni  * than GPL or LGPL is available it will apply instead, Sun elects to
33*b47b5b34SRafael Vanoni  * use only the General Public License version 2 (GPLv2) at this time
34*b47b5b34SRafael Vanoni  * for any software where a choice of GPL license versions is made
35*b47b5b34SRafael Vanoni  * available with the language indicating that GPLv2 or any later
36*b47b5b34SRafael Vanoni  * version may be used, or where a choice of which version of the GPL
37*b47b5b34SRafael Vanoni  * is applied is otherwise unspecified.
38*b47b5b34SRafael Vanoni  */
39*b47b5b34SRafael Vanoni 
40*b47b5b34SRafael Vanoni #ifndef __INCLUDE_GUARD_POWERTOP_H_
41*b47b5b34SRafael Vanoni #define	__INCLUDE_GUARD_POWERTOP_H_
42*b47b5b34SRafael Vanoni 
43*b47b5b34SRafael Vanoni #include <sys/types.h>
44*b47b5b34SRafael Vanoni #include <libintl.h>
45*b47b5b34SRafael Vanoni #include <sys/processor.h>
46*b47b5b34SRafael Vanoni 
47*b47b5b34SRafael Vanoni #define	max(A, B)		(((A) < (B)) ? (B) : (A))
48*b47b5b34SRafael Vanoni 
49*b47b5b34SRafael Vanoni #define	_(STRING)		gettext(STRING)
50*b47b5b34SRafael Vanoni 
51*b47b5b34SRafael Vanoni #define	TITLE			"OpenSolaris PowerTOP version 1.1"
52*b47b5b34SRafael Vanoni #define	COPYRIGHT_INTEL		"(C) 2009 Intel Corporation"
53*b47b5b34SRafael Vanoni 
54*b47b5b34SRafael Vanoni /*
55*b47b5b34SRafael Vanoni  * Exit values. stdlib.h defines EXIT_SUCCESS as 0 and
56*b47b5b34SRafael Vanoni  * EXIT_FAILURE as 1
57*b47b5b34SRafael Vanoni  */
58*b47b5b34SRafael Vanoni #define	EXIT_USAGE		2
59*b47b5b34SRafael Vanoni 
60*b47b5b34SRafael Vanoni /*
61*b47b5b34SRafael Vanoni  * PowerTOP Features
62*b47b5b34SRafael Vanoni  * These may not be available everywhere
63*b47b5b34SRafael Vanoni  */
64*b47b5b34SRafael Vanoni #define	FEATURE_CSTATE		0x01
65*b47b5b34SRafael Vanoni #define	FEATURE_PSTATE		0x02
66*b47b5b34SRafael Vanoni #define	FEATURE_EVENTS		0x04
67*b47b5b34SRafael Vanoni #define	FEATURE_TURBO		0x08
68*b47b5b34SRafael Vanoni 
69*b47b5b34SRafael Vanoni #define	BIT_DEPTH_BUF		10
70*b47b5b34SRafael Vanoni 
71*b47b5b34SRafael Vanoni #define	INTERVAL_DEFAULT	5.0
72*b47b5b34SRafael Vanoni #define	INTERVAL_MAX		100.0
73*b47b5b34SRafael Vanoni #define	INTERVAL_UPDATE(l)						\
74*b47b5b34SRafael Vanoni 	((l/INTERVAL_DEFAULT) * INTERVAL_DEFAULT + INTERVAL_DEFAULT)
75*b47b5b34SRafael Vanoni 
76*b47b5b34SRafael Vanoni #define	STATE_NAME_MAX		16
77*b47b5b34SRafael Vanoni #define	EVENT_NAME_MAX 		64
78*b47b5b34SRafael Vanoni #define	EVENT_NUM_MAX 		100
79*b47b5b34SRafael Vanoni #define	NSTATES			32
80*b47b5b34SRafael Vanoni 
81*b47b5b34SRafael Vanoni /*
82*b47b5b34SRafael Vanoni  * Display colors
83*b47b5b34SRafael Vanoni  */
84*b47b5b34SRafael Vanoni #define	PT_COLOR_DEFAULT	1
85*b47b5b34SRafael Vanoni #define	PT_COLOR_HEADER_BAR	2
86*b47b5b34SRafael Vanoni #define	PT_COLOR_ERROR		3
87*b47b5b34SRafael Vanoni #define	PT_COLOR_RED		4
88*b47b5b34SRafael Vanoni #define	PT_COLOR_YELLOW		5
89*b47b5b34SRafael Vanoni #define	PT_COLOR_GREEN		6
90*b47b5b34SRafael Vanoni #define	PT_COLOR_BRIGHT		7
91*b47b5b34SRafael Vanoni #define	PT_COLOR_BLUE		8
92*b47b5b34SRafael Vanoni 
93*b47b5b34SRafael Vanoni /*
94*b47b5b34SRafael Vanoni  * Constants for setup_windows()
95*b47b5b34SRafael Vanoni  */
96*b47b5b34SRafael Vanoni #define	SINGLE_LINE_SW 		1
97*b47b5b34SRafael Vanoni #define	LENGTH_SUGG_SW		2
98*b47b5b34SRafael Vanoni #define	TITLE_LINE		1
99*b47b5b34SRafael Vanoni #define	BLANK_LINE		1
100*b47b5b34SRafael Vanoni #define	NEXT_LINE		1
101*b47b5b34SRafael Vanoni #define	PTOP_BAR_NSLOTS		10
102*b47b5b34SRafael Vanoni #define	PTOP_BAR_LENGTH		40
103*b47b5b34SRafael Vanoni 
104*b47b5b34SRafael Vanoni /*
105*b47b5b34SRafael Vanoni  * Available op modes
106*b47b5b34SRafael Vanoni  */
107*b47b5b34SRafael Vanoni #define	PTOP_MODE_DEFAULT	0x01
108*b47b5b34SRafael Vanoni #define	PTOP_MODE_DUMP		0x02
109*b47b5b34SRafael Vanoni #define	PTOP_MODE_VERBOSE	0x04
110*b47b5b34SRafael Vanoni #define	PTOP_MODE_CPU		0x08
111*b47b5b34SRafael Vanoni 
112*b47b5b34SRafael Vanoni #define	PTOP_ON_DEFAULT		(g_op_mode & PTOP_MODE_DEFAULT)
113*b47b5b34SRafael Vanoni #define	PTOP_ON_DUMP		(g_op_mode & PTOP_MODE_DUMP)
114*b47b5b34SRafael Vanoni #define	PTOP_ON_VERBOSE		(g_op_mode & PTOP_MODE_VERBOSE)
115*b47b5b34SRafael Vanoni #define	PTOP_ON_CPU		(g_op_mode & PTOP_MODE_CPU)
116*b47b5b34SRafael Vanoni 
117*b47b5b34SRafael Vanoni /*
118*b47b5b34SRafael Vanoni  * Structures and typedefs
119*b47b5b34SRafael Vanoni  */
120*b47b5b34SRafael Vanoni struct line {
121*b47b5b34SRafael Vanoni 	char		*string;
122*b47b5b34SRafael Vanoni 	int		count;
123*b47b5b34SRafael Vanoni };
124*b47b5b34SRafael Vanoni 
125*b47b5b34SRafael Vanoni typedef struct event_info {
126*b47b5b34SRafael Vanoni 	char		offender_name[EVENT_NAME_MAX];
127*b47b5b34SRafael Vanoni 	char		offense_name[EVENT_NAME_MAX];
128*b47b5b34SRafael Vanoni 	uint64_t	total_count;
129*b47b5b34SRafael Vanoni } event_info_t;
130*b47b5b34SRafael Vanoni 
131*b47b5b34SRafael Vanoni /*
132*b47b5b34SRafael Vanoni  * P/C state information
133*b47b5b34SRafael Vanoni  */
134*b47b5b34SRafael Vanoni typedef struct state_info {
135*b47b5b34SRafael Vanoni 	char		name[STATE_NAME_MAX];
136*b47b5b34SRafael Vanoni 	hrtime_t	total_time;
137*b47b5b34SRafael Vanoni 	hrtime_t	last_time;
138*b47b5b34SRafael Vanoni 	double		events;
139*b47b5b34SRafael Vanoni } state_info_t;
140*b47b5b34SRafael Vanoni 
141*b47b5b34SRafael Vanoni typedef struct freq_state_info {
142*b47b5b34SRafael Vanoni 	uint64_t	speed;
143*b47b5b34SRafael Vanoni 	hrtime_t	total_time;
144*b47b5b34SRafael Vanoni } freq_state_info_t;
145*b47b5b34SRafael Vanoni 
146*b47b5b34SRafael Vanoni typedef struct cpu_power_info {
147*b47b5b34SRafael Vanoni 	uint64_t	current_pstate;
148*b47b5b34SRafael Vanoni 	hrtime_t	time_accounted;
149*b47b5b34SRafael Vanoni 	hrtime_t	dtrace_time;
150*b47b5b34SRafael Vanoni } cpu_power_info_t;
151*b47b5b34SRafael Vanoni 
152*b47b5b34SRafael Vanoni /*
153*b47b5b34SRafael Vanoni  * Turbo mode information
154*b47b5b34SRafael Vanoni  */
155*b47b5b34SRafael Vanoni typedef struct turbo_info {
156*b47b5b34SRafael Vanoni 	uint64_t	t_mcnt;
157*b47b5b34SRafael Vanoni 	uint64_t	t_acnt;
158*b47b5b34SRafael Vanoni } turbo_info_t;
159*b47b5b34SRafael Vanoni 
160*b47b5b34SRafael Vanoni typedef	void		(suggestion_func)(void);
161*b47b5b34SRafael Vanoni 
162*b47b5b34SRafael Vanoni /*
163*b47b5b34SRafael Vanoni  * Global variables
164*b47b5b34SRafael Vanoni  */
165*b47b5b34SRafael Vanoni extern double			g_displaytime;
166*b47b5b34SRafael Vanoni 
167*b47b5b34SRafael Vanoni extern int			g_bit_depth;
168*b47b5b34SRafael Vanoni 
169*b47b5b34SRafael Vanoni /*
170*b47b5b34SRafael Vanoni  * Event accounting
171*b47b5b34SRafael Vanoni  */
172*b47b5b34SRafael Vanoni extern int 			g_total_events;
173*b47b5b34SRafael Vanoni extern int 			g_tog_p_events;
174*b47b5b34SRafael Vanoni 
175*b47b5b34SRafael Vanoni /*
176*b47b5b34SRafael Vanoni  * Interval
177*b47b5b34SRafael Vanoni  */
178*b47b5b34SRafael Vanoni extern double 			g_ticktime, g_ticktime_usr;
179*b47b5b34SRafael Vanoni extern double 			g_interval;
180*b47b5b34SRafael Vanoni 
181*b47b5b34SRafael Vanoni /*
182*b47b5b34SRafael Vanoni  * Command line arguments
183*b47b5b34SRafael Vanoni  */
184*b47b5b34SRafael Vanoni extern uchar_t			g_op_mode;
185*b47b5b34SRafael Vanoni extern uint_t			g_observed_cpu;
186*b47b5b34SRafael Vanoni extern boolean_t		g_gui;
187*b47b5b34SRafael Vanoni /*
188*b47b5b34SRafael Vanoni  * Event info array
189*b47b5b34SRafael Vanoni  */
190*b47b5b34SRafael Vanoni extern event_info_t    		g_event_info[EVENT_NUM_MAX];
191*b47b5b34SRafael Vanoni extern event_info_t		*g_p_event;
192*b47b5b34SRafael Vanoni 
193*b47b5b34SRafael Vanoni /*
194*b47b5b34SRafael Vanoni  * Lookup table, sequential CPU id to Solaris CPU id
195*b47b5b34SRafael Vanoni  */
196*b47b5b34SRafael Vanoni extern processorid_t 		*g_cpu_table;
197*b47b5b34SRafael Vanoni 
198*b47b5b34SRafael Vanoni /*
199*b47b5b34SRafael Vanoni  * Number of idle/frequency states
200*b47b5b34SRafael Vanoni  */
201*b47b5b34SRafael Vanoni extern int			g_npstates;
202*b47b5b34SRafael Vanoni extern int			g_max_cstate;
203*b47b5b34SRafael Vanoni extern int			g_longest_cstate;
204*b47b5b34SRafael Vanoni 
205*b47b5b34SRafael Vanoni /*
206*b47b5b34SRafael Vanoni  * Total time, used to display different idle states
207*b47b5b34SRafael Vanoni  */
208*b47b5b34SRafael Vanoni extern hrtime_t			g_total_c_time;
209*b47b5b34SRafael Vanoni 
210*b47b5b34SRafael Vanoni /*
211*b47b5b34SRafael Vanoni  * P/C state info arrays
212*b47b5b34SRafael Vanoni  */
213*b47b5b34SRafael Vanoni extern state_info_t		g_cstate_info[NSTATES];
214*b47b5b34SRafael Vanoni extern freq_state_info_t	g_pstate_info[NSTATES];
215*b47b5b34SRafael Vanoni 
216*b47b5b34SRafael Vanoni extern uint_t			g_ncpus;
217*b47b5b34SRafael Vanoni extern uint_t			g_ncpus_observed;
218*b47b5b34SRafael Vanoni 
219*b47b5b34SRafael Vanoni extern char 			g_status_bar_slots[PTOP_BAR_NSLOTS]
220*b47b5b34SRafael Vanoni 	[PTOP_BAR_LENGTH];
221*b47b5b34SRafael Vanoni 
222*b47b5b34SRafael Vanoni extern cpu_power_info_t		*g_cpu_power_states;
223*b47b5b34SRafael Vanoni 
224*b47b5b34SRafael Vanoni /*
225*b47b5b34SRafael Vanoni  * Turbo mode related information
226*b47b5b34SRafael Vanoni  */
227*b47b5b34SRafael Vanoni extern boolean_t	g_turbo_supported;
228*b47b5b34SRafael Vanoni extern double		g_turbo_ratio;
229*b47b5b34SRafael Vanoni 
230*b47b5b34SRafael Vanoni extern char 			g_suggestion_key;
231*b47b5b34SRafael Vanoni extern suggestion_func 		*g_suggestion_activate;
232*b47b5b34SRafael Vanoni 
233*b47b5b34SRafael Vanoni /*
234*b47b5b34SRafael Vanoni  * DTrace scripts for the events report
235*b47b5b34SRafael Vanoni  */
236*b47b5b34SRafael Vanoni extern const char		*g_dtp_events;
237*b47b5b34SRafael Vanoni extern const char		*g_dtp_events_v;
238*b47b5b34SRafael Vanoni extern const char		*g_dtp_events_c;
239*b47b5b34SRafael Vanoni 
240*b47b5b34SRafael Vanoni /*
241*b47b5b34SRafael Vanoni  * Arguments for dtrace_program_strcompile(). Contents vary according to
242*b47b5b34SRafael Vanoni  * the specified operation mode.
243*b47b5b34SRafael Vanoni  */
244*b47b5b34SRafael Vanoni extern uint_t			g_argc;
245*b47b5b34SRafael Vanoni extern char			**g_argv;
246*b47b5b34SRafael Vanoni 
247*b47b5b34SRafael Vanoni /*
248*b47b5b34SRafael Vanoni  * Platform specific messages
249*b47b5b34SRafael Vanoni  */
250*b47b5b34SRafael Vanoni extern const char *g_msg_idle_state;
251*b47b5b34SRafael Vanoni extern const char *g_msg_freq_state;
252*b47b5b34SRafael Vanoni /*
253*b47b5b34SRafael Vanoni  * Suggestions related
254*b47b5b34SRafael Vanoni  */
255*b47b5b34SRafael Vanoni extern void 		suggest_p_state(void);
256*b47b5b34SRafael Vanoni extern void		suggest_as_root(void);
257*b47b5b34SRafael Vanoni 
258*b47b5b34SRafael Vanoni /*
259*b47b5b34SRafael Vanoni  * See util.c
260*b47b5b34SRafael Vanoni  */
261*b47b5b34SRafael Vanoni extern void 		pt_error(char *, ...);
262*b47b5b34SRafael Vanoni extern void 		pt_set_progname(char *);
263*b47b5b34SRafael Vanoni extern uint_t		enumerate_cpus(void);
264*b47b5b34SRafael Vanoni extern void		usage(void);
265*b47b5b34SRafael Vanoni extern int		get_bit_depth(void);
266*b47b5b34SRafael Vanoni extern void		battery_mod_lookup(void);
267*b47b5b34SRafael Vanoni extern int		event_compare(const void *, const void *);
268*b47b5b34SRafael Vanoni 
269*b47b5b34SRafael Vanoni /*
270*b47b5b34SRafael Vanoni  * Display/curses related
271*b47b5b34SRafael Vanoni  */
272*b47b5b34SRafael Vanoni extern void 		show_title_bar(void);
273*b47b5b34SRafael Vanoni extern void 		setup_windows(void);
274*b47b5b34SRafael Vanoni extern void 		initialize_curses(void);
275*b47b5b34SRafael Vanoni extern void		show_acpi_power_line(uint32_t flag, double rate,
276*b47b5b34SRafael Vanoni     double rem_cap, double cap, uint32_t state);
277*b47b5b34SRafael Vanoni extern void 		show_cstates();
278*b47b5b34SRafael Vanoni extern void 		show_wakeups(double interval);
279*b47b5b34SRafael Vanoni extern void 		show_eventstats(double interval);
280*b47b5b34SRafael Vanoni extern void 		show_suggestion(char *sug);
281*b47b5b34SRafael Vanoni extern void 		cleanup_curses(void);
282*b47b5b34SRafael Vanoni extern void		update_windows(void);
283*b47b5b34SRafael Vanoni 
284*b47b5b34SRafael Vanoni /*
285*b47b5b34SRafael Vanoni  * Suggestions
286*b47b5b34SRafael Vanoni  */
287*b47b5b34SRafael Vanoni extern void 		pick_suggestion(void);
288*b47b5b34SRafael Vanoni extern void 		add_suggestion(char *text, int weight, char key,
289*b47b5b34SRafael Vanoni     char *keystring, suggestion_func *func);
290*b47b5b34SRafael Vanoni extern void 		reset_suggestions(void);
291*b47b5b34SRafael Vanoni extern void 		print_all_suggestions(void);
292*b47b5b34SRafael Vanoni extern void 		print_battery(void);
293*b47b5b34SRafael Vanoni 
294*b47b5b34SRafael Vanoni /*
295*b47b5b34SRafael Vanoni  * DTrace stats
296*b47b5b34SRafael Vanoni  */
297*b47b5b34SRafael Vanoni extern int 		pt_cpufreq_stat_prepare(void);
298*b47b5b34SRafael Vanoni extern int 		pt_cpufreq_stat_collect(double interval);
299*b47b5b34SRafael Vanoni extern int 		pt_cpuidle_stat_prepare(void);
300*b47b5b34SRafael Vanoni extern int 		pt_cpuidle_stat_collect(double interval);
301*b47b5b34SRafael Vanoni extern int 		pt_events_stat_prepare(void);
302*b47b5b34SRafael Vanoni extern int 		pt_events_stat_collect(void);
303*b47b5b34SRafael Vanoni 
304*b47b5b34SRafael Vanoni /*
305*b47b5b34SRafael Vanoni  * Turbo mode related routines
306*b47b5b34SRafael Vanoni  */
307*b47b5b34SRafael Vanoni extern int		pt_turbo_stat_prepare(void);
308*b47b5b34SRafael Vanoni extern int		pt_turbo_stat_collect(void);
309*b47b5b34SRafael Vanoni 
310*b47b5b34SRafael Vanoni #endif /* __INCLUDE_GUARD_POWERTOP_H_ */
311