1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #undef TRACE_SYSTEM 4*4882a593Smuzhiyun #define TRACE_SYSTEM rpm 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ) 7*4882a593Smuzhiyun #define _TRACE_RUNTIME_POWER_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/ktime.h> 10*4882a593Smuzhiyun #include <linux/tracepoint.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct device; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * The rpm_internal events are used for tracing some important 16*4882a593Smuzhiyun * runtime pm internal functions. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun DECLARE_EVENT_CLASS(rpm_internal, 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun TP_PROTO(struct device *dev, int flags), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_ARGS(dev, flags), 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun TP_STRUCT__entry( 25*4882a593Smuzhiyun __string( name, dev_name(dev) ) 26*4882a593Smuzhiyun __field( int, flags ) 27*4882a593Smuzhiyun __field( int , usage_count ) 28*4882a593Smuzhiyun __field( int , disable_depth ) 29*4882a593Smuzhiyun __field( int , runtime_auto ) 30*4882a593Smuzhiyun __field( int , request_pending ) 31*4882a593Smuzhiyun __field( int , irq_safe ) 32*4882a593Smuzhiyun __field( int , child_count ) 33*4882a593Smuzhiyun ), 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TP_fast_assign( 36*4882a593Smuzhiyun __assign_str(name, dev_name(dev)); 37*4882a593Smuzhiyun __entry->flags = flags; 38*4882a593Smuzhiyun __entry->usage_count = atomic_read( 39*4882a593Smuzhiyun &dev->power.usage_count); 40*4882a593Smuzhiyun __entry->disable_depth = dev->power.disable_depth; 41*4882a593Smuzhiyun __entry->runtime_auto = dev->power.runtime_auto; 42*4882a593Smuzhiyun __entry->request_pending = dev->power.request_pending; 43*4882a593Smuzhiyun __entry->irq_safe = dev->power.irq_safe; 44*4882a593Smuzhiyun __entry->child_count = atomic_read( 45*4882a593Smuzhiyun &dev->power.child_count); 46*4882a593Smuzhiyun ), 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d" 49*4882a593Smuzhiyun " irq-%-1d child-%d", 50*4882a593Smuzhiyun __get_str(name), __entry->flags, 51*4882a593Smuzhiyun __entry->usage_count, 52*4882a593Smuzhiyun __entry->disable_depth, 53*4882a593Smuzhiyun __entry->runtime_auto, 54*4882a593Smuzhiyun __entry->request_pending, 55*4882a593Smuzhiyun __entry->irq_safe, 56*4882a593Smuzhiyun __entry->child_count 57*4882a593Smuzhiyun ) 58*4882a593Smuzhiyun ); 59*4882a593Smuzhiyun DEFINE_EVENT(rpm_internal, rpm_suspend, 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun TP_PROTO(struct device *dev, int flags), 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun TP_ARGS(dev, flags) 64*4882a593Smuzhiyun ); 65*4882a593Smuzhiyun DEFINE_EVENT(rpm_internal, rpm_resume, 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun TP_PROTO(struct device *dev, int flags), 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun TP_ARGS(dev, flags) 70*4882a593Smuzhiyun ); 71*4882a593Smuzhiyun DEFINE_EVENT(rpm_internal, rpm_idle, 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun TP_PROTO(struct device *dev, int flags), 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TP_ARGS(dev, flags) 76*4882a593Smuzhiyun ); 77*4882a593Smuzhiyun DEFINE_EVENT(rpm_internal, rpm_usage, 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun TP_PROTO(struct device *dev, int flags), 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun TP_ARGS(dev, flags) 82*4882a593Smuzhiyun ); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun TRACE_EVENT(rpm_return_int, 85*4882a593Smuzhiyun TP_PROTO(struct device *dev, unsigned long ip, int ret), 86*4882a593Smuzhiyun TP_ARGS(dev, ip, ret), 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun TP_STRUCT__entry( 89*4882a593Smuzhiyun __string( name, dev_name(dev)) 90*4882a593Smuzhiyun __field( unsigned long, ip ) 91*4882a593Smuzhiyun __field( int, ret ) 92*4882a593Smuzhiyun ), 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun TP_fast_assign( 95*4882a593Smuzhiyun __assign_str(name, dev_name(dev)); 96*4882a593Smuzhiyun __entry->ip = ip; 97*4882a593Smuzhiyun __entry->ret = ret; 98*4882a593Smuzhiyun ), 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name), 101*4882a593Smuzhiyun __entry->ret) 102*4882a593Smuzhiyun ); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #endif /* _TRACE_RUNTIME_POWER_H */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* This part must be outside protection */ 107*4882a593Smuzhiyun #include <trace/define_trace.h> 108