xref: /OK3568_Linux_fs/kernel/include/trace/events/smbus.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /* SMBUS message transfer tracepoints
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
5*4882a593Smuzhiyun  * Written by David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #undef TRACE_SYSTEM
8*4882a593Smuzhiyun #define TRACE_SYSTEM smbus
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #if !defined(_TRACE_SMBUS_H) || defined(TRACE_HEADER_MULTI_READ)
11*4882a593Smuzhiyun #define _TRACE_SMBUS_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/i2c.h>
14*4882a593Smuzhiyun #include <linux/tracepoint.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  * drivers/i2c/i2c-core-smbus.c
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * i2c_smbus_xfer() write data or procedure call request
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun TRACE_EVENT_CONDITION(smbus_write,
24*4882a593Smuzhiyun 	TP_PROTO(const struct i2c_adapter *adap,
25*4882a593Smuzhiyun 		 u16 addr, unsigned short flags,
26*4882a593Smuzhiyun 		 char read_write, u8 command, int protocol,
27*4882a593Smuzhiyun 		 const union i2c_smbus_data *data),
28*4882a593Smuzhiyun 	TP_ARGS(adap, addr, flags, read_write, command, protocol, data),
29*4882a593Smuzhiyun 	TP_CONDITION(read_write == I2C_SMBUS_WRITE ||
30*4882a593Smuzhiyun 		     protocol == I2C_SMBUS_PROC_CALL ||
31*4882a593Smuzhiyun 		     protocol == I2C_SMBUS_BLOCK_PROC_CALL),
32*4882a593Smuzhiyun 	TP_STRUCT__entry(
33*4882a593Smuzhiyun 		__field(int,	adapter_nr		)
34*4882a593Smuzhiyun 		__field(__u16,	addr			)
35*4882a593Smuzhiyun 		__field(__u16,	flags			)
36*4882a593Smuzhiyun 		__field(__u8,	command			)
37*4882a593Smuzhiyun 		__field(__u8,	len			)
38*4882a593Smuzhiyun 		__field(__u32,	protocol		)
39*4882a593Smuzhiyun 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
40*4882a593Smuzhiyun 	TP_fast_assign(
41*4882a593Smuzhiyun 		__entry->adapter_nr = adap->nr;
42*4882a593Smuzhiyun 		__entry->addr = addr;
43*4882a593Smuzhiyun 		__entry->flags = flags;
44*4882a593Smuzhiyun 		__entry->command = command;
45*4882a593Smuzhiyun 		__entry->protocol = protocol;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 		switch (protocol) {
48*4882a593Smuzhiyun 		case I2C_SMBUS_BYTE_DATA:
49*4882a593Smuzhiyun 			__entry->len = 1;
50*4882a593Smuzhiyun 			goto copy;
51*4882a593Smuzhiyun 		case I2C_SMBUS_WORD_DATA:
52*4882a593Smuzhiyun 		case I2C_SMBUS_PROC_CALL:
53*4882a593Smuzhiyun 			__entry->len = 2;
54*4882a593Smuzhiyun 			goto copy;
55*4882a593Smuzhiyun 		case I2C_SMBUS_BLOCK_DATA:
56*4882a593Smuzhiyun 		case I2C_SMBUS_BLOCK_PROC_CALL:
57*4882a593Smuzhiyun 		case I2C_SMBUS_I2C_BLOCK_DATA:
58*4882a593Smuzhiyun 			__entry->len = data->block[0] + 1;
59*4882a593Smuzhiyun 		copy:
60*4882a593Smuzhiyun 			memcpy(__entry->buf, data->block, __entry->len);
61*4882a593Smuzhiyun 			break;
62*4882a593Smuzhiyun 		case I2C_SMBUS_QUICK:
63*4882a593Smuzhiyun 		case I2C_SMBUS_BYTE:
64*4882a593Smuzhiyun 		case I2C_SMBUS_I2C_BLOCK_BROKEN:
65*4882a593Smuzhiyun 		default:
66*4882a593Smuzhiyun 			__entry->len = 0;
67*4882a593Smuzhiyun 		}
68*4882a593Smuzhiyun 		       ),
69*4882a593Smuzhiyun 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
70*4882a593Smuzhiyun 		  __entry->adapter_nr,
71*4882a593Smuzhiyun 		  __entry->addr,
72*4882a593Smuzhiyun 		  __entry->flags,
73*4882a593Smuzhiyun 		  __entry->command,
74*4882a593Smuzhiyun 		  __print_symbolic(__entry->protocol,
75*4882a593Smuzhiyun 				   { I2C_SMBUS_QUICK,		"QUICK"	},
76*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE,		"BYTE"	},
77*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
78*4882a593Smuzhiyun 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
79*4882a593Smuzhiyun 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
80*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
81*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
82*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
83*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
84*4882a593Smuzhiyun 		  __entry->len,
85*4882a593Smuzhiyun 		  __entry->len, __entry->buf
86*4882a593Smuzhiyun 		  ));
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /*
89*4882a593Smuzhiyun  * i2c_smbus_xfer() read data request
90*4882a593Smuzhiyun  */
91*4882a593Smuzhiyun TRACE_EVENT_CONDITION(smbus_read,
92*4882a593Smuzhiyun 	TP_PROTO(const struct i2c_adapter *adap,
93*4882a593Smuzhiyun 		 u16 addr, unsigned short flags,
94*4882a593Smuzhiyun 		 char read_write, u8 command, int protocol),
95*4882a593Smuzhiyun 	TP_ARGS(adap, addr, flags, read_write, command, protocol),
96*4882a593Smuzhiyun 	TP_CONDITION(!(read_write == I2C_SMBUS_WRITE ||
97*4882a593Smuzhiyun 		       protocol == I2C_SMBUS_PROC_CALL ||
98*4882a593Smuzhiyun 		       protocol == I2C_SMBUS_BLOCK_PROC_CALL)),
99*4882a593Smuzhiyun 	TP_STRUCT__entry(
100*4882a593Smuzhiyun 		__field(int,	adapter_nr		)
101*4882a593Smuzhiyun 		__field(__u16,	flags			)
102*4882a593Smuzhiyun 		__field(__u16,	addr			)
103*4882a593Smuzhiyun 		__field(__u8,	command			)
104*4882a593Smuzhiyun 		__field(__u32,	protocol		)
105*4882a593Smuzhiyun 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
106*4882a593Smuzhiyun 	TP_fast_assign(
107*4882a593Smuzhiyun 		__entry->adapter_nr = adap->nr;
108*4882a593Smuzhiyun 		__entry->addr = addr;
109*4882a593Smuzhiyun 		__entry->flags = flags;
110*4882a593Smuzhiyun 		__entry->command = command;
111*4882a593Smuzhiyun 		__entry->protocol = protocol;
112*4882a593Smuzhiyun 		       ),
113*4882a593Smuzhiyun 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s",
114*4882a593Smuzhiyun 		  __entry->adapter_nr,
115*4882a593Smuzhiyun 		  __entry->addr,
116*4882a593Smuzhiyun 		  __entry->flags,
117*4882a593Smuzhiyun 		  __entry->command,
118*4882a593Smuzhiyun 		  __print_symbolic(__entry->protocol,
119*4882a593Smuzhiyun 				   { I2C_SMBUS_QUICK,		"QUICK"	},
120*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE,		"BYTE"	},
121*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
122*4882a593Smuzhiyun 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
123*4882a593Smuzhiyun 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
124*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
125*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
126*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
127*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" })
128*4882a593Smuzhiyun 		  ));
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /*
131*4882a593Smuzhiyun  * i2c_smbus_xfer() read data or procedure call reply
132*4882a593Smuzhiyun  */
133*4882a593Smuzhiyun TRACE_EVENT_CONDITION(smbus_reply,
134*4882a593Smuzhiyun 	TP_PROTO(const struct i2c_adapter *adap,
135*4882a593Smuzhiyun 		 u16 addr, unsigned short flags,
136*4882a593Smuzhiyun 		 char read_write, u8 command, int protocol,
137*4882a593Smuzhiyun 		 const union i2c_smbus_data *data, int res),
138*4882a593Smuzhiyun 	TP_ARGS(adap, addr, flags, read_write, command, protocol, data, res),
139*4882a593Smuzhiyun 	TP_CONDITION(res >= 0 && read_write == I2C_SMBUS_READ),
140*4882a593Smuzhiyun 	TP_STRUCT__entry(
141*4882a593Smuzhiyun 		__field(int,	adapter_nr		)
142*4882a593Smuzhiyun 		__field(__u16,	addr			)
143*4882a593Smuzhiyun 		__field(__u16,	flags			)
144*4882a593Smuzhiyun 		__field(__u8,	command			)
145*4882a593Smuzhiyun 		__field(__u8,	len			)
146*4882a593Smuzhiyun 		__field(__u32,	protocol		)
147*4882a593Smuzhiyun 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
148*4882a593Smuzhiyun 	TP_fast_assign(
149*4882a593Smuzhiyun 		__entry->adapter_nr = adap->nr;
150*4882a593Smuzhiyun 		__entry->addr = addr;
151*4882a593Smuzhiyun 		__entry->flags = flags;
152*4882a593Smuzhiyun 		__entry->command = command;
153*4882a593Smuzhiyun 		__entry->protocol = protocol;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 		switch (protocol) {
156*4882a593Smuzhiyun 		case I2C_SMBUS_BYTE:
157*4882a593Smuzhiyun 		case I2C_SMBUS_BYTE_DATA:
158*4882a593Smuzhiyun 			__entry->len = 1;
159*4882a593Smuzhiyun 			goto copy;
160*4882a593Smuzhiyun 		case I2C_SMBUS_WORD_DATA:
161*4882a593Smuzhiyun 		case I2C_SMBUS_PROC_CALL:
162*4882a593Smuzhiyun 			__entry->len = 2;
163*4882a593Smuzhiyun 			goto copy;
164*4882a593Smuzhiyun 		case I2C_SMBUS_BLOCK_DATA:
165*4882a593Smuzhiyun 		case I2C_SMBUS_BLOCK_PROC_CALL:
166*4882a593Smuzhiyun 		case I2C_SMBUS_I2C_BLOCK_DATA:
167*4882a593Smuzhiyun 			__entry->len = data->block[0] + 1;
168*4882a593Smuzhiyun 		copy:
169*4882a593Smuzhiyun 			memcpy(__entry->buf, data->block, __entry->len);
170*4882a593Smuzhiyun 			break;
171*4882a593Smuzhiyun 		case I2C_SMBUS_QUICK:
172*4882a593Smuzhiyun 		case I2C_SMBUS_I2C_BLOCK_BROKEN:
173*4882a593Smuzhiyun 		default:
174*4882a593Smuzhiyun 			__entry->len = 0;
175*4882a593Smuzhiyun 		}
176*4882a593Smuzhiyun 		       ),
177*4882a593Smuzhiyun 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
178*4882a593Smuzhiyun 		  __entry->adapter_nr,
179*4882a593Smuzhiyun 		  __entry->addr,
180*4882a593Smuzhiyun 		  __entry->flags,
181*4882a593Smuzhiyun 		  __entry->command,
182*4882a593Smuzhiyun 		  __print_symbolic(__entry->protocol,
183*4882a593Smuzhiyun 				   { I2C_SMBUS_QUICK,		"QUICK"	},
184*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE,		"BYTE"	},
185*4882a593Smuzhiyun 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
186*4882a593Smuzhiyun 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
187*4882a593Smuzhiyun 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
188*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
189*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
190*4882a593Smuzhiyun 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
191*4882a593Smuzhiyun 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
192*4882a593Smuzhiyun 		  __entry->len,
193*4882a593Smuzhiyun 		  __entry->len, __entry->buf
194*4882a593Smuzhiyun 		  ));
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /*
197*4882a593Smuzhiyun  * i2c_smbus_xfer() result
198*4882a593Smuzhiyun  */
199*4882a593Smuzhiyun TRACE_EVENT(smbus_result,
200*4882a593Smuzhiyun 	    TP_PROTO(const struct i2c_adapter *adap,
201*4882a593Smuzhiyun 		     u16 addr, unsigned short flags,
202*4882a593Smuzhiyun 		     char read_write, u8 command, int protocol,
203*4882a593Smuzhiyun 		     int res),
204*4882a593Smuzhiyun 	    TP_ARGS(adap, addr, flags, read_write, command, protocol, res),
205*4882a593Smuzhiyun 	    TP_STRUCT__entry(
206*4882a593Smuzhiyun 		    __field(int,	adapter_nr		)
207*4882a593Smuzhiyun 		    __field(__u16,	addr			)
208*4882a593Smuzhiyun 		    __field(__u16,	flags			)
209*4882a593Smuzhiyun 		    __field(__u8,	read_write		)
210*4882a593Smuzhiyun 		    __field(__u8,	command			)
211*4882a593Smuzhiyun 		    __field(__s16,	res			)
212*4882a593Smuzhiyun 		    __field(__u32,	protocol		)
213*4882a593Smuzhiyun 			     ),
214*4882a593Smuzhiyun 	    TP_fast_assign(
215*4882a593Smuzhiyun 		    __entry->adapter_nr = adap->nr;
216*4882a593Smuzhiyun 		    __entry->addr = addr;
217*4882a593Smuzhiyun 		    __entry->flags = flags;
218*4882a593Smuzhiyun 		    __entry->read_write = read_write;
219*4882a593Smuzhiyun 		    __entry->command = command;
220*4882a593Smuzhiyun 		    __entry->protocol = protocol;
221*4882a593Smuzhiyun 		    __entry->res = res;
222*4882a593Smuzhiyun 			   ),
223*4882a593Smuzhiyun 	    TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d",
224*4882a593Smuzhiyun 		      __entry->adapter_nr,
225*4882a593Smuzhiyun 		      __entry->addr,
226*4882a593Smuzhiyun 		      __entry->flags,
227*4882a593Smuzhiyun 		      __entry->command,
228*4882a593Smuzhiyun 		      __print_symbolic(__entry->protocol,
229*4882a593Smuzhiyun 				       { I2C_SMBUS_QUICK,		"QUICK"	},
230*4882a593Smuzhiyun 				       { I2C_SMBUS_BYTE,		"BYTE"	},
231*4882a593Smuzhiyun 				       { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
232*4882a593Smuzhiyun 				       { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
233*4882a593Smuzhiyun 				       { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
234*4882a593Smuzhiyun 				       { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
235*4882a593Smuzhiyun 				       { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
236*4882a593Smuzhiyun 				       { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
237*4882a593Smuzhiyun 				       { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
238*4882a593Smuzhiyun 		      __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd",
239*4882a593Smuzhiyun 		      __entry->res
240*4882a593Smuzhiyun 		      ));
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun #endif /* _TRACE_SMBUS_H */
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun /* This part must be outside protection */
245*4882a593Smuzhiyun #include <trace/define_trace.h>
246