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  */
19 extern int i2c_transfer_trace_reg(void);
20 extern void i2c_transfer_trace_unreg(void);
21 
22 /*
23  * __i2c_transfer() write request
24  */
25 TRACE_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  */
58 TRACE_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  */
89 TRACE_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  */
122 TRACE_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>
147