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