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
  45TRACE_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->chip_select;
  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
  78TRACE_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->chip_select;
  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
 102DECLARE_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 = msg->spi->chip_select;
 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
 125DEFINE_EVENT(spi_message, spi_message_submit,
 126
 127        TP_PROTO(struct spi_message *msg),
 128
 129        TP_ARGS(msg)
 130
 131);
 132
 133DEFINE_EVENT(spi_message, spi_message_start,
 134
 135        TP_PROTO(struct spi_message *msg),
 136
 137        TP_ARGS(msg)
 138
 139);
 140
 141TRACE_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 = msg->spi->chip_select;
 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
 179DECLARE_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 = msg->spi->chip_select;
 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
 220DEFINE_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
 228DEFINE_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