1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM devfreq 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_DEVFREQ_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_DEVFREQ_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/devfreq.h> 9*4882a593Smuzhiyun #include <linux/tracepoint.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun TRACE_EVENT(devfreq_monitor, 12*4882a593Smuzhiyun TP_PROTO(struct devfreq *devfreq), 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun TP_ARGS(devfreq), 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun TP_STRUCT__entry( 17*4882a593Smuzhiyun __field(unsigned long, freq) 18*4882a593Smuzhiyun __field(unsigned long, busy_time) 19*4882a593Smuzhiyun __field(unsigned long, total_time) 20*4882a593Smuzhiyun __field(unsigned int, polling_ms) 21*4882a593Smuzhiyun __string(dev_name, dev_name(&devfreq->dev)) 22*4882a593Smuzhiyun ), 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun TP_fast_assign( 25*4882a593Smuzhiyun __entry->freq = devfreq->previous_freq; 26*4882a593Smuzhiyun __entry->busy_time = devfreq->last_status.busy_time; 27*4882a593Smuzhiyun __entry->total_time = devfreq->last_status.total_time; 28*4882a593Smuzhiyun __entry->polling_ms = devfreq->profile->polling_ms; 29*4882a593Smuzhiyun __assign_str(dev_name, dev_name(&devfreq->dev)); 30*4882a593Smuzhiyun ), 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun TP_printk("dev_name=%s freq=%lu polling_ms=%u load=%lu", 33*4882a593Smuzhiyun __get_str(dev_name), __entry->freq, __entry->polling_ms, 34*4882a593Smuzhiyun __entry->total_time == 0 ? 0 : 35*4882a593Smuzhiyun (100 * __entry->busy_time) / __entry->total_time) 36*4882a593Smuzhiyun ); 37*4882a593Smuzhiyun #endif /* _TRACE_DEVFREQ_H */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* This part must be outside protection */ 40*4882a593Smuzhiyun #include <trace/define_trace.h> 41