Linux Audio

Check our new training course

Loading...
v5.9
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/* I2C message transfer tracepoints
  3 *
  4 * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
  5 * Written by David Howells (dhowells@redhat.com)
 
 
 
 
 
  6 */
  7#undef TRACE_SYSTEM
  8#define TRACE_SYSTEM i2c
  9
 10#if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
 11#define _TRACE_I2C_H
 12
 13#include <linux/i2c.h>
 14#include <linux/tracepoint.h>
 15
 16/*
 17 * drivers/i2c/i2c-core-base.c
 18 */
 19extern int i2c_transfer_trace_reg(void);
 20extern void i2c_transfer_trace_unreg(void);
 21
 22/*
 23 * __i2c_transfer() write request
 24 */
 25TRACE_EVENT_FN(i2c_write,
 26	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 27			int num),
 28	       TP_ARGS(adap, msg, num),
 29	       TP_STRUCT__entry(
 30		       __field(int,	adapter_nr		)
 31		       __field(__u16,	msg_nr			)
 32		       __field(__u16,	addr			)
 33		       __field(__u16,	flags			)
 34		       __field(__u16,	len			)
 35		       __dynamic_array(__u8, buf, msg->len)	),
 36	       TP_fast_assign(
 37		       __entry->adapter_nr = adap->nr;
 38		       __entry->msg_nr = num;
 39		       __entry->addr = msg->addr;
 40		       __entry->flags = msg->flags;
 41		       __entry->len = msg->len;
 42		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
 43			      ),
 44	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
 45			 __entry->adapter_nr,
 46			 __entry->msg_nr,
 47			 __entry->addr,
 48			 __entry->flags,
 49			 __entry->len,
 50			 __entry->len, __get_dynamic_array(buf)
 51			 ),
 52	       i2c_transfer_trace_reg,
 53	       i2c_transfer_trace_unreg);
 54
 55/*
 56 * __i2c_transfer() read request
 57 */
 58TRACE_EVENT_FN(i2c_read,
 59	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 60			int num),
 61	       TP_ARGS(adap, msg, num),
 62	       TP_STRUCT__entry(
 63		       __field(int,	adapter_nr		)
 64		       __field(__u16,	msg_nr			)
 65		       __field(__u16,	addr			)
 66		       __field(__u16,	flags			)
 67		       __field(__u16,	len			)
 68				),
 69	       TP_fast_assign(
 70		       __entry->adapter_nr = adap->nr;
 71		       __entry->msg_nr = num;
 72		       __entry->addr = msg->addr;
 73		       __entry->flags = msg->flags;
 74		       __entry->len = msg->len;
 75			      ),
 76	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u",
 77			 __entry->adapter_nr,
 78			 __entry->msg_nr,
 79			 __entry->addr,
 80			 __entry->flags,
 81			 __entry->len
 82			 ),
 83	       i2c_transfer_trace_reg,
 84		       i2c_transfer_trace_unreg);
 85
 86/*
 87 * __i2c_transfer() read reply
 88 */
 89TRACE_EVENT_FN(i2c_reply,
 90	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 91			int num),
 92	       TP_ARGS(adap, msg, num),
 93	       TP_STRUCT__entry(
 94		       __field(int,	adapter_nr		)
 95		       __field(__u16,	msg_nr			)
 96		       __field(__u16,	addr			)
 97		       __field(__u16,	flags			)
 98		       __field(__u16,	len			)
 99		       __dynamic_array(__u8, buf, msg->len)	),
