^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* I2C message transfer tracepoints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #undef TRACE_SYSTEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define TRACE_SYSTEM i2c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define _TRACE_I2C_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/tracepoint.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * drivers/i2c/i2c-core-base.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) extern int i2c_transfer_trace_reg(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) extern void i2c_transfer_trace_unreg(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * __i2c_transfer() write request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) TRACE_EVENT_FN(i2c_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) int num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) TP_ARGS(adap, msg, num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) TP_STRUCT__entry(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) __field(int, adapter_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) __field(__u16, msg_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) __field(__u16, addr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) __field(__u16, flags )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) __field(__u16, len )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) __dynamic_array(__u8, buf, msg->len) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) TP_fast_assign(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) __entry->adapter_nr = adap->nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) __entry->msg_nr = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) __entry->addr = msg->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) __entry->flags = msg->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) __entry->len = msg->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) __entry->adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) __entry->msg_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) __entry->addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) __entry->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) __entry->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) __entry->len, __get_dynamic_array(buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) i2c_transfer_trace_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) i2c_transfer_trace_unreg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * __i2c_transfer() read request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) TRACE_EVENT_FN(i2c_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) TP_ARGS(adap, msg, num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) TP_STRUCT__entry(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) __field(int, adapter_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) __field(__u16, msg_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) __field(__u16, addr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) __field(__u16, flags )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __field(__u16, len )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) TP_fast_assign(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) __entry->adapter_nr = adap->nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) __entry->msg_nr = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) __entry->addr = msg->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) __entry->flags = msg->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) __entry->len = msg->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) TP_printk("i2c-%d #%u a=%03x f=%04x l=%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __entry->adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) __entry->msg_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) __entry->addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) __entry->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) __entry->len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) i2c_transfer_trace_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) i2c_transfer_trace_unreg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * __i2c_transfer() read reply
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) TRACE_EVENT_FN(i2c_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) TP_ARGS(adap, msg, num),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) TP_STRUCT__entry(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) __field(int, adapter_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) __field(__u16, msg_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) __field(__u16, addr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) __field(__u16, flags )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) __field(__u16, len )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) __dynamic_array(__u8, buf, msg->len) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) TP_fast_assign(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) __entry->adapter_nr = adap->nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) __entry->msg_nr = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) __entry->addr = msg->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) __entry->flags = msg->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) __entry->len = msg->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __entry->adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) __entry->msg_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) __entry->addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) __entry->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) __entry->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) __entry->len, __get_dynamic_array(buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) i2c_transfer_trace_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) i2c_transfer_trace_unreg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * __i2c_transfer() result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) TRACE_EVENT_FN(i2c_result,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) TP_ARGS(adap, num, ret),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) TP_STRUCT__entry(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) __field(int, adapter_nr )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) __field(__u16, nr_msgs )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) __field(__s16, ret )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) TP_fast_assign(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __entry->adapter_nr = adap->nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) __entry->nr_msgs = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __entry->ret = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) TP_printk("i2c-%d n=%u ret=%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) __entry->adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) __entry->nr_msgs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) __entry->ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) i2c_transfer_trace_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) i2c_transfer_trace_unreg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #endif /* _TRACE_I2C_H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* This part must be outside protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #include <trace/define_trace.h>