• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
4  */
5 
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM ufs
8 
9 #if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ)
10 #define _TRACE_UFS_H
11 
12 #include <linux/tracepoint.h>
13 
14 #define str_opcode(opcode)						\
15 	__print_symbolic(opcode,					\
16 		{ WRITE_16,		"WRITE_16" },			\
17 		{ WRITE_10,		"WRITE_10" },			\
18 		{ READ_16,		"READ_16" },			\
19 		{ READ_10,		"READ_10" },			\
20 		{ SYNCHRONIZE_CACHE,	"SYNC" },			\
21 		{ UNMAP,		"UNMAP" })
22 
23 #define UFS_LINK_STATES			\
24 	EM(UIC_LINK_OFF_STATE)		\
25 	EM(UIC_LINK_ACTIVE_STATE)	\
26 	EMe(UIC_LINK_HIBERN8_STATE)
27 
28 #define UFS_PWR_MODES			\
29 	EM(UFS_ACTIVE_PWR_MODE)		\
30 	EM(UFS_SLEEP_PWR_MODE)		\
31 	EMe(UFS_POWERDOWN_PWR_MODE)
32 
33 #define UFSCHD_CLK_GATING_STATES	\
34 	EM(CLKS_OFF)			\
35 	EM(CLKS_ON)			\
36 	EM(REQ_CLKS_OFF)		\
37 	EMe(REQ_CLKS_ON)
38 
39 /* Enums require being exported to userspace, for user tool parsing */
40 #undef EM
41 #undef EMe
42 #define EM(a)	TRACE_DEFINE_ENUM(a);
43 #define EMe(a)	TRACE_DEFINE_ENUM(a);
44 
45 UFS_LINK_STATES;
46 UFS_PWR_MODES;
47 UFSCHD_CLK_GATING_STATES;
48 
49 /*
50  * Now redefine the EM() and EMe() macros to map the enums to the strings
51  * that will be printed in the output.
52  */
53 #undef EM
54 #undef EMe
55 #define EM(a)	{ a, #a },
56 #define EMe(a)	{ a, #a }
57 
58 TRACE_EVENT(ufshcd_clk_gating,
59 
60 	TP_PROTO(const char *dev_name, int state),
61 
62 	TP_ARGS(dev_name, state),
63 
64 	TP_STRUCT__entry(
65 		__string(dev_name, dev_name)
66 		__field(int, state)
67 	),
68 
69 	TP_fast_assign(
70 		__assign_str(dev_name, dev_name);
71 		__entry->state = state;
72 	),
73 
74 	TP_printk("%s: gating state changed to %s",
75 		__get_str(dev_name),
76 		__print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES))
77 );
78 
79 TRACE_EVENT(ufshcd_clk_scaling,
80 
81 	TP_PROTO(const char *dev_name, const char *state, const char *clk,
82 		u32 prev_state, u32 curr_state),
83 
84 	TP_ARGS(dev_name, state, clk, prev_state, curr_state),
85 
86 	TP_STRUCT__entry(
87 		__string(dev_name, dev_name)
88 		__string(state, state)
89 		__string(clk, clk)
90 		__field(u32, prev_state)
91 		__field(u32, curr_state)
92 	),
93 
94 	TP_fast_assign(
95 		__assign_str(dev_name, dev_name);
96 		__assign_str(state, state);
97 		__assign_str(clk, clk);
98 		__entry->prev_state = prev_state;
99 		__entry->curr_state = curr_state;
100 	),
101 
102 	TP_printk("%s: %s %s from %u to %u Hz",
103 		__get_str(dev_name), __get_str(state), __get_str(clk),
104 		__entry->prev_state, __entry->curr_state)
105 );
106 
107 TRACE_EVENT(ufshcd_auto_bkops_state,
108 
109 	TP_PROTO(const char *dev_name, const char *state),
110 
111 	TP_ARGS(dev_name, state),
112 
113 	TP_STRUCT__entry(
114 		__string(dev_name, dev_name)
115 		__string(state, state)
116 	),
117 
118 	TP_fast_assign(
119 		__assign_str(dev_name, dev_name);
120 		__assign_str(state, state);
121 	),
122 
123 	TP_printk("%s: auto bkops - %s",
124 		__get_str(dev_name), __get_str(state))
125 );
126 
127 DECLARE_EVENT_CLASS(ufshcd_profiling_template,
128 	TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
129 		 int err),
130 
131 	TP_ARGS(dev_name, profile_info, time_us, err),
132 
133 	TP_STRUCT__entry(
134 		__string(dev_name, dev_name)
135 		__string(profile_info, profile_info)
136 		__field(s64, time_us)
137 		__field(int, err)
138 	),
139 
140 	TP_fast_assign(
141 		__assign_str(dev_name, dev_name);
142 		__assign_str(profile_info, profile_info);
143 		__entry->time_us = time_us;
144 		__entry->err = err;
145 	),
146 
147 	TP_printk("%s: %s: took %lld usecs, err %d",
148 		__get_str(dev_name), __get_str(profile_info),
149 		__entry->time_us, __entry->err)
150 );
151 
152 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_hibern8,
153 	TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
154 		 int err),
155 	TP_ARGS(dev_name, profile_info, time_us, err));
156 
157 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_gating,
158 	TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
159 		 int err),
160 	TP_ARGS(dev_name, profile_info, time_us, err));
161 
162 DEFINE_EVENT(ufshcd_profiling_template, ufshcd_profile_clk_scaling,
163 	TP_PROTO(const char *dev_name, const char *profile_info, s64 time_us,
164 		 int err),
165 	TP_ARGS(dev_name, profile_info, time_us, err));
166 
167 DECLARE_EVENT_CLASS(ufshcd_template,
168 	TP_PROTO(const char *dev_name, int err, s64 usecs,
169 		 int dev_state, int link_state),
170 
171 	TP_ARGS(dev_name, err, usecs, dev_state, link_state),
172 
173 	TP_STRUCT__entry(
174 		__field(s64, usecs)
175 		__field(int, err)
176 		__string(dev_name, dev_name)
177 		__field(int, dev_state)
178 		__field(int, link_state)
179 	),
180 
181 	TP_fast_assign(
182 		__entry->usecs = usecs;
183 		__entry->err = err;
184 		__assign_str(dev_name, dev_name);
185 		__entry->dev_state = dev_state;
186 		__entry->link_state = link_state;
187 	),
188 
189 	TP_printk(
190 		"%s: took %lld usecs, dev_state: %s, link_state: %s, err %d",
191 		__get_str(dev_name),
192 		__entry->usecs,
193 		__print_symbolic(__entry->dev_state, UFS_PWR_MODES),
194 		__print_symbolic(__entry->link_state, UFS_LINK_STATES),
195 		__entry->err
196 	)
197 );
198 
199 DEFINE_EVENT(ufshcd_template, ufshcd_system_suspend,
200 	     TP_PROTO(const char *dev_name, int err, s64 usecs,
201 		      int dev_state, int link_state),
202 	     TP_ARGS(dev_name, err, usecs, dev_state, link_state));
203 
204 DEFINE_EVENT(ufshcd_template, ufshcd_system_resume,
205 	     TP_PROTO(const char *dev_name, int err, s64 usecs,
206 		      int dev_state, int link_state),
207 	     TP_ARGS(dev_name, err, usecs, dev_state, link_state));
208 
209 DEFINE_EVENT(ufshcd_template, ufshcd_runtime_suspend,
210 	     TP_PROTO(const char *dev_name, int err, s64 usecs,
211 		      int dev_state, int link_state),
212 	     TP_ARGS(dev_name, err, usecs, dev_state, link_state));
213 
214 DEFINE_EVENT(ufshcd_template, ufshcd_runtime_resume,
215 	     TP_PROTO(const char *dev_name, int err, s64 usecs,
216 		      int dev_state, int link_state),
217 	     TP_ARGS(dev_name, err, usecs, dev_state, link_state));
218 
219 DEFINE_EVENT(ufshcd_template, ufshcd_init,
220 	     TP_PROTO(const char *dev_name, int err, s64 usecs,
221 		      int dev_state, int link_state),
222 	     TP_ARGS(dev_name, err, usecs, dev_state, link_state));
223 
224 TRACE_EVENT(ufshcd_command,
225 	TP_PROTO(const char *dev_name, const char *str, unsigned int tag,
226 			u32 doorbell, int transfer_len, u32 intr, u64 lba,
227 			u8 opcode, u8 group_id),
228 
229 	TP_ARGS(dev_name, str, tag, doorbell, transfer_len,
230 				intr, lba, opcode, group_id),
231 
232 	TP_STRUCT__entry(
233 		__string(dev_name, dev_name)
234 		__string(str, str)
235 		__field(unsigned int, tag)
236 		__field(u32, doorbell)
237 		__field(int, transfer_len)
238 		__field(u32, intr)
239 		__field(u64, lba)
240 		__field(u8, opcode)
241 		__field(u8, group_id)
242 	),
243 
244 	TP_fast_assign(
245 		__assign_str(dev_name, dev_name);
246 		__assign_str(str, str);
247 		__entry->tag = tag;
248 		__entry->doorbell = doorbell;
249 		__entry->transfer_len = transfer_len;
250 		__entry->intr = intr;
251 		__entry->lba = lba;
252 		__entry->opcode = opcode;
253 		__entry->group_id = group_id;
254 	),
255 
256 	TP_printk(
257 		"%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x",
258 		__get_str(str), __get_str(dev_name), __entry->tag,
259 		__entry->doorbell, __entry->transfer_len,
260 		__entry->intr, __entry->lba, (u32)__entry->opcode,
261 		str_opcode(__entry->opcode), (u32)__entry->group_id
262 	)
263 );
264 
265 TRACE_EVENT(ufshcd_uic_command,
266 	TP_PROTO(const char *dev_name, const char *str, u32 cmd,
267 		 u32 arg1, u32 arg2, u32 arg3),
268 
269 	TP_ARGS(dev_name, str, cmd, arg1, arg2, arg3),
270 
271 	TP_STRUCT__entry(
272 		__string(dev_name, dev_name)
273 		__string(str, str)
274 		__field(u32, cmd)
275 		__field(u32, arg1)
276 		__field(u32, arg2)
277 		__field(u32, arg3)
278 	),
279 
280 	TP_fast_assign(
281 		__assign_str(dev_name, dev_name);
282 		__assign_str(str, str);
283 		__entry->cmd = cmd;
284 		__entry->arg1 = arg1;
285 		__entry->arg2 = arg2;
286 		__entry->arg3 = arg3;
287 	),
288 
289 	TP_printk(
290 		"%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x",
291 		__get_str(str), __get_str(dev_name), __entry->cmd,
292 		__entry->arg1, __entry->arg2, __entry->arg3
293 	)
294 );
295 
296 TRACE_EVENT(ufshcd_upiu,
297 	TP_PROTO(const char *dev_name, const char *str, void *hdr, void *tsf),
298 
299 	TP_ARGS(dev_name, str, hdr, tsf),
300 
301 	TP_STRUCT__entry(
302 		__string(dev_name, dev_name)
303 		__string(str, str)
304 		__array(unsigned char, hdr, 12)
305 		__array(unsigned char, tsf, 16)
306 	),
307 
308 	TP_fast_assign(
309 		__assign_str(dev_name, dev_name);
310 		__assign_str(str, str);
311 		memcpy(__entry->hdr, hdr, sizeof(__entry->hdr));
312 		memcpy(__entry->tsf, tsf, sizeof(__entry->tsf));
313 	),
314 
315 	TP_printk(
316 		"%s: %s: HDR:%s, CDB:%s",
317 		__get_str(str), __get_str(dev_name),
318 		__print_hex(__entry->hdr, sizeof(__entry->hdr)),
319 		__print_hex(__entry->tsf, sizeof(__entry->tsf))
320 	)
321 );
322 
323 #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */
324 
325 /* This part must be outside protection */
326 #include <trace/define_trace.h>
327