100	       TP_fast_assign(
101		       __entry->adapter_nr = adap->nr;
102		       __entry->msg_nr = num;
103		       __entry->addr = msg->addr;
104		       __entry->flags = msg->flags;
105		       __entry->len = msg->len;
106		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
107			      ),
108	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
109			 __entry->adapter_nr,
110			 __entry->msg_nr,
111			 __entry->addr,
112			 __entry->flags,
113			 __entry->len,
114			 __entry->len, __get_dynamic_array(buf)
115			 ),
116	       i2c_transfer_trace_reg,
117	       i2c_transfer_trace_unreg);
118
119/*
120 * __i2c_transfer() result
121 */
122TRACE_EVENT_FN(i2c_result,
123	       TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
124	       TP_ARGS(adap, num, ret),
125	       TP_STRUCT__entry(
126		       __field(int,	adapter_nr		)
127		       __field(__u16,	nr_msgs			)
128		       __field(__s16,	ret			)
129				),
130	       TP_fast_assign(
131		       __entry->adapter_nr = adap->nr;
132		       __entry->nr_msgs = num;
133		       __entry->ret = ret;
134			      ),
135	       TP_printk("i2c-%d n=%u ret=%d",
136			 __entry->adapter_nr,
137			 __entry->nr_msgs,
138			 __entry->ret
139			 ),
140	       i2c_transfer_trace_reg,
141	       i2c_transfer_trace_unreg);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
143#endif /* _TRACE_I2C_H */
144
145/* This part must be outside protection */
146#include <trace/define_trace.h>
v4.6
  1/* I2C and SMBUS message transfer tracepoints
 
  2 *
  3 * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
  4 * Written by David Howells (dhowells@redhat.com)
  5 *
  6 * This program is free software; you can redistribute it and/or
  7 * modify it under the terms of the GNU General Public Licence
  8 * as published by the Free Software Foundation; either version
  9 * 2 of the Licence, or (at your option) any later version.
 10 */
 11#undef TRACE_SYSTEM
 12#define TRACE_SYSTEM i2c
 13
 14#if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
 15#define _TRACE_I2C_H
 16
 17#include <linux/i2c.h>
 18#include <linux/tracepoint.h>
 19
 20/*
 21 * drivers/i2c/i2c-core.c
 22 */
 23extern void i2c_transfer_trace_reg(void);
 24extern void i2c_transfer_trace_unreg(void);
 25
 26/*
 27 * __i2c_transfer() write request
 28 */
 29TRACE_EVENT_FN(i2c_write,
 30	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 31			int num),
 32	       TP_ARGS(adap, msg, num),
 33	       TP_STRUCT__entry(
 34		       __field(int,	adapter_nr		)
 35		       __field(__u16,	msg_nr			)
 36		       __field(__u16,	addr			)
 37		       __field(__u16,	flags			)
 38		       __field(__u16,	len			)
 39		       __dynamic_array(__u8, buf, msg->len)	),
 40	       TP_fast_assign(
 41		       __entry->adapter_nr = adap->nr;
 42		       __entry->msg_nr = num;
 43		       __entry->addr = msg->addr;
 44		       __entry->flags = msg->flags;
 45		       __entry->len = msg->len;
 46		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
 47			      ),
 48	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
 49			 __entry->adapter_nr,
 50			 __entry->msg_nr,
 51			 __entry->addr,
 52			 __entry->flags,
 53			 __entry->len,
 54			 __entry->len, __get_dynamic_array(buf)
 55			 ),
 56	       i2c_transfer_trace_reg,
 57	       i2c_transfer_trace_unreg);
 58
 59/*
 60 * __i2c_transfer() read request
 61 */
 62TRACE_EVENT_FN(i2c_read,
 63	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 64			int num),
 65	       TP_ARGS(adap, msg, num),
 66	       TP_STRUCT__entry(
 67		       __field(int,	adapter_nr		)
 68		       __field(__u16,	msg_nr			)
 69		       __field(__u16,	addr			)
 70		       __field(__u16,	flags			)
 71		       __field(__u16,	len			)
 72				),
 73	       TP_fast_assign(
 74		       __entry->adapter_nr = adap->nr;
 75		       __entry->msg_nr = num;
 76		       __entry->addr = msg->addr;
 77		       __entry->flags = msg->flags;
 78		       __entry->len = msg->len;
 79			      ),
 80	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u",
 81			 __entry->adapter_nr,
 82			 __entry->msg_nr,
 83			 __entry->addr,
 84			 __entry->flags,
 85			 __entry->len
 86			 ),
 87	       i2c_transfer_trace_reg,
 88		       i2c_transfer_trace_unreg);
 89
 90/*
 91 * __i2c_transfer() read reply
 92 */
 93TRACE_EVENT_FN(i2c_reply,
 94	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
 95			int num),
 96	       TP_ARGS(adap, msg, num),
 97	       TP_STRUCT__entry(
 98		       __field(int,	adapter_nr		)
 99		       __field(__u16,	msg_nr			)
100		       __field(__u16,	addr			)
101		       __field(__u16,	flags			)
102		       __field(__u16,	len			)
103		       __dynamic_array(__u8, buf, msg->len)	),
104	       TP_fast_assign(
105		       __entry->adapter_nr = adap->nr;
106		       __entry->msg_nr = num;
107		       __entry->addr = msg->addr;
108		       __entry->flags = msg->flags;
109		       __entry->len = msg->len;
110		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
111			      ),
112	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
113			 __entry->adapter_nr,
114			 __entry->msg_nr,
115			 __entry->addr,
116			 __entry->flags,
117			 __entry->len,
118			 __entry->len, __get_dynamic_array(buf)
119			 ),
120	       i2c_transfer_trace_reg,
121	       i2c_transfer_trace_unreg);
122
123/*
124 * __i2c_transfer() result
125 */
126TRACE_EVENT_FN(i2c_result,
127	       TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
128	       TP_ARGS(adap, num, ret),
129	       TP_STRUCT__entry(
130		       __field(int,	adapter_nr		)
131		       __field(__u16,	nr_msgs			)
132		       __field(__s16,	ret			)
133				),
134	       TP_fast_assign(
135		       __entry->adapter_nr = adap->nr;
136		       __entry->nr_msgs = num;
137		       __entry->ret = ret;
138			      ),
139	       TP_printk("i2c-%d n=%u ret=%d",
140			 __entry->adapter_nr,
141			 __entry->nr_msgs,
142			 __entry->ret
143			 ),
144	       i2c_transfer_trace_reg,
145	       i2c_transfer_trace_unreg);
146
147/*
148 * i2c_smbus_xfer() write data or procedure call request
149 */
150TRACE_EVENT_CONDITION(smbus_write,
151	TP_PROTO(const struct i2c_adapter *adap,
152		 u16 addr, unsigned short flags,
153		 char read_write, u8 command, int protocol,
154		 const union i2c_smbus_data *data),
155	TP_ARGS(adap, addr, flags, read_write, command, protocol, data),
156	TP_CONDITION(read_write == I2C_SMBUS_WRITE ||
157		     protocol == I2C_SMBUS_PROC_CALL ||
158		     protocol == I2C_SMBUS_BLOCK_PROC_CALL),
159	TP_STRUCT__entry(
160		__field(int,	adapter_nr		)
161		__field(__u16,	addr			)
162		__field(__u16,	flags			)
163		__field(__u8,	command			)
164		__field(__u8,	len			)
165		__field(__u32,	protocol		)
166		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
167	TP_fast_assign(
168		__entry->adapter_nr = adap->nr;
169		__entry->addr = addr;
170		__entry->flags = flags;
171		__entry->command = command;
172		__entry->protocol = protocol;
173
174		switch (protocol) {
175		case I2C_SMBUS_BYTE_DATA:
176			__entry->len = 1;
177			goto copy;
178		case I2C_SMBUS_WORD_DATA:
179		case I2C_SMBUS_PROC_CALL:
180			__entry->len = 2;
181			goto copy;
182		case I2C_SMBUS_BLOCK_DATA:
183		case I2C_SMBUS_BLOCK_PROC_CALL:
184		case I2C_SMBUS_I2C_BLOCK_DATA:
185			__entry->len = data->block[0] + 1;
186		copy:
187			memcpy(__entry->buf, data->block, __entry->len);
188			break;
189		case I2C_SMBUS_QUICK:
190		case I2C_SMBUS_BYTE:
191		case I2C_SMBUS_I2C_BLOCK_BROKEN:
192		default:
193			__entry->len = 0;
194		}
195		       ),
196	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
197		  __entry->adapter_nr,
198		  __entry->addr,
199		  __entry->flags,
200		  __entry->command,
201		  __print_symbolic(__entry->protocol,
202				   { I2C_SMBUS_QUICK,		"QUICK"	},
203				   { I2C_SMBUS_BYTE,		"BYTE"	},
204				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
205				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
206				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
207				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
208				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
209				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
210				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
211		  __entry->len,
212		  __entry->len, __entry->buf
213		  ));
214
215/*
216 * i2c_smbus_xfer() read data request
217 */
218TRACE_EVENT_CONDITION(smbus_read,
219	TP_PROTO(const struct i2c_adapter *adap,
220		 u16 addr, unsigned short flags,
221		 char read_write, u8 command, int protocol),
222	TP_ARGS(adap, addr, flags, read_write, command, protocol),
223	TP_CONDITION(!(read_write == I2C_SMBUS_WRITE ||
224		       protocol == I2C_SMBUS_PROC_CALL ||
225		       protocol == I2C_SMBUS_BLOCK_PROC_CALL)),
226	TP_STRUCT__entry(
227		__field(int,	adapter_nr		)
228		__field(__u16,	flags			)
229		__field(__u16,	addr			)
230		__field(__u8,	command			)
231		__field(__u32,	protocol		)
232		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
233	TP_fast_assign(
234		__entry->adapter_nr = adap->nr;
235		__entry->addr = addr;
236		__entry->flags = flags;
237		__entry->command = command;
238		__entry->protocol = protocol;
239		       ),
240	TP_printk("i2c-%d a=%03x f=%04x c=%x %s",
241		  __entry->adapter_nr,
242		  __entry->addr,
243		  __entry->flags,
244		  __entry->command,
245		  __print_symbolic(__entry->protocol,
246				   { I2C_SMBUS_QUICK,		"QUICK"	},
247				   { I2C_SMBUS_BYTE,		"BYTE"	},
248				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
249				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
250				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
251				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
252				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
253				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
254				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" })
255		  ));
256
257/*
258 * i2c_smbus_xfer() read data or procedure call reply
259 */
260TRACE_EVENT_CONDITION(smbus_reply,
261	TP_PROTO(const struct i2c_adapter *adap,
262		 u16 addr, unsigned short flags,
263		 char read_write, u8 command, int protocol,
264		 const union i2c_smbus_data *data),
265	TP_ARGS(adap, addr, flags, read_write, command, protocol, data),
266	TP_CONDITION(read_write == I2C_SMBUS_READ),
267	TP_STRUCT__entry(
268		__field(int,	adapter_nr		)
269		__field(__u16,	addr			)
270		__field(__u16,	flags			)
271		__field(__u8,	command			)
272		__field(__u8,	len			)
273		__field(__u32,	protocol		)
274		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
275	TP_fast_assign(
276		__entry->adapter_nr = adap->nr;
277		__entry->addr = addr;
278		__entry->flags = flags;
279		__entry->command = command;
280		__entry->protocol = protocol;
281
282		switch (protocol) {
283		case I2C_SMBUS_BYTE:
284		case I2C_SMBUS_BYTE_DATA:
285			__entry->len = 1;
286			goto copy;
287		case I2C_SMBUS_WORD_DATA:
288		case I2C_SMBUS_PROC_CALL:
289			__entry->len = 2;
290			goto copy;
291		case I2C_SMBUS_BLOCK_DATA:
292		case I2C_SMBUS_BLOCK_PROC_CALL:
293		case I2C_SMBUS_I2C_BLOCK_DATA:
294			__entry->len = data->block[0] + 1;
295		copy:
296			memcpy(__entry->buf, data->block, __entry->len);
297			break;
298		case I2C_SMBUS_QUICK:
299		case I2C_SMBUS_I2C_BLOCK_BROKEN:
300		default:
301			__entry->len = 0;
302		}
303		       ),
304	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
305		  __entry->adapter_nr,
306		  __entry->addr,
307		  __entry->flags,
308		  __entry->command,
309		  __print_symbolic(__entry->protocol,
310				   { I2C_SMBUS_QUICK,		"QUICK"	},
311				   { I2C_SMBUS_BYTE,		"BYTE"	},
312				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
313				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
314				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
315				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
316				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
317				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
318				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
319		  __entry->len,
320		  __entry->len, __entry->buf
321		  ));
322
323/*
324 * i2c_smbus_xfer() result
325 */
326TRACE_EVENT(smbus_result,
327	    TP_PROTO(const struct i2c_adapter *adap,
328		     u16 addr, unsigned short flags,
329		     char read_write, u8 command, int protocol,
330		     int res),
331	    TP_ARGS(adap, addr, flags, read_write, command, protocol, res),
332	    TP_STRUCT__entry(
333		    __field(int,	adapter_nr		)
334		    __field(__u16,	addr			)
335		    __field(__u16,	flags			)
336		    __field(__u8,	read_write		)
337		    __field(__u8,	command			)
338		    __field(__s16,	res			)
339		    __field(__u32,	protocol		)
340			     ),
341	    TP_fast_assign(
342		    __entry->adapter_nr = adap->nr;
343		    __entry->addr = addr;
344		    __entry->flags = flags;
345		    __entry->read_write = read_write;
346		    __entry->command = command;
347		    __entry->protocol = protocol;
348		    __entry->res = res;
349			   ),
350	    TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d",
351		      __entry->adapter_nr,
352		      __entry->addr,
353		      __entry->flags,
354		      __entry->command,
355		      __print_symbolic(__entry->protocol,
356				       { I2C_SMBUS_QUICK,		"QUICK"	},
357				       { I2C_SMBUS_BYTE,		"BYTE"	},
358				       { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
359				       { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
360				       { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
361				       { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
362				       { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
363				       { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
364				       { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
365		      __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd",
366		      __entry->res
367		      ));
368
369#endif /* _TRACE_I2C_H */
370
371/* This part must be outside protection */
372#include <trace/define_trace.h>