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