1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM spi
4 
5 #if !defined(_TRACE_SPI_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_SPI_H
7 
8 #include <linux/ktime.h>
9 #include <linux/tracepoint.h>
10 
11 DECLARE_EVENT_CLASS(spi_controller,
12 
13 	TP_PROTO(struct spi_controller *controller),
14 
15 	TP_ARGS(controller),
16 
17 	TP_STRUCT__entry(
18 		__field(        int,           bus_num             )
19 	),
20 
21 	TP_fast_assign(
22 		__entry->bus_num = controller->bus_num;
23 	),
24 
25 	TP_printk("spi%d", (int)__entry->bus_num)
26 
27 );
28 
29 DEFINE_EVENT(spi_controller, spi_controller_idle,
30 
31 	TP_PROTO(struct spi_controller *controller),
32 
33 	TP_ARGS(controller)
34 
35 );
36 
37 DEFINE_EVENT(spi_controller, spi_controller_busy,
38 
39 	TP_PROTO(struct spi_controller *controller),
40 
41 	TP_ARGS(controller)
42 
43 );
44 
45 DECLARE_EVENT_CLASS(spi_message,
46 
47 	TP_PROTO(struct spi_message *msg),
48 
49 	TP_ARGS(msg),
50 
51 	TP_STRUCT__entry(
52 		__field(        int,            bus_num         )
53 		__field(        int,            chip_select     )
54 		__field(        struct spi_message *,   msg     )
55 	),
56 
57 	TP_fast_assign(
58 		__entry->bus_num = msg->spi->controller->bus_num;
59 		__entry->chip_select = msg->spi->chip_select;
60 		__entry->msg = msg;
61 	),
62 
63         TP_printk("spi%d.%d %p", (int)__entry->bus_num,
64 		  (int)__entry->chip_select,
65 		  (struct spi_message *)__entry->msg)
66 );
67 
68 DEFINE_EVENT(spi_message, spi_message_submit,
69 
70 	TP_PROTO(struct spi_message *msg),
71 
72 	TP_ARGS(msg)
73 
74 );
75 
76 DEFINE_EVENT(spi_message, spi_message_start,
77 
78 	TP_PROTO(struct spi_message *msg),
79 
80 	TP_ARGS(msg)
81 
82 );
83 
84 TRACE_EVENT(spi_message_done,
85 
86 	TP_PROTO(struct spi_message *msg),
87 
88 	TP_ARGS(msg),
89 
90 	TP_STRUCT__entry(
91 		__field(        int,            bus_num         )
92 		__field(        int,            chip_select     )
93 		__field(        struct spi_message *,   msg     )
94 		__field(        unsigned,       frame           )
95 		__field(        unsigned,       actual          )
96 	),
97 
98 	TP_fast_assign(
99 		__entry->bus_num = msg->spi->controller->bus_num;
100 		__entry->chip_select = msg->spi->chip_select;
101 		__entry->msg = msg;
102 		__entry->frame = msg->frame_length;
103 		__entry->actual = msg->actual_length;
104 	),
105 
106         TP_printk("spi%d.%d %p len=%u/%u", (int)__entry->bus_num,
107 		  (int)__entry->chip_select,
108 		  (struct spi_message *)__entry->msg,
109                   (unsigned)__entry->actual, (unsigned)__entry->frame)
110 );
111 
112 /*
113  * consider a buffer valid if non-NULL and if it doesn't match the dummy buffer
114  * that only exist to work with controllers that have SPI_CONTROLLER_MUST_TX or
115  * SPI_CONTROLLER_MUST_RX.
116  */
117 #define spi_valid_txbuf(msg, xfer) \
118 	(xfer->tx_buf && xfer->tx_buf != msg->spi->controller->dummy_tx)
119 #define spi_valid_rxbuf(msg, xfer) \
120 	(xfer->rx_buf && xfer->rx_buf != msg->spi->controller->dummy_rx)
121 
122 DECLARE_EVENT_CLASS(spi_transfer,
123 
124 	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer),
125 
126 	TP_ARGS(msg, xfer),
127 
128 	TP_STRUCT__entry(
129 		__field(        int,            bus_num         )
130 		__field(        int,            chip_select     )
131 		__field(        struct spi_transfer *,   xfer   )
132 		__field(        int,            len             )
133 		__dynamic_array(u8, rx_buf,
134 				spi_valid_rxbuf(msg, xfer) ?
135 					(xfer->len < 64 ? xfer->len : 64) : 0)
136 		__dynamic_array(u8, tx_buf,
137 				spi_valid_txbuf(msg, xfer) ?
138 					(xfer->len < 64 ? xfer->len : 64) : 0)
139 	),
140 
141 	TP_fast_assign(
142 		__entry->bus_num = msg->spi->controller->bus_num;
143 		__entry->chip_select = msg->spi->chip_select;
144 		__entry->xfer = xfer;
145 		__entry->len = xfer->len;
146 
147 		if (spi_valid_txbuf(msg, xfer))
148 			memcpy(__get_dynamic_array(tx_buf),
149 			       xfer->tx_buf, __get_dynamic_array_len(tx_buf));
150 
151 		if (spi_valid_rxbuf(msg, xfer))
152 			memcpy(__get_dynamic_array(rx_buf),
153 			       xfer->rx_buf, __get_dynamic_array_len(rx_buf));
154 	),
155 
156 	TP_printk("spi%d.%d %p len=%d tx=[%*phD] rx=[%*phD]",
157 		  __entry->bus_num, __entry->chip_select,
158 		  __entry->xfer, __entry->len,
159 		  __get_dynamic_array_len(tx_buf), __get_dynamic_array(tx_buf),
160 		  __get_dynamic_array_len(rx_buf), __get_dynamic_array(rx_buf))
161 );
162 
163 DEFINE_EVENT(spi_transfer, spi_transfer_start,
164 
165 	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer),
166 
167 	TP_ARGS(msg, xfer)
168 
169 );
170 
171 DEFINE_EVENT(spi_transfer, spi_transfer_stop,
172 
173 	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer),
174 
175 	TP_ARGS(msg, xfer)
176 
177 );
178 
179 #endif /* _TRACE_POWER_H */
180 
181 /* This part must be outside protection */
182 #include <trace/define_trace.h>
183