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