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