| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 |  | 
|---|
| 3 | #undef TRACE_SYSTEM | 
|---|
| 4 | #define TRACE_SYSTEM rpm | 
|---|
| 5 |  | 
|---|
| 6 | #if !defined(_TRACE_RUNTIME_POWER_H) || defined(TRACE_HEADER_MULTI_READ) | 
|---|
| 7 | #define _TRACE_RUNTIME_POWER_H | 
|---|
| 8 |  | 
|---|
| 9 | #include <linux/ktime.h> | 
|---|
| 10 | #include <linux/tracepoint.h> | 
|---|
| 11 |  | 
|---|
| 12 | struct device; | 
|---|
| 13 |  | 
|---|
| 14 | /* | 
|---|
| 15 | * The rpm_internal events are used for tracing some important | 
|---|
| 16 | * runtime pm internal functions. | 
|---|
| 17 | */ | 
|---|
| 18 | DECLARE_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_count | 
|---|
| 57 | ) | 
|---|
| 58 | ); | 
|---|
| 59 | DEFINE_EVENT(rpm_internal, rpm_suspend, | 
|---|
| 60 |  | 
|---|
| 61 | TP_PROTO(struct device *dev, int flags), | 
|---|
| 62 |  | 
|---|
| 63 | TP_ARGS(dev, flags) | 
|---|
| 64 | ); | 
|---|
| 65 | DEFINE_EVENT(rpm_internal, rpm_resume, | 
|---|
| 66 |  | 
|---|
| 67 | TP_PROTO(struct device *dev, int flags), | 
|---|
| 68 |  | 
|---|
| 69 | TP_ARGS(dev, flags) | 
|---|
| 70 | ); | 
|---|
| 71 | DEFINE_EVENT(rpm_internal, rpm_idle, | 
|---|
| 72 |  | 
|---|
| 73 | TP_PROTO(struct device *dev, int flags), | 
|---|
| 74 |  | 
|---|
| 75 | TP_ARGS(dev, flags) | 
|---|
| 76 | ); | 
|---|
| 77 | DEFINE_EVENT(rpm_internal, rpm_usage, | 
|---|
| 78 |  | 
|---|
| 79 | TP_PROTO(struct device *dev, int flags), | 
|---|
| 80 |  | 
|---|
| 81 | TP_ARGS(dev, flags) | 
|---|
| 82 | ); | 
|---|
| 83 |  | 
|---|
| 84 | TRACE_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 EM | 
|---|
| 113 | #undef EMe | 
|---|
| 114 | #define EM(a, b)	TRACE_DEFINE_ENUM(a); | 
|---|
| 115 | #define EMe(a, b)	TRACE_DEFINE_ENUM(a); | 
|---|
| 116 |  | 
|---|
| 117 | RPM_STATUS_STRINGS | 
|---|
| 118 |  | 
|---|
| 119 | /* | 
|---|
| 120 | * Now redefine the EM() and EMe() macros to map the enums to the strings that | 
|---|
| 121 | * will be printed in the output. | 
|---|
| 122 | */ | 
|---|
| 123 | #undef EM | 
|---|
| 124 | #undef EMe | 
|---|
| 125 | #define EM(a, b)	{ a, b }, | 
|---|
| 126 | #define EMe(a, b)	{ a, b } | 
|---|
| 127 |  | 
|---|
| 128 | TRACE_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 |  | 
|---|