blob: ec6f81561558100b3c8236597b0c6c02cc8a2cde [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
Juri Lelli2f8ed122015-04-30 17:35:23 +0100175DEFINE_EVENT(cpu, cpu_capacity,
176
177 TP_PROTO(unsigned int capacity, unsigned int cpu_id),
178
179 TP_ARGS(capacity, cpu_id)
180);
181
Todd E Brandte8bca472014-06-10 07:31:22 -0700182TRACE_EVENT(device_pm_callback_start,
Shuah Khan53644672013-07-26 13:30:20 -0600183
Todd E Brandte8bca472014-06-10 07:31:22 -0700184 TP_PROTO(struct device *dev, const char *pm_ops, int event),
Shuah Khan53644672013-07-26 13:30:20 -0600185
Todd E Brandte8bca472014-06-10 07:31:22 -0700186 TP_ARGS(dev, pm_ops, event),
Shuah Khan53644672013-07-26 13:30:20 -0600187
188 TP_STRUCT__entry(
189 __string(device, dev_name(dev))
190 __string(driver, dev_driver_string(dev))
191 __string(parent, dev->parent ? dev_name(dev->parent) : "none")
192 __string(pm_ops, pm_ops ? pm_ops : "none ")
Todd E Brandte8bca472014-06-10 07:31:22 -0700193 __field(int, event)
194 ),
195
196 TP_fast_assign(
197 __assign_str(device, dev_name(dev));
198 __assign_str(driver, dev_driver_string(dev));
199 __assign_str(parent,
200 dev->parent ? dev_name(dev->parent) : "none");
201 __assign_str(pm_ops, pm_ops ? pm_ops : "none ");
202 __entry->event = event;
203 ),
204
205 TP_printk("%s %s, parent: %s, %s[%s]", __get_str(driver),
206 __get_str(device), __get_str(parent), __get_str(pm_ops),
207 pm_verb_symbolic(__entry->event))
208);
209
210TRACE_EVENT(device_pm_callback_end,
211
212 TP_PROTO(struct device *dev, int error),
213
214 TP_ARGS(dev, error),
215
216 TP_STRUCT__entry(
217 __string(device, dev_name(dev))
218 __string(driver, dev_driver_string(dev))
Shuah Khan53644672013-07-26 13:30:20 -0600219 __field(int, error)
220 ),
221
222 TP_fast_assign(
Shuah Khan53644672013-07-26 13:30:20 -0600223 __assign_str(device, dev_name(dev));
224 __assign_str(driver, dev_driver_string(dev));
Shuah Khan53644672013-07-26 13:30:20 -0600225 __entry->error = error;
226 ),
227
Todd E Brandte8bca472014-06-10 07:31:22 -0700228 TP_printk("%s %s, err=%d",
229 __get_str(driver), __get_str(device), __entry->error)
Shuah Khan53644672013-07-26 13:30:20 -0600230);
231
Todd E Brandtbb3632c2014-06-06 05:40:17 -0700232TRACE_EVENT(suspend_resume,
233
234 TP_PROTO(const char *action, int val, bool start),
235
236 TP_ARGS(action, val, start),
237
238 TP_STRUCT__entry(
239 __field(const char *, action)
240 __field(int, val)
241 __field(bool, start)
242 ),
243
244 TP_fast_assign(
245 __entry->action = action;
246 __entry->val = val;
247 __entry->start = start;
248 ),
249
250 TP_printk("%s[%u] %s", __entry->action, (unsigned int)__entry->val,
251 (__entry->start)?"begin":"end")
252);
253
Arve Hjønnevåg6791e362012-04-29 22:53:02 +0200254DECLARE_EVENT_CLASS(wakeup_source,
255
256 TP_PROTO(const char *name, unsigned int state),
257
258 TP_ARGS(name, state),
259
260 TP_STRUCT__entry(
261 __string( name, name )
262 __field( u64, state )
263 ),
264
265 TP_fast_assign(
266 __assign_str(name, name);
267 __entry->state = state;
268 ),
269
270 TP_printk("%s state=0x%lx", __get_str(name),
271 (unsigned long)__entry->state)
272);
273
274DEFINE_EVENT(wakeup_source, wakeup_source_activate,
275
276 TP_PROTO(const char *name, unsigned int state),
277
278 TP_ARGS(name, state)
279);
280
281DEFINE_EVENT(wakeup_source, wakeup_source_deactivate,
282
283 TP_PROTO(const char *name, unsigned int state),
284
285 TP_ARGS(name, state)
286);
287
Jean Pihet74704ac2010-09-07 09:21:32 +0200288/*
289 * The clock events are used for clock enable/disable and for
290 * clock rate change
291 */
292DECLARE_EVENT_CLASS(clock,
293
294 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
295
296 TP_ARGS(name, state, cpu_id),
297
298 TP_STRUCT__entry(
299 __string( name, name )
300 __field( u64, state )
301 __field( u64, cpu_id )
302 ),
303
304 TP_fast_assign(
305 __assign_str(name, name);
306 __entry->state = state;
307 __entry->cpu_id = cpu_id;
308 ),
309
310 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
311 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
312);
313
314DEFINE_EVENT(clock, clock_enable,
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_disable,
322
323 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
324
325 TP_ARGS(name, state, cpu_id)
326);
327
328DEFINE_EVENT(clock, clock_set_rate,
329
330 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
331
332 TP_ARGS(name, state, cpu_id)
333);
334
Colin Crossb354d8a2012-05-09 16:09:50 -0700335TRACE_EVENT(clock_set_parent,
336
337 TP_PROTO(const char *name, const char *parent_name),
338
339 TP_ARGS(name, parent_name),
340
341 TP_STRUCT__entry(
342 __string( name, name )
343 __string( parent_name, parent_name )
344 ),
345
346 TP_fast_assign(
347 __assign_str(name, name);
348 __assign_str(parent_name, parent_name);
349 ),
350
351 TP_printk("%s parent=%s", __get_str(name), __get_str(parent_name))
352);
353
Jean Pihet74704ac2010-09-07 09:21:32 +0200354/*
355 * The power domain events are used for power domains transitions
356 */
357DECLARE_EVENT_CLASS(power_domain,
358
359 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
360
361 TP_ARGS(name, state, cpu_id),
362
363 TP_STRUCT__entry(
364 __string( name, name )
365 __field( u64, state )
366 __field( u64, cpu_id )
367 ),
368
369 TP_fast_assign(
370 __assign_str(name, name);
371 __entry->state = state;
372 __entry->cpu_id = cpu_id;
373),
374
375 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
376 (unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
377);
378
379DEFINE_EVENT(power_domain, power_domain_target,
380
381 TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
382
383 TP_ARGS(name, state, cpu_id)
384);
Sahara247e9ee2013-06-21 11:12:28 +0900385
386/*
387 * The pm qos events are used for pm qos update
388 */
Saharaae8822b2013-06-21 11:12:29 +0900389DECLARE_EVENT_CLASS(pm_qos_request,
390
391 TP_PROTO(int pm_qos_class, s32 value),
392
393 TP_ARGS(pm_qos_class, value),
394
395 TP_STRUCT__entry(
396 __field( int, pm_qos_class )
397 __field( s32, value )
398 ),
399
400 TP_fast_assign(
401 __entry->pm_qos_class = pm_qos_class;
402 __entry->value = value;
403 ),
404
405 TP_printk("pm_qos_class=%s value=%d",
406 __print_symbolic(__entry->pm_qos_class,
407 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" },
408 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" },
409 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }),
410 __entry->value)
411);
412
413DEFINE_EVENT(pm_qos_request, pm_qos_add_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_update_request,
421
422 TP_PROTO(int pm_qos_class, s32 value),
423
424 TP_ARGS(pm_qos_class, value)
425);
426
427DEFINE_EVENT(pm_qos_request, pm_qos_remove_request,
428
429 TP_PROTO(int pm_qos_class, s32 value),
430
431 TP_ARGS(pm_qos_class, value)
432);
433
434TRACE_EVENT(pm_qos_update_request_timeout,
435
436 TP_PROTO(int pm_qos_class, s32 value, unsigned long timeout_us),
437
438 TP_ARGS(pm_qos_class, value, timeout_us),
439
440 TP_STRUCT__entry(
441 __field( int, pm_qos_class )
442 __field( s32, value )
443 __field( unsigned long, timeout_us )
444 ),
445
446 TP_fast_assign(
447 __entry->pm_qos_class = pm_qos_class;
448 __entry->value = value;
449 __entry->timeout_us = timeout_us;
450 ),
451
452 TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld",
453 __print_symbolic(__entry->pm_qos_class,
454 { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" },
455 { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" },
456 { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }),
457 __entry->value, __entry->timeout_us)
458);
459
Sahara247e9ee2013-06-21 11:12:28 +0900460DECLARE_EVENT_CLASS(pm_qos_update,
461
462 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
463
464 TP_ARGS(action, prev_value, curr_value),
465
466 TP_STRUCT__entry(
467 __field( enum pm_qos_req_action, action )
468 __field( int, prev_value )
469 __field( int, curr_value )
470 ),
471
472 TP_fast_assign(
473 __entry->action = action;
474 __entry->prev_value = prev_value;
475 __entry->curr_value = curr_value;
476 ),
477
478 TP_printk("action=%s prev_value=%d curr_value=%d",
479 __print_symbolic(__entry->action,
480 { PM_QOS_ADD_REQ, "ADD_REQ" },
481 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" },
482 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }),
483 __entry->prev_value, __entry->curr_value)
484);
485
486DEFINE_EVENT(pm_qos_update, pm_qos_update_target,
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
493DEFINE_EVENT_PRINT(pm_qos_update, pm_qos_update_flags,
494
495 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
496
497 TP_ARGS(action, prev_value, curr_value),
498
499 TP_printk("action=%s prev_value=0x%x curr_value=0x%x",
500 __print_symbolic(__entry->action,
501 { PM_QOS_ADD_REQ, "ADD_REQ" },
502 { PM_QOS_UPDATE_REQ, "UPDATE_REQ" },
503 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }),
504 __entry->prev_value, __entry->curr_value)
505);
Sahara96d9d0b2013-06-21 11:12:30 +0900506
507DECLARE_EVENT_CLASS(dev_pm_qos_request,
508
509 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
510 s32 new_value),
511
512 TP_ARGS(name, type, new_value),
513
514 TP_STRUCT__entry(
515 __string( name, name )
516 __field( enum dev_pm_qos_req_type, type )
517 __field( s32, new_value )
518 ),
519
520 TP_fast_assign(
521 __assign_str(name, name);
522 __entry->type = type;
523 __entry->new_value = new_value;
524 ),
525
526 TP_printk("device=%s type=%s new_value=%d",
527 __get_str(name),
528 __print_symbolic(__entry->type,
Rafael J. Wysockib02f6692014-02-11 00:35:23 +0100529 { DEV_PM_QOS_RESUME_LATENCY, "DEV_PM_QOS_RESUME_LATENCY" },
530 { DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }),
Sahara96d9d0b2013-06-21 11:12:30 +0900531 __entry->new_value)
532);
533
534DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_add_request,
535
536 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
537 s32 new_value),
538
539 TP_ARGS(name, type, new_value)
540);
541
542DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_update_request,
543
544 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
545 s32 new_value),
546
547 TP_ARGS(name, type, new_value)
548);
549
550DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request,
551
552 TP_PROTO(const char *name, enum dev_pm_qos_req_type type,
553 s32 new_value),
554
555 TP_ARGS(name, type, new_value)
556);
Arjan van de Ven61613522009-09-17 16:11:28 +0200557#endif /* _TRACE_POWER_H */
558
559/* This part must be outside protection */
560#include <trace/define_trace.h>