linux/include/trace/events/spi.h
<<
>>
Prefs
   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
  11DECLARE_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
  29DEFINE_EVENT(spi_controller, spi_controller_idle,
  30
  31        TP_PROTO(struct spi_controller *controller),
  32
  33        TP_ARGS(controller)
  34
  35);
  36
  37DEFINE_EVENT(spi_controller, spi_controller_busy,
  38
  39        TP_PROTO(struct spi_controller *controller),
  40
  41        TP_ARGS(controller)
  42
  43);
  44
  45DECLARE_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
  68DEFINE_EVENT(spi_message, spi_message_submit,
  69
  70        TP_PROTO(struct spi_message *msg),
  71
  72        TP_ARGS(msg)
  73
  74);
  75
  76DEFINE_EVENT(spi_message, spi_message_start,
  77
  78        TP_PROTO(struct spi_message *msg),
  79
  80        TP_ARGS(msg)
  81
  82);
  83
  84TRACE_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
 122DECLARE_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
 163DEFINE_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
 171DEFINE_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