1 #undef TRACE_SYSTEM 2 #define TRACE_SYSTEM power 3 4 #if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ) 5 #define _TRACE_POWER_H 6 7 #include <linux/ktime.h> 8 #include <linux/pm_qos.h> 9 #include <linux/tracepoint.h> 10 #include <linux/trace_events.h> 11 12 #define TPS(x) tracepoint_string(x) 13 14 DECLARE_EVENT_CLASS(cpu, 15 16 TP_PROTO(unsigned int state, unsigned int cpu_id), 17 18 TP_ARGS(state, cpu_id), 19 20 TP_STRUCT__entry( 21 __field( u32, state ) 22 __field( u32, cpu_id ) 23 ), 24 25 TP_fast_assign( 26 __entry->state = state; 27 __entry->cpu_id = cpu_id; 28 ), 29 30 TP_printk("state=%lu cpu_id=%lu", (unsigned long)__entry->state, 31 (unsigned long)__entry->cpu_id) 32 ); 33 34 DEFINE_EVENT(cpu, cpu_idle, 35 36 TP_PROTO(unsigned int state, unsigned int cpu_id), 37 38 TP_ARGS(state, cpu_id) 39 ); 40 41 TRACE_EVENT(powernv_throttle, 42 43 TP_PROTO(int chip_id, const char *reason, int pmax), 44 45 TP_ARGS(chip_id, reason, pmax), 46 47 TP_STRUCT__entry( 48 __field(int, chip_id) 49 __string(reason, reason) 50 __field(int, pmax) 51 ), 52 53 TP_fast_assign( 54 __entry->chip_id = chip_id; 55 __assign_str(reason, reason); 56 __entry->pmax = pmax; 57 ), 58 59 TP_printk("Chip %d Pmax %d %s", __entry->chip_id, 60 __entry->pmax, __get_str(reason)) 61 ); 62 63 TRACE_EVENT(pstate_sample, 64 65 TP_PROTO(u32 core_busy, 66 u32 scaled_busy, 67 u32 from, 68 u32 to, 69 u64 mperf, 70 u64 aperf, 71 u64 tsc, 72 u32 freq, 73 u32 io_boost 74 ), 75 76 TP_ARGS(core_busy, 77 scaled_busy, 78 from, 79 to, 80 mperf, 81 aperf, 82 tsc, 83 freq, 84 io_boost 85 ), 86 87 TP_STRUCT__entry( 88 __field(u32, core_busy) 89 __field(u32, scaled_busy) 90 __field(u32, from) 91 __field(u32, to) 92 __field(u64, mperf) 93 __field(u64, aperf) 94 __field(u64, tsc) 95 __field(u32, freq) 96 __field(u32, io_boost) 97 ), 98 99 TP_fast_assign( 100 __entry->core_busy = core_busy; 101 __entry->scaled_busy = scaled_busy; 102 __entry->from = from; 103 __entry->to = to; 104 __entry->mperf = mperf; 105 __entry->aperf = aperf; 106 __entry->tsc = tsc; 107 __entry->freq = freq; 108 __entry->io_boost = io_boost; 109 ), 110 111 TP_printk("core_busy=%lu scaled=%lu from=%lu to=%lu mperf=%llu aperf=%llu tsc=%llu freq=%lu io_boost=%lu", 112 (unsigned long)__entry->core_busy, 113 (unsigned long)__entry->scaled_busy, 114 (unsigned long)__entry->from, 115 (unsigned long)__entry->to, 116 (unsigned long long)__entry->mperf, 117 (unsigned long long)__entry->aperf, 118 (unsigned long long)__entry->tsc, 119 (unsigned long)__entry->freq, 120 (unsigned long)__entry->io_boost 121 ) 122 123 ); 124 125 /* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */ 126 #ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING 127 #define _PWR_EVENT_AVOID_DOUBLE_DEFINING 128 129 #define PWR_EVENT_EXIT -1 130 #endif 131 132 #define pm_verb_symbolic(event) \ 133 __print_symbolic(event, \ 134 { PM_EVENT_SUSPEND, "suspend" }, \ 135 { PM_EVENT_RESUME, "resume" }, \ 136 { PM_EVENT_FREEZE, "freeze" }, \ 137 { PM_EVENT_QUIESCE, "quiesce" }, \ 138 { PM_EVENT_HIBERNATE, "hibernate" }, \ 139 { PM_EVENT_THAW, "thaw" }, \ 140 { PM_EVENT_RESTORE, "restore" }, \ 141 { PM_EVENT_RECOVER, "recover" }) 142 143 DEFINE_EVENT(cpu, cpu_frequency, 144 145 TP_PROTO(unsigned int frequency, unsigned int cpu_id), 146 147 TP_ARGS(frequency, cpu_id) 148 ); 149 150 TRACE_EVENT(device_pm_callback_start, 151 152 TP_PROTO(struct device *dev, const char *pm_ops, int event), 153 154 TP_ARGS(dev, pm_ops, event), 155 156 TP_STRUCT__entry( 157 __string(device, dev_name(dev)) 158 __string(driver, dev_driver_string(dev)) 159 __string(parent, dev->parent ? dev_name(dev->parent) : "none") 160 __string(pm_ops, pm_ops ? pm_ops : "none ") 161 __field(int, event) 162 ), 163 164 TP_fast_assign( 165 __assign_str(device, dev_name(dev)); 166 __assign_str(driver, dev_driver_string(dev)); 167 __assign_str(parent, 168 dev->parent ? dev_name(dev->parent) : "none"); 169 __assign_str(pm_ops, pm_ops ? pm_ops : "none "); 170 __entry->event = event; 171 ), 172 173 TP_printk("%s %s, parent: %s, %s[%s]", __get_str(driver), 174 __get_str(device), __get_str(parent), __get_str(pm_ops), 175 pm_verb_symbolic(__entry->event)) 176 ); 177 178 TRACE_EVENT(device_pm_callback_end, 179 180 TP_PROTO(struct device *dev, int error), 181 182 TP_ARGS(dev, error), 183 184 TP_STRUCT__entry( 185 __string(device, dev_name(dev)) 186 __string(driver, dev_driver_string(dev)) 187 __field(int, error) 188 ), 189 190 TP_fast_assign( 191 __assign_str(device, dev_name(dev)); 192 __assign_str(driver, dev_driver_string(dev)); 193 __entry->error = error; 194 ), 195 196 TP_printk("%s %s, err=%d", 197 __get_str(driver), __get_str(device), __entry->error) 198 ); 199 200 TRACE_EVENT(suspend_resume, 201 202 TP_PROTO(const char *action, int val, bool start), 203 204 TP_ARGS(action, val, start), 205 206 TP_STRUCT__entry( 207 __field(const char *, action) 208 __field(int, val) 209 __field(bool, start) 210 ), 211 212 TP_fast_assign( 213 __entry->action = action; 214 __entry->val = val; 215 __entry->start = start; 216 ), 217 218 TP_printk("%s[%u] %s", __entry->action, (unsigned int)__entry->val, 219 (__entry->start)?"begin":"end") 220 ); 221 222 DECLARE_EVENT_CLASS(wakeup_source, 223 224 TP_PROTO(const char *name, unsigned int state), 225 226 TP_ARGS(name, state), 227 228 TP_STRUCT__entry( 229 __string( name, name ) 230 __field( u64, state ) 231 ), 232 233 TP_fast_assign( 234 __assign_str(name, name); 235 __entry->state = state; 236 ), 237 238 TP_printk("%s state=0x%lx", __get_str(name), 239 (unsigned long)__entry->state) 240 ); 241 242 DEFINE_EVENT(wakeup_source, wakeup_source_activate, 243 244 TP_PROTO(const char *name, unsigned int state), 245 246 TP_ARGS(name, state) 247 ); 248 249 DEFINE_EVENT(wakeup_source, wakeup_source_deactivate, 250 251 TP_PROTO(const char *name, unsigned int state), 252 253 TP_ARGS(name, state) 254 ); 255 256 /* 257 * The clock events are used for clock enable/disable and for 258 * clock rate change 259 */ 260 DECLARE_EVENT_CLASS(clock, 261 262 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 263 264 TP_ARGS(name, state, cpu_id), 265 266 TP_STRUCT__entry( 267 __string( name, name ) 268 __field( u64, state ) 269 __field( u64, cpu_id ) 270 ), 271 272 TP_fast_assign( 273 __assign_str(name, name); 274 __entry->state = state; 275 __entry->cpu_id = cpu_id; 276 ), 277 278 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), 279 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) 280 ); 281 282 DEFINE_EVENT(clock, clock_enable, 283 284 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 285 286 TP_ARGS(name, state, cpu_id) 287 ); 288 289 DEFINE_EVENT(clock, clock_disable, 290 291 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 292 293 TP_ARGS(name, state, cpu_id) 294 ); 295 296 DEFINE_EVENT(clock, clock_set_rate, 297 298 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 299 300 TP_ARGS(name, state, cpu_id) 301 ); 302 303 /* 304 * The power domain events are used for power domains transitions 305 */ 306 DECLARE_EVENT_CLASS(power_domain, 307 308 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 309 310 TP_ARGS(name, state, cpu_id), 311 312 TP_STRUCT__entry( 313 __string( name, name ) 314 __field( u64, state ) 315 __field( u64, cpu_id ) 316 ), 317 318 TP_fast_assign( 319 __assign_str(name, name); 320 __entry->state = state; 321 __entry->cpu_id = cpu_id; 322 ), 323 324 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), 325 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) 326 ); 327 328 DEFINE_EVENT(power_domain, power_domain_target, 329 330 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), 331 332 TP_ARGS(name, state, cpu_id) 333 ); 334 335 /* 336 * The pm qos events are used for pm qos update 337 */ 338 DECLARE_EVENT_CLASS(pm_qos_request, 339 340 TP_PROTO(int pm_qos_class, s32 value), 341 342 TP_ARGS(pm_qos_class, value), 343 344 TP_STRUCT__entry( 345 __field( int, pm_qos_class ) 346 __field( s32, value ) 347 ), 348 349 TP_fast_assign( 350 __entry->pm_qos_class = pm_qos_class; 351 __entry->value = value; 352 ), 353 354 TP_printk("pm_qos_class=%s value=%d", 355 __print_symbolic(__entry->pm_qos_class, 356 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, 357 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, 358 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), 359 __entry->value) 360 ); 361 362 DEFINE_EVENT(pm_qos_request, pm_qos_add_request, 363 364 TP_PROTO(int pm_qos_class, s32 value), 365 366 TP_ARGS(pm_qos_class, value) 367 ); 368 369 DEFINE_EVENT(pm_qos_request, pm_qos_update_request, 370 371 TP_PROTO(int pm_qos_class, s32 value), 372 373 TP_ARGS(pm_qos_class, value) 374 ); 375 376 DEFINE_EVENT(pm_qos_request, pm_qos_remove_request, 377 378 TP_PROTO(int pm_qos_class, s32 value), 379 380 TP_ARGS(pm_qos_class, value) 381 ); 382 383 TRACE_EVENT(pm_qos_update_request_timeout, 384 385 TP_PROTO(int pm_qos_class, s32 value, unsigned long timeout_us), 386 387 TP_ARGS(pm_qos_class, value, timeout_us), 388 389 TP_STRUCT__entry( 390 __field( int, pm_qos_class ) 391 __field( s32, value ) 392 __field( unsigned long, timeout_us ) 393 ), 394 395 TP_fast_assign( 396 __entry->pm_qos_class = pm_qos_class; 397 __entry->value = value; 398 __entry->timeout_us = timeout_us; 399 ), 400 401 TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld", 402 __print_symbolic(__entry->pm_qos_class, 403 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, 404 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, 405 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), 406 __entry->value, __entry->timeout_us) 407 ); 408 409 DECLARE_EVENT_CLASS(pm_qos_update, 410 411 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), 412 413 TP_ARGS(action, prev_value, curr_value), 414 415 TP_STRUCT__entry( 416 __field( enum pm_qos_req_action, action ) 417 __field( int, prev_value ) 418 __field( int, curr_value ) 419 ), 420 421 TP_fast_assign( 422 __entry->action = action; 423 __entry->prev_value = prev_value; 424 __entry->curr_value = curr_value; 425 ), 426 427 TP_printk("action=%s prev_value=%d curr_value=%d", 428 __print_symbolic(__entry->action, 429 { PM_QOS_ADD_REQ, "ADD_REQ" }, 430 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" }, 431 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), 432 __entry->prev_value, __entry->curr_value) 433 ); 434 435 DEFINE_EVENT(pm_qos_update, pm_qos_update_target, 436 437 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), 438 439 TP_ARGS(action, prev_value, curr_value) 440 ); 441 442 DEFINE_EVENT_PRINT(pm_qos_update, pm_qos_update_flags, 443 444 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), 445 446 TP_ARGS(action, prev_value, curr_value), 447 448 TP_printk("action=%s prev_value=0x%x curr_value=0x%x", 449 __print_symbolic(__entry->action, 450 { PM_QOS_ADD_REQ, "ADD_REQ" }, 451 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" }, 452 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), 453 __entry->prev_value, __entry->curr_value) 454 ); 455 456 DECLARE_EVENT_CLASS(dev_pm_qos_request, 457 458 TP_PROTO(const char *name, enum dev_pm_qos_req_type type, 459 s32 new_value), 460 461 TP_ARGS(name, type, new_value), 462 463 TP_STRUCT__entry( 464 __string( name, name ) 465 __field( enum dev_pm_qos_req_type, type ) 466 __field( s32, new_value ) 467 ), 468 469 TP_fast_assign( 470 __assign_str(name, name); 471 __entry->type = type; 472 __entry->new_value = new_value; 473 ), 474 475 TP_printk("device=%s type=%s new_value=%d", 476 __get_str(name), 477 __print_symbolic(__entry->type, 478 { DEV_PM_QOS_RESUME_LATENCY, "DEV_PM_QOS_RESUME_LATENCY" }, 479 { DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }), 480 __entry->new_value) 481 ); 482 483 DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_add_request, 484 485 TP_PROTO(const char *name, enum dev_pm_qos_req_type type, 486 s32 new_value), 487 488 TP_ARGS(name, type, new_value) 489 ); 490 491 DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_update_request, 492 493 TP_PROTO(const char *name, enum dev_pm_qos_req_type type, 494 s32 new_value), 495 496 TP_ARGS(name, type, new_value) 497 ); 498 499 DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request, 500 501 TP_PROTO(const char *name, enum dev_pm_qos_req_type type, 502 s32 new_value), 503 504 TP_ARGS(name, type, new_value) 505 ); 506 #endif /* _TRACE_POWER_H */ 507 508 /* This part must be outside protection */ 509 #include <trace/define_trace.h> 510