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 
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 
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 
223 TRACE_EVENT(ufshcd_command,
224 	TP_PROTO(const char *dev_name, const char *str, unsigned int tag,
225 			u32 doorbell, int transfer_len, u32 intr, u64 lba,
226 			u8 opcode),
227 
228 	TP_ARGS(dev_name, str, tag, doorbell, transfer_len, intr, lba, opcode),
229 
230 	TP_STRUCT__entry(
231 		__string(dev_name, dev_name)
232 		__string(str, str)
233 		__field(unsigned int, tag)
234 		__field(u32, doorbell)
235 		__field(int, transfer_len)
236 		__field(u32, intr)
237 		__field(u64, lba)
238 		__field(u8, opcode)
239 	),
240 
241 	TP_fast_assign(
242 		__assign_str(dev_name, dev_name);
243 		__assign_str(str, str);
244 		__entry->tag = tag;
245 		__entry->doorbell = doorbell;
246 		__entry->transfer_len = transfer_len;
247 		__entry->intr = intr;
248 		__entry->lba = lba;
249 		__entry->opcode = opcode;
250 	),
251 
252 	TP_printk(
253 		"%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x",
254 		__get_str(str), __get_str(dev_name), __entry->tag,
255 		__entry->doorbell, __entry->transfer_len,
256 		__entry->intr, __entry->lba, (u32)__entry->opcode
257 	)
258 );
259 
260 TRACE_EVENT(ufshcd_upiu,
261 	TP_PROTO(const char *dev_name, const char *str, void *hdr, void *tsf),
262 
263 	TP_ARGS(dev_name, str, hdr, tsf),
264 
265 	TP_STRUCT__entry(
266 		__string(dev_name, dev_name)
267 		__string(str, str)
268 		__array(unsigned char, hdr, 12)
269 		__array(unsigned char, tsf, 16)
270 	),
271 
272 	TP_fast_assign(
273 		__assign_str(dev_name, dev_name);
274 		__assign_str(str, str);
275 		memcpy(__entry->hdr, hdr, sizeof(__entry->hdr));
276 		memcpy(__entry->tsf, tsf, sizeof(__entry->tsf));
277 	),
278 
279 	TP_printk(
280 		"%s: %s: HDR:%s, CDB:%s",
281 		__get_str(str), __get_str(dev_name),
282 		__print_hex(__entry->hdr, sizeof(__entry->hdr)),
283 		__print_hex(__entry->tsf, sizeof(__entry->tsf))
284 	)
285 );
286 
287 #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */
288 
289 /* This part must be outside protection */
290 #include <trace/define_trace.h>
291