xref: /linux/include/trace/events/i2c.h (revision 4ab5a5d2a4a2289c2af07accbec7170ca5671f41)
1 /* I2C 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-base.c
22  */
23 extern int i2c_transfer_trace_reg(void);
24 extern void i2c_transfer_trace_unreg(void);
25 
26 /*
27  * __i2c_transfer() write request
28  */
29 TRACE_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  */
62 TRACE_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  */
93 TRACE_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  */
126 TRACE_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 #endif /* _TRACE_I2C_H */
148 
149 /* This part must be outside protection */
150 #include <trace/define_trace.h>
151