blob: 070be71b1aacdc89f581fb4a31dd539cea3e1a06 [file] [log] [blame]
Arjan van de Ven61613522009-09-17 16:11:28 +02001#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>
Sahara247e9ee2013-06-21 11:12:28 +09008#include <linux/pm_qos.h>
Arjan van de Ven61613522009-09-17 16:11:28 +02009#include <linux/tracepoint.h>
Steven Rostedt (Red Hat)af658dc2015-04-29 14:36:05 -040010#include <linux/trace_events.h>
Todd E Brandtbb3632c2014-06-06 05:40:17 -070011
12#define TPS(x) tracepoint_string(x)
Arjan van de Ven61613522009-09-17 16:11:28 +020013
Thomas Renninger25e41932011-01-03 17:50:44 +010014DECLARE_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
34DEFINE_EVENT(cpu, cpu_idle,
35
36 TP_PROTO(unsigned int state, unsigned int cpu_id),
37
38 TP_ARGS(state, cpu_id)
39);
40
Shilpasri G Bhat0306e482016-02-03 01:11:40 +053041TRACE_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
Dirk Brandewieb69880f2014-01-16 10:32:25 -080063TRACE_EVENT(pstate_sample,
64
65 TP_PROTO(u32 core_busy,
66 u32 scaled_busy,
Doug Smythies4055fad2015-04-11 21:10:26 -070067 u32 from,
68 u32 to,
Dirk Brandewieb69880f2014-01-16 10:32:25 -080069 u64 mperf,
70 u64 aperf,
Doug Smythies4055fad2015-04-11 21:10:26 -070071 u64 tsc,
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -070072 u32 freq,
73 u32 io_boost
Dirk Brandewieb69880f2014-01-16 10:32:25 -080074 ),
75
76 TP_ARGS(core_busy,
77 scaled_busy,
Doug Smythies4055fad2015-04-11 21:10:26 -070078 from,
79 to,
Dirk Brandewieb69880f2014-01-16 10:32:25 -080080 mperf,
81 aperf,
Doug Smythies4055fad2015-04-11 21:10:26 -070082 tsc,
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -070083 freq,
84 io_boost
Dirk Brandewieb69880f2014-01-16 10:32:25 -080085 ),
86
87 TP_STRUCT__entry(
88 __field(u32, core_busy)
89 __field(u32, scaled_busy)
Doug Smythies4055fad2015-04-11 21:10:26 -070090 __field(u32, from)
91 __field(u32, to)
Dirk Brandewieb69880f2014-01-16 10:32:25 -080092 __field(u64, mperf)
93 __field(u64, aperf)
Doug Smythies4055fad2015-04-11 21:10:26 -070094 __field(u64, tsc)
Dirk Brandewieb69880f2014-01-16 10:32:25 -080095 __field(u32, freq)
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -070096 __field(u32, io_boost)
Doug Smythies4055fad2015-04-11 21:10:26 -070097 ),
Dirk Brandewieb69880f2014-01-16 10:32:25 -080098
99 TP_fast_assign(
100 __entry->core_busy = core_busy;
101 __entry->scaled_busy = scaled_busy;
Doug Smythies4055fad2015-04-11 21:10:26 -0700102 __entry->from = from;
103 __entry->to = to;
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800104 __entry->mperf = mperf;
105 __entry->aperf = aperf;
Doug Smythies4055fad2015-04-11 21:10:26 -0700106 __entry->tsc = tsc;
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800107 __entry->freq = freq;
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -0700108 __entry->io_boost = io_boost;
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800109 ),
110
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -0700111 TP_printk("core_busy=%lu scaled=%lu from=%lu to=%lu mperf=%llu aperf=%llu tsc=%llu freq=%lu io_boost=%lu",
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800112 (unsigned long)__entry->core_busy,
113 (unsigned long)__entry->scaled_busy,
Doug Smythies4055fad2015-04-11 21:10:26 -0700114 (unsigned long)__entry->from,
115 (unsigned long)__entry->to,
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800116 (unsigned long long)__entry->mperf,
117 (unsigned long long)__entry->aperf,
Doug Smythies4055fad2015-04-11 21:10:26 -0700118 (unsigned long long)__entry->tsc,
Srinivas Pandruvada3ba7bca2016-09-13 17:41:33 -0700119 (unsigned long)__entry->freq,
120 (unsigned long)__entry->io_boost
Dirk Brandewieb69880f2014-01-16 10:32:25 -0800121 )
122
123);
124
Thomas Renninger25e41932011-01-03 17:50:44 +0100125/* 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
Arjan van de Ven61613522009-09-17 16:11:28 +0200130#endif
131
Todd E Brandte8bca472014-06-10 07:31:22 -0700132#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
Thomas Renninger25e41932011-01-03 17:50:44 +0100143DEFINE_EVENT(cpu, cpu_frequency,
144
145 TP_PROTO(unsigned int frequency, unsigned int cpu_id),
146
147 TP_ARGS(frequency, cpu_id)
148);
149
Ruchi Kandoi83707ea2015-11-19 16:07:19 -0800150TRACE_EVENT(cpu_frequency_limits,
151
152 TP_PROTO(unsigned int max_freq, unsigned int min_freq,
153 unsigned int cpu_id),
154
155 TP_ARGS(max_freq, min_freq, cpu_id),
156
157 TP_STRUCT__entry(
158 __field( u32, min_freq )
159 __field( u32, max_freq )
160 __field( u32, cpu_id )
161 ),
162
163 TP_fast_assign(
164 __entry->min_freq = min_freq;
Thierry Strudeld3354592016-03-23 10:02:15 -0700165 __entry->max_freq = max_freq;
Ruchi Kandoi83707ea2015-11-19 16:07:19 -0800166 __entry->cpu_id = cpu_id;
167 ),
168
169 TP_printk("min=%lu max=%lu cpu_id=%lu",
170 (unsigned long)__entry->min_freq,
171 (unsigned long)__entry->max_freq,
172 (unsigned long)__entry->cpu_id)
173);
174
Todd E Brandte8bca472014-06-10 07:31:22 -0700175TRACE_EVENT(device_pm_callback_start,
Shuah Khan53644672013-07-26 13:30:20 -0600176
Todd E Brandte8bca472014-06-10 07:31:22 -0700177 TP_PROTO(struct device *dev, const char *pm_ops, int event),
Shuah Khan53644672013-07-26 13:30:20 -0600178
Todd E Brandte8bca472014-06-10 07:31:22 -0700179 TP_ARGS(dev, pm_ops, event),
Shuah Khan53644672013-07-26 13:30:20 -0600180
181 TP_STRUCT__entry(
182 __string(device, dev_name(dev))
183 __string(driver, dev_driver_string(dev))
184 __string(parent, dev->parent ? dev_name(dev->parent) : "none")
185 __string(pm_ops, pm_ops ? pm_ops : "none ")
Todd E Brandte8bca472014-06-10 07:31:22 -0700186 __field(int, event)
187 ),
188
189 TP_fast_assign(
190 __assign_str(device, dev_name(dev));
191 __assign_str(driver, dev_driver_string(dev));
192 __assign_str(parent,
193 dev->parent ? dev_name(dev->parent) : "none");
194 __assign_str(pm_ops, pm_ops ? pm_ops : "none ");
195 __entry->event = event;
196 ),
197
198 TP_printk("%s %s, parent: %s, %s[%s]", __get_str(driver),
199 __get_str(device), __get_str(parent), __get_str(pm_ops),
200 pm_verb_symbolic(__entry->event))
201);
202
203TRACE_EVENT(device_pm_callback_end,
204
205 TP_PROTO(struct device *dev, int error),
206
207 TP_ARGS(dev, error),
208
209 TP_STRUCT__entry(
210 __string(device, dev_name(dev))
211 __string(driver, dev_driver_string(dev))
Shuah Khan53644672013-07-26 13:30:20 -0600212 __field(int, error)
213 ),
214
215 TP_fast_assign(
Shuah Khan53644672013-07-26 13:30:20 -0600216 __assign_str(device, dev_name(dev));
217 __assign_str(driver, dev_driver_string(dev));
Shuah Khan53644672013-07-26 13:30:20 -0600218 __entry->error = error;
219 ),
220
Todd E Brandte8bca472014-06-10 07:31:22 -0700221 TP_printk("%s %s, err=%d",
222 __get_str(driver), __get_str(device), __entry->error)
Shuah Khan53644672013-07-26 13:30:20 -0600223);
224
Todd E Brandtbb3632c2014-06-06 05:40:17 -0700225TRACE_EVENT(suspend_resume,
226
227 TP_PROTO(const char *action, int val, bool start),
228
229 TP_ARGS(action, val, start),
230
231 TP_STRUCT__entry(
232 __field(const char *, action)
233 __field(int, val)
234 __field(bool, start)
235 ),
236
237 TP_fast_assign(
238 __entry->action = action;
239 __entry->val = val;
240 __entry->start = start;
241 ),
242
243 TP_printk("%s[%u] %s", __entry->action, (unsigned int)__entry->val,
244 (__entry->start)?"begin":"end")
245);
246
Arve Hjønnevåg6791e362012-04-29 22:53:02 +0200247DECLARE_EVENT_CLASS(wakeup_source,
248
249 TP_PROTO(const char *name, unsigned int state),
250
251 TP_ARGS(name, state),
252
253 TP_STRUCT__entry(
254 __string( name, name )
255 __field( u64, state )
256 ),
257
258 TP_fast_assign(
259 __assign_str(name, name);
260 __entry->state = state;
261 ),
262
263 TP_printk("%s state=0x%lx", __get_str(name),
264 (unsigned long)__entry->state)
265);
266
267DEFINE_EVENT(wakeup_source, wakeup_source_activate,
268
269 TP_PROTO(const char *name, unsigned int state),
270
271 TP_ARGS(name, state)
272);
273
274DEFINE_EVENT(wakeup_source, wakeup_source_deactivate,
275
276 TP_PROTO(const char *name, unsigned int state),
277
278 TP_ARGS(name, state)
279);
280
Jean Pihet74704ac2010-09-07 09:21:32 +0200281/*
282 * The clock events are used for clock enable/disable and for
283 * clock rate change
284 */
285DECLARE_EVENT_CLASS(clock,
286
287 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
288
289 TP_ARGS(name, state, cpu_id),
290
291 TP_STRUCT__entry(
292 __string( name, name )
293 __field( u64, state )
294 __field( u64, cpu_id )
295 ),
296
297 TP_fast_assign(
298 __assign_str(name, name);
299 __entry->state = state;
300 __entry->cpu_id = cpu_id;
301 ),
302
303 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
304 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
305);
306
307DEFINE_EVENT(clock, clock_enable,
308
309 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
310
311 TP_ARGS(name, state, cpu_id)
312);
313
314DEFINE_EVENT(clock, clock_disable,
315
316 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
317
318 TP_ARGS(name, state, cpu_id)
319);
320
321DEFINE_EVENT(clock, clock_set_rate,
322
323 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
324
325 TP_ARGS(name, state, cpu_id)
326);
327
Colin Crossb354d8a2012-05-09 16:09:50 -0700328TRACE_EVENT(clock_set_parent,
329
330 TP_PROTO(const char *name, const char *parent_name),
331
332 TP_ARGS(name, parent_name),
333
334 TP_STRUCT__entry(
335 __string( name, name )
336 __string( parent_name, parent_name )
337 ),
338
339 TP_fast_assign(
340 __assign_str(name, name);
341 __assign_str(parent_name, parent_name);
342 ),
343
344 TP_printk("%s parent=%s", __get_str(name), __get_str(parent_name))
345);
346
Jean Pihet74704ac2010-09-07 09:21:32 +0200347/*
348 * The power domain events are used for power domains transitions
349 */
350DECLARE_EVENT_CLASS(power_domain,
351
352 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
353
354 TP_ARGS(name, state, cpu_id),
355
356 TP_STRUCT__entry(
357 __string( name, name )
358 __field( u64, state )
359 __field( u64, cpu_id )
360 ),
361
362 TP_fast_assign(
363 __assign_str(name, name);
364 __entry->state = state;
365 __entry->cpu_id = cpu_id;
366),
367
368 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
369 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
370);
371
372DEFINE_EVENT(power_domain, power_domain_target,
373
374 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
375
376 TP_ARGS(name, state, cpu_id)
377);
Sahara247e9ee2013-06-21 11:12:28 +0900378
379/*
380 * The pm qos events are used for pm qos update
381 */
Saharaae8822b2013-06-21 11:12:29 +0900382DECLARE_EVENT_CLASS(pm_qos_request,
383
384 TP_PROTO(int pm_qos_class, s32 value),
385
386 TP_ARGS(pm_qos_class, value),
387
388 TP_STRUCT__entry(
389 __field( int, pm_qos_class )
390 __field( s32, value )
391 ),
392
393 TP_fast_assign(
394 __entry->pm_qos_class = pm_qos_class;
395 __entry->value = value;
396 ),
397
398 TP_printk("pm_qos_class=%s value=%d",
399 __print_symbolic(__entry->pm_qos_class,
400 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" },
401 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" },
402 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }),
403 __entry->value)
404);
405
406DEFINE_EVENT(pm_qos_request, pm_qos_add_request,
407
408 TP_PROTO(int pm_qos_class, s32 value),
409
410 TP_ARGS(pm_qos_class, value)
411);
412
413DEFINE_EVENT(pm_qos_request, pm_qos_update_request,
414
415 TP_PROTO(int pm_qos_class, s32 value),
416
417 TP_ARGS(pm_qos_class, value)
418);
419
420DEFINE_EVENT(pm_qos_request, pm_qos_remove_request,
421
422 TP_PROTO(int pm_qos_class, s32 value),
423
424 TP_ARGS(pm_qos_class, value)
425);
426
427TRACE_EVENT(pm_qos_update_request_timeout,
428
429 TP_PROTO(int pm_qos_class, s32 value, unsigned long timeout_us),
430
431 TP_ARGS(pm_qos_class, value, timeout_us),
432
433 TP_STRUCT__entry(
434 __field( int, pm_qos_class )
435 __field( s32, value )
436 __field( unsigned long, timeout_us )
437 ),
438
439 TP_fast_assign(
440 __entry->pm_qos_class = pm_qos_class;
441 __entry->value = value;
442 __entry->timeout_us = timeout_us;
443 ),
444
445 TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld",
446 __print_symbolic(__entry->pm_qos_class,
447 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" },
448 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" },
449 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }),
450 __entry->value, __entry->timeout_us)
451);
452
Sahara247e9ee2013-06-21 11:12:28 +0900453DECLARE_EVENT_CLASS(pm_qos_update,
454
455 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
456
457 TP_ARGS(action, prev_value, curr_value),
458
459 TP_STRUCT__entry(
460 __field( enum pm_qos_req_action, action )
461 __field( int, prev_value )
462 __field( int, curr_value )
463 ),
464
465 TP_fast_assign(
466 __entry->action = action;
467 __entry->prev_value = prev_value;
468 __entry->curr_value = curr_value;
469 ),
470
471 TP_printk("action=%s prev_value=%d curr_value=%d",
472 __print_symbolic(__entry->action,
473 { PM_QOS_ADD_REQ, "ADD_REQ" },
474 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" },
475 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }),
476 __entry->prev_value, __entry->curr_value)
477);
478
479DEFINE_EVENT(pm_qos_update, pm_qos_update_target,
480
481 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
482
483 TP_ARGS(action, prev_value, curr_value)
484);
485
486DEFINE_EVENT_PRINT(pm_qos_update, pm_qos_update_flags,
487
488 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
489
490 TP_ARGS(action, prev_value, curr_value),
491
492 TP_printk("action=%s prev_value=0x%x curr_value=0x%x",
493 __print_symbolic(__entry->action,
494 { PM_QOS_ADD_REQ, "ADD_REQ" },
495 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" },
496 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }),
497 __entry->prev_value, __entry->curr_value)
498);
Sahara96d9d0b2013-06-21 11:12:30 +0900499
500DECLARE_EVENT_CLASS(dev_pm_qos_request,
501
502 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
503 s32 new_value),
504
505 TP_ARGS(name, type, new_value),
506
507 TP_STRUCT__entry(
508 __string( name, name )
509 __field( enum dev_pm_qos_req_type, type )
510 __field( s32, new_value )
511 ),
512
513 TP_fast_assign(
514 __assign_str(name, name);
515 __entry->type = type;
516 __entry->new_value = new_value;
517 ),
518
519 TP_printk("device=%s type=%s new_value=%d",
520 __get_str(name),
521 __print_symbolic(__entry->type,
Rafael J. Wysockib02f6692014-02-11 00:35:23 +0100522 { DEV_PM_QOS_RESUME_LATENCY, "DEV_PM_QOS_RESUME_LATENCY" },
523 { DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }),
Sahara96d9d0b2013-06-21 11:12:30 +0900524 __entry->new_value)
525);
526
527DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_add_request,
528
529 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
530 s32 new_value),
531
532 TP_ARGS(name, type, new_value)
533);
534
535DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_update_request,
536
537 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
538 s32 new_value),
539
540 TP_ARGS(name, type, new_value)
541);
542
543DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request,
544
545 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
546 s32 new_value),
547
548 TP_ARGS(name, type, new_value)
549);
Arjan van de Ven61613522009-09-17 16:11:28 +0200550#endif /* _TRACE_POWER_H */
551
552/* This part must be outside protection */
553#include <trace/define_trace.h>