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