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