mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
e55483ad0e
It is sometimes useful to profile how long CPU frequency switches take, since they often involve variable overhead (PLL lock times, voltage increase time, etc.). Add additional traces to to make this possible. Since the overhead involved may differ based on the frequencies being switched between, record both the start and the end frequencies as part of the trace. Change-Id: I2de743fc357dad3590fd4980f65f38f6073d426e Signed-off-by: Matt Wagantall <mattw@codeaurora.org> (cherry picked from commit 0fe22de09613ce497561f51151b2c50b6c4a1c3e) (cherry picked from commit 9ab0adbcac4df4d681617a8368329d2f4cad4171)
302 lines
6.5 KiB
C
302 lines
6.5 KiB
C
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM power
|
|
|
|
#if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_POWER_H
|
|
|
|
#include <linux/ktime.h>
|
|
#include <linux/tracepoint.h>
|
|
|
|
DECLARE_EVENT_CLASS(cpu,
|
|
|
|
TP_PROTO(unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(state, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u32, state )
|
|
__field( u32, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->state = state;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("state=%lu cpu_id=%lu", (unsigned long)__entry->state,
|
|
(unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(cpu, cpu_idle,
|
|
|
|
TP_PROTO(unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(state, cpu_id)
|
|
);
|
|
|
|
/* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */
|
|
#ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING
|
|
#define _PWR_EVENT_AVOID_DOUBLE_DEFINING
|
|
|
|
#define PWR_EVENT_EXIT -1
|
|
#endif
|
|
|
|
DEFINE_EVENT(cpu, cpu_frequency,
|
|
|
|
TP_PROTO(unsigned int frequency, unsigned int cpu_id),
|
|
|
|
TP_ARGS(frequency, cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(cpu_frequency_switch_start,
|
|
|
|
TP_PROTO(unsigned int start_freq, unsigned int end_freq,
|
|
unsigned int cpu_id),
|
|
|
|
TP_ARGS(start_freq, end_freq, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u32, start_freq )
|
|
__field( u32, end_freq )
|
|
__field( u32, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->start_freq = start_freq;
|
|
__entry->end_freq = end_freq;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("start=%lu end=%lu cpu_id=%lu",
|
|
(unsigned long)__entry->start_freq,
|
|
(unsigned long)__entry->end_freq,
|
|
(unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(cpu_frequency_switch_end,
|
|
|
|
TP_PROTO(unsigned int cpu_id),
|
|
|
|
TP_ARGS(cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u32, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("cpu_id=%lu", (unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(machine_suspend,
|
|
|
|
TP_PROTO(unsigned int state),
|
|
|
|
TP_ARGS(state),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u32, state )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->state = state;
|
|
),
|
|
|
|
TP_printk("state=%lu", (unsigned long)__entry->state)
|
|
);
|
|
|
|
#ifdef CONFIG_EVENT_POWER_TRACING_DEPRECATED
|
|
|
|
/*
|
|
* The power events are used for cpuidle & suspend (power_start, power_end)
|
|
* and for cpufreq (power_frequency)
|
|
*/
|
|
DECLARE_EVENT_CLASS(power,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u64, type )
|
|
__field( u64, state )
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->type = type;
|
|
__entry->state = state;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("type=%lu state=%lu cpu_id=%lu", (unsigned long)__entry->type,
|
|
(unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(power, power_start,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(power, power_frequency,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(power_end,
|
|
|
|
TP_PROTO(unsigned int cpu_id),
|
|
|
|
TP_ARGS(cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("cpu_id=%lu", (unsigned long)__entry->cpu_id)
|
|
|
|
);
|
|
|
|
/* Deprecated dummy functions must be protected against multi-declartion */
|
|
#ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED
|
|
#define _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED
|
|
|
|
enum {
|
|
POWER_NONE = 0,
|
|
POWER_CSTATE = 1,
|
|
POWER_PSTATE = 2,
|
|
};
|
|
#endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */
|
|
|
|
#else /* CONFIG_EVENT_POWER_TRACING_DEPRECATED */
|
|
|
|
#ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED
|
|
#define _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED
|
|
enum {
|
|
POWER_NONE = 0,
|
|
POWER_CSTATE = 1,
|
|
POWER_PSTATE = 2,
|
|
};
|
|
|
|
/* These dummy declaration have to be ripped out when the deprecated
|
|
events get removed */
|
|
static inline void trace_power_start(u64 type, u64 state, u64 cpuid) {};
|
|
static inline void trace_power_end(u64 cpuid) {};
|
|
static inline void trace_power_start_rcuidle(u64 type, u64 state, u64 cpuid) {};
|
|
static inline void trace_power_end_rcuidle(u64 cpuid) {};
|
|
static inline void trace_power_frequency(u64 type, u64 state, u64 cpuid) {};
|
|
#endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */
|
|
|
|
#endif /* CONFIG_EVENT_POWER_TRACING_DEPRECATED */
|
|
|
|
/*
|
|
* The clock events are used for clock enable/disable and for
|
|
* clock rate change
|
|
*/
|
|
DECLARE_EVENT_CLASS(clock,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
__field( u64, state )
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
__entry->state = state;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
|
|
(unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(clock, clock_enable,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(clock, clock_disable,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(clock, clock_set_rate,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(clock_set_parent,
|
|
|
|
TP_PROTO(const char *name, const char *parent_name),
|
|
|
|
TP_ARGS(name, parent_name),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
__string( parent_name, parent_name )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
__assign_str(parent_name, parent_name);
|
|
),
|
|
|
|
TP_printk("%s parent=%s", __get_str(name), __get_str(parent_name))
|
|
);
|
|
|
|
/*
|
|
* The power domain events are used for power domains transitions
|
|
*/
|
|
DECLARE_EVENT_CLASS(power_domain,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__string( name, name )
|
|
__field( u64, state )
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(name, name);
|
|
__entry->state = state;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("%s state=%lu cpu_id=%lu", __get_str(name),
|
|
(unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(power_domain, power_domain_target,
|
|
|
|
TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(name, state, cpu_id)
|
|
);
|
|
#endif /* _TRACE_POWER_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|