Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /* I2C message transfer tracepoints
0003  *
0004  * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
0006  */
0007 #undef TRACE_SYSTEM
0008 #define TRACE_SYSTEM i2c
0009 
0010 #if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
0011 #define _TRACE_I2C_H
0012 
0013 #include <linux/i2c.h>
0014 #include <linux/tracepoint.h>
0015 
0016 /*
0017  * drivers/i2c/i2c-core-base.c
0018  */
0019 extern int i2c_transfer_trace_reg(void);
0020 extern void i2c_transfer_trace_unreg(void);
0021 
0022 /*
0023  * __i2c_transfer() write request
0024  */
0025 TRACE_EVENT_FN(i2c_write,
0026            TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
0027             int num),
0028            TP_ARGS(adap, msg, num),
0029            TP_STRUCT__entry(
0030                __field(int, adapter_nr      )
0031                __field(__u16,   msg_nr          )
0032                __field(__u16,   addr            )
0033                __field(__u16,   flags           )
0034                __field(__u16,   len         )
0035                __dynamic_array(__u8, buf, msg->len) ),
0036            TP_fast_assign(
0037                __entry->adapter_nr = adap->nr;
0038                __entry->msg_nr = num;
0039                __entry->addr = msg->addr;
0040                __entry->flags = msg->flags;
0041                __entry->len = msg->len;
0042                memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
0043                   ),
0044            TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
0045              __entry->adapter_nr,
0046              __entry->msg_nr,
0047              __entry->addr,
0048              __entry->flags,
0049              __entry->len,
0050              __entry->len, __get_dynamic_array(buf)
0051              ),
0052            i2c_transfer_trace_reg,
0053            i2c_transfer_trace_unreg);
0054 
0055 /*
0056  * __i2c_transfer() read request
0057  */
0058 TRACE_EVENT_FN(i2c_read,
0059            TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
0060             int num),
0061            TP_ARGS(adap, msg, num),
0062            TP_STRUCT__entry(
0063                __field(int, adapter_nr      )
0064                __field(__u16,   msg_nr          )
0065                __field(__u16,   addr            )
0066                __field(__u16,   flags           )
0067                __field(__u16,   len         )
0068                 ),
0069            TP_fast_assign(
0070                __entry->adapter_nr = adap->nr;
0071                __entry->msg_nr = num;
0072                __entry->addr = msg->addr;
0073                __entry->flags = msg->flags;
0074                __entry->len = msg->len;
0075                   ),
0076            TP_printk("i2c-%d #%u a=%03x f=%04x l=%u",
0077              __entry->adapter_nr,
0078              __entry->msg_nr,
0079              __entry->addr,
0080              __entry->flags,
0081              __entry->len
0082              ),
0083            i2c_transfer_trace_reg,
0084                i2c_transfer_trace_unreg);
0085 
0086 /*
0087  * __i2c_transfer() read reply
0088  */
0089 TRACE_EVENT_FN(i2c_reply,
0090            TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
0091             int num),
0092            TP_ARGS(adap, msg, num),
0093            TP_STRUCT__entry(
0094                __field(int, adapter_nr      )
0095                __field(__u16,   msg_nr          )
0096                __field(__u16,   addr            )
0097                __field(__u16,   flags           )
0098                __field(__u16,   len         )
0099                __dynamic_array(__u8, buf, msg->len) ),
0100            TP_fast_assign(
0101                __entry->adapter_nr = adap->nr;
0102                __entry->msg_nr = num;
0103                __entry->addr = msg->addr;
0104                __entry->flags = msg->flags;
0105                __entry->len = msg->len;
0106                memcpy(__get_dynamic_array(buf), msg->buf, msg->len);
0107                   ),
0108            TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]",
0109              __entry->adapter_nr,
0110              __entry->msg_nr,
0111              __entry->addr,
0112              __entry->flags,
0113              __entry->len,
0114              __entry->len, __get_dynamic_array(buf)
0115              ),
0116            i2c_transfer_trace_reg,
0117            i2c_transfer_trace_unreg);
0118 
0119 /*
0120  * __i2c_transfer() result
0121  */
0122 TRACE_EVENT_FN(i2c_result,
0123            TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
0124            TP_ARGS(adap, num, ret),
0125            TP_STRUCT__entry(
0126                __field(int, adapter_nr      )
0127                __field(__u16,   nr_msgs         )
0128                __field(__s16,   ret         )
0129                 ),
0130            TP_fast_assign(
0131                __entry->adapter_nr = adap->nr;
0132                __entry->nr_msgs = num;
0133                __entry->ret = ret;
0134                   ),
0135            TP_printk("i2c-%d n=%u ret=%d",
0136              __entry->adapter_nr,
0137              __entry->nr_msgs,
0138              __entry->ret
0139              ),
0140            i2c_transfer_trace_reg,
0141            i2c_transfer_trace_unreg);
0142 
0143 #endif /* _TRACE_I2C_H */
0144 
0145 /* This part must be outside protection */
0146 #include <trace/define_trace.h>