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