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>
147