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