Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1 | /* |
Arjan van der Ven | ee42d81 | 2007-05-18 18:33:19 +0000 | [diff] [blame] | 2 | * Copyright 2007, Intel Corporation |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 3 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 4 | * This file is part of PowerTOP |
| 5 | * |
| 6 | * This program file is free software; you can redistribute it and/or modify it |
| 7 | * under the terms of the GNU General Public License as published by the |
| 8 | * Free Software Foundation; version 2 of the License. |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 9 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 10 | * This program is distributed in the hope that it will be useful, but WITHOUT |
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 13 | * for more details. |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 14 | * |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 15 | * You should have received a copy of the GNU General Public License |
Arjan van der Ven | 0eb44da | 2007-05-13 03:39:32 +0000 | [diff] [blame] | 16 | * along with this program in a file named COPYING; if not, write to the |
| 17 | * Free Software Foundation, Inc., |
| 18 | * 51 Franklin Street, Fifth Floor, |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 19 | * Boston, MA 02110-1301 USA |
| 20 | * |
| 21 | * Authors: |
| 22 | * Arjan van de Ven <arjan@linux.intel.com> |
| 23 | */ |
| 24 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 25 | #include <getopt.h> |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 26 | #include <unistd.h> |
| 27 | #include <stdio.h> |
| 28 | #include <stdlib.h> |
| 29 | #include <string.h> |
| 30 | #include <stdint.h> |
| 31 | #include <sys/types.h> |
| 32 | #include <dirent.h> |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 33 | #include <ctype.h> |
Arjan van der Ven | 32724fc | 2007-05-24 21:06:24 +0000 | [diff] [blame] | 34 | #include <assert.h> |
Arjan van der Ven | 6a0ade2 | 2007-05-24 23:45:33 +0000 | [diff] [blame] | 35 | #include <locale.h> |
Arjan van der Ven | 2e74d1d | 2007-05-26 15:47:40 +0000 | [diff] [blame] | 36 | #include <time.h> |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 37 | #include <sys/stat.h> |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 38 | |
Arjan van der Ven | 9ed4628 | 2007-05-13 17:17:29 +0000 | [diff] [blame] | 39 | #include "powertop.h" |
| 40 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 41 | #define VERSION "1.11-1" |
Auke Kok | eecdec5 | 2008-12-01 18:22:47 +0000 | [diff] [blame] | 42 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 43 | uint64_t start_usage[8], start_duration[8]; |
| 44 | uint64_t last_usage[8], last_duration[8]; |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 45 | char cnames[8][16]; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 46 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 47 | double ticktime = 15.0; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 48 | |
Arjan van der Ven | 7144a6b | 2007-05-26 00:00:53 +0000 | [diff] [blame] | 49 | int interrupt_0, total_interrupt; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 50 | |
Arjan van der Ven | 356cd2c | 2007-12-13 21:52:01 +0000 | [diff] [blame] | 51 | int showpids = 0; |
| 52 | |
Arjan van der Ven | d252c31 | 2007-05-12 18:22:26 +0000 | [diff] [blame] | 53 | static int maxcstate = 0; |
Arjan van der Ven | 5288ca7 | 2007-05-23 16:24:06 +0000 | [diff] [blame] | 54 | int topcstate = 0; |
Arjan van der Ven | d252c31 | 2007-05-12 18:22:26 +0000 | [diff] [blame] | 55 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 56 | int dump = 0; |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 57 | int reset_pm_stats = 0; |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 58 | |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 59 | static int cpu_count = 0; |
| 60 | |
Arjan van der Ven | 5f4b71e | 2007-10-27 21:46:59 +0000 | [diff] [blame] | 61 | #define IRQCOUNT 150 |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 62 | |
| 63 | struct irqdata { |
| 64 | int active; |
| 65 | int number; |
| 66 | uint64_t count; |
| 67 | char description[256]; |
| 68 | }; |
| 69 | |
| 70 | struct irqdata interrupts[IRQCOUNT]; |
| 71 | |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 72 | #define FREQ_ACPI 3579.545 |
| 73 | static unsigned long FREQ; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 74 | |
| 75 | int nostats; |
| 76 | |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 77 | |
| 78 | struct line *lines; |
| 79 | int linehead; |
| 80 | int linesize; |
| 81 | int linectotal; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 82 | |
Arjan van der Ven | 2e74d1d | 2007-05-26 15:47:40 +0000 | [diff] [blame] | 83 | double last_bat_cap = 0; |
| 84 | double prev_bat_cap = 0; |
| 85 | time_t last_bat_time = 0; |
| 86 | time_t prev_bat_time = 0; |
| 87 | |
Arjan van der Ven | 2b7db8e | 2007-06-23 19:03:34 +0000 | [diff] [blame] | 88 | double displaytime = 0.0; |
| 89 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 90 | void push_line(char *string, int count) |
| 91 | { |
| 92 | int i; |
Arjan van der Ven | 32724fc | 2007-05-24 21:06:24 +0000 | [diff] [blame] | 93 | |
| 94 | assert(string != NULL); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 95 | for (i = 0; i < linehead; i++) |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 96 | if (strcmp(string, lines[i].string) == 0) { |
| 97 | lines[i].count += count; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 98 | return; |
| 99 | } |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 100 | if (linehead == linesize) |
| 101 | lines = realloc (lines, (linesize ? (linesize *= 2) : (linesize = 64)) * sizeof (struct line)); |
| 102 | lines[linehead].string = strdup (string); |
| 103 | lines[linehead].count = count; |
Arjan van der Ven | 356cd2c | 2007-12-13 21:52:01 +0000 | [diff] [blame] | 104 | lines[linehead].pid[0] = 0; |
| 105 | linehead++; |
| 106 | } |
| 107 | |
| 108 | void push_line_pid(char *string, int count, char *pid) |
| 109 | { |
| 110 | int i; |
| 111 | assert(string != NULL); |
| 112 | for (i = 0; i < linehead; i++) |
| 113 | if (strcmp(string, lines[i].string) == 0) { |
| 114 | lines[i].count += count; |
| 115 | if (pid && strcmp(lines[i].pid, pid)!=0) |
| 116 | lines[i].pid[0] = 0; |
| 117 | return; |
| 118 | } |
| 119 | if (linehead == linesize) |
| 120 | lines = realloc (lines, (linesize ? (linesize *= 2) : (linesize = 64)) * sizeof (struct line)); |
| 121 | lines[linehead].string = strdup (string); |
| 122 | lines[linehead].count = count; |
| 123 | if (pid) |
| 124 | strcpy(lines[linehead].pid, pid); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 125 | linehead++; |
| 126 | } |
| 127 | |
| 128 | void clear_lines(void) |
| 129 | { |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 130 | int i; |
| 131 | for (i = 0; i < linehead; i++) |
| 132 | free (lines[i].string); |
| 133 | free (lines); |
| 134 | linehead = linesize = 0; |
| 135 | lines = NULL; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 136 | } |
| 137 | |
| 138 | void count_lines(void) |
| 139 | { |
| 140 | uint64_t q = 0; |
| 141 | int i; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 142 | for (i = 0; i < linehead; i++) |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 143 | q += lines[i].count; |
| 144 | linectotal = q; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 145 | } |
| 146 | |
| 147 | int update_irq(int irq, uint64_t count, char *name) |
| 148 | { |
| 149 | int i; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 150 | int firstfree = IRQCOUNT; |
Arjan van der Ven | a18feb2 | 2007-05-24 21:02:02 +0000 | [diff] [blame] | 151 | |
| 152 | if (!name) |
| 153 | return 0; |
| 154 | |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 155 | for (i = 0; i < IRQCOUNT; i++) { |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 156 | if (interrupts[i].active && interrupts[i].number == irq) { |
| 157 | uint64_t oldcount; |
| 158 | oldcount = interrupts[i].count; |
| 159 | interrupts[i].count = count; |
| 160 | return count - oldcount; |
| 161 | } |
| 162 | if (!interrupts[i].active && firstfree > i) |
| 163 | firstfree = i; |
| 164 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 165 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 166 | interrupts[firstfree].active = 1; |
| 167 | interrupts[firstfree].count = count; |
| 168 | interrupts[firstfree].number = irq; |
| 169 | strcpy(interrupts[firstfree].description, name); |
Arjan van der Ven | f096363 | 2007-08-18 21:28:02 +0000 | [diff] [blame] | 170 | if (strcmp(name,"i8042\n")==0) |
| 171 | strcpy(interrupts[firstfree].description, _("PS/2 keyboard/mouse/touchpad")); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 172 | return count; |
| 173 | } |
| 174 | |
| 175 | static void do_proc_irq(void) |
| 176 | { |
| 177 | FILE *file; |
| 178 | char line[1024]; |
Arjan van der Ven | 25e737e | 2007-05-27 15:20:18 +0000 | [diff] [blame] | 179 | char line2[1024]; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 180 | char *name; |
| 181 | uint64_t delta; |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 182 | |
| 183 | interrupt_0 = 0; |
Arjan van der Ven | 7144a6b | 2007-05-26 00:00:53 +0000 | [diff] [blame] | 184 | total_interrupt = 0; |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 185 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 186 | file = fopen("/proc/interrupts", "r"); |
| 187 | if (!file) |
| 188 | return; |
| 189 | while (!feof(file)) { |
| 190 | char *c; |
| 191 | int nr = -1; |
| 192 | uint64_t count = 0; |
Arjan van der Ven | 5f4b71e | 2007-10-27 21:46:59 +0000 | [diff] [blame] | 193 | int special = 0; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 194 | memset(line, 0, sizeof(line)); |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 195 | if (fgets(line, 1024, file) == NULL) |
| 196 | break; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 197 | c = strchr(line, ':'); |
| 198 | if (!c) |
| 199 | continue; |
Arjan van der Ven | 5f4b71e | 2007-10-27 21:46:59 +0000 | [diff] [blame] | 200 | /* deal with NMI and the like.. make up fake nrs */ |
| 201 | if (line[0] != ' ' && (line[0] < '0' || line[0] > '9')) { |
| 202 | if (strncmp(line,"NMI:", 4)==0) |
| 203 | nr=20000; |
| 204 | if (strncmp(line,"RES:", 4)==0) |
| 205 | nr=20001; |
| 206 | if (strncmp(line,"CAL:", 4)==0) |
| 207 | nr=20002; |
| 208 | if (strncmp(line,"TLB:", 4)==0) |
| 209 | nr=20003; |
| 210 | if (strncmp(line,"TRM:", 4)==0) |
| 211 | nr=20004; |
| 212 | if (strncmp(line,"THR:", 4)==0) |
| 213 | nr=20005; |
| 214 | if (strncmp(line,"SPU:", 4)==0) |
| 215 | nr=20006; |
| 216 | special = 1; |
| 217 | } else |
| 218 | nr = strtoull(line, NULL, 10); |
| 219 | |
| 220 | if (nr==-1) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 221 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 222 | *c = 0; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 223 | c++; |
| 224 | while (c && strlen(c)) { |
| 225 | char *newc; |
| 226 | count += strtoull(c, &newc, 10); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 227 | if (newc == c) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 228 | break; |
| 229 | c = newc; |
| 230 | } |
| 231 | c = strchr(c, ' '); |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 232 | if (!c) |
| 233 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 234 | while (c && *c == ' ') |
| 235 | c++; |
Arjan van der Ven | 5f4b71e | 2007-10-27 21:46:59 +0000 | [diff] [blame] | 236 | if (!special) { |
| 237 | c = strchr(c, ' '); |
| 238 | if (!c) |
| 239 | continue; |
| 240 | while (c && *c == ' ') |
| 241 | c++; |
| 242 | } |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 243 | name = c; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 244 | c = strchr(name, '\n'); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 245 | if (c) |
| 246 | *c = 0; |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 247 | |
| 248 | delta = update_irq(nr, count, name); |
Arjan van der Ven | 7fe991f | 2007-10-27 22:49:26 +0000 | [diff] [blame] | 249 | if (strcmp(name, "i8042")) { |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 250 | if (special) |
| 251 | sprintf(line2, _(" <kernel IPI> : %s"), name); |
| 252 | else |
| 253 | sprintf(line2, _(" <interrupt> : %s"), name); |
Arjan van der Ven | 7fe991f | 2007-10-27 22:49:26 +0000 | [diff] [blame] | 254 | } |
Arjan van der Ven | f096363 | 2007-08-18 21:28:02 +0000 | [diff] [blame] | 255 | else |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 256 | sprintf(line2, _(" <interrupt> : %s"), _("PS/2 keyboard/mouse/touchpad")); |
| 257 | //don't special-case interrupt 0 as it's not the system timer on Android |
| 258 | #ifdef PLATFORM_NO_INT0 |
| 259 | if (delta > 0) |
| 260 | push_line(line2, delta); |
| 261 | total_interrupt += delta; |
| 262 | #else |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 263 | if (nr > 0 && delta > 0) |
Arjan van der Ven | 25e737e | 2007-05-27 15:20:18 +0000 | [diff] [blame] | 264 | push_line(line2, delta); |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 265 | if (nr==0) |
| 266 | interrupt_0 = delta; |
Arjan van der Ven | d4ef0b9 | 2007-05-26 00:02:09 +0000 | [diff] [blame] | 267 | else |
| 268 | total_interrupt += delta; |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 269 | #endif |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 270 | } |
| 271 | fclose(file); |
| 272 | } |
| 273 | |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 274 | static void read_data_acpi(uint64_t * usage, uint64_t * duration) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 275 | { |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 276 | DIR *dir; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 277 | struct dirent *entry; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 278 | FILE *file = NULL; |
| 279 | char line[4096]; |
| 280 | char *c; |
| 281 | int clevel = 0; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 282 | |
| 283 | memset(usage, 0, 64); |
| 284 | memset(duration, 0, 64); |
| 285 | |
| 286 | dir = opendir("/proc/acpi/processor"); |
| 287 | if (!dir) |
| 288 | return; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 289 | while ((entry = readdir(dir))) { |
| 290 | if (strlen(entry->d_name) < 3) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 291 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 292 | sprintf(line, "/proc/acpi/processor/%s/power", entry->d_name); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 293 | file = fopen(line, "r"); |
| 294 | if (!file) |
| 295 | continue; |
| 296 | |
| 297 | clevel = 0; |
| 298 | |
| 299 | while (!feof(file)) { |
| 300 | memset(line, 0, 4096); |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 301 | if (fgets(line, 4096, file) == NULL) |
| 302 | break; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 303 | c = strstr(line, "age["); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 304 | if (!c) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 305 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 306 | c += 4; |
Arjan van der Ven | c3ef64b | 2007-05-18 16:57:34 +0000 | [diff] [blame] | 307 | usage[clevel] += 1+strtoull(c, NULL, 10); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 308 | c = strstr(line, "ation["); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 309 | if (!c) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 310 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 311 | c += 6; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 312 | duration[clevel] += strtoull(c, NULL, 10); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 313 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 314 | clevel++; |
Arjan van der Ven | d252c31 | 2007-05-12 18:22:26 +0000 | [diff] [blame] | 315 | if (clevel > maxcstate) |
| 316 | maxcstate = clevel; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 317 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 318 | } |
| 319 | fclose(file); |
| 320 | } |
| 321 | closedir(dir); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 322 | } |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 323 | |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 324 | static void read_data_cpuidle(uint64_t * usage, uint64_t * duration) |
| 325 | { |
| 326 | DIR *cpudir; |
| 327 | DIR *dir; |
| 328 | struct dirent *entry; |
| 329 | FILE *file = NULL; |
| 330 | char line[4096]; |
| 331 | char filename[128], *f; |
| 332 | int len, clevel = 0; |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 333 | int numcpus = 0; |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 334 | |
| 335 | memset(usage, 0, 64); |
| 336 | memset(duration, 0, 64); |
| 337 | |
| 338 | cpudir = opendir("/sys/devices/system/cpu"); |
| 339 | if (!cpudir) |
| 340 | return; |
| 341 | |
| 342 | /* Loop over cpuN entries */ |
| 343 | while ((entry = readdir(cpudir))) { |
| 344 | if (strlen(entry->d_name) < 3) |
| 345 | continue; |
| 346 | |
| 347 | if (!isdigit(entry->d_name[3])) |
| 348 | continue; |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 349 | len = snprintf(filename, 128, "/sys/devices/system/cpu/%s/online", |
| 350 | entry->d_name); |
| 351 | file = fopen(filename, "r"); |
| 352 | if (file) { |
| 353 | f = fgets(line, 4096, file); |
| 354 | fclose(file); |
| 355 | if (f != NULL) { |
| 356 | if (*f == '1') |
| 357 | numcpus++; |
| 358 | else |
| 359 | continue; |
| 360 | } |
| 361 | } |
| 362 | len = snprintf(filename, 128, "/sys/devices/system/cpu/%s/cpuidle", |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 363 | entry->d_name); |
| 364 | |
| 365 | dir = opendir(filename); |
| 366 | if (!dir) |
| 367 | return; |
| 368 | |
| 369 | clevel = 0; |
| 370 | |
| 371 | /* For each C-state, there is a stateX directory which |
| 372 | * contains a 'usage' and a 'time' (duration) file */ |
| 373 | while ((entry = readdir(dir))) { |
| 374 | if (strlen(entry->d_name) < 3) |
| 375 | continue; |
| 376 | sprintf(filename + len, "/%s/desc", entry->d_name); |
| 377 | file = fopen(filename, "r"); |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 378 | if (file) { |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 379 | |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 380 | memset(line, 0, 4096); |
| 381 | f = fgets(line, 4096, file); |
| 382 | fclose(file); |
| 383 | if (f == NULL) |
| 384 | break; |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 385 | |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 386 | |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 387 | f = strstr(line, "MWAIT "); |
| 388 | if (f) { |
| 389 | f += 6; |
| 390 | clevel = (strtoull(f, NULL, 16)>>4) + 1; |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 391 | sprintf(cnames[clevel], "C%i mwait", clevel); |
| 392 | } else |
| 393 | sprintf(cnames[clevel], "C%i\t", clevel); |
| 394 | |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 395 | f = strstr(line, "POLL IDLE"); |
| 396 | if (f) { |
| 397 | clevel = 0; |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 398 | sprintf(cnames[clevel], "%s\t", _("polling")); |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 399 | } |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 400 | |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 401 | f = strstr(line, "ACPI HLT"); |
| 402 | if (f) { |
| 403 | clevel = 1; |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 404 | sprintf(cnames[clevel], "%s\t", "C1 halt"); |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 405 | } |
Arjan van der Ven | 28e45c6 | 2008-03-27 04:37:57 +0000 | [diff] [blame] | 406 | } |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 407 | sprintf(filename + len, "/%s/usage", entry->d_name); |
| 408 | file = fopen(filename, "r"); |
| 409 | if (!file) |
| 410 | continue; |
| 411 | |
| 412 | memset(line, 0, 4096); |
| 413 | f = fgets(line, 4096, file); |
| 414 | fclose(file); |
| 415 | if (f == NULL) |
| 416 | break; |
| 417 | |
| 418 | usage[clevel] += 1+strtoull(line, NULL, 10); |
| 419 | |
| 420 | sprintf(filename + len, "/%s/time", entry->d_name); |
| 421 | file = fopen(filename, "r"); |
| 422 | if (!file) |
| 423 | continue; |
| 424 | |
| 425 | memset(line, 0, 4096); |
| 426 | f = fgets(line, 4096, file); |
| 427 | fclose(file); |
| 428 | if (f == NULL) |
| 429 | break; |
| 430 | |
| 431 | duration[clevel] += 1+strtoull(line, NULL, 10); |
| 432 | |
| 433 | clevel++; |
| 434 | if (clevel > maxcstate) |
| 435 | maxcstate = clevel; |
| 436 | |
| 437 | } |
| 438 | closedir(dir); |
| 439 | |
| 440 | } |
| 441 | closedir(cpudir); |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 442 | if (numcpus) |
| 443 | cpu_count = numcpus; |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 444 | } |
| 445 | |
| 446 | static void read_data(uint64_t * usage, uint64_t * duration) |
| 447 | { |
| 448 | int r; |
| 449 | struct stat s; |
| 450 | |
| 451 | /* Then check for CPUidle */ |
Arjan van der Ven | 8569c29 | 2008-03-27 14:38:07 +0000 | [diff] [blame] | 452 | r = stat("/sys/devices/system/cpu/cpu0/cpuidle", &s); |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 453 | if (!r) { |
| 454 | read_data_cpuidle(usage, duration); |
| 455 | |
| 456 | /* perform residency calculations based on usecs */ |
| 457 | FREQ = 1000; |
| 458 | return; |
| 459 | } |
| 460 | |
| 461 | /* First, check for ACPI */ |
| 462 | r = stat("/proc/acpi/processor", &s); |
| 463 | if (!r) { |
| 464 | read_data_acpi(usage, duration); |
| 465 | |
| 466 | /* perform residency calculations based on ACPI timer */ |
| 467 | FREQ = FREQ_ACPI; |
| 468 | return; |
| 469 | } |
| 470 | } |
| 471 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 472 | void stop_timerstats(void) |
| 473 | { |
| 474 | FILE *file; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 475 | file = fopen("/proc/timer_stats", "w"); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 476 | if (!file) { |
| 477 | nostats = 1; |
| 478 | return; |
| 479 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 480 | fprintf(file, "0\n"); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 481 | fclose(file); |
| 482 | } |
| 483 | void start_timerstats(void) |
| 484 | { |
| 485 | FILE *file; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 486 | file = fopen("/proc/timer_stats", "w"); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 487 | if (!file) { |
| 488 | nostats = 1; |
| 489 | return; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 490 | } |
| 491 | fprintf(file, "1\n"); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 492 | fclose(file); |
| 493 | } |
| 494 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 495 | void reset_msm_pm_stats(void) |
| 496 | { |
| 497 | FILE *file; |
| 498 | file = fopen("/proc/msm_pm_stats", "w"); |
| 499 | if (!file) |
| 500 | return; |
| 501 | fprintf(file, "reset\n"); |
| 502 | fclose(file); |
| 503 | } |
| 504 | |
| 505 | |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 506 | int line_compare (const void *av, const void *bv) |
| 507 | { |
| 508 | const struct line *a = av, *b = bv; |
| 509 | return b->count - a->count; |
| 510 | } |
| 511 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 512 | void sort_lines(void) |
| 513 | { |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 514 | qsort (lines, linehead, sizeof (struct line), line_compare); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 515 | } |
| 516 | |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 517 | |
| 518 | |
Auke Kok | 41e8360 | 2008-09-04 19:59:19 +0000 | [diff] [blame] | 519 | int print_battery_proc_acpi(void) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 520 | { |
| 521 | DIR *dir; |
| 522 | struct dirent *dirent; |
| 523 | FILE *file; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 524 | double rate = 0; |
| 525 | double cap = 0; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 526 | |
| 527 | char filename[256]; |
| 528 | |
| 529 | dir = opendir("/proc/acpi/battery"); |
| 530 | if (!dir) |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 531 | return 0; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 532 | |
| 533 | while ((dirent = readdir(dir))) { |
Arjan van der Ven | b3cd4df | 2007-05-14 18:18:32 +0000 | [diff] [blame] | 534 | int dontcount = 0; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 535 | double voltage = 0.0; |
| 536 | double amperes_drawn = 0.0; |
| 537 | double watts_drawn = 0.0; |
| 538 | double amperes_left = 0.0; |
| 539 | double watts_left = 0.0; |
Arjan van der Ven | 3638262 | 2007-05-17 17:40:55 +0000 | [diff] [blame] | 540 | char line[1024]; |
Arjan van der Ven | 740ee8f | 2007-05-16 15:30:01 +0000 | [diff] [blame] | 541 | |
| 542 | if (strlen(dirent->d_name) < 3) |
| 543 | continue; |
| 544 | |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 545 | sprintf(filename, "/proc/acpi/battery/%s/state", dirent->d_name); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 546 | file = fopen(filename, "r"); |
| 547 | if (!file) |
| 548 | continue; |
Arjan van der Ven | 6a0ade2 | 2007-05-24 23:45:33 +0000 | [diff] [blame] | 549 | memset(line, 0, 1024); |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 550 | while (fgets(line, 1024, file) != NULL) { |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 551 | char *c; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 552 | if (strstr(line, "present:") && strstr(line, "no")) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 553 | break; |
| 554 | |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 555 | if (strstr(line, "charging state:") |
| 556 | && !strstr(line, "discharging")) |
| 557 | dontcount = 1; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 558 | c = strchr(line, ':'); |
| 559 | if (!c) |
| 560 | continue; |
| 561 | c++; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 562 | |
| 563 | if (strstr(line, "present voltage")) |
| 564 | voltage = strtoull(c, NULL, 10) / 1000.0; |
| 565 | |
| 566 | if (strstr(line, "remaining capacity") && strstr(c, "mW")) |
Arjan van der Ven | 880b2cb | 2007-05-14 22:00:48 +0000 | [diff] [blame] | 567 | watts_left = strtoull(c, NULL, 10) / 1000.0; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 568 | |
| 569 | if (strstr(line, "remaining capacity") && strstr(c, "mAh")) |
Arjan van der Ven | 880b2cb | 2007-05-14 22:00:48 +0000 | [diff] [blame] | 570 | amperes_left = strtoull(c, NULL, 10) / 1000.0; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 571 | |
| 572 | if (strstr(line, "present rate") && strstr(c, "mW")) |
Arjan van der Ven | 880b2cb | 2007-05-14 22:00:48 +0000 | [diff] [blame] | 573 | watts_drawn = strtoull(c, NULL, 10) / 1000.0 ; |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 574 | |
| 575 | if (strstr(line, "present rate") && strstr(c, "mA")) |
Arjan van der Ven | 880b2cb | 2007-05-14 22:00:48 +0000 | [diff] [blame] | 576 | amperes_drawn = strtoull(c, NULL, 10) / 1000.0; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 577 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 578 | } |
| 579 | fclose(file); |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 580 | |
| 581 | if (!dontcount) { |
| 582 | rate += watts_drawn + voltage * amperes_drawn; |
| 583 | } |
| 584 | cap += watts_left + voltage * amperes_left; |
Arjan van der Ven | 2e74d1d | 2007-05-26 15:47:40 +0000 | [diff] [blame] | 585 | |
Arjan van der Ven | 11d9a2e | 2007-05-14 21:55:31 +0000 | [diff] [blame] | 586 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 587 | } |
| 588 | closedir(dir); |
Arjan van der Ven | 387e291 | 2007-06-06 22:32:18 +0000 | [diff] [blame] | 589 | if (prev_bat_cap - cap < 0.001 && rate < 0.001) |
| 590 | last_bat_time = 0; |
Arjan van der Ven | 6435af2 | 2007-05-26 16:08:03 +0000 | [diff] [blame] | 591 | if (!last_bat_time) { |
| 592 | last_bat_time = prev_bat_time = time(NULL); |
| 593 | last_bat_cap = prev_bat_cap = cap; |
| 594 | } |
Arjan van der Ven | 128f595 | 2007-05-26 16:14:29 +0000 | [diff] [blame] | 595 | if (time(NULL) - last_bat_time >= 400) { |
Arjan van der Ven | 6435af2 | 2007-05-26 16:08:03 +0000 | [diff] [blame] | 596 | prev_bat_cap = last_bat_cap; |
| 597 | prev_bat_time = last_bat_time; |
| 598 | last_bat_time = time(NULL); |
| 599 | last_bat_cap = cap; |
| 600 | } |
Arjan van der Ven | 399ceb5 | 2007-05-27 02:15:12 +0000 | [diff] [blame] | 601 | |
Arjan van der Ven | e0e45f1 | 2007-05-26 15:56:29 +0000 | [diff] [blame] | 602 | show_acpi_power_line(rate, cap, prev_bat_cap - cap, time(NULL) - prev_bat_time); |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 603 | return 1; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 604 | } |
| 605 | |
Auke Kok | 41e8360 | 2008-09-04 19:59:19 +0000 | [diff] [blame] | 606 | int print_battery_proc_pmu(void) |
| 607 | { |
| 608 | char line[80]; |
| 609 | int i; |
| 610 | int power_present = 0; |
| 611 | int num_batteries = 0; |
| 612 | /* unsigned rem_time_sec = 0; */ |
| 613 | unsigned charge_mAh = 0, max_charge_mAh = 0, voltage_mV = 0; |
| 614 | int discharge_mA = 0; |
| 615 | FILE *fd; |
| 616 | |
| 617 | fd = fopen("/proc/pmu/info", "r"); |
| 618 | if (fd == NULL) |
| 619 | return 0; |
| 620 | |
| 621 | while ( fgets(line, sizeof(line), fd) != NULL ) |
| 622 | { |
| 623 | if (strncmp("AC Power", line, strlen("AC Power")) == 0) |
| 624 | sscanf(strchr(line, ':')+2, "%d", &power_present); |
| 625 | else if (strncmp("Battery count", line, strlen("Battery count")) == 0) |
| 626 | sscanf(strchr(line, ':')+2, "%d", &num_batteries); |
| 627 | } |
| 628 | fclose(fd); |
| 629 | |
| 630 | for (i = 0; i < num_batteries; ++i) |
| 631 | { |
| 632 | char file_name[20]; |
| 633 | int flags = 0; |
| 634 | /* int battery_charging, battery_full; */ |
| 635 | /* unsigned this_rem_time_sec = 0; */ |
| 636 | unsigned this_charge_mAh = 0, this_max_charge_mAh = 0; |
| 637 | unsigned this_voltage_mV = 0, this_discharge_mA = 0; |
| 638 | |
| 639 | snprintf(file_name, sizeof(file_name), "/proc/pmu/battery_%d", i); |
| 640 | fd = fopen(file_name, "r"); |
| 641 | if (fd == NULL) |
| 642 | continue; |
| 643 | |
| 644 | while (fgets(line, sizeof(line), fd) != NULL) |
| 645 | { |
| 646 | if (strncmp("flags", line, strlen("flags")) == 0) |
| 647 | sscanf(strchr(line, ':')+2, "%x", &flags); |
| 648 | else if (strncmp("charge", line, strlen("charge")) == 0) |
| 649 | sscanf(strchr(line, ':')+2, "%d", &this_charge_mAh); |
| 650 | else if (strncmp("max_charge", line, strlen("max_charge")) == 0) |
| 651 | sscanf(strchr(line, ':')+2, "%d", &this_max_charge_mAh); |
| 652 | else if (strncmp("voltage", line, strlen("voltage")) == 0) |
| 653 | sscanf(strchr(line, ':')+2, "%d", &this_voltage_mV); |
| 654 | else if (strncmp("current", line, strlen("current")) == 0) |
| 655 | sscanf(strchr(line, ':')+2, "%d", &this_discharge_mA); |
| 656 | /* else if (strncmp("time rem.", line, strlen("time rem.")) == 0) */ |
| 657 | /* sscanf(strchr(line, ':')+2, "%d", &this_rem_time_sec); */ |
| 658 | } |
| 659 | fclose(fd); |
| 660 | |
| 661 | if ( !(flags & 0x1) ) |
| 662 | /* battery isn't present */ |
| 663 | continue; |
| 664 | |
| 665 | /* battery_charging = flags & 0x2; */ |
| 666 | /* battery_full = !battery_charging && power_present; */ |
| 667 | |
| 668 | charge_mAh += this_charge_mAh; |
| 669 | max_charge_mAh += this_max_charge_mAh; |
| 670 | voltage_mV += this_voltage_mV; |
| 671 | discharge_mA += this_discharge_mA; |
| 672 | /* rem_time_sec += this_rem_time_sec; */ |
| 673 | } |
Auke Kok | 07ed39e | 2008-09-16 17:22:14 +0000 | [diff] [blame] | 674 | show_pmu_power_line(voltage_mV, charge_mAh, max_charge_mAh, |
Auke Kok | 41e8360 | 2008-09-04 19:59:19 +0000 | [diff] [blame] | 675 | discharge_mA); |
| 676 | return 1; |
| 677 | } |
| 678 | |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 679 | void print_battery_sysfs(void) |
| 680 | { |
| 681 | DIR *dir; |
| 682 | struct dirent *dirent; |
| 683 | FILE *file; |
| 684 | double rate = 0; |
| 685 | double cap = 0; |
| 686 | |
| 687 | char filename[256]; |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 688 | |
Auke Kok | 41e8360 | 2008-09-04 19:59:19 +0000 | [diff] [blame] | 689 | if (print_battery_proc_acpi()) |
| 690 | return; |
| 691 | |
| 692 | if (print_battery_proc_pmu()) |
Arjan van der Ven | 160580c | 2008-03-27 18:16:12 +0000 | [diff] [blame] | 693 | return; |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 694 | |
| 695 | dir = opendir("/sys/class/power_supply"); |
| 696 | if (!dir) { |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 697 | return; |
| 698 | } |
| 699 | |
| 700 | while ((dirent = readdir(dir))) { |
| 701 | int dontcount = 0; |
| 702 | double voltage = 0.0; |
| 703 | double amperes_drawn = 0.0; |
| 704 | double watts_drawn = 0.0; |
| 705 | double watts_left = 0.0; |
| 706 | char line[1024]; |
| 707 | |
| 708 | if (strstr(dirent->d_name, "AC")) |
| 709 | continue; |
| 710 | |
| 711 | sprintf(filename, "/sys/class/power_supply/%s/present", dirent->d_name); |
| 712 | file = fopen(filename, "r"); |
| 713 | if (!file) |
| 714 | continue; |
| 715 | int s; |
| 716 | if ((s = getc(file)) != EOF) { |
| 717 | if (s == 0) |
| 718 | break; |
| 719 | } |
| 720 | fclose(file); |
| 721 | |
| 722 | sprintf(filename, "/sys/class/power_supply/%s/status", dirent->d_name); |
| 723 | file = fopen(filename, "r"); |
| 724 | if (!file) |
| 725 | continue; |
| 726 | memset(line, 0, 1024); |
| 727 | if (fgets(line, 1024, file) != NULL) { |
| 728 | if (!strstr(line, "Discharging")) |
| 729 | dontcount = 1; |
| 730 | } |
| 731 | fclose(file); |
| 732 | |
| 733 | sprintf(filename, "/sys/class/power_supply/%s/voltage_now", dirent->d_name); |
| 734 | file = fopen(filename, "r"); |
| 735 | if (!file) |
| 736 | continue; |
| 737 | memset(line, 0, 1024); |
| 738 | if (fgets(line, 1024, file) != NULL) { |
| 739 | voltage = strtoull(line, NULL, 10) / 1000000.0; |
| 740 | } |
| 741 | fclose(file); |
| 742 | |
| 743 | sprintf(filename, "/sys/class/power_supply/%s/energy_now", dirent->d_name); |
| 744 | file = fopen(filename, "r"); |
Auke Kok | 07ed39e | 2008-09-16 17:22:14 +0000 | [diff] [blame] | 745 | watts_left = 1; |
| 746 | if (!file) { |
| 747 | sprintf(filename, "/sys/class/power_supply/%s/charge_now", dirent->d_name); |
| 748 | file = fopen(filename, "r"); |
| 749 | if (!file) |
| 750 | continue; |
| 751 | |
| 752 | /* W = A * V */ |
| 753 | watts_left = voltage; |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 754 | } |
Auke Kok | 07ed39e | 2008-09-16 17:22:14 +0000 | [diff] [blame] | 755 | memset(line, 0, 1024); |
| 756 | if (fgets(line, 1024, file) != NULL) |
| 757 | watts_left *= strtoull(line, NULL, 10) / 1000000.0; |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 758 | fclose(file); |
| 759 | |
| 760 | sprintf(filename, "/sys/class/power_supply/%s/current_now", dirent->d_name); |
| 761 | file = fopen(filename, "r"); |
| 762 | if (!file) |
| 763 | continue; |
| 764 | memset(line, 0, 1024); |
| 765 | if (fgets(line, 1024, file) != NULL) { |
Auke Kok | 07ed39e | 2008-09-16 17:22:14 +0000 | [diff] [blame] | 766 | amperes_drawn = strtoull(line, NULL, 10) / 1000000.0; |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 767 | } |
| 768 | fclose(file); |
| 769 | |
| 770 | if (!dontcount) { |
| 771 | rate += watts_drawn + voltage * amperes_drawn; |
| 772 | } |
| 773 | cap += watts_left; |
| 774 | |
| 775 | |
| 776 | } |
| 777 | closedir(dir); |
| 778 | if (prev_bat_cap - cap < 0.001 && rate < 0.001) |
| 779 | last_bat_time = 0; |
| 780 | if (!last_bat_time) { |
| 781 | last_bat_time = prev_bat_time = time(NULL); |
| 782 | last_bat_cap = prev_bat_cap = cap; |
| 783 | } |
| 784 | if (time(NULL) - last_bat_time >= 400) { |
| 785 | prev_bat_cap = last_bat_cap; |
| 786 | prev_bat_time = last_bat_time; |
| 787 | last_bat_time = time(NULL); |
| 788 | last_bat_cap = cap; |
| 789 | } |
| 790 | |
| 791 | show_acpi_power_line(rate, cap, prev_bat_cap - cap, time(NULL) - prev_bat_time); |
| 792 | } |
| 793 | |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 794 | char cstate_lines[12][200]; |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 795 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 796 | void usage() |
| 797 | { |
| 798 | printf(_("Usage: powertop [OPTION...]\n")); |
| 799 | printf(_(" -d, --dump read wakeups once and print list of top offenders\n")); |
| 800 | printf(_(" -t, --time=DOUBLE default time to gather data in seconds\n")); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 801 | printf(_(" -r, --reset Reset PM stats data\n")); |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 802 | printf(_(" -h, --help Show this help message\n")); |
Auke Kok | eecdec5 | 2008-12-01 18:22:47 +0000 | [diff] [blame] | 803 | printf(_(" -v, --version Show version information and exit\n")); |
| 804 | exit(0); |
| 805 | } |
| 806 | |
| 807 | void version() |
| 808 | { |
Auke Kok | fb60478 | 2008-12-11 21:35:46 +0000 | [diff] [blame] | 809 | printf(_("powertop version %s\n"), VERSION); |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 810 | exit(0); |
| 811 | } |
| 812 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 813 | int main(int argc, char **argv) |
| 814 | { |
| 815 | char line[1024]; |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 816 | int ncursesinited=0; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 817 | FILE *file = NULL; |
| 818 | uint64_t cur_usage[8], cur_duration[8]; |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 819 | double wakeups_per_second = 0; |
| 820 | |
Arjan van der Ven | b517d0f | 2007-08-19 17:39:51 +0000 | [diff] [blame] | 821 | setlocale (LC_ALL, ""); |
| 822 | bindtextdomain ("powertop", "/usr/share/locale"); |
| 823 | textdomain ("powertop"); |
Arjan van der Ven | fe2d715 | 2007-06-23 04:40:40 +0000 | [diff] [blame] | 824 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 825 | while (1) { |
| 826 | static struct option opts[] = { |
| 827 | { "dump", 0, NULL, 'd' }, |
| 828 | { "time", 1, NULL, 't' }, |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 829 | { "reset", 0, NULL, 'r' }, |
| 830 | { "pids", 0, NULL, 'p' }, |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 831 | { "help", 0, NULL, 'h' }, |
Auke Kok | eecdec5 | 2008-12-01 18:22:47 +0000 | [diff] [blame] | 832 | { "version", 0, NULL, 'v' }, |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 833 | { 0, 0, NULL, 0 } |
| 834 | }; |
| 835 | int index2 = 0, c; |
| 836 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 837 | c = getopt_long(argc, argv, "dt:rphv", opts, &index2); |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 838 | if (c == -1) |
| 839 | break; |
| 840 | switch (c) { |
| 841 | case 'd': |
| 842 | dump = 1; |
| 843 | break; |
| 844 | case 't': |
| 845 | ticktime = strtod(optarg, NULL); |
| 846 | break; |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 847 | case 'r': |
| 848 | reset_pm_stats = 1; |
| 849 | break; |
| 850 | case 'p': |
| 851 | showpids = 1; |
| 852 | break; |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 853 | case 'h': |
| 854 | usage(); |
| 855 | break; |
Auke Kok | eecdec5 | 2008-12-01 18:22:47 +0000 | [diff] [blame] | 856 | case 'v': |
| 857 | version(); |
| 858 | break; |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 859 | default: |
| 860 | ; |
| 861 | } |
| 862 | } |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 863 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 864 | if (!dump) |
| 865 | ticktime = 5.0; |
| 866 | |
Arjan van der Ven | 5683ee3 | 2007-07-28 03:33:35 +0000 | [diff] [blame] | 867 | system("/sbin/modprobe cpufreq_stats &> /dev/null"); |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 868 | read_data(&start_usage[0], &start_duration[0]); |
Arjan van der Ven | 329bb7a | 2007-06-17 06:27:18 +0000 | [diff] [blame] | 869 | |
Arjan van der Ven | e967a40 | 2007-05-22 04:14:59 +0000 | [diff] [blame] | 870 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 871 | memcpy(last_usage, start_usage, sizeof(last_usage)); |
| 872 | memcpy(last_duration, start_duration, sizeof(last_duration)); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 873 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 874 | do_proc_irq(); |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 875 | do_proc_irq(); |
Arjan van der Ven | 5103dd7 | 2007-06-17 16:27:44 +0000 | [diff] [blame] | 876 | do_cpufreq_stats(); |
Arjan van der Ven | 9fc3a16 | 2007-10-03 20:09:00 +0000 | [diff] [blame] | 877 | count_usb_urbs(); |
Arjan van der Ven | eeb2e17 | 2008-03-27 04:01:21 +0000 | [diff] [blame] | 878 | count_usb_urbs(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 879 | |
| 880 | memset(cur_usage, 0, sizeof(cur_usage)); |
| 881 | memset(cur_duration, 0, sizeof(cur_duration)); |
Auke Kok | eecdec5 | 2008-12-01 18:22:47 +0000 | [diff] [blame] | 882 | printf("PowerTOP " VERSION " (C) 2007, 2008 Intel Corporation \n\n"); |
Arjan van der Ven | 34640a4 | 2007-08-19 17:42:57 +0000 | [diff] [blame] | 883 | if (geteuid() != 0) |
Arjan van der Ven | c425d82 | 2007-05-22 03:53:34 +0000 | [diff] [blame] | 884 | printf(_("PowerTOP needs to be run as root to collect enough information\n")); |
Arjan van der Ven | 735c048 | 2007-05-28 17:51:37 +0000 | [diff] [blame] | 885 | printf(_("Collecting data for %i seconds \n"), (int)ticktime); |
Arjan van der Ven | db0370a | 2008-03-27 18:44:50 +0000 | [diff] [blame] | 886 | printf("\n\n"); |
| 887 | print_intel_cstates(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 888 | stop_timerstats(); |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 889 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 890 | while (1) { |
| 891 | double maxsleep = 0.0; |
| 892 | int64_t totalticks; |
| 893 | int64_t totalevents; |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 894 | fd_set rfds; |
| 895 | struct timeval tv; |
| 896 | int key; |
| 897 | |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 898 | int num_cpus = sysconf(_SC_NPROCESSORS_ONLN); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 899 | int i = 0; |
| 900 | double c0 = 0; |
| 901 | char *c; |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 902 | |
| 903 | |
| 904 | FD_ZERO(&rfds); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 905 | #ifndef NO_NCURSES |
| 906 | /* Do not check for stdin (fd: 0) |
| 907 | * This would cause select to return immediately |
| 908 | * when the USB is re-attached on ADB shell. |
| 909 | */ |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 910 | FD_SET(0, &rfds); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 911 | #endif |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 912 | tv.tv_sec = ticktime; |
Arjan van der Ven | 735c048 | 2007-05-28 17:51:37 +0000 | [diff] [blame] | 913 | tv.tv_usec = (ticktime - tv.tv_sec) * 1000000;; |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 914 | if (reset_pm_stats) |
| 915 | reset_msm_pm_stats(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 916 | do_proc_irq(); |
| 917 | start_timerstats(); |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 918 | |
| 919 | |
| 920 | key = select(1, &rfds, NULL, NULL, &tv); |
| 921 | |
Arjan van der Ven | 735c048 | 2007-05-28 17:51:37 +0000 | [diff] [blame] | 922 | if (key && tv.tv_sec) ticktime = ticktime - tv.tv_sec - tv.tv_usec/1000000.0; |
Arjan van der Ven | b43056b | 2007-05-24 20:47:42 +0000 | [diff] [blame] | 923 | |
Arjan van der Ven | fcddf6e | 2007-06-23 05:33:16 +0000 | [diff] [blame] | 924 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 925 | stop_timerstats(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 926 | msm_pm_stats(); |
Arjan van der Ven | e039912 | 2007-05-24 14:56:27 +0000 | [diff] [blame] | 927 | clear_lines(); |
| 928 | do_proc_irq(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 929 | read_data(&cur_usage[0], &cur_duration[0]); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 930 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 931 | totalticks = 0; |
| 932 | totalevents = 0; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 933 | for (i = 0; i < 8; i++) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 934 | if (cur_usage[i]) { |
| 935 | totalticks += cur_duration[i] - last_duration[i]; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 936 | totalevents += cur_usage[i] - last_usage[i]; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 937 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 938 | |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 939 | if (!dump) { |
| 940 | if (!ncursesinited) { |
| 941 | initialize_curses(); |
| 942 | ncursesinited++; |
| 943 | } |
| 944 | setup_windows(); |
| 945 | show_title_bar(); |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 946 | } |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 947 | |
| 948 | memset(&cstate_lines, 0, sizeof(cstate_lines)); |
Arjan van der Ven | 5288ca7 | 2007-05-23 16:24:06 +0000 | [diff] [blame] | 949 | topcstate = -4; |
Arjan van der Ven | bbd7aee | 2007-06-23 05:05:38 +0000 | [diff] [blame] | 950 | if (totalevents == 0 && maxcstate <= 1) { |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 951 | sprintf(cstate_lines[5],_("< Detailed C-state information is not available.>\n")); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 952 | } else { |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 953 | double sleept, percentage; |
| 954 | if (cpu_count) |
| 955 | num_cpus = cpu_count; |
| 956 | c0 = num_cpus * ticktime * 1000 * FREQ - totalticks; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 957 | if (c0 < 0) |
| 958 | c0 = 0; /* rounding errors in measurement might make c0 go slightly negative.. this is confusing */ |
Arjan van der Ven | 6fe1c57 | 2007-08-18 21:52:07 +0000 | [diff] [blame] | 959 | sprintf(cstate_lines[0], _("Cn\t Avg residency\n")); |
Arjan van der Ven | 02a9e36 | 2007-06-23 05:15:45 +0000 | [diff] [blame] | 960 | |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 961 | percentage = c0 * 100.0 / (num_cpus * ticktime * 1000 * FREQ); |
Arjan van der Ven | 02a9e36 | 2007-06-23 05:15:45 +0000 | [diff] [blame] | 962 | sprintf(cstate_lines[1], _("C0 (cpu running) (%4.1f%%)\n"), percentage); |
| 963 | if (percentage > 50) |
| 964 | topcstate = 0; |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 965 | for (i = 0; i < 8; i++) |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 966 | if (cur_usage[i]) { |
Arjan van der Ven | 0074289 | 2007-06-01 03:16:51 +0000 | [diff] [blame] | 967 | sleept = (cur_duration[i] - last_duration[i]) / (cur_usage[i] - last_usage[i] |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 968 | + 0.1) / FREQ; |
Arjan van der Ven | 5288ca7 | 2007-05-23 16:24:06 +0000 | [diff] [blame] | 969 | percentage = (cur_duration[i] - |
| 970 | last_duration[i]) * 100 / |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 971 | (num_cpus * ticktime * 1000 * FREQ); |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 972 | |
| 973 | if (cnames[i][0]==0) |
| 974 | sprintf(cnames[i],"C%i",i+1); |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 975 | sprintf |
Arjan van der Ven | 03f2a89 | 2008-06-27 17:01:33 +0000 | [diff] [blame] | 976 | (cstate_lines[2+i], _("%s\t%5.1fms (%4.1f%%)\n"), |
Arjan van der Ven | 70551c5 | 2008-03-27 03:16:37 +0000 | [diff] [blame] | 977 | cnames[i], sleept, percentage); |
Arjan van der Ven | 0074289 | 2007-06-01 03:16:51 +0000 | [diff] [blame] | 978 | if (maxsleep < sleept) |
| 979 | maxsleep = sleept; |
Arjan van der Ven | 5288ca7 | 2007-05-23 16:24:06 +0000 | [diff] [blame] | 980 | if (percentage > 50) |
| 981 | topcstate = i+1; |
| 982 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 983 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 984 | } |
Arjan van der Ven | 329bb7a | 2007-06-17 06:27:18 +0000 | [diff] [blame] | 985 | do_cpufreq_stats(); |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 986 | show_cstates(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 987 | show_msm_pm_stats(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 988 | /* now the timer_stats info */ |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 989 | memset(line, 0, sizeof(line)); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 990 | totalticks = 0; |
Arjan van der Ven | 7dd3863 | 2007-06-17 16:03:15 +0000 | [diff] [blame] | 991 | file = NULL; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 992 | if (!nostats) |
Arjan van der Ven | 6473da4 | 2007-05-13 15:23:31 +0000 | [diff] [blame] | 993 | file = fopen("/proc/timer_stats", "r"); |
| 994 | while (file && !feof(file)) { |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 995 | char *count, *pid, *process, *func; |
Arjan van der Ven | 91793a8 | 2007-05-25 15:47:52 +0000 | [diff] [blame] | 996 | char line2[1024]; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 997 | int cnt; |
Arjan van der Ven | 5683ee3 | 2007-07-28 03:33:35 +0000 | [diff] [blame] | 998 | int deferrable = 0; |
Arjan van der Ven | 6a0ade2 | 2007-05-24 23:45:33 +0000 | [diff] [blame] | 999 | memset(line, 0, 1024); |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 1000 | if (fgets(line, 1024, file) == NULL) |
| 1001 | break; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1002 | if (strstr(line, "total events")) |
| 1003 | break; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1004 | c = count = &line[0]; |
| 1005 | c = strchr(c, ','); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1006 | if (!c) |
| 1007 | continue; |
| 1008 | *c = 0; |
| 1009 | c++; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1010 | while (*c != 0 && *c == ' ') |
| 1011 | c++; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1012 | pid = c; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1013 | c = strchr(c, ' '); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1014 | if (!c) |
| 1015 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1016 | *c = 0; |
| 1017 | c++; |
| 1018 | while (*c != 0 && *c == ' ') |
| 1019 | c++; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1020 | process = c; |
| 1021 | c = strchr(c, ' '); |
| 1022 | if (!c) |
| 1023 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1024 | *c = 0; |
| 1025 | c++; |
| 1026 | while (*c != 0 && *c == ' ') |
| 1027 | c++; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1028 | func = c; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1029 | if (strcmp(process, "insmod") == 0) |
Arjan van der Ven | 8512054 | 2007-10-29 17:49:28 +0000 | [diff] [blame] | 1030 | process = _("<kernel module>"); |
Arjan van der Ven | efcad81 | 2007-05-25 15:21:38 +0000 | [diff] [blame] | 1031 | if (strcmp(process, "modprobe") == 0) |
Arjan van der Ven | 8512054 | 2007-10-29 17:49:28 +0000 | [diff] [blame] | 1032 | process = _("<kernel module>"); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1033 | if (strcmp(process, "swapper") == 0) |
Arjan van der Ven | 8512054 | 2007-10-29 17:49:28 +0000 | [diff] [blame] | 1034 | process = _("<kernel core>"); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1035 | c = strchr(c, '\n'); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1036 | if (strncmp(func, "tick_nohz_", 10) == 0) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1037 | continue; |
Arjan van der Ven | dccde0d | 2007-06-11 19:46:49 +0000 | [diff] [blame] | 1038 | if (strncmp(func, "tick_setup_sched_timer", 20) == 0) |
| 1039 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1040 | if (strcmp(process, "powertop") == 0) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1041 | continue; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1042 | if (c) |
| 1043 | *c = 0; |
Arjan van der Ven | 5683ee3 | 2007-07-28 03:33:35 +0000 | [diff] [blame] | 1044 | cnt = strtoull(count, &c, 10); |
| 1045 | while (*c != 0) { |
| 1046 | if (*c++ == 'D') |
| 1047 | deferrable = 1; |
| 1048 | } |
| 1049 | if (deferrable) |
| 1050 | continue; |
Arjan van der Ven | 91793a8 | 2007-05-25 15:47:52 +0000 | [diff] [blame] | 1051 | sprintf(line2, "%15s : %s", process, func); |
Arjan van der Ven | 356cd2c | 2007-12-13 21:52:01 +0000 | [diff] [blame] | 1052 | push_line_pid(line2, cnt, pid); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1053 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1054 | if (file) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1055 | pclose(file); |
Anurag Singh | bf459e2 | 2011-10-10 10:50:51 -0700 | [diff] [blame] | 1056 | #ifdef PLATFORM_NO_INT0 |
| 1057 | totalevents = total_interrupt; |
| 1058 | #endif |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 1059 | if (strstr(line, "total events")) { |
| 1060 | int d; |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 1061 | d = strtoull(line, NULL, 10) / num_cpus; |
Arjan van der Ven | e772a47 | 2007-05-26 00:03:31 +0000 | [diff] [blame] | 1062 | if (totalevents == 0) { /* No c-state info available, use timerstats instead */ |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 1063 | totalevents = d * num_cpus + total_interrupt; |
Arjan van der Ven | e772a47 | 2007-05-26 00:03:31 +0000 | [diff] [blame] | 1064 | if (d < interrupt_0) |
| 1065 | totalevents += interrupt_0 - d; |
| 1066 | } |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 1067 | if (d>0 && d < interrupt_0) |
Arjan van der Ven | 8512054 | 2007-10-29 17:49:28 +0000 | [diff] [blame] | 1068 | push_line(_(" <interrupt> : extra timer interrupt"), interrupt_0 - d); |
Arjan van der Ven | 4be0e1b | 2007-05-23 15:50:53 +0000 | [diff] [blame] | 1069 | } |
| 1070 | |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 1071 | |
| 1072 | if (totalevents && ticktime) { |
Patrick Cain | d5f3cfb | 2012-10-24 12:33:15 -0700 | [diff] [blame] | 1073 | wakeups_per_second = totalevents * 1.0 / ticktime / num_cpus; |
| 1074 | show_wakeups(wakeups_per_second, ticktime, c0 * 100.0 / (num_cpus * ticktime * 1000 * FREQ)); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1075 | } |
Arjan van der Ven | 9fc3a16 | 2007-10-03 20:09:00 +0000 | [diff] [blame] | 1076 | count_usb_urbs(); |
Arjan van der Ven | a90b352 | 2008-03-27 03:52:28 +0000 | [diff] [blame] | 1077 | print_battery_sysfs(); |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1078 | count_lines(); |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 1079 | sort_lines(); |
Arjan van der Ven | 329bb7a | 2007-06-17 06:27:18 +0000 | [diff] [blame] | 1080 | |
Arjan van der Ven | 2b7db8e | 2007-06-23 19:03:34 +0000 | [diff] [blame] | 1081 | displaytime = displaytime - ticktime; |
| 1082 | |
Arjan van der Ven | bdedb3c | 2007-05-22 23:53:28 +0000 | [diff] [blame] | 1083 | show_timerstats(nostats, ticktime); |
| 1084 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1085 | if (maxsleep < 5.0) |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1086 | ticktime = 10; |
Arjan van der Ven | efa67c2 | 2007-06-07 18:09:04 +0000 | [diff] [blame] | 1087 | else if (maxsleep < 30.0) |
| 1088 | ticktime = 15; |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1089 | else if (maxsleep < 100.0) |
| 1090 | ticktime = 20; |
| 1091 | else if (maxsleep < 400.0) |
| 1092 | ticktime = 30; |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1093 | else |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1094 | ticktime = 45; |
| 1095 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1096 | |
Arjan van der Ven | d353b41 | 2007-05-25 21:22:14 +0000 | [diff] [blame] | 1097 | if (key) { |
| 1098 | char keychar; |
Auke Kok | e0f6766 | 2008-11-26 19:07:58 +0000 | [diff] [blame] | 1099 | int keystroke = fgetc(stdin); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1100 | #ifndef NO_NCURSES |
| 1101 | /* Do not handle EOF when not using ncurses as |
| 1102 | * the shell would pass the EOF to the app causing |
| 1103 | * it to stop. |
| 1104 | */ |
Auke Kok | e0f6766 | 2008-11-26 19:07:58 +0000 | [diff] [blame] | 1105 | if (keystroke == EOF) |
| 1106 | exit(EXIT_SUCCESS); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1107 | #endif |
Arjan van der Ven | d353b41 | 2007-05-25 21:22:14 +0000 | [diff] [blame] | 1108 | |
Auke Kok | e0f6766 | 2008-11-26 19:07:58 +0000 | [diff] [blame] | 1109 | keychar = toupper(keystroke); |
Arjan van der Ven | d353b41 | 2007-05-25 21:22:14 +0000 | [diff] [blame] | 1110 | if (keychar == 'Q') |
| 1111 | exit(EXIT_SUCCESS); |
| 1112 | if (keychar == 'R') |
| 1113 | ticktime = 3; |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1114 | #ifndef NO_SUGGESTIONS |
Arjan van der Ven | d353b41 | 2007-05-25 21:22:14 +0000 | [diff] [blame] | 1115 | if (keychar == suggestion_key && suggestion_activate) { |
| 1116 | suggestion_activate(); |
| 1117 | ticktime = 2; |
Arjan van der Ven | 2b7db8e | 2007-06-23 19:03:34 +0000 | [diff] [blame] | 1118 | displaytime = -1.0; |
Arjan van der Ven | 356cd2c | 2007-12-13 21:52:01 +0000 | [diff] [blame] | 1119 | } else |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1120 | #endif |
Arjan van der Ven | 356cd2c | 2007-12-13 21:52:01 +0000 | [diff] [blame] | 1121 | if (keychar == 'P') |
| 1122 | showpids = !showpids; |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1123 | |
Arjan van der Ven | d353b41 | 2007-05-25 21:22:14 +0000 | [diff] [blame] | 1124 | } |
| 1125 | |
Arjan van der Ven | 96f6120 | 2007-06-05 01:46:09 +0000 | [diff] [blame] | 1126 | if (wakeups_per_second < 0) |
| 1127 | ticktime = 2; |
| 1128 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1129 | |
| 1130 | #ifndef NO_SUGGESTIONS |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 1131 | reset_suggestions(); |
Arjan van der Ven | db82c2b | 2007-05-22 23:56:20 +0000 | [diff] [blame] | 1132 | |
Arjan van der Ven | 1b730c8 | 2007-05-18 01:59:28 +0000 | [diff] [blame] | 1133 | suggest_kernel_config("CONFIG_USB_SUSPEND", 1, |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 1134 | _("Suggestion: Enable the CONFIG_USB_SUSPEND kernel configuration option.\nThis option will automatically disable UHCI USB when not in use, and may\nsave approximately 1 Watt of power."), 20); |
Arjan van der Ven | db16ceb | 2007-05-13 16:43:34 +0000 | [diff] [blame] | 1135 | suggest_kernel_config("CONFIG_CPU_FREQ_GOV_ONDEMAND", 1, |
Arjan van der Ven | c425d82 | 2007-05-22 03:53:34 +0000 | [diff] [blame] | 1136 | _("Suggestion: Enable the CONFIG_CPU_FREQ_GOV_ONDEMAND kernel configuration option.\n" |
Arjan van der Ven | 2889d76 | 2007-05-26 14:13:41 +0000 | [diff] [blame] | 1137 | "The 'ondemand' CPU speed governor will minimize the CPU power usage while\n" "giving you performance when it is needed."), 5); |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 1138 | suggest_kernel_config("CONFIG_NO_HZ", 1, _("Suggestion: Enable the CONFIG_NO_HZ kernel configuration option.\nThis option is required to get any kind of longer sleep times in the CPU."), 50); |
Arjan van der Ven | d6e336b | 2007-06-01 07:16:43 +0000 | [diff] [blame] | 1139 | suggest_kernel_config("CONFIG_ACPI_BATTERY", 1, _("Suggestion: Enable the CONFIG_ACPI_BATTERY kernel configuration option.\n " |
| 1140 | "This option is required to get power estimages from PowerTOP"), 5); |
Arjan van der Ven | 1666e8d | 2007-05-15 23:37:44 +0000 | [diff] [blame] | 1141 | suggest_kernel_config("CONFIG_HPET_TIMER", 1, |
Arjan van der Ven | c350a1b | 2007-06-08 21:06:39 +0000 | [diff] [blame] | 1142 | _("Suggestion: Enable the CONFIG_HPET_TIMER kernel configuration option.\n" |
Arjan van der Ven | e0c35c4 | 2007-06-04 05:13:39 +0000 | [diff] [blame] | 1143 | "Without HPET support the kernel needs to wake up every 20 milliseconds for \n" "some housekeeping tasks."), 10); |
Arjan van der Ven | 26a3771 | 2007-05-26 14:11:47 +0000 | [diff] [blame] | 1144 | if (!access("/sys/module/snd_ac97_codec", F_OK) && |
| 1145 | access("/sys/module/snd_ac97_codec/parameters/power_save", F_OK)) |
Arjan van der Ven | 0024c93 | 2007-05-23 16:27:03 +0000 | [diff] [blame] | 1146 | suggest_kernel_config("CONFIG_SND_AC97_POWER_SAVE", 1, |
Arjan van der Ven | c425d82 | 2007-05-22 03:53:34 +0000 | [diff] [blame] | 1147 | _("Suggestion: Enable the CONFIG_SND_AC97_POWER_SAVE kernel configuration option.\n" |
Arjan van der Ven | 1b730c8 | 2007-05-18 01:59:28 +0000 | [diff] [blame] | 1148 | "This option will automatically power down your sound codec when not in use,\n" |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 1149 | "and can save approximately half a Watt of power."), 20); |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1150 | suggest_kernel_config("CONFIG_IRQBALANCE", 0, |
Arjan van der Ven | 825ec69 | 2007-05-24 17:41:06 +0000 | [diff] [blame] | 1151 | _("Suggestion: Disable the CONFIG_IRQBALANCE kernel configuration option.\n" "The in-kernel irq balancer is obsolete and wakes the CPU up far more than needed."), 3); |
Arjan van der Ven | 96abef1 | 2007-06-17 06:30:21 +0000 | [diff] [blame] | 1152 | suggest_kernel_config("CONFIG_CPU_FREQ_STAT", 1, |
| 1153 | _("Suggestion: Enable the CONFIG_CPU_FREQ_STAT kernel configuration option.\n" |
Arjan van der Ven | 45b6a98 | 2007-06-17 16:38:59 +0000 | [diff] [blame] | 1154 | "This option allows PowerTOP to show P-state percentages \n" "P-states correspond to CPU frequencies."), 2); |
Arjan van der Ven | f6a2247 | 2007-06-27 04:50:13 +0000 | [diff] [blame] | 1155 | suggest_kernel_config("CONFIG_INOTIFY", 1, |
| 1156 | _("Suggestion: Enable the CONFIG_INOTIFY kernel configuration option.\n" |
| 1157 | "This option allows programs to wait for changes in files and directories\n" |
| 1158 | "instead of having to poll for these changes"), 5); |
Arjan van der Ven | 96abef1 | 2007-06-17 06:30:21 +0000 | [diff] [blame] | 1159 | |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1160 | |
| 1161 | /* suggest to stop beagle if it shows up in the top 20 and wakes up more than 10 times in the measurement */ |
| 1162 | suggest_process_death("beagled : schedule_timeout", "beagled", lines, min(linehead,20), 10.0, |
| 1163 | _("Suggestion: Disable or remove 'beagle' from your system. \n" |
| 1164 | "Beagle is the program that indexes for easy desktop search, however it's \n" |
| 1165 | "not very efficient and costs a significant amount of battery life."), 30); |
Arjan van der Ven | 95521af | 2007-05-27 17:49:39 +0000 | [diff] [blame] | 1166 | suggest_process_death("beagled : futex_wait (hrtimer_wakeup)", "beagled", lines, min(linehead,20), 10.0, |
| 1167 | _("Suggestion: Disable or remove 'beagle' from your system. \n" |
| 1168 | "Beagle is the program that indexes for easy desktop search, however it's \n" |
| 1169 | "not very efficient and costs a significant amount of battery life."), 30); |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1170 | |
Arjan van der Ven | 6396cbb | 2007-10-28 19:47:16 +0000 | [diff] [blame] | 1171 | /* suggest to stop gnome-power-manager *only* if it shows up in the top 10 and wakes up more than 10 times in the measurement */ |
| 1172 | /* note to distribution makers: There is no need to patch this out! */ |
| 1173 | /* If you ship a recent enough g-p-m, the warning will not be there, */ |
| 1174 | /* and if you ship a really old one the warning is really justified. */ |
Arjan van der Ven | 915f798 | 2007-05-26 22:18:24 +0000 | [diff] [blame] | 1175 | suggest_process_death("gnome-power-man : schedule_timeout (process_timeout)", "gnome-power-manager", lines, min(linehead,10), 10.0, |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1176 | _("Suggestion: Disable or remove 'gnome-power-manager' from your system. \n" |
Arjan van der Ven | f096363 | 2007-08-18 21:28:02 +0000 | [diff] [blame] | 1177 | "Older versions of gnome-power-manager wake up far more often than \n" |
| 1178 | "needed costing you some power."), 5); |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1179 | |
| 1180 | /* suggest to stop pcscd if it shows up in the top 50 and wakes up at all*/ |
Arjan van der Ven | ba3cc27 | 2007-06-01 06:53:08 +0000 | [diff] [blame] | 1181 | suggest_process_death("pcscd : ", "pcscd", lines, min(linehead,50), 1.0, |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1182 | _("Suggestion: Disable or remove 'pcscd' from your system. \n" |
| 1183 | "pcscd tends to keep the USB subsystem out of power save mode\n" |
| 1184 | "and your processor out of deeper powersave states."), 30); |
| 1185 | |
| 1186 | |
Arjan van der Ven | e0fec35 | 2007-05-27 02:38:53 +0000 | [diff] [blame] | 1187 | /* suggest to stop hal polilng if it shows up in the top 50 and wakes up too much*/ |
Arjan van der Ven | 7a53342 | 2007-06-01 07:01:24 +0000 | [diff] [blame] | 1188 | suggest_process_death("hald-addon-stor : ", "hald-addon-storage", lines, min(linehead,50), 2.0, |
Arjan van der Ven | bd4a8f9 | 2007-06-08 19:53:53 +0000 | [diff] [blame] | 1189 | _( "Suggestion: Disable 'hal' from polling your cdrom with: \n" |
Auke Kok | 869de2c | 2008-11-26 18:58:21 +0000 | [diff] [blame] | 1190 | "hal-disable-polling --device /dev/cdrom 'hal' is the component that auto-opens a\n" |
Arjan van der Ven | af7d576 | 2007-06-08 22:02:02 +0000 | [diff] [blame] | 1191 | "window if you plug in a CD but disables SATA power saving from kicking in."), 30); |
Arjan van der Ven | e0fec35 | 2007-05-27 02:38:53 +0000 | [diff] [blame] | 1192 | |
Arjan van der Ven | 2484be2 | 2007-06-03 21:31:22 +0000 | [diff] [blame] | 1193 | /* suggest to kill sealert; it wakes up 10 times/second on a default F7 install*/ |
| 1194 | suggest_process_death("/usr/bin/sealer : schedule_timeout (process_timeout)", "-/usr/bin/sealert", lines, min(linehead,20), 20.0, |
| 1195 | _("Disable the SE-Alert software by removing the 'setroubleshoot-server' rpm\n" |
| 1196 | "SE-Alert alerts you about SELinux policy violations, but also\n" |
| 1197 | "has a bug that wakes it up 10 times per second."), 20); |
| 1198 | |
Arjan van der Ven | e0fec35 | 2007-05-27 02:38:53 +0000 | [diff] [blame] | 1199 | |
Arjan van der Ven | 7fe3232 | 2007-05-24 17:52:56 +0000 | [diff] [blame] | 1200 | suggest_bluetooth_off(); |
| 1201 | suggest_nmi_watchdog(); |
| 1202 | suggest_laptop_mode(); |
Arjan van der Ven | abd58ea | 2007-05-28 19:06:10 +0000 | [diff] [blame] | 1203 | if (maxsleep > 15.0) |
| 1204 | suggest_hpet(); |
Arjan van der Ven | aed51c7 | 2007-05-25 16:11:50 +0000 | [diff] [blame] | 1205 | suggest_ac97_powersave(); |
Arjan van der Ven | aec529b | 2007-05-25 19:57:57 +0000 | [diff] [blame] | 1206 | suggest_wireless_powersave(); |
Arjan van der Ven | 2889d76 | 2007-05-26 14:13:41 +0000 | [diff] [blame] | 1207 | suggest_ondemand_governor(); |
Arjan van der Ven | c16dfc7 | 2007-06-08 03:49:35 +0000 | [diff] [blame] | 1208 | suggest_noatime(); |
Arjan van der Ven | f1cc3b9 | 2007-06-08 04:56:33 +0000 | [diff] [blame] | 1209 | suggest_sata_alpm(); |
| 1210 | suggest_powersched(); |
Arjan van der Ven | 4193b60 | 2007-06-12 22:33:45 +0000 | [diff] [blame] | 1211 | suggest_xrandr_TV_off(); |
Arjan van der Ven | c29ff6b | 2007-06-16 17:00:46 +0000 | [diff] [blame] | 1212 | suggest_WOL_off(); |
Arjan van der Ven | 35b5197 | 2007-06-19 01:52:00 +0000 | [diff] [blame] | 1213 | suggest_writeback_time(); |
Arjan van der Ven | 9823a12 | 2007-07-28 03:49:35 +0000 | [diff] [blame] | 1214 | suggest_usb_autosuspend(); |
Arjan van der Ven | e3c7882 | 2008-03-27 04:57:39 +0000 | [diff] [blame] | 1215 | usb_activity_hint(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1216 | #endif |
Arjan van der Ven | 0bddd72 | 2007-08-31 17:24:07 +0000 | [diff] [blame] | 1217 | if (dump) { |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1218 | #ifndef NO_SUGGESTIONS |
Arjan van der Ven | 0bddd72 | 2007-08-31 17:24:07 +0000 | [diff] [blame] | 1219 | print_all_suggestions(); |
Arjan van der Ven | a332b9e | 2008-03-27 03:40:55 +0000 | [diff] [blame] | 1220 | display_usb_activity(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1221 | #endif |
Arjan van der Ven | 0bddd72 | 2007-08-31 17:24:07 +0000 | [diff] [blame] | 1222 | exit(EXIT_SUCCESS); |
| 1223 | } |
| 1224 | |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1225 | #ifndef NO_SUGGESTIONS |
Arjan van der Ven | d1d1338 | 2007-05-26 21:24:16 +0000 | [diff] [blame] | 1226 | if (!key) |
| 1227 | pick_suggestion(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1228 | #endif |
| 1229 | #ifndef NO_NCURSES |
Arjan van der Ven | b43056b | 2007-05-24 20:47:42 +0000 | [diff] [blame] | 1230 | show_title_bar(); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1231 | #endif |
Arjan van der Ven | ef08f1c | 2007-05-16 18:28:57 +0000 | [diff] [blame] | 1232 | fflush(stdout); |
Anurag Singh | c5781f8 | 2011-10-10 10:44:44 -0700 | [diff] [blame] | 1233 | |
Arjan van der Ven | e74d6b7 | 2007-06-23 18:23:55 +0000 | [diff] [blame] | 1234 | if (!key && ticktime >= 4.8) { /* quiet down the effects of any IO to xterms */ |
| 1235 | FD_ZERO(&rfds); |
| 1236 | FD_SET(0, &rfds); |
| 1237 | tv.tv_sec = 3; |
| 1238 | tv.tv_usec = 0; |
| 1239 | key = select(1, &rfds, NULL, NULL, &tv); |
| 1240 | } |
Arjan van der Ven | 12e55ca | 2007-05-12 22:52:54 +0000 | [diff] [blame] | 1241 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1242 | read_data(&cur_usage[0], &cur_duration[0]); |
| 1243 | memcpy(last_usage, cur_usage, sizeof(last_usage)); |
| 1244 | memcpy(last_duration, cur_duration, sizeof(last_duration)); |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 1245 | |
Arjan van der Ven | 41cc994 | 2007-05-24 20:20:19 +0000 | [diff] [blame] | 1246 | |
| 1247 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1248 | } |
Arjan van der Ven | a332b9e | 2008-03-27 03:40:55 +0000 | [diff] [blame] | 1249 | |
Arjan van der Ven | 2861535 | 2007-05-11 20:08:05 +0000 | [diff] [blame] | 1250 | return 0; |
| 1251 | } |