Branch data Line data Source code
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 [ # # # # : 207 : 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 [ # # # # : 0 : DEFINE_EVENT(spi_controller, spi_controller_idle,
# # # # ]
30 : :
31 : : TP_PROTO(struct spi_controller *controller),
32 : :
33 : : TP_ARGS(controller)
34 : :
35 : : );
36 : :
37 [ # # # # : 0 : DEFINE_EVENT(spi_controller, spi_controller_busy,
# # # # ]
38 : :
39 : : TP_PROTO(struct spi_controller *controller),
40 : :
41 : : TP_ARGS(controller)
42 : :
43 : : );
44 : :
45 [ # # # # : 207 : 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 [ # # # # : 0 : DEFINE_EVENT(spi_message, spi_message_submit,
# # # # ]
69 : :
70 : : TP_PROTO(struct spi_message *msg),
71 : :
72 : : TP_ARGS(msg)
73 : :
74 : : );
75 : :
76 [ # # # # : 0 : DEFINE_EVENT(spi_message, spi_message_start,
# # # # ]
77 : :
78 : : TP_PROTO(struct spi_message *msg),
79 : :
80 : : TP_ARGS(msg)
81 : :
82 : : );
83 : :
84 [ # # # # : 207 : 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 [ # # # # : 207 : 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 [ # # # # : 0 : 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 [ # # # # : 0 : 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>
|