150 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2 3#undef TRACE_SYSTEM4#define TRACE_SYSTEM rpm5 6#if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ)7#define _TRACE_RUNTIME_POWER_H8 9#include <linux/ktime.h>10#include <linux/tracepoint.h>11 12struct device;13 14/*15 * The rpm_internal events are used for tracing some important16 * runtime pm internal functions.17 */18DECLARE_EVENT_CLASS(rpm_internal,19 20 TP_PROTO(struct device *dev, int flags),21 22 TP_ARGS(dev, flags),23 24 TP_STRUCT__entry(25 __string( name, dev_name(dev) )26 __field( int, flags )27 __field( int , usage_count )28 __field( int , disable_depth )29 __field( int , runtime_auto )30 __field( int , request_pending )31 __field( int , irq_safe )32 __field( int , child_count )33 ),34 35 TP_fast_assign(36 __assign_str(name);37 __entry->flags = flags;38 __entry->usage_count = atomic_read(39 &dev->power.usage_count);40 __entry->disable_depth = dev->power.disable_depth;41 __entry->runtime_auto = dev->power.runtime_auto;42 __entry->request_pending = dev->power.request_pending;43 __entry->irq_safe = dev->power.irq_safe;44 __entry->child_count = atomic_read(45 &dev->power.child_count);46 ),47 48 TP_printk("%s flags-%x cnt-%-2d dep-%-2d auto-%-1d p-%-1d"49 " irq-%-1d child-%d",50 __get_str(name), __entry->flags,51 __entry->usage_count,52 __entry->disable_depth,53 __entry->runtime_auto,54 __entry->request_pending,55 __entry->irq_safe,56 __entry->child_count57 )58);59DEFINE_EVENT(rpm_internal, rpm_suspend,60 61 TP_PROTO(struct device *dev, int flags),62 63 TP_ARGS(dev, flags)64);65DEFINE_EVENT(rpm_internal, rpm_resume,66 67 TP_PROTO(struct device *dev, int flags),68 69 TP_ARGS(dev, flags)70);71DEFINE_EVENT(rpm_internal, rpm_idle,72 73 TP_PROTO(struct device *dev, int flags),74 75 TP_ARGS(dev, flags)76);77DEFINE_EVENT(rpm_internal, rpm_usage,78 79 TP_PROTO(struct device *dev, int flags),80 81 TP_ARGS(dev, flags)82);83 84TRACE_EVENT(rpm_return_int,85 TP_PROTO(struct device *dev, unsigned long ip, int ret),86 TP_ARGS(dev, ip, ret),87 88 TP_STRUCT__entry(89 __string( name, dev_name(dev))90 __field( unsigned long, ip )91 __field( int, ret )92 ),93 94 TP_fast_assign(95 __assign_str(name);96 __entry->ip = ip;97 __entry->ret = ret;98 ),99 100 TP_printk("%pS:%s ret=%d", (void *)__entry->ip, __get_str(name),101 __entry->ret)102);103 104#define RPM_STATUS_STRINGS \105 EM(RPM_INVALID, "RPM_INVALID") \106 EM(RPM_ACTIVE, "RPM_ACTIVE") \107 EM(RPM_RESUMING, "RPM_RESUMING") \108 EM(RPM_SUSPENDED, "RPM_SUSPENDED") \109 EMe(RPM_SUSPENDING, "RPM_SUSPENDING")110 111/* Enums require being exported to userspace, for user tool parsing. */112#undef EM113#undef EMe114#define EM(a, b) TRACE_DEFINE_ENUM(a);115#define EMe(a, b) TRACE_DEFINE_ENUM(a);116 117RPM_STATUS_STRINGS118 119/*120 * Now redefine the EM() and EMe() macros to map the enums to the strings that121 * will be printed in the output.122 */123#undef EM124#undef EMe125#define EM(a, b) { a, b },126#define EMe(a, b) { a, b }127 128TRACE_EVENT(rpm_status,129 TP_PROTO(struct device *dev, enum rpm_status status),130 TP_ARGS(dev, status),131 132 TP_STRUCT__entry(133 __string(name, dev_name(dev))134 __field(int, status)135 ),136 137 TP_fast_assign(138 __assign_str(name);139 __entry->status = status;140 ),141 142 TP_printk("%s status=%s", __get_str(name),143 __print_symbolic(__entry->status, RPM_STATUS_STRINGS))144);145 146#endif /* _TRACE_RUNTIME_POWER_H */147 148/* This part must be outside protection */149#include <trace/define_trace.h>150