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 <libintl.h> 45 #include <sys/processor.h> 46 47 #define max(A, B) (((A) < (B)) ? (B) : (A)) 48 49 #define _(STRING) gettext(STRING) 50 51 #define TITLE "OpenSolaris PowerTOP version 1.2" 52 #define COPYRIGHT_INTEL "(C) 2009 Intel Corporation" 53 54 /* 55 * Exit values. stdlib.h defines EXIT_SUCCESS as 0 and 56 * EXIT_FAILURE as 1 57 */ 58 #define EXIT_USAGE 2 59 60 /* 61 * PowerTOP Features 62 * These may not be available everywhere 63 */ 64 #define FEATURE_CSTATE 0x01 65 #define FEATURE_PSTATE 0x02 66 #define FEATURE_EVENTS 0x04 67 #define FEATURE_TURBO 0x08 68 69 #define BIT_DEPTH_BUF 10 70 71 #define INTERVAL_DEFAULT 5.0 72 #define INTERVAL_MAX 100.0 73 #define INTERVAL_UPDATE(l) \ 74 ((l/INTERVAL_DEFAULT) * INTERVAL_DEFAULT + INTERVAL_DEFAULT) 75 76 #define STATE_NAME_MAX 16 77 #define EVENT_NAME_MAX 64 78 #define EVENT_NUM_MAX 100 79 #define NSTATES 32 80 81 /* 82 * Available op modes 83 */ 84 #define PT_MODE_DEFAULT 0x01 85 #define PT_MODE_DUMP 0x02 86 #define PT_MODE_VERBOSE 0x04 87 #define PT_MODE_CPU 0x08 88 89 #define PT_ON_DEFAULT (g_op_mode & PT_MODE_DEFAULT) 90 #define PT_ON_DUMP (g_op_mode & PT_MODE_DUMP) 91 #define PT_ON_VERBOSE (g_op_mode & PT_MODE_VERBOSE) 92 #define PT_ON_CPU (g_op_mode & PT_MODE_CPU) 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 * Interval 164 */ 165 extern double g_ticktime, g_ticktime_usr; 166 extern double g_interval; 167 168 /* 169 * Command line arguments 170 */ 171 extern uchar_t g_op_mode; 172 extern uint_t g_observed_cpu; 173 extern boolean_t g_gui; 174 /* 175 * Event info array 176 */ 177 extern event_info_t g_event_info[EVENT_NUM_MAX]; 178 179 /* 180 * Lookup table, sequential CPU id to Solaris CPU id 181 */ 182 extern processorid_t *g_cpu_table; 183 184 /* 185 * Number of idle/frequency states 186 */ 187 extern int g_npstates; 188 extern int g_max_cstate; 189 extern int g_longest_cstate; 190 191 /* 192 * Total time, used to display different idle states 193 */ 194 extern hrtime_t g_total_c_time; 195 196 /* 197 * P/C state info arrays 198 */ 199 extern state_info_t g_cstate_info[NSTATES]; 200 extern freq_state_info_t g_pstate_info[NSTATES]; 201 202 extern uint_t g_features; 203 extern uint_t g_ncpus; 204 extern uint_t g_ncpus_observed; 205 206 extern cpu_power_info_t *g_cpu_power_states; 207 208 /* 209 * Turbo mode related information 210 */ 211 extern boolean_t g_turbo_supported; 212 extern double g_turbo_ratio; 213 214 extern sugg_t *g_curr_sugg; 215 216 /* 217 * DTrace scripts for the events report 218 */ 219 extern const char *g_dtp_events; 220 extern const char *g_dtp_events_v; 221 extern const char *g_dtp_events_c; 222 223 /* 224 * Arguments for dtrace_program_strcompile(). Contents vary according to 225 * the specified operation mode. 226 */ 227 extern uint_t g_argc; 228 extern char **g_argv; 229 230 /* 231 * Platform specific messages 232 */ 233 extern const char *g_msg_idle_state; 234 extern const char *g_msg_freq_state; 235 extern const char *g_msg_freq_enable; 236 237 /* 238 * Suggestions related 239 */ 240 extern void pt_cpufreq_suggest(void); 241 extern void pt_sugg_as_root(void); 242 243 /* 244 * See util.c 245 */ 246 extern void pt_error(char *, ...); 247 extern void pt_set_progname(char *); 248 extern uint_t enumerate_cpus(void); 249 extern void usage(void); 250 extern int get_bit_depth(void); 251 extern void battery_mod_lookup(void); 252 extern int event_compare(const void *, const void *); 253 254 /* 255 * Display/curses related 256 */ 257 extern void pt_display_setup(boolean_t); 258 extern void pt_display_init_curses(void); 259 extern void pt_display_update(void); 260 extern void pt_display_title_bar(void); 261 extern void pt_display_status_bar(void); 262 extern void pt_display_mod_status_bar(char *); 263 extern void pt_display_states(void); 264 extern void pt_display_acpi_power(uint32_t, double, double, double, 265 uint32_t); 266 extern void pt_display_wakeups(double); 267 extern void pt_display_events(double); 268 extern void pt_display_suggestions(char *); 269 270 /* 271 * Suggestions 272 */ 273 extern void pt_sugg_add(char *, int, char, char *, sugg_func_t *); 274 extern int pt_sugg_remove(sugg_func_t *); 275 extern void pt_sugg_pick(void); 276 277 /* 278 * Battery 279 */ 280 extern void pt_battery_print(void); 281 282 /* 283 * DTrace stats 284 */ 285 extern int pt_cpufreq_stat_prepare(void); 286 extern int pt_cpufreq_stat_collect(double); 287 extern int pt_cpuidle_stat_prepare(void); 288 extern int pt_cpuidle_stat_collect(double); 289 extern int pt_events_stat_prepare(void); 290 extern int pt_events_stat_collect(void); 291 292 /* 293 * Turbo mode related routines 294 */ 295 extern int pt_turbo_stat_prepare(void); 296 extern int pt_turbo_stat_collect(void); 297 298 #endif /* __INCLUDE_GUARD_POWERTOP_H_ */ 299