7ff5ab47 |
1 | /* |
2 | * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. |
3 | * |
4 | * This program is free software; you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License version 2 and |
6 | * only version 2 as published by the Free Software Foundation. |
7 | * |
8 | * This program is distributed in the hope that it will be useful, |
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | * GNU General Public License for more details. |
12 | */ |
13 | |
14 | #undef TRACE_SYSTEM |
15 | #define TRACE_SYSTEM ufs |
16 | |
17 | #if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) |
18 | #define _TRACE_UFS_H |
19 | |
20 | #include <linux/tracepoint.h> |
21 | |
22 | #define UFS_LINK_STATES \ |
23 | EM(UIC_LINK_OFF_STATE) \ |
24 | EM(UIC_LINK_ACTIVE_STATE) \ |
25 | EMe(UIC_LINK_HIBERN8_STATE) |
26 | |
27 | #define UFS_PWR_MODES \ |
28 | EM(UFS_ACTIVE_PWR_MODE) \ |
29 | EM(UFS_SLEEP_PWR_MODE) \ |
30 | EMe(UFS_POWERDOWN_PWR_MODE) |
31 | |
32 | #define UFSCHD_CLK_GATING_STATES \ |
33 | EM(CLKS_OFF) \ |
34 | EM(CLKS_ON) \ |
35 | EM(REQ_CLKS_OFF) \ |
36 | EMe(REQ_CLKS_ON) |
37 | |
38 | /* Enums require being exported to userspace, for user tool parsing */ |
39 | #undef EM |
40 | #undef EMe |
41 | #define EM(a) TRACE_DEFINE_ENUM(a); |
42 | #define EMe(a) TRACE_DEFINE_ENUM(a); |
43 | |
44 | UFS_LINK_STATES; |
45 | UFS_PWR_MODES; |
46 | UFSCHD_CLK_GATING_STATES; |
47 | |
48 | /* |
49 | * Now redefine the EM() and EMe() macros to map the enums to the strings |
50 | * that will be printed in the output. |
51 | */ |
52 | #undef EM |
53 | #undef EMe |
54 | #define EM(a) { a, #a }, |
55 | #define EMe(a) { a, #a } |
56 | |
57 | TRACE_EVENT(ufshcd_clk_gating, |
58 | |
59 | TP_PROTO(const char *dev_name, int state), |
60 | |
61 | TP_ARGS(dev_name, state), |
62 | |
63 | TP_STRUCT__entry( |
64 | __string(dev_name, dev_name) |
65 | __field(int, state) |
66 | ), |
67 | |
68 | TP_fast_assign( |
69 | __assign_str(dev_name, dev_name); |
70 | __entry->state = state; |
71 | ), |
72 | |
73 | TP_printk("%s: gating state changed to %s", |
74 | __get_str(dev_name), |
75 | __print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES)) |
76 | ); |
77 | |
78 | TRACE_EVENT(ufshcd_clk_scaling, |
79 | |
80 | TP_PROTO(const char *dev_name, const char *state, const char *clk, |
81 | u32 prev_state, u32 curr_state), |
82 | |
83 | TP_ARGS(dev_name, state, clk, prev_state, curr_state), |
84 | |
85 | TP_STRUCT__entry( |
86 | __string(dev_name, dev_name) |
87 | __string(state, state) |
88 | __string(clk, clk) |
89 | __field(u32, prev_state) |
90 | __field(u32, curr_state) |
91 | ), |
92 | |
93 | TP_fast_assign( |
94 | __assign_str(dev_name, dev_name); |
95 | __assign_str(state, state); |
96 | __assign_str(clk, clk); |
97 | __entry->prev_state = prev_state; |
98 | __entry->curr_state = curr_state; |
99 | ), |
100 | |
101 | TP_printk("%s: %s %s from %u to %u Hz", |
102 | __get_str(dev_name), __get_str(state), __get_str(clk), |
103 | __entry->prev_state, __entry->curr_state) |
104 | ); |
105 | |
106 | TRACE_EVENT(ufshcd_auto_bkops_state, |
107 | |
108 | TP_PROTO(const char *dev_name, const char *state), |
109 | |
110 | TP_ARGS(dev_name, state), |
111 | |
112 | TP_STRUCT__entry( |
113 | __string(dev_name, dev_name) |
114 | __string(state, state) |
115 | ), |
116 | |
117 | TP_fast_assign( |
118 | __assign_str(dev_name, dev_name); |
119 | __assign_str(state, state); |
120 | ), |
121 | |
122 | TP_printk("%s: auto bkops - %s", |
123 | __get_str(dev_name), __get_str(state)) |
124 | ); |
125 | |
911a0771 |
126 | DECLARE_EVENT_CLASS(ufshcd_profiling_template, |
127 | TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, |
128 | int err), |
129 | |
130 | TP_ARGS(dev_name, profile_info, time_us, err), |
131 | |
132 | TP_STRUCT__entry( |
133 | __string(dev_name, dev_name) |
134 | __string(profile_info, profile_info) |
135 | __field(s64, time_us) |
136 | __field(int, err) |
137 | ), |
138 | |
139 | TP_fast_assign( |
140 | __assign_str(dev_name, dev_name); |
141 | __assign_str(profile_info, profile_info); |
142 | __entry->time_us = time_us; |
143 | __entry->err = err; |
144 | ), |
145 | |
146 | TP_printk("%s: %s: took %lld usecs, err %d", |
147 | __get_str(dev_name), __get_str(profile_info), |
148 | __entry->time_us, __entry->err) |
149 | ); |
150 | |
151 | DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8, |
152 | TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, |
153 | int err), |
154 | TP_ARGS(dev_name, profile_info, time_us, err)); |
155 | |
156 | DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating, |
157 | TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, |
158 | int err), |
159 | TP_ARGS(dev_name, profile_info, time_us, err)); |
160 | |
161 | DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling, |
162 | TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us, |
163 | int err), |
164 | TP_ARGS(dev_name, profile_info, time_us, err)); |
165 | |
7ff5ab47 |
166 | DECLARE_EVENT_CLASS(ufshcd_template, |
167 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
168 | int dev_state, int link_state), |
169 | |
170 | TP_ARGS(dev_name, err, usecs, dev_state, link_state), |
171 | |
172 | TP_STRUCT__entry( |
173 | __field(s64, usecs) |
174 | __field(int, err) |
175 | __string(dev_name, dev_name) |
176 | __field(int, dev_state) |
177 | __field(int, link_state) |
178 | ), |
179 | |
180 | TP_fast_assign( |
181 | __entry->usecs = usecs; |
182 | __entry->err = err; |
183 | __assign_str(dev_name, dev_name); |
184 | __entry->dev_state = dev_state; |
185 | __entry->link_state = link_state; |
186 | ), |
187 | |
188 | TP_printk( |
189 | "%s: took %lld usecs, dev_state: %s, link_state: %s, err %d", |
190 | __get_str(dev_name), |
191 | __entry->usecs, |
192 | __print_symbolic(__entry->dev_state, UFS_PWR_MODES), |
193 | __print_symbolic(__entry->link_state, UFS_LINK_STATES), |
194 | __entry->err |
195 | ) |
196 | ); |
197 | |
198 | DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend, |
199 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
200 | int dev_state, int link_state), |
201 | TP_ARGS(dev_name, err, usecs, dev_state, link_state)); |
202 | |
203 | DEFINE_EVENT(ufshcd_template, ufshcd_system_resume, |
204 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
205 | int dev_state, int link_state), |
206 | TP_ARGS(dev_name, err, usecs, dev_state, link_state)); |
207 | |
208 | DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend, |
209 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
210 | int dev_state, int link_state), |
211 | TP_ARGS(dev_name, err, usecs, dev_state, link_state)); |
212 | |
213 | DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume, |
214 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
215 | int dev_state, int link_state), |
216 | TP_ARGS(dev_name, err, usecs, dev_state, link_state)); |
217 | |
218 | DEFINE_EVENT(ufshcd_template, ufshcd_init, |
219 | TP_PROTO(const char *dev_name, int err, s64 usecs, |
220 | int dev_state, int link_state), |
221 | TP_ARGS(dev_name, err, usecs, dev_state, link_state)); |
222 | #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */ |
223 | |
224 | /* This part must be outside protection */ |
225 | #include <trace/define_trace.h> |