2 #define TRACE_SYSTEM power
4 #if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
7 #include <linux/ktime.h>
8 #include <linux/pm_qos.h>
9 #include <linux/tracepoint.h>
10 #include <linux/trace_events.h>
12 #define TPS(x) tracepoint_string(x)
14 DECLARE_EVENT_CLASS(cpu
,
16 TP_PROTO(unsigned int state
, unsigned int cpu_id
),
18 TP_ARGS(state
, cpu_id
),
22 __field( u32
, cpu_id
)
26 __entry
->state
= state
;
27 __entry
->cpu_id
= cpu_id
;
30 TP_printk("state=%lu cpu_id=%lu", (unsigned long)__entry
->state
,
31 (unsigned long)__entry
->cpu_id
)
34 DEFINE_EVENT(cpu
, cpu_idle
,
36 TP_PROTO(unsigned int state
, unsigned int cpu_id
),
38 TP_ARGS(state
, cpu_id
)
41 TRACE_EVENT(powernv_throttle
,
43 TP_PROTO(int chip_id
, const char *reason
, int pmax
),
45 TP_ARGS(chip_id
, reason
, pmax
),
49 __string(reason
, reason
)
54 __entry
->chip_id
= chip_id
;
55 __assign_str(reason
, reason
);
59 TP_printk("Chip %d Pmax %d %s", __entry
->chip_id
,
60 __entry
->pmax
, __get_str(reason
))
63 TRACE_EVENT(pstate_sample
,
65 TP_PROTO(u32 core_busy
,
86 __field(u32
, core_busy
)
87 __field(u32
, scaled_busy
)
97 __entry
->core_busy
= core_busy
;
98 __entry
->scaled_busy
= scaled_busy
;
101 __entry
->mperf
= mperf
;
102 __entry
->aperf
= aperf
;
104 __entry
->freq
= freq
;
107 TP_printk("core_busy=%lu scaled=%lu from=%lu to=%lu mperf=%llu aperf=%llu tsc=%llu freq=%lu ",
108 (unsigned long)__entry
->core_busy
,
109 (unsigned long)__entry
->scaled_busy
,
110 (unsigned long)__entry
->from
,
111 (unsigned long)__entry
->to
,
112 (unsigned long long)__entry
->mperf
,
113 (unsigned long long)__entry
->aperf
,
114 (unsigned long long)__entry
->tsc
,
115 (unsigned long)__entry
->freq
120 /* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */
121 #ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING
122 #define _PWR_EVENT_AVOID_DOUBLE_DEFINING
124 #define PWR_EVENT_EXIT -1
127 #define pm_verb_symbolic(event) \
128 __print_symbolic(event, \
129 { PM_EVENT_SUSPEND, "suspend" }, \
130 { PM_EVENT_RESUME, "resume" }, \
131 { PM_EVENT_FREEZE, "freeze" }, \
132 { PM_EVENT_QUIESCE, "quiesce" }, \
133 { PM_EVENT_HIBERNATE, "hibernate" }, \
134 { PM_EVENT_THAW, "thaw" }, \
135 { PM_EVENT_RESTORE, "restore" }, \
136 { PM_EVENT_RECOVER, "recover" })
138 DEFINE_EVENT(cpu
, cpu_frequency
,
140 TP_PROTO(unsigned int frequency
, unsigned int cpu_id
),
142 TP_ARGS(frequency
, cpu_id
)
145 TRACE_EVENT(device_pm_callback_start
,
147 TP_PROTO(struct device
*dev
, const char *pm_ops
, int event
),
149 TP_ARGS(dev
, pm_ops
, event
),
152 __string(device
, dev_name(dev
))
153 __string(driver
, dev_driver_string(dev
))
154 __string(parent
, dev
->parent
? dev_name(dev
->parent
) : "none")
155 __string(pm_ops
, pm_ops
? pm_ops
: "none ")
160 __assign_str(device
, dev_name(dev
));
161 __assign_str(driver
, dev_driver_string(dev
));
163 dev
->parent
? dev_name(dev
->parent
) : "none");
164 __assign_str(pm_ops
, pm_ops
? pm_ops
: "none ");
165 __entry
->event
= event
;
168 TP_printk("%s %s, parent: %s, %s[%s]", __get_str(driver
),
169 __get_str(device
), __get_str(parent
), __get_str(pm_ops
),
170 pm_verb_symbolic(__entry
->event
))
173 TRACE_EVENT(device_pm_callback_end
,
175 TP_PROTO(struct device
*dev
, int error
),
180 __string(device
, dev_name(dev
))
181 __string(driver
, dev_driver_string(dev
))
186 __assign_str(device
, dev_name(dev
));
187 __assign_str(driver
, dev_driver_string(dev
));
188 __entry
->error
= error
;
191 TP_printk("%s %s, err=%d",
192 __get_str(driver
), __get_str(device
), __entry
->error
)
195 TRACE_EVENT(suspend_resume
,
197 TP_PROTO(const char *action
, int val
, bool start
),
199 TP_ARGS(action
, val
, start
),
202 __field(const char *, action
)
208 __entry
->action
= action
;
210 __entry
->start
= start
;
213 TP_printk("%s[%u] %s", __entry
->action
, (unsigned int)__entry
->val
,
214 (__entry
->start
)?"begin":"end")
217 DECLARE_EVENT_CLASS(wakeup_source
,
219 TP_PROTO(const char *name
, unsigned int state
),
221 TP_ARGS(name
, state
),
224 __string( name
, name
)
225 __field( u64
, state
)
229 __assign_str(name
, name
);
230 __entry
->state
= state
;
233 TP_printk("%s state=0x%lx", __get_str(name
),
234 (unsigned long)__entry
->state
)
237 DEFINE_EVENT(wakeup_source
, wakeup_source_activate
,
239 TP_PROTO(const char *name
, unsigned int state
),
244 DEFINE_EVENT(wakeup_source
, wakeup_source_deactivate
,
246 TP_PROTO(const char *name
, unsigned int state
),
252 * The clock events are used for clock enable/disable and for
255 DECLARE_EVENT_CLASS(clock
,
257 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
259 TP_ARGS(name
, state
, cpu_id
),
262 __string( name
, name
)
263 __field( u64
, state
)
264 __field( u64
, cpu_id
)
268 __assign_str(name
, name
);
269 __entry
->state
= state
;
270 __entry
->cpu_id
= cpu_id
;
273 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name
),
274 (unsigned long)__entry
->state
, (unsigned long)__entry
->cpu_id
)
277 DEFINE_EVENT(clock
, clock_enable
,
279 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
281 TP_ARGS(name
, state
, cpu_id
)
284 DEFINE_EVENT(clock
, clock_disable
,
286 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
288 TP_ARGS(name
, state
, cpu_id
)
291 DEFINE_EVENT(clock
, clock_set_rate
,
293 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
295 TP_ARGS(name
, state
, cpu_id
)
299 * The power domain events are used for power domains transitions
301 DECLARE_EVENT_CLASS(power_domain
,
303 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
305 TP_ARGS(name
, state
, cpu_id
),
308 __string( name
, name
)
309 __field( u64
, state
)
310 __field( u64
, cpu_id
)
314 __assign_str(name
, name
);
315 __entry
->state
= state
;
316 __entry
->cpu_id
= cpu_id
;
319 TP_printk("%s state=%lu cpu_id=%lu", __get_str(name
),
320 (unsigned long)__entry
->state
, (unsigned long)__entry
->cpu_id
)
323 DEFINE_EVENT(power_domain
, power_domain_target
,
325 TP_PROTO(const char *name
, unsigned int state
, unsigned int cpu_id
),
327 TP_ARGS(name
, state
, cpu_id
)
331 * The pm qos events are used for pm qos update
333 DECLARE_EVENT_CLASS(pm_qos_request
,
335 TP_PROTO(int pm_qos_class
, s32 value
),
337 TP_ARGS(pm_qos_class
, value
),
340 __field( int, pm_qos_class
)
341 __field( s32
, value
)
345 __entry
->pm_qos_class
= pm_qos_class
;
346 __entry
->value
= value
;
349 TP_printk("pm_qos_class=%s value=%d",
350 __print_symbolic(__entry
->pm_qos_class
,
351 { PM_QOS_CPU_DMA_LATENCY
, "CPU_DMA_LATENCY" },
352 { PM_QOS_NETWORK_LATENCY
, "NETWORK_LATENCY" },
353 { PM_QOS_NETWORK_THROUGHPUT
, "NETWORK_THROUGHPUT" }),
357 DEFINE_EVENT(pm_qos_request
, pm_qos_add_request
,
359 TP_PROTO(int pm_qos_class
, s32 value
),
361 TP_ARGS(pm_qos_class
, value
)
364 DEFINE_EVENT(pm_qos_request
, pm_qos_update_request
,
366 TP_PROTO(int pm_qos_class
, s32 value
),
368 TP_ARGS(pm_qos_class
, value
)
371 DEFINE_EVENT(pm_qos_request
, pm_qos_remove_request
,
373 TP_PROTO(int pm_qos_class
, s32 value
),
375 TP_ARGS(pm_qos_class
, value
)
378 TRACE_EVENT(pm_qos_update_request_timeout
,
380 TP_PROTO(int pm_qos_class
, s32 value
, unsigned long timeout_us
),
382 TP_ARGS(pm_qos_class
, value
, timeout_us
),
385 __field( int, pm_qos_class
)
386 __field( s32
, value
)
387 __field( unsigned long, timeout_us
)
391 __entry
->pm_qos_class
= pm_qos_class
;
392 __entry
->value
= value
;
393 __entry
->timeout_us
= timeout_us
;
396 TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld",
397 __print_symbolic(__entry
->pm_qos_class
,
398 { PM_QOS_CPU_DMA_LATENCY
, "CPU_DMA_LATENCY" },
399 { PM_QOS_NETWORK_LATENCY
, "NETWORK_LATENCY" },
400 { PM_QOS_NETWORK_THROUGHPUT
, "NETWORK_THROUGHPUT" }),
401 __entry
->value
, __entry
->timeout_us
)
404 DECLARE_EVENT_CLASS(pm_qos_update
,
406 TP_PROTO(enum pm_qos_req_action action
, int prev_value
, int curr_value
),
408 TP_ARGS(action
, prev_value
, curr_value
),
411 __field( enum pm_qos_req_action
, action
)
412 __field( int, prev_value
)
413 __field( int, curr_value
)
417 __entry
->action
= action
;
418 __entry
->prev_value
= prev_value
;
419 __entry
->curr_value
= curr_value
;
422 TP_printk("action=%s prev_value=%d curr_value=%d",
423 __print_symbolic(__entry
->action
,
424 { PM_QOS_ADD_REQ
, "ADD_REQ" },
425 { PM_QOS_UPDATE_REQ
, "UPDATE_REQ" },
426 { PM_QOS_REMOVE_REQ
, "REMOVE_REQ" }),
427 __entry
->prev_value
, __entry
->curr_value
)
430 DEFINE_EVENT(pm_qos_update
, pm_qos_update_target
,
432 TP_PROTO(enum pm_qos_req_action action
, int prev_value
, int curr_value
),
434 TP_ARGS(action
, prev_value
, curr_value
)
437 DEFINE_EVENT_PRINT(pm_qos_update
, pm_qos_update_flags
,
439 TP_PROTO(enum pm_qos_req_action action
, int prev_value
, int curr_value
),
441 TP_ARGS(action
, prev_value
, curr_value
),
443 TP_printk("action=%s prev_value=0x%x curr_value=0x%x",
444 __print_symbolic(__entry
->action
,
445 { PM_QOS_ADD_REQ
, "ADD_REQ" },
446 { PM_QOS_UPDATE_REQ
, "UPDATE_REQ" },
447 { PM_QOS_REMOVE_REQ
, "REMOVE_REQ" }),
448 __entry
->prev_value
, __entry
->curr_value
)
451 DECLARE_EVENT_CLASS(dev_pm_qos_request
,
453 TP_PROTO(const char *name
, enum dev_pm_qos_req_type type
,
456 TP_ARGS(name
, type
, new_value
),
459 __string( name
, name
)
460 __field( enum dev_pm_qos_req_type
, type
)
461 __field( s32
, new_value
)
465 __assign_str(name
, name
);
466 __entry
->type
= type
;
467 __entry
->new_value
= new_value
;
470 TP_printk("device=%s type=%s new_value=%d",
472 __print_symbolic(__entry
->type
,
473 { DEV_PM_QOS_RESUME_LATENCY
, "DEV_PM_QOS_RESUME_LATENCY" },
474 { DEV_PM_QOS_FLAGS
, "DEV_PM_QOS_FLAGS" }),
478 DEFINE_EVENT(dev_pm_qos_request
, dev_pm_qos_add_request
,
480 TP_PROTO(const char *name
, enum dev_pm_qos_req_type type
,
483 TP_ARGS(name
, type
, new_value
)
486 DEFINE_EVENT(dev_pm_qos_request
, dev_pm_qos_update_request
,
488 TP_PROTO(const char *name
, enum dev_pm_qos_req_type type
,
491 TP_ARGS(name
, type
, new_value
)
494 DEFINE_EVENT(dev_pm_qos_request
, dev_pm_qos_remove_request
,
496 TP_PROTO(const char *name
, enum dev_pm_qos_req_type type
,
499 TP_ARGS(name
, type
, new_value
)
501 #endif /* _TRACE_POWER_H */
503 /* This part must be outside protection */
504 #include <trace/define_trace.h>