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