Commit | Line | Data |
---|---|---|
61613521 AV |
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> | |
247e9ee0 | 8 | #include <linux/pm_qos.h> |
61613521 AV |
9 | #include <linux/tracepoint.h> |
10 | ||
25e41933 TR |
11 | DECLARE_EVENT_CLASS(cpu, |
12 | ||
13 | TP_PROTO(unsigned int state, unsigned int cpu_id), | |
14 | ||
15 | TP_ARGS(state, cpu_id), | |
16 | ||
17 | TP_STRUCT__entry( | |
18 | __field( u32, state ) | |
19 | __field( u32, cpu_id ) | |
20 | ), | |
21 | ||
22 | TP_fast_assign( | |
23 | __entry->state = state; | |
24 | __entry->cpu_id = cpu_id; | |
25 | ), | |
26 | ||
27 | TP_printk("state=%lu cpu_id=%lu", (unsigned long)__entry->state, | |
28 | (unsigned long)__entry->cpu_id) | |
29 | ); | |
30 | ||
31 | DEFINE_EVENT(cpu, cpu_idle, | |
32 | ||
33 | TP_PROTO(unsigned int state, unsigned int cpu_id), | |
34 | ||
35 | TP_ARGS(state, cpu_id) | |
36 | ); | |
37 | ||
b69880f9 DB |
38 | TRACE_EVENT(pstate_sample, |
39 | ||
40 | TP_PROTO(u32 core_busy, | |
41 | u32 scaled_busy, | |
42 | u32 state, | |
43 | u64 mperf, | |
44 | u64 aperf, | |
b69880f9 DB |
45 | u32 freq |
46 | ), | |
47 | ||
48 | TP_ARGS(core_busy, | |
49 | scaled_busy, | |
50 | state, | |
51 | mperf, | |
52 | aperf, | |
b69880f9 DB |
53 | freq |
54 | ), | |
55 | ||
56 | TP_STRUCT__entry( | |
57 | __field(u32, core_busy) | |
58 | __field(u32, scaled_busy) | |
59 | __field(u32, state) | |
60 | __field(u64, mperf) | |
61 | __field(u64, aperf) | |
b69880f9 DB |
62 | __field(u32, freq) |
63 | ||
64 | ), | |
65 | ||
66 | TP_fast_assign( | |
67 | __entry->core_busy = core_busy; | |
68 | __entry->scaled_busy = scaled_busy; | |
69 | __entry->state = state; | |
70 | __entry->mperf = mperf; | |
71 | __entry->aperf = aperf; | |
b69880f9 DB |
72 | __entry->freq = freq; |
73 | ), | |
74 | ||
709c078e | 75 | TP_printk("core_busy=%lu scaled=%lu state=%lu mperf=%llu aperf=%llu freq=%lu ", |
b69880f9 DB |
76 | (unsigned long)__entry->core_busy, |
77 | (unsigned long)__entry->scaled_busy, | |
78 | (unsigned long)__entry->state, | |
79 | (unsigned long long)__entry->mperf, | |
80 | (unsigned long long)__entry->aperf, | |
b69880f9 DB |
81 | (unsigned long)__entry->freq |
82 | ) | |
83 | ||
84 | ); | |
85 | ||
25e41933 TR |
86 | /* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */ |
87 | #ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING | |
88 | #define _PWR_EVENT_AVOID_DOUBLE_DEFINING | |
89 | ||
90 | #define PWR_EVENT_EXIT -1 | |
61613521 AV |
91 | #endif |
92 | ||
25e41933 TR |
93 | DEFINE_EVENT(cpu, cpu_frequency, |
94 | ||
95 | TP_PROTO(unsigned int frequency, unsigned int cpu_id), | |
96 | ||
97 | TP_ARGS(frequency, cpu_id) | |
98 | ); | |
99 | ||
100 | TRACE_EVENT(machine_suspend, | |
101 | ||
102 | TP_PROTO(unsigned int state), | |
103 | ||
104 | TP_ARGS(state), | |
105 | ||
106 | TP_STRUCT__entry( | |
107 | __field( u32, state ) | |
108 | ), | |
109 | ||
110 | TP_fast_assign( | |
111 | __entry->state = state; | |
112 | ), | |
113 | ||
114 | TP_printk("state=%lu", (unsigned long)__entry->state) | |
115 | ); | |
116 | ||
53644677 SK |
117 | TRACE_EVENT(device_pm_report_time, |
118 | ||
119 | TP_PROTO(struct device *dev, const char *pm_ops, s64 ops_time, | |
120 | char *pm_event_str, int error), | |
121 | ||
122 | TP_ARGS(dev, pm_ops, ops_time, pm_event_str, error), | |
123 | ||
124 | TP_STRUCT__entry( | |
125 | __string(device, dev_name(dev)) | |
126 | __string(driver, dev_driver_string(dev)) | |
127 | __string(parent, dev->parent ? dev_name(dev->parent) : "none") | |
128 | __string(pm_ops, pm_ops ? pm_ops : "none ") | |
129 | __string(pm_event_str, pm_event_str) | |
130 | __field(s64, ops_time) | |
131 | __field(int, error) | |
132 | ), | |
133 | ||
134 | TP_fast_assign( | |
135 | const char *tmp = dev->parent ? dev_name(dev->parent) : "none"; | |
136 | const char *tmp_i = pm_ops ? pm_ops : "none "; | |
137 | ||
138 | __assign_str(device, dev_name(dev)); | |
139 | __assign_str(driver, dev_driver_string(dev)); | |
140 | __assign_str(parent, tmp); | |
141 | __assign_str(pm_ops, tmp_i); | |
142 | __assign_str(pm_event_str, pm_event_str); | |
143 | __entry->ops_time = ops_time; | |
144 | __entry->error = error; | |
145 | ), | |
146 | ||
147 | /* ops_str has an extra space at the end */ | |
148 | TP_printk("%s %s parent=%s state=%s ops=%snsecs=%lld err=%d", | |
149 | __get_str(driver), __get_str(device), __get_str(parent), | |
150 | __get_str(pm_event_str), __get_str(pm_ops), | |
151 | __entry->ops_time, __entry->error) | |
152 | ); | |
153 | ||
6791e36c AH |
154 | DECLARE_EVENT_CLASS(wakeup_source, |
155 | ||
156 | TP_PROTO(const char *name, unsigned int state), | |
157 | ||
158 | TP_ARGS(name, state), | |
159 | ||
160 | TP_STRUCT__entry( | |
161 | __string( name, name ) | |
162 | __field( u64, state ) | |
163 | ), | |
164 | ||
165 | TP_fast_assign( | |
166 | __assign_str(name, name); | |
167 | __entry->state = state; | |
168 | ), | |
169 | ||
170 | TP_printk("%s state=0x%lx", __get_str(name), | |
171 | (unsigned long)__entry->state) | |
172 | ); | |
173 | ||
174 | DEFINE_EVENT(wakeup_source, wakeup_source_activate, | |
175 | ||
176 | TP_PROTO(const char *name, unsigned int state), | |
177 | ||
178 | TP_ARGS(name, state) | |
179 | ); | |
180 | ||
181 | DEFINE_EVENT(wakeup_source, wakeup_source_deactivate, | |
182 | ||
183 | TP_PROTO(const char *name, unsigned int state), | |
184 | ||
185 | TP_ARGS(name, state) | |
186 | ); | |
187 | ||
74704ac6 JP |
188 | /* |
189 | * The clock events are used for clock enable/disable and for | |
190 | * clock rate change | |
191 | */ | |
192 | DECLARE_EVENT_CLASS(clock, | |
193 | ||
194 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
195 | ||
196 | TP_ARGS(name, state, cpu_id), | |
197 | ||
198 | TP_STRUCT__entry( | |
199 | __string( name, name ) | |
200 | __field( u64, state ) | |
201 | __field( u64, cpu_id ) | |
202 | ), | |
203 | ||
204 | TP_fast_assign( | |
205 | __assign_str(name, name); | |
206 | __entry->state = state; | |
207 | __entry->cpu_id = cpu_id; | |
208 | ), | |
209 | ||
210 | TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), | |
211 | (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) | |
212 | ); | |
213 | ||
214 | DEFINE_EVENT(clock, clock_enable, | |
215 | ||
216 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
217 | ||
218 | TP_ARGS(name, state, cpu_id) | |
219 | ); | |
220 | ||
221 | DEFINE_EVENT(clock, clock_disable, | |
222 | ||
223 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
224 | ||
225 | TP_ARGS(name, state, cpu_id) | |
226 | ); | |
227 | ||
228 | DEFINE_EVENT(clock, clock_set_rate, | |
229 | ||
230 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
231 | ||
232 | TP_ARGS(name, state, cpu_id) | |
233 | ); | |
234 | ||
235 | /* | |
236 | * The power domain events are used for power domains transitions | |
237 | */ | |
238 | DECLARE_EVENT_CLASS(power_domain, | |
239 | ||
240 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
241 | ||
242 | TP_ARGS(name, state, cpu_id), | |
243 | ||
244 | TP_STRUCT__entry( | |
245 | __string( name, name ) | |
246 | __field( u64, state ) | |
247 | __field( u64, cpu_id ) | |
248 | ), | |
249 | ||
250 | TP_fast_assign( | |
251 | __assign_str(name, name); | |
252 | __entry->state = state; | |
253 | __entry->cpu_id = cpu_id; | |
254 | ), | |
255 | ||
256 | TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), | |
257 | (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) | |
258 | ); | |
259 | ||
260 | DEFINE_EVENT(power_domain, power_domain_target, | |
261 | ||
262 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | |
263 | ||
264 | TP_ARGS(name, state, cpu_id) | |
265 | ); | |
247e9ee0 S |
266 | |
267 | /* | |
268 | * The pm qos events are used for pm qos update | |
269 | */ | |
ae8822b8 S |
270 | DECLARE_EVENT_CLASS(pm_qos_request, |
271 | ||
272 | TP_PROTO(int pm_qos_class, s32 value), | |
273 | ||
274 | TP_ARGS(pm_qos_class, value), | |
275 | ||
276 | TP_STRUCT__entry( | |
277 | __field( int, pm_qos_class ) | |
278 | __field( s32, value ) | |
279 | ), | |
280 | ||
281 | TP_fast_assign( | |
282 | __entry->pm_qos_class = pm_qos_class; | |
283 | __entry->value = value; | |
284 | ), | |
285 | ||
286 | TP_printk("pm_qos_class=%s value=%d", | |
287 | __print_symbolic(__entry->pm_qos_class, | |
288 | { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, | |
289 | { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, | |
290 | { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), | |
291 | __entry->value) | |
292 | ); | |
293 | ||
294 | DEFINE_EVENT(pm_qos_request, pm_qos_add_request, | |
295 | ||
296 | TP_PROTO(int pm_qos_class, s32 value), | |
297 | ||
298 | TP_ARGS(pm_qos_class, value) | |
299 | ); | |
300 | ||
301 | DEFINE_EVENT(pm_qos_request, pm_qos_update_request, | |
302 | ||
303 | TP_PROTO(int pm_qos_class, s32 value), | |
304 | ||
305 | TP_ARGS(pm_qos_class, value) | |
306 | ); | |
307 | ||
308 | DEFINE_EVENT(pm_qos_request, pm_qos_remove_request, | |
309 | ||
310 | TP_PROTO(int pm_qos_class, s32 value), | |
311 | ||
312 | TP_ARGS(pm_qos_class, value) | |
313 | ); | |
314 | ||
315 | TRACE_EVENT(pm_qos_update_request_timeout, | |
316 | ||
317 | TP_PROTO(int pm_qos_class, s32 value, unsigned long timeout_us), | |
318 | ||
319 | TP_ARGS(pm_qos_class, value, timeout_us), | |
320 | ||
321 | TP_STRUCT__entry( | |
322 | __field( int, pm_qos_class ) | |
323 | __field( s32, value ) | |
324 | __field( unsigned long, timeout_us ) | |
325 | ), | |
326 | ||
327 | TP_fast_assign( | |
328 | __entry->pm_qos_class = pm_qos_class; | |
329 | __entry->value = value; | |
330 | __entry->timeout_us = timeout_us; | |
331 | ), | |
332 | ||
333 | TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld", | |
334 | __print_symbolic(__entry->pm_qos_class, | |
335 | { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, | |
336 | { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, | |
337 | { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), | |
338 | __entry->value, __entry->timeout_us) | |
339 | ); | |
340 | ||
247e9ee0 S |
341 | DECLARE_EVENT_CLASS(pm_qos_update, |
342 | ||
343 | TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), | |
344 | ||
345 | TP_ARGS(action, prev_value, curr_value), | |
346 | ||
347 | TP_STRUCT__entry( | |
348 | __field( enum pm_qos_req_action, action ) | |
349 | __field( int, prev_value ) | |
350 | __field( int, curr_value ) | |
351 | ), | |
352 | ||
353 | TP_fast_assign( | |
354 | __entry->action = action; | |
355 | __entry->prev_value = prev_value; | |
356 | __entry->curr_value = curr_value; | |
357 | ), | |
358 | ||
359 | TP_printk("action=%s prev_value=%d curr_value=%d", | |
360 | __print_symbolic(__entry->action, | |
361 | { PM_QOS_ADD_REQ, "ADD_REQ" }, | |
362 | { PM_QOS_UPDATE_REQ, "UPDATE_REQ" }, | |
363 | { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), | |
364 | __entry->prev_value, __entry->curr_value) | |
365 | ); | |
366 | ||
367 | DEFINE_EVENT(pm_qos_update, pm_qos_update_target, | |
368 | ||
369 | TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), | |
370 | ||
371 | TP_ARGS(action, prev_value, curr_value) | |
372 | ); | |
373 | ||
374 | DEFINE_EVENT_PRINT(pm_qos_update, pm_qos_update_flags, | |
375 | ||
376 | TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value), | |
377 | ||
378 | TP_ARGS(action, prev_value, curr_value), | |
379 | ||
380 | TP_printk("action=%s prev_value=0x%x curr_value=0x%x", | |
381 | __print_symbolic(__entry->action, | |
382 | { PM_QOS_ADD_REQ, "ADD_REQ" }, | |
383 | { PM_QOS_UPDATE_REQ, "UPDATE_REQ" }, | |
384 | { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), | |
385 | __entry->prev_value, __entry->curr_value) | |
386 | ); | |
96d9d0b5 S |
387 | |
388 | DECLARE_EVENT_CLASS(dev_pm_qos_request, | |
389 | ||
390 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | |
391 | s32 new_value), | |
392 | ||
393 | TP_ARGS(name, type, new_value), | |
394 | ||
395 | TP_STRUCT__entry( | |
396 | __string( name, name ) | |
397 | __field( enum dev_pm_qos_req_type, type ) | |
398 | __field( s32, new_value ) | |
399 | ), | |
400 | ||
401 | TP_fast_assign( | |
402 | __assign_str(name, name); | |
403 | __entry->type = type; | |
404 | __entry->new_value = new_value; | |
405 | ), | |
406 | ||
407 | TP_printk("device=%s type=%s new_value=%d", | |
408 | __get_str(name), | |
409 | __print_symbolic(__entry->type, | |
410 | { DEV_PM_QOS_LATENCY, "DEV_PM_QOS_LATENCY" }, | |
411 | { DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }), | |
412 | __entry->new_value) | |
413 | ); | |
414 | ||
415 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_add_request, | |
416 | ||
417 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | |
418 | s32 new_value), | |
419 | ||
420 | TP_ARGS(name, type, new_value) | |
421 | ); | |
422 | ||
423 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_update_request, | |
424 | ||
425 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | |
426 | s32 new_value), | |
427 | ||
428 | TP_ARGS(name, type, new_value) | |
429 | ); | |
430 | ||
431 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request, | |
432 | ||
433 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | |
434 | s32 new_value), | |
435 | ||
436 | TP_ARGS(name, type, new_value) | |
437 | ); | |
61613521 AV |
438 | #endif /* _TRACE_POWER_H */ |
439 | ||
440 | /* This part must be outside protection */ | |
441 | #include <trace/define_trace.h> |