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