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 TRACE_EVENT(spi_setup, 46 TP_PROTO(struct spi_device *spi, int status), 47 TP_ARGS(spi, status), 48 49 TP_STRUCT__entry( 50 __field(int, bus_num) 51 __field(int, chip_select) 52 __field(unsigned long, mode) 53 __field(unsigned int, bits_per_word) 54 __field(unsigned int, max_speed_hz) 55 __field(int, status) 56 ), 57 58 TP_fast_assign( 59 __entry->bus_num = spi->controller->bus_num; 60 __entry->chip_select = spi_get_chipselect(spi, 0); 61 __entry->mode = spi->mode; 62 __entry->bits_per_word = spi->bits_per_word; 63 __entry->max_speed_hz = spi->max_speed_hz; 64 __entry->status = status; 65 ), 66 67 TP_printk("spi%d.%d setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d", 68 __entry->bus_num, __entry->chip_select, 69 (__entry->mode & SPI_MODE_X_MASK), 70 (__entry->mode & SPI_CS_HIGH) ? "cs_high, " : "", 71 (__entry->mode & SPI_LSB_FIRST) ? "lsb, " : "", 72 (__entry->mode & SPI_3WIRE) ? "3wire, " : "", 73 (__entry->mode & SPI_LOOP) ? "loopback, " : "", 74 __entry->bits_per_word, __entry->max_speed_hz, 75 __entry->status) 76 ); 77 78 TRACE_EVENT(spi_set_cs, 79 TP_PROTO(struct spi_device *spi, bool enable), 80 TP_ARGS(spi, enable), 81 82 TP_STRUCT__entry( 83 __field(int, bus_num) 84 __field(int, chip_select) 85 __field(unsigned long, mode) 86 __field(bool, enable) 87 ), 88 89 TP_fast_assign( 90 __entry->bus_num = spi->controller->bus_num; 91 __entry->chip_select = spi_get_chipselect(spi, 0); 92 __entry->mode = spi->mode; 93 __entry->enable = enable; 94 ), 95 96 TP_printk("spi%d.%d %s%s", 97 __entry->bus_num, __entry->chip_select, 98 __entry->enable ? "activate" : "deactivate", 99 (__entry->mode & SPI_CS_HIGH) ? ", cs_high" : "") 100 ); 101 102 DECLARE_EVENT_CLASS(spi_message, 103 104 TP_PROTO(struct spi_message *msg), 105 106 TP_ARGS(msg), 107 108 TP_STRUCT__entry( 109 __field( int, bus_num ) 110 __field( int, chip_select ) 111 __field( struct spi_message *, msg ) 112 ), 113 114 TP_fast_assign( 115 __entry->bus_num = msg->spi->controller->bus_num; 116 __entry->chip_select = spi_get_chipselect(msg->spi, 0); 117 __entry->msg = msg; 118 ), 119 120 TP_printk("spi%d.%d %p", (int)__entry->bus_num, 121 (int)__entry->chip_select, 122 (struct spi_message *)__entry->msg) 123 ); 124 125 DEFINE_EVENT(spi_message, spi_message_submit, 126 127 TP_PROTO(struct spi_message *msg), 128 129 TP_ARGS(msg) 130 131 ); 132 133 DEFINE_EVENT(spi_message, spi_message_start, 134 135 TP_PROTO(struct spi_message *msg), 136 137 TP_ARGS(msg) 138 139 ); 140 141 TRACE_EVENT(spi_message_done, 142 143 TP_PROTO(struct spi_message *msg), 144 145 TP_ARGS(msg), 146 147 TP_STRUCT__entry( 148 __field( int, bus_num ) 149 __field( int, chip_select ) 150 __field( struct spi_message *, msg ) 151 __field( unsigned, frame ) 152 __field( unsigned, actual ) 153 ), 154 155 TP_fast_assign( 156 __entry->bus_num = msg->spi->controller->bus_num; 157 __entry->chip_select = spi_get_chipselect(msg->spi, 0); 158 __entry->msg = msg; 159 __entry->frame = msg->frame_length; 160 __entry->actual = msg->actual_length; 161 ), 162 163 TP_printk("spi%d.%d %p len=%u/%u", (int)__entry->bus_num, 164 (int)__entry->chip_select, 165 (struct spi_message *)__entry->msg, 166 (unsigned)__entry->actual, (unsigned)__entry->frame) 167 ); 168 169 /* 170 * Consider a buffer valid if non-NULL and if it doesn't match the dummy buffer 171 * that only exist to work with controllers that have SPI_CONTROLLER_MUST_TX or 172 * SPI_CONTROLLER_MUST_RX. 173 */ 174 #define spi_valid_txbuf(msg, xfer) \ 175 (xfer->tx_buf && xfer->tx_buf != msg->spi->controller->dummy_tx) 176 #define spi_valid_rxbuf(msg, xfer) \ 177 (xfer->rx_buf && xfer->rx_buf != msg->spi->controller->dummy_rx) 178 179 DECLARE_EVENT_CLASS(spi_transfer, 180 181 TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 182 183 TP_ARGS(msg, xfer), 184 185 TP_STRUCT__entry( 186 __field( int, bus_num ) 187 __field( int, chip_select ) 188 __field( struct spi_transfer *, xfer ) 189 __field( int, len ) 190 __dynamic_array(u8, rx_buf, 191 spi_valid_rxbuf(msg, xfer) ? 192 (xfer->len < 64 ? xfer->len : 64) : 0) 193 __dynamic_array(u8, tx_buf, 194 spi_valid_txbuf(msg, xfer) ? 195 (xfer->len < 64 ? xfer->len : 64) : 0) 196 ), 197 198 TP_fast_assign( 199 __entry->bus_num = msg->spi->controller->bus_num; 200 __entry->chip_select = spi_get_chipselect(msg->spi, 0); 201 __entry->xfer = xfer; 202 __entry->len = xfer->len; 203 204 if (spi_valid_txbuf(msg, xfer)) 205 memcpy(__get_dynamic_array(tx_buf), 206 xfer->tx_buf, __get_dynamic_array_len(tx_buf)); 207 208 if (spi_valid_rxbuf(msg, xfer)) 209 memcpy(__get_dynamic_array(rx_buf), 210 xfer->rx_buf, __get_dynamic_array_len(rx_buf)); 211 ), 212 213 TP_printk("spi%d.%d %p len=%d tx=[%*phD] rx=[%*phD]", 214 __entry->bus_num, __entry->chip_select, 215 __entry->xfer, __entry->len, 216 __get_dynamic_array_len(tx_buf), __get_dynamic_array(tx_buf), 217 __get_dynamic_array_len(rx_buf), __get_dynamic_array(rx_buf)) 218 ); 219 220 DEFINE_EVENT(spi_transfer, spi_transfer_start, 221 222 TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 223 224 TP_ARGS(msg, xfer) 225 226 ); 227 228 DEFINE_EVENT(spi_transfer, spi_transfer_stop, 229 230 TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 231 232 TP_ARGS(msg, xfer) 233 234 ); 235 236 #endif /* _TRACE_POWER_H */ 237 238 /* This part must be outside protection */ 239 #include <trace/define_trace.h> 240