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