xref: /openbmc/linux/include/trace/events/i2c.h (revision 7f904d7e1f3ec7c2de47c024a5a5c30988b54703)
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