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 /* 41b47b5b34SRafael Vanoni * DTrace scripts for observing interrupts, callouts and cyclic events 42b47b5b34SRafael Vanoni * that cause CPU activity. Such activity prevents the processor from 43b47b5b34SRafael Vanoni * entering lower power states and reducing power consumption. 44b47b5b34SRafael Vanoni * 45b47b5b34SRafael Vanoni * g_dtp_events is the default script 46b47b5b34SRafael Vanoni */ 47b47b5b34SRafael Vanoni const char *g_dtp_events = 48b47b5b34SRafael Vanoni "interrupt-complete" 49b47b5b34SRafael Vanoni "/arg0 != NULL && arg3 !=0/" 50b47b5b34SRafael Vanoni "{" 51b47b5b34SRafael Vanoni " this->devi = (struct dev_info *)arg0;" 52b47b5b34SRafael Vanoni " @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 53b47b5b34SRafael Vanoni " this->devi->devi_instance] = count();" 54b47b5b34SRafael Vanoni "}" 55b47b5b34SRafael Vanoni "" 56b47b5b34SRafael Vanoni "sdt:::callout-start" 57b47b5b34SRafael Vanoni "/(caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 58b47b5b34SRafael Vanoni "{" 59b47b5b34SRafael Vanoni " this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 60b47b5b34SRafael Vanoni " @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 61b47b5b34SRafael Vanoni "}" 62b47b5b34SRafael Vanoni "" 63b47b5b34SRafael Vanoni "sdt:::callout-start" 64b47b5b34SRafael Vanoni "/(caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 65b47b5b34SRafael Vanoni "{" 66b47b5b34SRafael Vanoni " @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 67b47b5b34SRafael Vanoni "}" 68b47b5b34SRafael Vanoni "" 69b47b5b34SRafael Vanoni "sdt:::cyclic-start" 70b47b5b34SRafael Vanoni "/(caddr_t)((cyclic_t *)arg0)->cy_handler == (caddr_t)&`clock/" 71b47b5b34SRafael Vanoni "{" 72b47b5b34SRafael Vanoni " @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 73b47b5b34SRafael Vanoni "}" 74b47b5b34SRafael Vanoni "" 75b47b5b34SRafael Vanoni "fbt::xt_all:entry," 76b47b5b34SRafael Vanoni "fbt::xc_all:entry" 77b47b5b34SRafael Vanoni "{" 78b47b5b34SRafael Vanoni " self->xc_func = arg0;" 79b47b5b34SRafael Vanoni "}" 80b47b5b34SRafael Vanoni "" 81b47b5b34SRafael Vanoni "fbt::xt_one_unchecked:entry," 82b47b5b34SRafael Vanoni "fbt::xt_some:entry," 83b47b5b34SRafael Vanoni "fbt::xc_one:entry," 84b47b5b34SRafael Vanoni "fbt::xc_some:entry" 85b47b5b34SRafael Vanoni "{" 86b47b5b34SRafael Vanoni " self->xc_func = arg1;" 87b47b5b34SRafael Vanoni "}" 88b47b5b34SRafael Vanoni "" 89b47b5b34SRafael Vanoni "sysinfo:::xcalls" 90b47b5b34SRafael Vanoni "/pid != $pid/" 91b47b5b34SRafael Vanoni "{" 92b47b5b34SRafael Vanoni " @events_x[execname, self->xc_func] = sum(arg0);" 93b47b5b34SRafael Vanoni " self->xc_func = 0;" 94b47b5b34SRafael Vanoni "}"; 95b47b5b34SRafael Vanoni 96b47b5b34SRafael Vanoni /* 97b47b5b34SRafael Vanoni * g_dtp_events_v is enabled through the -v option, it includes cyclic events 98b47b5b34SRafael Vanoni * in the report, allowing a complete view of system activity 99b47b5b34SRafael Vanoni */ 100b47b5b34SRafael Vanoni const char *g_dtp_events_v = 101b47b5b34SRafael Vanoni "interrupt-complete" 102b47b5b34SRafael Vanoni "/arg0 != NULL && arg3 !=0/" 103b47b5b34SRafael Vanoni "{" 104b47b5b34SRafael Vanoni " this->devi = (struct dev_info *)arg0;" 105b47b5b34SRafael Vanoni " @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 106b47b5b34SRafael Vanoni " this->devi->devi_instance] = count();" 107b47b5b34SRafael Vanoni "}" 108b47b5b34SRafael Vanoni "" 109b47b5b34SRafael Vanoni "sdt:::callout-start" 110b47b5b34SRafael Vanoni "/(caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 111b47b5b34SRafael Vanoni "{" 112b47b5b34SRafael Vanoni " this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 113b47b5b34SRafael Vanoni " @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 114b47b5b34SRafael Vanoni "}" 115b47b5b34SRafael Vanoni "" 116b47b5b34SRafael Vanoni "sdt:::callout-start" 117b47b5b34SRafael Vanoni "/(caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 118b47b5b34SRafael Vanoni "{" 119b47b5b34SRafael Vanoni " @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 120b47b5b34SRafael Vanoni "}" 121b47b5b34SRafael Vanoni "" 122b47b5b34SRafael Vanoni "sdt:::cyclic-start" 123b47b5b34SRafael Vanoni "/(caddr_t)((cyclic_t *)arg0)->cy_handler != (caddr_t)&`dtrace_state_deadman &&" 124b47b5b34SRafael Vanoni " (caddr_t)((cyclic_t *)arg0)->cy_handler != (caddr_t)&`dtrace_state_clean/" 125b47b5b34SRafael Vanoni "{" 126b47b5b34SRafael Vanoni " @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 127b47b5b34SRafael Vanoni "}" 128b47b5b34SRafael Vanoni "" 129b47b5b34SRafael Vanoni "fbt::xt_all:entry," 130b47b5b34SRafael Vanoni "fbt::xc_all:entry" 131b47b5b34SRafael Vanoni "{" 132b47b5b34SRafael Vanoni " self->xc_func = arg0;" 133b47b5b34SRafael Vanoni "}" 134b47b5b34SRafael Vanoni "" 135b47b5b34SRafael Vanoni "fbt::xt_one_unchecked:entry," 136b47b5b34SRafael Vanoni "fbt::xt_some:entry," 137b47b5b34SRafael Vanoni "fbt::xc_one:entry," 138b47b5b34SRafael Vanoni "fbt::xc_some:entry" 139b47b5b34SRafael Vanoni "{" 140b47b5b34SRafael Vanoni " self->xc_func = arg1;" 141b47b5b34SRafael Vanoni "}" 142b47b5b34SRafael Vanoni "" 143b47b5b34SRafael Vanoni "sysinfo:::xcalls" 144b47b5b34SRafael Vanoni "/pid != $pid/" 145b47b5b34SRafael Vanoni "{" 146b47b5b34SRafael Vanoni " @events_x[execname, self->xc_func] = sum(arg0);" 147b47b5b34SRafael Vanoni " self->xc_func = 0;" 148b47b5b34SRafael Vanoni "}"; 149b47b5b34SRafael Vanoni 150b47b5b34SRafael Vanoni /* 151b47b5b34SRafael Vanoni * This script is selected through the -c option, it takes the CPU id as 152b47b5b34SRafael Vanoni * argument and observes activity generated by that CPU 153b47b5b34SRafael Vanoni */ 154b47b5b34SRafael Vanoni const char *g_dtp_events_c = 155b47b5b34SRafael Vanoni "interrupt-complete" 156b47b5b34SRafael Vanoni "/cpu == $0 &&" 157b47b5b34SRafael Vanoni " arg0 != NULL && arg3 != 0/" 158b47b5b34SRafael Vanoni "{" 159b47b5b34SRafael Vanoni " this->devi = (struct dev_info *)arg0;" 160b47b5b34SRafael Vanoni " @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 161b47b5b34SRafael Vanoni " this->devi->devi_instance] = count();" 162b47b5b34SRafael Vanoni "}" 163b47b5b34SRafael Vanoni "" 164b47b5b34SRafael Vanoni "sdt:::callout-start" 165b47b5b34SRafael Vanoni "/cpu == $0 &&" 166b47b5b34SRafael Vanoni " (caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 167b47b5b34SRafael Vanoni "{" 168b47b5b34SRafael Vanoni " this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 169b47b5b34SRafael Vanoni " @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 170b47b5b34SRafael Vanoni "}" 171b47b5b34SRafael Vanoni "" 172b47b5b34SRafael Vanoni "sdt:::callout-start" 173b47b5b34SRafael Vanoni "/cpu == $0 &&" 174b47b5b34SRafael Vanoni " (caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 175b47b5b34SRafael Vanoni "{" 176b47b5b34SRafael Vanoni " @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 177b47b5b34SRafael Vanoni "}" 178b47b5b34SRafael Vanoni "" 179b47b5b34SRafael Vanoni "sdt:::cyclic-start" 180b47b5b34SRafael Vanoni "/cpu == $0 &&" 181b47b5b34SRafael Vanoni " (caddr_t)((cyclic_t *)arg0)->cy_handler == (caddr_t)&`clock/" 182b47b5b34SRafael Vanoni "{" 183b47b5b34SRafael Vanoni " @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 184b47b5b34SRafael Vanoni "}" 185b47b5b34SRafael Vanoni "" 186b47b5b34SRafael Vanoni /* 187b47b5b34SRafael Vanoni * xcalls to all CPUs. We're only interested in firings from other CPUs since 188b47b5b34SRafael Vanoni * the system doesn't xcall itself 189b47b5b34SRafael Vanoni */ 190b47b5b34SRafael Vanoni "fbt::xt_all:entry," 191b47b5b34SRafael Vanoni "fbt::xc_all:entry" 192b47b5b34SRafael Vanoni "/pid != $pid &&" 193b47b5b34SRafael Vanoni " cpu != $0/" 194b47b5b34SRafael Vanoni "{" 195b47b5b34SRafael Vanoni " self->xc_func = arg0;" 196b47b5b34SRafael Vanoni " self->xc_cpu = cpu;" 197b47b5b34SRafael Vanoni " self->cpu_known = 1;" 198b47b5b34SRafael Vanoni "}" 199b47b5b34SRafael Vanoni "" 200b47b5b34SRafael Vanoni /* 201b47b5b34SRafael Vanoni * xcalls to a subset of CPUs. No way of knowing if the observed CPU is in 202b47b5b34SRafael Vanoni * it, so account it in the generic @events_x aggregation. Again, we don't 203b47b5b34SRafael Vanoni * xcall the current CPU. 204b47b5b34SRafael Vanoni */ 205b47b5b34SRafael Vanoni "fbt::xt_some:entry," 206b47b5b34SRafael Vanoni "fbt::xc_some:entry" 207b47b5b34SRafael Vanoni "/pid != $pid &&" 208b47b5b34SRafael Vanoni " cpu != $0/" 209b47b5b34SRafael Vanoni "{" 210b47b5b34SRafael Vanoni " self->xc_func = arg1;" 211b47b5b34SRafael Vanoni "}" 212b47b5b34SRafael Vanoni "" 213b47b5b34SRafael Vanoni /* 214b47b5b34SRafael Vanoni * xcalls to a specific CPU, with all the necessary information 215b47b5b34SRafael Vanoni */ 216b47b5b34SRafael Vanoni "fbt::xt_one_unchecked:entry," 217b47b5b34SRafael Vanoni "fbt::xc_one:entry" 218b47b5b34SRafael Vanoni "/arg0 == $0/" 219b47b5b34SRafael Vanoni "{" 220b47b5b34SRafael Vanoni " self->xc_func = arg1;" 221b47b5b34SRafael Vanoni " self->xc_cpu = arg0;" 222b47b5b34SRafael Vanoni " self->cpu_known = 1;" 223b47b5b34SRafael Vanoni "}" 224b47b5b34SRafael Vanoni "" 225b47b5b34SRafael Vanoni "sysinfo:::xcalls" 226b47b5b34SRafael Vanoni "/pid != $pid &&" 227b47b5b34SRafael Vanoni " self->xc_func &&" 228b47b5b34SRafael Vanoni " !self->cpu_known/" 229b47b5b34SRafael Vanoni "{" 230b47b5b34SRafael Vanoni " @events_x[execname, self->xc_func] = sum(arg0);" 231b47b5b34SRafael Vanoni " self->xc_func = 0;" 232b47b5b34SRafael Vanoni "}" 233b47b5b34SRafael Vanoni "" 234b47b5b34SRafael Vanoni "sysinfo:::xcalls" 235b47b5b34SRafael Vanoni "/pid != $pid &&" 236b47b5b34SRafael Vanoni " self->xc_func &&" 237b47b5b34SRafael Vanoni " self->cpu_known/" 238b47b5b34SRafael Vanoni "{" 239b47b5b34SRafael Vanoni " @events_xc[execname, self->xc_func, self->xc_cpu] = sum(arg0);" 240b47b5b34SRafael Vanoni " self->xc_func = 0;" 241b47b5b34SRafael Vanoni " self->xc_cpu = 0;" 242b47b5b34SRafael Vanoni " self->cpu_known = 0;" 243b47b5b34SRafael Vanoni "}"; 244b47b5b34SRafael Vanoni 245b47b5b34SRafael Vanoni /* 246b47b5b34SRafael Vanoni * sparcv9 platform specific display messages 247b47b5b34SRafael Vanoni */ 248*9bbf5ba1SRafael Vanoni const char *g_msg_idle_state = "Idle Power States"; 249b47b5b34SRafael Vanoni const char *g_msg_freq_state = "Frequency Levels"; 250*9bbf5ba1SRafael Vanoni const char *g_msg_freq_enable = "P - Enable CPU PM"; 251