xref: /titanic_50/usr/src/cmd/powertop/common/display.c (revision 636423db672c14451a65835f534789270ebd4dc9)
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 <stdlib.h>
41b47b5b34SRafael Vanoni #include <string.h>
42b47b5b34SRafael Vanoni #include <curses.h>
43b47b5b34SRafael Vanoni #include "powertop.h"
44b47b5b34SRafael Vanoni 
45b47b5b34SRafael Vanoni static WINDOW 	*title_bar_window;
46b47b5b34SRafael Vanoni static WINDOW 	*cstate_window;
47b47b5b34SRafael Vanoni static WINDOW 	*wakeup_window;
48b47b5b34SRafael Vanoni static WINDOW 	*acpi_power_window;
49b47b5b34SRafael Vanoni static WINDOW 	*eventstat_window;
50b47b5b34SRafael Vanoni static WINDOW 	*suggestion_window;
51b47b5b34SRafael Vanoni static WINDOW 	*status_bar_window;
52b47b5b34SRafael Vanoni 
53b47b5b34SRafael Vanoni #define	print(win, y, x, fmt, args...)				\
54*636423dbSRafael Vanoni 	if (PT_ON_DUMP)						\
55b47b5b34SRafael Vanoni 		(void) printf(fmt, ## args);			\
56b47b5b34SRafael Vanoni 	else							\
57b47b5b34SRafael Vanoni 		(void) mvwprintw(win, y, x, fmt, ## args);
58b47b5b34SRafael Vanoni 
59*636423dbSRafael Vanoni char 		g_status_bar_slots[PT_BAR_NSLOTS][PT_BAR_LENGTH];
60b47b5b34SRafael Vanoni char 		g_suggestion_key;
61b47b5b34SRafael Vanoni 
62b47b5b34SRafael Vanoni static int	maxx, maxy;
63b47b5b34SRafael Vanoni 
64b47b5b34SRafael Vanoni static void
65b47b5b34SRafael Vanoni zap_windows(void)
66b47b5b34SRafael Vanoni {
67b47b5b34SRafael Vanoni 	if (title_bar_window) {
68b47b5b34SRafael Vanoni 		(void) delwin(title_bar_window);
69b47b5b34SRafael Vanoni 		title_bar_window = NULL;
70b47b5b34SRafael Vanoni 	}
71b47b5b34SRafael Vanoni 	if (cstate_window) {
72b47b5b34SRafael Vanoni 		(void) delwin(cstate_window);
73b47b5b34SRafael Vanoni 		cstate_window = NULL;
74b47b5b34SRafael Vanoni 	}
75b47b5b34SRafael Vanoni 	if (wakeup_window) {
76b47b5b34SRafael Vanoni 		(void) delwin(wakeup_window);
77b47b5b34SRafael Vanoni 		wakeup_window = NULL;
78b47b5b34SRafael Vanoni 	}
79b47b5b34SRafael Vanoni 	if (acpi_power_window) {
80b47b5b34SRafael Vanoni 		(void) delwin(acpi_power_window);
81b47b5b34SRafael Vanoni 		acpi_power_window = NULL;
82b47b5b34SRafael Vanoni 	}
83b47b5b34SRafael Vanoni 	if (eventstat_window) {
84b47b5b34SRafael Vanoni 		(void) delwin(eventstat_window);
85b47b5b34SRafael Vanoni 		eventstat_window = NULL;
86b47b5b34SRafael Vanoni 	}
87b47b5b34SRafael Vanoni 	if (suggestion_window) {
88b47b5b34SRafael Vanoni 		(void) delwin(suggestion_window);
89b47b5b34SRafael Vanoni 		suggestion_window = NULL;
90b47b5b34SRafael Vanoni 	}
91b47b5b34SRafael Vanoni 	if (status_bar_window) {
92b47b5b34SRafael Vanoni 		(void) delwin(status_bar_window);
93b47b5b34SRafael Vanoni 		status_bar_window = NULL;
94b47b5b34SRafael Vanoni 	}
95b47b5b34SRafael Vanoni }
96b47b5b34SRafael Vanoni 
97b47b5b34SRafael Vanoni void
98b47b5b34SRafael Vanoni cleanup_curses(void)
99b47b5b34SRafael Vanoni {
100b47b5b34SRafael Vanoni 	(void) endwin();
101b47b5b34SRafael Vanoni }
102b47b5b34SRafael Vanoni 
103b47b5b34SRafael Vanoni /*
104b47b5b34SRafael Vanoni  * This part was re-written to be human readable and easy to modify. Please
105b47b5b34SRafael Vanoni  * try to keep it that way and help us save some time.
106b47b5b34SRafael Vanoni  *
107b47b5b34SRafael Vanoni  * Friendly reminder:
108b47b5b34SRafael Vanoni  * 	subwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x)
109b47b5b34SRafael Vanoni  */
110b47b5b34SRafael Vanoni void
111b47b5b34SRafael Vanoni setup_windows(void)
112b47b5b34SRafael Vanoni {
113b47b5b34SRafael Vanoni 	/*
114b47b5b34SRafael Vanoni 	 * These variables are used to properly set the initial y position and
115b47b5b34SRafael Vanoni 	 * number of lines in each subwindow, as the number of supported CPU
116b47b5b34SRafael Vanoni 	 * states affects their placement.
117b47b5b34SRafael Vanoni 	 */
118b47b5b34SRafael Vanoni 	int cstate_lines, event_lines, pos_y;
119b47b5b34SRafael Vanoni 
120b47b5b34SRafael Vanoni 	getmaxyx(stdscr, maxy, maxx);
121b47b5b34SRafael Vanoni 
122b47b5b34SRafael Vanoni 	zap_windows();
123b47b5b34SRafael Vanoni 
124b47b5b34SRafael Vanoni 	cstate_lines 	= TITLE_LINE + max((g_max_cstate+1), g_npstates);
125b47b5b34SRafael Vanoni 
126b47b5b34SRafael Vanoni 	pos_y = 0;
127b47b5b34SRafael Vanoni 	title_bar_window = subwin(stdscr, SINGLE_LINE_SW, maxx, pos_y, 0);
128b47b5b34SRafael Vanoni 
129b47b5b34SRafael Vanoni 	pos_y += NEXT_LINE + BLANK_LINE;
130b47b5b34SRafael Vanoni 	cstate_window = subwin(stdscr, cstate_lines, maxx, pos_y, 0);
131b47b5b34SRafael Vanoni 
132b47b5b34SRafael Vanoni 	pos_y += cstate_lines + BLANK_LINE;
133b47b5b34SRafael Vanoni 	wakeup_window = subwin(stdscr, SINGLE_LINE_SW, maxx, pos_y, 0);
134b47b5b34SRafael Vanoni 
135b47b5b34SRafael Vanoni 	pos_y += NEXT_LINE;
136b47b5b34SRafael Vanoni 	acpi_power_window = subwin(stdscr, SINGLE_LINE_SW, maxx, pos_y, 0);
137b47b5b34SRafael Vanoni 
138b47b5b34SRafael Vanoni 	pos_y += NEXT_LINE + BLANK_LINE;
139b47b5b34SRafael Vanoni 	event_lines = maxy - SINGLE_LINE_SW - NEXT_LINE - LENGTH_SUGG_SW -
140b47b5b34SRafael Vanoni 	    pos_y;
141b47b5b34SRafael Vanoni 	eventstat_window = subwin(stdscr, event_lines, maxx, pos_y, 0);
142b47b5b34SRafael Vanoni 
143b47b5b34SRafael Vanoni 	pos_y += event_lines + NEXT_LINE;
144b47b5b34SRafael Vanoni 	suggestion_window = subwin(stdscr, SINGLE_LINE_SW, maxx, pos_y, 0);
145b47b5b34SRafael Vanoni 
146b47b5b34SRafael Vanoni 	pos_y += BLANK_LINE + NEXT_LINE;
147b47b5b34SRafael Vanoni 	status_bar_window = subwin(stdscr, SINGLE_LINE_SW, maxx, pos_y, 0);
148b47b5b34SRafael Vanoni 
149b47b5b34SRafael Vanoni 	(void) strcpy(g_status_bar_slots[0], _(" Q - Quit "));
150b47b5b34SRafael Vanoni 	(void) strcpy(g_status_bar_slots[1], _(" R - Refresh "));
151b47b5b34SRafael Vanoni 
152b47b5b34SRafael Vanoni 	(void) werase(stdscr);
153b47b5b34SRafael Vanoni 	(void) wrefresh(status_bar_window);
154b47b5b34SRafael Vanoni }
155b47b5b34SRafael Vanoni 
156b47b5b34SRafael Vanoni void
157b47b5b34SRafael Vanoni initialize_curses(void)
158b47b5b34SRafael Vanoni {
159b47b5b34SRafael Vanoni 	(void) initscr();
160b47b5b34SRafael Vanoni 	(void) start_color();
161b47b5b34SRafael Vanoni 
162b47b5b34SRafael Vanoni 	/*
163b47b5b34SRafael Vanoni 	 * Enable keyboard mapping
164b47b5b34SRafael Vanoni 	 */
165b47b5b34SRafael Vanoni 	(void) keypad(stdscr, TRUE);
166b47b5b34SRafael Vanoni 
167b47b5b34SRafael Vanoni 	/*
168b47b5b34SRafael Vanoni 	 * Tell curses not to do NL->CR/NL on output
169b47b5b34SRafael Vanoni 	 */
170b47b5b34SRafael Vanoni 	(void) nonl();
171b47b5b34SRafael Vanoni 
172b47b5b34SRafael Vanoni 	/*
173b47b5b34SRafael Vanoni 	 * Take input chars one at a time, no wait for \n
174b47b5b34SRafael Vanoni 	 */
175b47b5b34SRafael Vanoni 	(void) cbreak();
176b47b5b34SRafael Vanoni 
177b47b5b34SRafael Vanoni 	/*
178b47b5b34SRafael Vanoni 	 * Dont echo input
179b47b5b34SRafael Vanoni 	 */
180b47b5b34SRafael Vanoni 	(void) noecho();
181b47b5b34SRafael Vanoni 
182b47b5b34SRafael Vanoni 	/*
183b47b5b34SRafael Vanoni 	 * Turn off cursor
184b47b5b34SRafael Vanoni 	 */
185b47b5b34SRafael Vanoni 	(void) curs_set(0);
186b47b5b34SRafael Vanoni 
187b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_DEFAULT, COLOR_WHITE, COLOR_BLACK);
188b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_HEADER_BAR, COLOR_BLACK, COLOR_WHITE);
189b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_ERROR, COLOR_BLACK, COLOR_RED);
190b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_RED, COLOR_WHITE, COLOR_RED);
191b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_YELLOW, COLOR_WHITE, COLOR_YELLOW);
192b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_GREEN, COLOR_WHITE, COLOR_GREEN);
193b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_BLUE, COLOR_WHITE, COLOR_BLUE);
194b47b5b34SRafael Vanoni 	(void) init_pair(PT_COLOR_BRIGHT, COLOR_WHITE, COLOR_BLACK);
195b47b5b34SRafael Vanoni 
196b47b5b34SRafael Vanoni 	(void) atexit(cleanup_curses);
197b47b5b34SRafael Vanoni }
198b47b5b34SRafael Vanoni 
199b47b5b34SRafael Vanoni void
200b47b5b34SRafael Vanoni show_title_bar(void)
201b47b5b34SRafael Vanoni {
202b47b5b34SRafael Vanoni 	int 	i, x = 0, y = 0;
203b47b5b34SRafael Vanoni 	char	title_pad[10];
204b47b5b34SRafael Vanoni 
205b47b5b34SRafael Vanoni 	(void) wattrset(title_bar_window, COLOR_PAIR(PT_COLOR_HEADER_BAR));
206b47b5b34SRafael Vanoni 	(void) wbkgd(title_bar_window, COLOR_PAIR(PT_COLOR_HEADER_BAR));
207b47b5b34SRafael Vanoni 	(void) werase(title_bar_window);
208b47b5b34SRafael Vanoni 
209b47b5b34SRafael Vanoni 	(void) snprintf(title_pad, 10, "%%%ds",
210b47b5b34SRafael Vanoni 	    (maxx - strlen(TITLE))/2 + strlen(TITLE));
211b47b5b34SRafael Vanoni 	/* LINTED: E_SEC_PRINTF_VAR_FMT */
212b47b5b34SRafael Vanoni 	print(title_bar_window, y, x, title_pad, TITLE);
213b47b5b34SRafael Vanoni 
214b47b5b34SRafael Vanoni 	(void) wrefresh(title_bar_window);
215b47b5b34SRafael Vanoni 	(void) werase(status_bar_window);
216b47b5b34SRafael Vanoni 
217*636423dbSRafael Vanoni 	for (i = 0; i < PT_BAR_NSLOTS; i++) {
218b47b5b34SRafael Vanoni 		if (strlen(g_status_bar_slots[i]) == 0)
219b47b5b34SRafael Vanoni 			continue;
220b47b5b34SRafael Vanoni 		(void) wattron(status_bar_window, A_REVERSE);
221b47b5b34SRafael Vanoni 		print(status_bar_window, y, x, "%s", g_status_bar_slots[i]);
222b47b5b34SRafael Vanoni 		(void) wattroff(status_bar_window, A_REVERSE);
223b47b5b34SRafael Vanoni 		x += strlen(g_status_bar_slots[i]) + 1;
224b47b5b34SRafael Vanoni 	}
225b47b5b34SRafael Vanoni 	(void) wnoutrefresh(status_bar_window);
226b47b5b34SRafael Vanoni }
227b47b5b34SRafael Vanoni 
228b47b5b34SRafael Vanoni void
229b47b5b34SRafael Vanoni show_cstates(void)
230b47b5b34SRafael Vanoni {
231b47b5b34SRafael Vanoni 	char		c[100];
232b47b5b34SRafael Vanoni 	int		i;
233b47b5b34SRafael Vanoni 	double		total_pstates = 0.0, avg, res;
234b47b5b34SRafael Vanoni 	uint64_t	p0_speed, p1_speed;
235b47b5b34SRafael Vanoni 
236*636423dbSRafael Vanoni 	if (!PT_ON_DUMP) {
237b47b5b34SRafael Vanoni 		(void) werase(cstate_window);
238b47b5b34SRafael Vanoni 		(void) wattrset(cstate_window, COLOR_PAIR(PT_COLOR_DEFAULT));
239b47b5b34SRafael Vanoni 		(void) wbkgd(cstate_window, COLOR_PAIR(PT_COLOR_DEFAULT));
240b47b5b34SRafael Vanoni 	}
241b47b5b34SRafael Vanoni 
242*636423dbSRafael Vanoni 	print(cstate_window, 0, 0, "%s\tAvg\tresidency\n", g_msg_idle_state);
243b47b5b34SRafael Vanoni 	res =  (((double)g_cstate_info[0].total_time / g_total_c_time)) * 100;
244b47b5b34SRafael Vanoni 	(void) sprintf(c, "C0 (cpu running)\t\t(%.1f%%)\n", (float)res);
245b47b5b34SRafael Vanoni 	print(cstate_window, 1, 0, "%s", c);
246b47b5b34SRafael Vanoni 
247b47b5b34SRafael Vanoni 	for (i = 1; i <= g_max_cstate; i++) {
248b47b5b34SRafael Vanoni 		/*
249b47b5b34SRafael Vanoni 		 * In situations where the load is too intensive, the system
250b47b5b34SRafael Vanoni 		 * might not transition at all.
251b47b5b34SRafael Vanoni 		 */
252b47b5b34SRafael Vanoni 		if (g_cstate_info[i].events > 0)
253b47b5b34SRafael Vanoni 			avg = (((double)g_cstate_info[i].total_time/
254*636423dbSRafael Vanoni 			    MICROSEC)/g_cstate_info[i].events);
255b47b5b34SRafael Vanoni 		else
256b47b5b34SRafael Vanoni 			avg = 0;
257b47b5b34SRafael Vanoni 
258b47b5b34SRafael Vanoni 		res = ((double)g_cstate_info[i].total_time/g_total_c_time)
259b47b5b34SRafael Vanoni 		    * 100;
260b47b5b34SRafael Vanoni 
261b47b5b34SRafael Vanoni 		(void) sprintf(c, "C%d\t\t\t%.1fms\t(%.1f%%)\n", i, (float)avg,
262b47b5b34SRafael Vanoni 		    (float)res);
263b47b5b34SRafael Vanoni 		print(cstate_window, i + 1, 0, "%s", c);
264b47b5b34SRafael Vanoni 	}
265b47b5b34SRafael Vanoni 
266*636423dbSRafael Vanoni 	print(cstate_window, 0, 48, "%s\n", g_msg_freq_state);
267b47b5b34SRafael Vanoni 
268b47b5b34SRafael Vanoni 	if (g_npstates < 2) {
269b47b5b34SRafael Vanoni 		(void) sprintf(c, "%4lu Mhz\t%.1f%%",
270b47b5b34SRafael Vanoni 		    (long)g_pstate_info[0].speed, 100.0);
271b47b5b34SRafael Vanoni 		print(cstate_window, 1, 48, "%s\n", c);
272b47b5b34SRafael Vanoni 	} else {
273b47b5b34SRafael Vanoni 		for (i = 0; i < g_npstates; i++) {
274b47b5b34SRafael Vanoni 			total_pstates += (double)(g_pstate_info[i].total_time/
275*636423dbSRafael Vanoni 			    g_ncpus_observed/MICROSEC);
276b47b5b34SRafael Vanoni 		}
277b47b5b34SRafael Vanoni 
278b47b5b34SRafael Vanoni 		/*
279b47b5b34SRafael Vanoni 		 * display ACPI_PSTATE from P(n) to P(1)
280b47b5b34SRafael Vanoni 		 */
281b47b5b34SRafael Vanoni 		for (i = 0;  i < g_npstates - 1; i++) {
282b47b5b34SRafael Vanoni 			(void) sprintf(c, "%4lu Mhz\t%.1f%%",
283b47b5b34SRafael Vanoni 			    (long)g_pstate_info[i].speed,
284b47b5b34SRafael Vanoni 			    100 * (g_pstate_info[i].total_time/g_ncpus_observed/
285*636423dbSRafael Vanoni 			    MICROSEC/total_pstates));
286b47b5b34SRafael Vanoni 			print(cstate_window, i+1, 48, "%s\n", c);
287b47b5b34SRafael Vanoni 		}
288b47b5b34SRafael Vanoni 
289b47b5b34SRafael Vanoni 		/*
290b47b5b34SRafael Vanoni 		 * Display ACPI_PSTATE P0 according to if turbo
291b47b5b34SRafael Vanoni 		 * mode is supported
292b47b5b34SRafael Vanoni 		 */
293b47b5b34SRafael Vanoni 		if (g_turbo_supported) {
294b47b5b34SRafael Vanoni 			p1_speed = g_pstate_info[g_npstates - 2].speed;
295b47b5b34SRafael Vanoni 
296b47b5b34SRafael Vanoni 			/*
297b47b5b34SRafael Vanoni 			 * If g_turbo_ratio <= 1.0, it will be ignored.
298b47b5b34SRafael Vanoni 			 * we display P(0) as P(1) + 1.
299b47b5b34SRafael Vanoni 			 */
300b47b5b34SRafael Vanoni 			if (g_turbo_ratio <= 1.0) {
301b47b5b34SRafael Vanoni 				p0_speed = p1_speed + 1;
302b47b5b34SRafael Vanoni 			} else {
303b47b5b34SRafael Vanoni 				/*
304b47b5b34SRafael Vanoni 				 * If g_turbo_ratio > 1.0, that means turbo
305b47b5b34SRafael Vanoni 				 * mode works. So, P(0) = ratio * P(1);
306b47b5b34SRafael Vanoni 				 */
307b47b5b34SRafael Vanoni 				p0_speed = (uint64_t)(p1_speed * g_turbo_ratio);
308b47b5b34SRafael Vanoni 				if (p0_speed < (p1_speed + 1))
309b47b5b34SRafael Vanoni 				p0_speed = p1_speed + 1;
310b47b5b34SRafael Vanoni 			}
311b47b5b34SRafael Vanoni 			/*
312b47b5b34SRafael Vanoni 			 * Reset the ratio for the next round
313b47b5b34SRafael Vanoni 			 */
314b47b5b34SRafael Vanoni 			g_turbo_ratio = 0.0;
315b47b5b34SRafael Vanoni 
316b47b5b34SRafael Vanoni 			/*
317b47b5b34SRafael Vanoni 			 * Setup the string for the display
318b47b5b34SRafael Vanoni 			 */
319b47b5b34SRafael Vanoni 			(void) sprintf(c, "%4lu Mhz(turbo)\t%.1f%%",
320b47b5b34SRafael Vanoni 			    (long)p0_speed,
321b47b5b34SRafael Vanoni 			    100 * (g_pstate_info[i].total_time/
322*636423dbSRafael Vanoni 			    g_ncpus_observed/MICROSEC/total_pstates));
323b47b5b34SRafael Vanoni 		} else {
324b47b5b34SRafael Vanoni 			(void) sprintf(c, "%4lu Mhz\t%.1f%%",
325b47b5b34SRafael Vanoni 			    (long)g_pstate_info[i].speed,
326b47b5b34SRafael Vanoni 			    100 * (g_pstate_info[i].total_time/
327*636423dbSRafael Vanoni 			    g_ncpus_observed/MICROSEC/total_pstates));
328b47b5b34SRafael Vanoni 		}
329b47b5b34SRafael Vanoni 		print(cstate_window, i+1, 48, "%s\n", c);
330b47b5b34SRafael Vanoni 	}
331b47b5b34SRafael Vanoni 
332*636423dbSRafael Vanoni 	if (!PT_ON_DUMP)
333b47b5b34SRafael Vanoni 		(void) wnoutrefresh(cstate_window);
334b47b5b34SRafael Vanoni }
335b47b5b34SRafael Vanoni 
336b47b5b34SRafael Vanoni void
337b47b5b34SRafael Vanoni show_acpi_power_line(uint32_t flag, double rate, double rem_cap, double cap,
338b47b5b34SRafael Vanoni     uint32_t state)
339b47b5b34SRafael Vanoni {
340b47b5b34SRafael Vanoni 	char	buffer[1024];
341b47b5b34SRafael Vanoni 
342b47b5b34SRafael Vanoni 	(void) sprintf(buffer,  _("no ACPI power usage estimate available"));
343b47b5b34SRafael Vanoni 
344*636423dbSRafael Vanoni 	if (!PT_ON_DUMP)
345b47b5b34SRafael Vanoni 		(void) werase(acpi_power_window);
346b47b5b34SRafael Vanoni 	if (flag) {
347b47b5b34SRafael Vanoni 		char *c;
348b47b5b34SRafael Vanoni 		(void) sprintf(buffer, "Power usage (ACPI estimate): %.3fW",
349b47b5b34SRafael Vanoni 		    rate);
350b47b5b34SRafael Vanoni 		(void) strcat(buffer, " ");
351b47b5b34SRafael Vanoni 		c = &buffer[strlen(buffer)];
352b47b5b34SRafael Vanoni 		switch (state) {
353b47b5b34SRafael Vanoni 		case 0:
354b47b5b34SRafael Vanoni 			(void) sprintf(c, "(running on AC power, fully "
355b47b5b34SRafael Vanoni 			    "charged)");
356b47b5b34SRafael Vanoni 			break;
357b47b5b34SRafael Vanoni 		case 1:
358b47b5b34SRafael Vanoni 			(void) sprintf(c, "(discharging: %3.1f hours)",
359b47b5b34SRafael Vanoni 			    (uint32_t)rem_cap/rate);
360b47b5b34SRafael Vanoni 			break;
361b47b5b34SRafael Vanoni 		case 2:
362b47b5b34SRafael Vanoni 			(void) sprintf(c, "(charging: %3.1f hours)",
363b47b5b34SRafael Vanoni 			    (uint32_t)(cap - rem_cap)/rate);
364b47b5b34SRafael Vanoni 			break;
365b47b5b34SRafael Vanoni 		case 4:
366b47b5b34SRafael Vanoni 			(void) sprintf(c, "(##critically low battery power##)");
367b47b5b34SRafael Vanoni 			break;
368b47b5b34SRafael Vanoni 		}
369b47b5b34SRafael Vanoni 
370b47b5b34SRafael Vanoni 	}
371b47b5b34SRafael Vanoni 	print(acpi_power_window, 0, 0, "%s\n", buffer);
372*636423dbSRafael Vanoni 	if (!PT_ON_DUMP)
373b47b5b34SRafael Vanoni 		(void) wnoutrefresh(acpi_power_window);
374b47b5b34SRafael Vanoni }
375b47b5b34SRafael Vanoni 
376b47b5b34SRafael Vanoni void
377b47b5b34SRafael Vanoni show_wakeups(double interval)
378b47b5b34SRafael Vanoni {
379b47b5b34SRafael Vanoni 	char		c[100];
380b47b5b34SRafael Vanoni 	int		i, event_sum = 0;
381*636423dbSRafael Vanoni 	event_info_t	*event = g_event_info;
382b47b5b34SRafael Vanoni 
383*636423dbSRafael Vanoni 	if (!PT_ON_DUMP) {
384b47b5b34SRafael Vanoni 		(void) werase(wakeup_window);
385b47b5b34SRafael Vanoni 		(void) wbkgd(wakeup_window, COLOR_PAIR(PT_COLOR_RED));
386b47b5b34SRafael Vanoni 		(void) wattron(wakeup_window, A_BOLD);
387b47b5b34SRafael Vanoni 	}
388b47b5b34SRafael Vanoni 
389b47b5b34SRafael Vanoni 	/*
390b47b5b34SRafael Vanoni 	 * calculate the actual total event number
391b47b5b34SRafael Vanoni 	 */
392*636423dbSRafael Vanoni 	for (i = 0; i < g_top_events; i++, event++)
393*636423dbSRafael Vanoni 		event_sum += event->total_count;
394b47b5b34SRafael Vanoni 
395b47b5b34SRafael Vanoni 	/*
396b47b5b34SRafael Vanoni 	 * g_total_events is the sum of the number of Cx->C0 transition,
397b47b5b34SRafael Vanoni 	 * So when the system is very busy, the idle thread will have no
398b47b5b34SRafael Vanoni 	 * chance or very seldom to be scheduled, this could cause >100%
399b47b5b34SRafael Vanoni 	 * event report. Re-assign g_total_events to the actual event
400b47b5b34SRafael Vanoni 	 * number is a way to avoid this issue.
401b47b5b34SRafael Vanoni 	 */
402b47b5b34SRafael Vanoni 	if (event_sum > g_total_events)
403b47b5b34SRafael Vanoni 		g_total_events = event_sum;
404b47b5b34SRafael Vanoni 
405b47b5b34SRafael Vanoni 	(void) sprintf(c, "Wakeups-from-idle per second: %4.1f\tinterval: "
406b47b5b34SRafael Vanoni 	    "%.1fs", (double)(g_total_events/interval), interval);
407b47b5b34SRafael Vanoni 	print(wakeup_window, 0, 0, "%s\n", c);
408b47b5b34SRafael Vanoni 
409*636423dbSRafael Vanoni 	if (!PT_ON_DUMP)
410b47b5b34SRafael Vanoni 		(void) wnoutrefresh(wakeup_window);
411b47b5b34SRafael Vanoni }
412b47b5b34SRafael Vanoni 
413b47b5b34SRafael Vanoni void
414b47b5b34SRafael Vanoni show_eventstats(double interval)
415b47b5b34SRafael Vanoni {
416b47b5b34SRafael Vanoni 	char		c[100];
417b47b5b34SRafael Vanoni 	int		i;
418b47b5b34SRafael Vanoni 	double		events;
419*636423dbSRafael Vanoni 	event_info_t	*event = g_event_info;
420b47b5b34SRafael Vanoni 
421*636423dbSRafael Vanoni 	if (!PT_ON_DUMP) {
422b47b5b34SRafael Vanoni 		(void) werase(eventstat_window);
423b47b5b34SRafael Vanoni 		(void) wattrset(eventstat_window, COLOR_PAIR(PT_COLOR_DEFAULT));
424b47b5b34SRafael Vanoni 		(void) wbkgd(eventstat_window, COLOR_PAIR(PT_COLOR_DEFAULT));
425b47b5b34SRafael Vanoni 	}
426b47b5b34SRafael Vanoni 
427b47b5b34SRafael Vanoni 	/*
428b47b5b34SRafael Vanoni 	 * Sort the event report list
429b47b5b34SRafael Vanoni 	 */
430*636423dbSRafael Vanoni 	if (g_top_events > EVENT_NUM_MAX)
431*636423dbSRafael Vanoni 		g_top_events = EVENT_NUM_MAX;
432b47b5b34SRafael Vanoni 
433*636423dbSRafael Vanoni 	qsort((void *)g_event_info, g_top_events, sizeof (event_info_t),
434b47b5b34SRafael Vanoni 	    event_compare);
435b47b5b34SRafael Vanoni 
436*636423dbSRafael Vanoni 	if (PT_ON_CPU)
437b47b5b34SRafael Vanoni 		(void) sprintf(c, "Top causes for wakeups on CPU %d:\n",
438b47b5b34SRafael Vanoni 		    g_observed_cpu);
439b47b5b34SRafael Vanoni 	else
440b47b5b34SRafael Vanoni 		(void) sprintf(c, "Top causes for wakeups:\n");
441b47b5b34SRafael Vanoni 
442b47b5b34SRafael Vanoni 	print(eventstat_window, 0, 0, "%s", c);
443b47b5b34SRafael Vanoni 
444*636423dbSRafael Vanoni 	for (i = 0; i < g_top_events; i++, event++) {
445b47b5b34SRafael Vanoni 
446*636423dbSRafael Vanoni 		if (g_total_events > 0 && event->total_count > 0)
447*636423dbSRafael Vanoni 			events = (double)event->total_count/
448b47b5b34SRafael Vanoni 			    (double)g_total_events;
449b47b5b34SRafael Vanoni 		else
450b47b5b34SRafael Vanoni 			continue;
451b47b5b34SRafael Vanoni 
452b47b5b34SRafael Vanoni 		(void) sprintf(c, "%4.1f%% (%5.1f)", 100 * events,
453*636423dbSRafael Vanoni 		    (double)event->total_count/interval);
454b47b5b34SRafael Vanoni 		print(eventstat_window, i+1, 0, "%s", c);
455b47b5b34SRafael Vanoni 		print(eventstat_window, i+1, 16, "%20s :",
456*636423dbSRafael Vanoni 		    event->offender_name);
457b47b5b34SRafael Vanoni 		print(eventstat_window, i+1, 40, "%-64s\n",
458*636423dbSRafael Vanoni 		    event->offense_name);
459b47b5b34SRafael Vanoni 	}
460b47b5b34SRafael Vanoni 
461*636423dbSRafael Vanoni 	if (!PT_ON_DUMP)
462b47b5b34SRafael Vanoni 		(void) wnoutrefresh(eventstat_window);
463b47b5b34SRafael Vanoni }
464b47b5b34SRafael Vanoni 
465b47b5b34SRafael Vanoni void
466b47b5b34SRafael Vanoni show_suggestion(char *sug)
467b47b5b34SRafael Vanoni {
468b47b5b34SRafael Vanoni 	(void) werase(suggestion_window);
469b47b5b34SRafael Vanoni 	print(suggestion_window, 0, 0, "%s", sug);
470b47b5b34SRafael Vanoni 	(void) wnoutrefresh(suggestion_window);
471b47b5b34SRafael Vanoni }
472b47b5b34SRafael Vanoni 
473b47b5b34SRafael Vanoni void
474b47b5b34SRafael Vanoni update_windows(void)
475b47b5b34SRafael Vanoni {
476b47b5b34SRafael Vanoni 	(void) doupdate();
477b47b5b34SRafael Vanoni }
478