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 #include <getopt.h> 41b47b5b34SRafael Vanoni #include <unistd.h> 42b47b5b34SRafael Vanoni #include <stdio.h> 43b47b5b34SRafael Vanoni #include <stdlib.h> 44b47b5b34SRafael Vanoni #include <string.h> 45b47b5b34SRafael Vanoni #include <ctype.h> 46b47b5b34SRafael Vanoni #include <locale.h> 47b47b5b34SRafael Vanoni #include "powertop.h" 48b47b5b34SRafael Vanoni 49b47b5b34SRafael Vanoni /* 50b47b5b34SRafael Vanoni * Global variables, see powertop.h for comments and extern declarations. 51b47b5b34SRafael Vanoni * These are ordered by type, grouped by usage. 52b47b5b34SRafael Vanoni */ 53b47b5b34SRafael Vanoni double g_ticktime, g_ticktime_usr; 54b47b5b34SRafael Vanoni double g_interval; 55b47b5b34SRafael Vanoni double g_displaytime; 56b47b5b34SRafael Vanoni 57b47b5b34SRafael Vanoni int g_bit_depth; 58b47b5b34SRafael Vanoni int g_total_events, g_tog_p_events; 59b47b5b34SRafael Vanoni int g_npstates, g_max_cstate, g_longest_cstate; 60b47b5b34SRafael Vanoni uint_t g_ncpus; 61b47b5b34SRafael Vanoni uint_t g_ncpus_observed; 62b47b5b34SRafael Vanoni 63b47b5b34SRafael Vanoni processorid_t *g_cpu_table; 64b47b5b34SRafael Vanoni 65b47b5b34SRafael Vanoni hrtime_t g_total_c_time; 66b47b5b34SRafael Vanoni 67b47b5b34SRafael Vanoni uchar_t g_op_mode; 68b47b5b34SRafael Vanoni boolean_t g_gui; 69b47b5b34SRafael Vanoni uint_t g_observed_cpu; 70b47b5b34SRafael Vanoni 71b47b5b34SRafael Vanoni event_info_t g_event_info[EVENT_NUM_MAX]; 72b47b5b34SRafael Vanoni event_info_t *g_p_event; 73b47b5b34SRafael Vanoni state_info_t g_cstate_info[NSTATES]; 74b47b5b34SRafael Vanoni freq_state_info_t g_pstate_info[NSTATES]; 75b47b5b34SRafael Vanoni cpu_power_info_t *g_cpu_power_states; 76b47b5b34SRafael Vanoni suggestion_func *g_suggestion_activate; 77b47b5b34SRafael Vanoni 78b47b5b34SRafael Vanoni boolean_t g_turbo_supported; 79b47b5b34SRafael Vanoni 80b47b5b34SRafael Vanoni uint_t g_argc; 81b47b5b34SRafael Vanoni char **g_argv; 82b47b5b34SRafael Vanoni 83b47b5b34SRafael Vanoni char *optarg; 84b47b5b34SRafael Vanoni 85b47b5b34SRafael Vanoni static const int true = 1; 86b47b5b34SRafael Vanoni 87b47b5b34SRafael Vanoni int 88b47b5b34SRafael Vanoni main(int argc, char **argv) 89b47b5b34SRafael Vanoni { 90b47b5b34SRafael Vanoni hrtime_t last, now; 91b47b5b34SRafael Vanoni uint_t features = 0, user_interval = 0; 92b47b5b34SRafael Vanoni int ncursesinited = 0, index2 = 0, c, ret, dump_count = 0; 93b47b5b34SRafael Vanoni double last_time; 94b47b5b34SRafael Vanoni char *endptr; 95b47b5b34SRafael Vanoni 96b47b5b34SRafael Vanoni static struct option opts[] = { 97b47b5b34SRafael Vanoni { "dump", 1, NULL, 'd' }, 98b47b5b34SRafael Vanoni { "time", 1, NULL, 't' }, 99b47b5b34SRafael Vanoni { "help", 0, NULL, 'h' }, 100b47b5b34SRafael Vanoni { "cpu", 1, NULL, 'c' }, 101b47b5b34SRafael Vanoni { "verbose", 0, NULL, 'v' }, 102b47b5b34SRafael Vanoni { 0, 0, NULL, 0 } 103b47b5b34SRafael Vanoni }; 104b47b5b34SRafael Vanoni 105b47b5b34SRafael Vanoni (void) setlocale(LC_ALL, ""); 106b47b5b34SRafael Vanoni (void) bindtextdomain("powertop", "/usr/share/locale"); 107b47b5b34SRafael Vanoni (void) textdomain("powertop"); 108b47b5b34SRafael Vanoni 109b47b5b34SRafael Vanoni pt_set_progname(argv[0]); 110b47b5b34SRafael Vanoni 111b47b5b34SRafael Vanoni /* 112b47b5b34SRafael Vanoni * Enumerate the system's CPUs 113b47b5b34SRafael Vanoni * Populate cpu_table, g_ncpus 114b47b5b34SRafael Vanoni */ 115b47b5b34SRafael Vanoni if ((g_ncpus = g_ncpus_observed = enumerate_cpus()) == 0) 116b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 117b47b5b34SRafael Vanoni 118b47b5b34SRafael Vanoni if ((g_bit_depth = get_bit_depth()) < 0) 119b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 120b47b5b34SRafael Vanoni 121b47b5b34SRafael Vanoni g_ticktime = g_ticktime_usr = INTERVAL_DEFAULT; 122b47b5b34SRafael Vanoni g_displaytime = 0.0; 123b47b5b34SRafael Vanoni g_op_mode = PTOP_MODE_DEFAULT; 124b47b5b34SRafael Vanoni g_gui = B_FALSE; 125b47b5b34SRafael Vanoni g_max_cstate = 0; 126b47b5b34SRafael Vanoni g_argv = NULL; 127b47b5b34SRafael Vanoni g_argc = 0; 128b47b5b34SRafael Vanoni g_observed_cpu = 0; 129b47b5b34SRafael Vanoni g_turbo_supported = B_FALSE; 130b47b5b34SRafael Vanoni 131b47b5b34SRafael Vanoni while ((c = getopt_long(argc, argv, "d:t:h:vc:", opts, &index2)) 132b47b5b34SRafael Vanoni != EOF) { 133b47b5b34SRafael Vanoni if (c == -1) 134b47b5b34SRafael Vanoni break; 135b47b5b34SRafael Vanoni 136b47b5b34SRafael Vanoni switch (c) { 137b47b5b34SRafael Vanoni case 'd': 138b47b5b34SRafael Vanoni if (PTOP_ON_DUMP) 139b47b5b34SRafael Vanoni usage(); 140b47b5b34SRafael Vanoni 141b47b5b34SRafael Vanoni g_op_mode |= PTOP_MODE_DUMP; 142b47b5b34SRafael Vanoni dump_count = (int)strtod(optarg, &endptr); 143b47b5b34SRafael Vanoni 144b47b5b34SRafael Vanoni if (dump_count <= 0 || *endptr != NULL) 145b47b5b34SRafael Vanoni usage(); 146b47b5b34SRafael Vanoni break; 147b47b5b34SRafael Vanoni case 't': 148b47b5b34SRafael Vanoni if (user_interval) 149b47b5b34SRafael Vanoni usage(); 150b47b5b34SRafael Vanoni 151b47b5b34SRafael Vanoni user_interval = 1; 152b47b5b34SRafael Vanoni g_ticktime = g_ticktime_usr = (double)strtod(optarg, 153b47b5b34SRafael Vanoni &endptr); 154b47b5b34SRafael Vanoni 155b47b5b34SRafael Vanoni if (*endptr != NULL || g_ticktime < 1 || 156b47b5b34SRafael Vanoni g_ticktime > INTERVAL_MAX) 157b47b5b34SRafael Vanoni usage(); 158b47b5b34SRafael Vanoni break; 159b47b5b34SRafael Vanoni case 'v': 160b47b5b34SRafael Vanoni if (PTOP_ON_CPU || PTOP_ON_VERBOSE) 161b47b5b34SRafael Vanoni usage(); 162b47b5b34SRafael Vanoni 163b47b5b34SRafael Vanoni g_op_mode |= PTOP_MODE_VERBOSE; 164b47b5b34SRafael Vanoni break; 165b47b5b34SRafael Vanoni case 'c': 166b47b5b34SRafael Vanoni if (PTOP_ON_CPU || PTOP_ON_VERBOSE) 167b47b5b34SRafael Vanoni usage(); 168b47b5b34SRafael Vanoni 169b47b5b34SRafael Vanoni g_op_mode |= PTOP_MODE_CPU; 170b47b5b34SRafael Vanoni g_observed_cpu = (uint_t)strtod(optarg, &endptr); 171b47b5b34SRafael Vanoni 172b47b5b34SRafael Vanoni if (g_observed_cpu >= g_ncpus) 173b47b5b34SRafael Vanoni usage(); 174b47b5b34SRafael Vanoni 175b47b5b34SRafael Vanoni g_argc = 1; 176b47b5b34SRafael Vanoni g_ncpus_observed = 1; 177b47b5b34SRafael Vanoni 178b47b5b34SRafael Vanoni if ((g_argv = malloc(sizeof (char *))) == NULL) 179b47b5b34SRafael Vanoni return (EXIT_FAILURE); 180b47b5b34SRafael Vanoni 181b47b5b34SRafael Vanoni if ((*g_argv = malloc(sizeof (char) * 5)) == NULL) 182b47b5b34SRafael Vanoni return (EXIT_FAILURE); 183b47b5b34SRafael Vanoni 184b47b5b34SRafael Vanoni (void) snprintf(*g_argv, 5, "%d\0", g_observed_cpu); 185b47b5b34SRafael Vanoni break; 186b47b5b34SRafael Vanoni case 'h': 187b47b5b34SRafael Vanoni default: 188b47b5b34SRafael Vanoni usage(); 189b47b5b34SRafael Vanoni return (EXIT_USAGE); 190b47b5b34SRafael Vanoni } 191b47b5b34SRafael Vanoni } 192b47b5b34SRafael Vanoni 193b47b5b34SRafael Vanoni if (optind < argc) { 194b47b5b34SRafael Vanoni usage(); 195b47b5b34SRafael Vanoni } 196b47b5b34SRafael Vanoni 197b47b5b34SRafael Vanoni (void) printf("%s %s\n\n", TITLE, COPYRIGHT_INTEL); 198b47b5b34SRafael Vanoni 199b47b5b34SRafael Vanoni /* 200b47b5b34SRafael Vanoni * If the system is running on battery, find out what's 201b47b5b34SRafael Vanoni * the kstat module for it 202b47b5b34SRafael Vanoni */ 203b47b5b34SRafael Vanoni battery_mod_lookup(); 204b47b5b34SRafael Vanoni 205b47b5b34SRafael Vanoni /* Prepare C-state statistics */ 206b47b5b34SRafael Vanoni ret = pt_cpuidle_stat_prepare(); 207b47b5b34SRafael Vanoni if (ret == 0) 208b47b5b34SRafael Vanoni features |= FEATURE_CSTATE; 209b47b5b34SRafael Vanoni else 210b47b5b34SRafael Vanoni /* 211b47b5b34SRafael Vanoni * PowerTop was unable to run a DTrace program, 212b47b5b34SRafael Vanoni * most likely for lack of permissions. 213b47b5b34SRafael Vanoni */ 214b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 215b47b5b34SRafael Vanoni 216b47b5b34SRafael Vanoni /* Prepare P-state statistics */ 217b47b5b34SRafael Vanoni if (pt_cpufreq_stat_prepare() == 0) 218b47b5b34SRafael Vanoni features |= FEATURE_PSTATE; 219b47b5b34SRafael Vanoni 220b47b5b34SRafael Vanoni /* Prepare event statistics */ 221b47b5b34SRafael Vanoni if (pt_events_stat_prepare() != -1) 222b47b5b34SRafael Vanoni features |= FEATURE_EVENTS; 223b47b5b34SRafael Vanoni 224b47b5b34SRafael Vanoni /* Prepare turbo statistics */ 225b47b5b34SRafael Vanoni if (pt_turbo_stat_prepare() == 0) { 226b47b5b34SRafael Vanoni features |= FEATURE_TURBO; 227b47b5b34SRafael Vanoni } 228b47b5b34SRafael Vanoni 229b47b5b34SRafael Vanoni (void) printf(_("Collecting data for %.2f second(s) \n"), 230b47b5b34SRafael Vanoni (float)g_ticktime); 231b47b5b34SRafael Vanoni 232b47b5b34SRafael Vanoni if (!PTOP_ON_DUMP) 233b47b5b34SRafael Vanoni g_gui = B_TRUE; 234b47b5b34SRafael Vanoni 235b47b5b34SRafael Vanoni last = gethrtime(); 236b47b5b34SRafael Vanoni 237b47b5b34SRafael Vanoni while (true) { 238b47b5b34SRafael Vanoni fd_set rfds; 239b47b5b34SRafael Vanoni struct timeval tv; 240b47b5b34SRafael Vanoni int key, reinit = 0; 241b47b5b34SRafael Vanoni char keychar; 242b47b5b34SRafael Vanoni 243b47b5b34SRafael Vanoni /* 244b47b5b34SRafael Vanoni * Sleep for a while waiting either for input (if we're not 245b47b5b34SRafael Vanoni * in dump mode) or for the timeout to elapse 246b47b5b34SRafael Vanoni */ 247b47b5b34SRafael Vanoni FD_ZERO(&rfds); 248b47b5b34SRafael Vanoni FD_SET(0, &rfds); 249b47b5b34SRafael Vanoni 250b47b5b34SRafael Vanoni tv.tv_sec = (long)g_ticktime; 251b47b5b34SRafael Vanoni tv.tv_usec = (long)((g_ticktime - tv.tv_sec) * 1000000); 252b47b5b34SRafael Vanoni 253b47b5b34SRafael Vanoni if (!PTOP_ON_DUMP) 254b47b5b34SRafael Vanoni key = select(1, &rfds, NULL, NULL, &tv); 255b47b5b34SRafael Vanoni else 256b47b5b34SRafael Vanoni key = select(1, NULL, NULL, NULL, &tv); 257b47b5b34SRafael Vanoni 258b47b5b34SRafael Vanoni now = gethrtime(); 259b47b5b34SRafael Vanoni 260b47b5b34SRafael Vanoni g_interval = (double)(now - last)/NANOSEC; 261b47b5b34SRafael Vanoni last = now; 262b47b5b34SRafael Vanoni 263b47b5b34SRafael Vanoni g_tog_p_events = 0; 264b47b5b34SRafael Vanoni g_total_events = 0; 265b47b5b34SRafael Vanoni 266*9b37b909SRafael Vanoni (void) memset(g_event_info, 0, 267*9b37b909SRafael Vanoni EVENT_NUM_MAX * sizeof (event_info_t)); 268*9b37b909SRafael Vanoni (void) memset(g_cstate_info, NSTATES 269*9b37b909SRafael Vanoni * sizeof (state_info_t), 0); 270b47b5b34SRafael Vanoni 271b47b5b34SRafael Vanoni /* Collect idle state transition stats */ 272b47b5b34SRafael Vanoni if (features & FEATURE_CSTATE && 273b47b5b34SRafael Vanoni pt_cpuidle_stat_collect(g_interval) < 0) { 274b47b5b34SRafael Vanoni /* Reinitialize C-state statistics */ 275b47b5b34SRafael Vanoni if (pt_cpuidle_stat_prepare() != 0) 276b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 277b47b5b34SRafael Vanoni 278b47b5b34SRafael Vanoni reinit = 1; 279b47b5b34SRafael Vanoni } 280b47b5b34SRafael Vanoni 281b47b5b34SRafael Vanoni /* Collect frequency change stats */ 282b47b5b34SRafael Vanoni if (features & FEATURE_PSTATE && 283b47b5b34SRafael Vanoni pt_cpufreq_stat_collect(g_interval) < 0) { 284b47b5b34SRafael Vanoni /* Reinitialize P-state statistics */ 285b47b5b34SRafael Vanoni if (pt_cpufreq_stat_prepare() != 0) 286b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 287b47b5b34SRafael Vanoni 288b47b5b34SRafael Vanoni reinit = 1; 289b47b5b34SRafael Vanoni } 290b47b5b34SRafael Vanoni 291b47b5b34SRafael Vanoni /* Collect event statistics */ 292b47b5b34SRafael Vanoni if (features & FEATURE_EVENTS && 293b47b5b34SRafael Vanoni pt_events_stat_collect() < 0) { 294b47b5b34SRafael Vanoni /* Reinitialize event statistics */ 295b47b5b34SRafael Vanoni if (pt_events_stat_prepare() != 0) 296b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 297b47b5b34SRafael Vanoni 298b47b5b34SRafael Vanoni reinit = 1; 299b47b5b34SRafael Vanoni } 300b47b5b34SRafael Vanoni 301b47b5b34SRafael Vanoni if (reinit) 302b47b5b34SRafael Vanoni continue; 303b47b5b34SRafael Vanoni 304b47b5b34SRafael Vanoni /* Collect turbo statistics */ 305b47b5b34SRafael Vanoni if (features & FEATURE_TURBO && 306b47b5b34SRafael Vanoni pt_turbo_stat_collect() < 0) { 307b47b5b34SRafael Vanoni exit(EXIT_FAILURE); 308b47b5b34SRafael Vanoni } 309b47b5b34SRafael Vanoni 310b47b5b34SRafael Vanoni /* 311b47b5b34SRafael Vanoni * Initialize curses if we're not dumping and 312b47b5b34SRafael Vanoni * haven't already done it 313b47b5b34SRafael Vanoni */ 314b47b5b34SRafael Vanoni if (!PTOP_ON_DUMP) { 315b47b5b34SRafael Vanoni if (!ncursesinited) { 316b47b5b34SRafael Vanoni initialize_curses(); 317b47b5b34SRafael Vanoni ncursesinited++; 318b47b5b34SRafael Vanoni } 319b47b5b34SRafael Vanoni setup_windows(); 320b47b5b34SRafael Vanoni show_title_bar(); 321b47b5b34SRafael Vanoni } 322b47b5b34SRafael Vanoni 323b47b5b34SRafael Vanoni /* Show CPU power states */ 324b47b5b34SRafael Vanoni if (features & FEATURE_CSTATE) 325b47b5b34SRafael Vanoni show_cstates(); 326b47b5b34SRafael Vanoni 327b47b5b34SRafael Vanoni /* Show wakeups events affecting PM */ 328b47b5b34SRafael Vanoni if (features & FEATURE_EVENTS) { 329b47b5b34SRafael Vanoni show_wakeups(g_interval); 330b47b5b34SRafael Vanoni show_eventstats(g_interval); 331b47b5b34SRafael Vanoni } 332b47b5b34SRafael Vanoni 333b47b5b34SRafael Vanoni print_battery(); 334b47b5b34SRafael Vanoni 335b47b5b34SRafael Vanoni g_displaytime = g_displaytime - g_ticktime; 336b47b5b34SRafael Vanoni 337b47b5b34SRafael Vanoni if (key && !PTOP_ON_DUMP) { 338b47b5b34SRafael Vanoni keychar = toupper(fgetc(stdin)); 339b47b5b34SRafael Vanoni 340b47b5b34SRafael Vanoni switch (keychar) { 341b47b5b34SRafael Vanoni case 'Q': 342b47b5b34SRafael Vanoni cleanup_curses(); 343b47b5b34SRafael Vanoni exit(EXIT_SUCCESS); 344b47b5b34SRafael Vanoni break; 345b47b5b34SRafael Vanoni case 'R': 346b47b5b34SRafael Vanoni g_ticktime = 3; 347b47b5b34SRafael Vanoni break; 348b47b5b34SRafael Vanoni } 349b47b5b34SRafael Vanoni if (keychar == g_suggestion_key && 350b47b5b34SRafael Vanoni g_suggestion_activate) { 351b47b5b34SRafael Vanoni g_suggestion_activate(); 352b47b5b34SRafael Vanoni g_displaytime = -1.0; 353b47b5b34SRafael Vanoni } 354b47b5b34SRafael Vanoni } 355b47b5b34SRafael Vanoni reset_suggestions(); 356b47b5b34SRafael Vanoni 357b47b5b34SRafael Vanoni /* suggests PM */ 358b47b5b34SRafael Vanoni if (geteuid() == 0) { 359b47b5b34SRafael Vanoni suggest_p_state(); 360b47b5b34SRafael Vanoni } else { 361b47b5b34SRafael Vanoni suggest_as_root(); 362b47b5b34SRafael Vanoni } 363b47b5b34SRafael Vanoni 364b47b5b34SRafael Vanoni if (dump_count) 365b47b5b34SRafael Vanoni dump_count--; 366b47b5b34SRafael Vanoni 367b47b5b34SRafael Vanoni /* Exits if user requested a dump */ 368b47b5b34SRafael Vanoni if (PTOP_ON_DUMP && !dump_count) { 369b47b5b34SRafael Vanoni print_all_suggestions(); 370b47b5b34SRafael Vanoni exit(EXIT_SUCCESS); 371b47b5b34SRafael Vanoni } 372b47b5b34SRafael Vanoni 373b47b5b34SRafael Vanoni /* No key pressed, will suggest something */ 374b47b5b34SRafael Vanoni if (!key && !dump_count) 375b47b5b34SRafael Vanoni pick_suggestion(); 376b47b5b34SRafael Vanoni 377b47b5b34SRafael Vanoni /* Refresh display */ 378b47b5b34SRafael Vanoni if (!PTOP_ON_DUMP) { 379b47b5b34SRafael Vanoni show_title_bar(); 380b47b5b34SRafael Vanoni update_windows(); 381b47b5b34SRafael Vanoni } 382b47b5b34SRafael Vanoni 383b47b5b34SRafael Vanoni /* 384b47b5b34SRafael Vanoni * Update the interval based on how long the CPU was in the 385b47b5b34SRafael Vanoni * longest c-state during the last snapshot. If the user 386b47b5b34SRafael Vanoni * specified an interval we skip this bit and keep it fixed. 387b47b5b34SRafael Vanoni */ 388b47b5b34SRafael Vanoni last_time = (((double)g_cstate_info[g_longest_cstate].total_time 389b47b5b34SRafael Vanoni /g_ncpus)/g_cstate_info[g_longest_cstate].events); 390b47b5b34SRafael Vanoni 391b47b5b34SRafael Vanoni if (!user_interval) 392b47b5b34SRafael Vanoni if (last_time < INTERVAL_DEFAULT || 393b47b5b34SRafael Vanoni (g_total_events/g_ticktime) < 1) 394b47b5b34SRafael Vanoni g_ticktime = INTERVAL_DEFAULT; 395b47b5b34SRafael Vanoni else 396b47b5b34SRafael Vanoni g_ticktime = INTERVAL_UPDATE(last_time); 397b47b5b34SRafael Vanoni 398b47b5b34SRafael Vanoni /* 399b47b5b34SRafael Vanoni * Restore user specified interval after a refresh 400b47b5b34SRafael Vanoni */ 401b47b5b34SRafael Vanoni if (keychar == 'R' && user_interval) 402b47b5b34SRafael Vanoni g_ticktime = g_ticktime_usr; 403b47b5b34SRafael Vanoni } 404b47b5b34SRafael Vanoni return (EXIT_SUCCESS); 405b47b5b34SRafael Vanoni } 406b47b5b34SRafael Vanoni 407b47b5b34SRafael Vanoni void 408b47b5b34SRafael Vanoni suggest_as_root(void) 409b47b5b34SRafael Vanoni { 410b47b5b34SRafael Vanoni add_suggestion("Suggestion: run as root to get suggestions" 411b47b5b34SRafael Vanoni " for reducing system power consumption", 40, NULL, NULL, 412b47b5b34SRafael Vanoni NULL); 413b47b5b34SRafael Vanoni } 414