246 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/* SMBUS 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 smbus9 10#if !defined(_TRACE_SMBUS_H) || defined(TRACE_HEADER_MULTI_READ)11#define _TRACE_SMBUS_H12 13#include <linux/i2c.h>14#include <linux/tracepoint.h>15 16/*17 * drivers/i2c/i2c-core-smbus.c18 */19 20/*21 * i2c_smbus_xfer() write data or procedure call request22 */23TRACE_EVENT_CONDITION(smbus_write,24 TP_PROTO(const struct i2c_adapter *adap,25 u16 addr, unsigned short flags,26 char read_write, u8 command, int protocol,27 const union i2c_smbus_data *data),28 TP_ARGS(adap, addr, flags, read_write, command, protocol, data),29 TP_CONDITION(read_write == I2C_SMBUS_WRITE ||30 protocol == I2C_SMBUS_PROC_CALL ||31 protocol == I2C_SMBUS_BLOCK_PROC_CALL),32 TP_STRUCT__entry(33 __field(int, adapter_nr )34 __field(__u16, addr )35 __field(__u16, flags )36 __field(__u8, command )37 __field(__u8, len )38 __field(__u32, protocol )39 __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ),40 TP_fast_assign(41 __entry->adapter_nr = adap->nr;42 __entry->addr = addr;43 __entry->flags = flags;44 __entry->command = command;45 __entry->protocol = protocol;46 47 switch (protocol) {48 case I2C_SMBUS_BYTE_DATA:49 __entry->len = 1;50 goto copy;51 case I2C_SMBUS_WORD_DATA:52 case I2C_SMBUS_PROC_CALL:53 __entry->len = 2;54 goto copy;55 case I2C_SMBUS_BLOCK_DATA:56 case I2C_SMBUS_BLOCK_PROC_CALL:57 case I2C_SMBUS_I2C_BLOCK_DATA:58 __entry->len = data->block[0] + 1;59 copy:60 memcpy(__entry->buf, data->block, __entry->len);61 break;62 case I2C_SMBUS_QUICK:63 case I2C_SMBUS_BYTE:64 case I2C_SMBUS_I2C_BLOCK_BROKEN:65 default:66 __entry->len = 0;67 }68 ),69 TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",70 __entry->adapter_nr,71 __entry->addr,72 __entry->flags,73 __entry->command,74 __print_symbolic(__entry->protocol,75 { I2C_SMBUS_QUICK, "QUICK" },76 { I2C_SMBUS_BYTE, "BYTE" },77 { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" },78 { I2C_SMBUS_WORD_DATA, "WORD_DATA" },79 { I2C_SMBUS_PROC_CALL, "PROC_CALL" },80 { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" },81 { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" },82 { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" },83 { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }),84 __entry->len,85 __entry->len, __entry->buf86 ));87 88/*89 * i2c_smbus_xfer() read data request90 */91TRACE_EVENT_CONDITION(smbus_read,92 TP_PROTO(const struct i2c_adapter *adap,93 u16 addr, unsigned short flags,94 char read_write, u8 command, int protocol),95 TP_ARGS(adap, addr, flags, read_write, command, protocol),96 TP_CONDITION(!(read_write == I2C_SMBUS_WRITE ||97 protocol == I2C_SMBUS_PROC_CALL ||98 protocol == I2C_SMBUS_BLOCK_PROC_CALL)),99 TP_STRUCT__entry(100 __field(int, adapter_nr )101 __field(__u16, flags )102 __field(__u16, addr )103 __field(__u8, command )104 __field(__u32, protocol )105 __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ),106 TP_fast_assign(107 __entry->adapter_nr = adap->nr;108 __entry->addr = addr;109 __entry->flags = flags;110 __entry->command = command;111 __entry->protocol = protocol;112 ),113 TP_printk("i2c-%d a=%03x f=%04x c=%x %s",114 __entry->adapter_nr,115 __entry->addr,116 __entry->flags,117 __entry->command,118 __print_symbolic(__entry->protocol,119 { I2C_SMBUS_QUICK, "QUICK" },120 { I2C_SMBUS_BYTE, "BYTE" },121 { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" },122 { I2C_SMBUS_WORD_DATA, "WORD_DATA" },123 { I2C_SMBUS_PROC_CALL, "PROC_CALL" },124 { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" },125 { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" },126 { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" },127 { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" })128 ));129 130/*131 * i2c_smbus_xfer() read data or procedure call reply132 */133TRACE_EVENT_CONDITION(smbus_reply,134 TP_PROTO(const struct i2c_adapter *adap,135 u16 addr, unsigned short flags,136 char read_write, u8 command, int protocol,137 const union i2c_smbus_data *data, int res),138 TP_ARGS(adap, addr, flags, read_write, command, protocol, data, res),139 TP_CONDITION(res >= 0 && read_write == I2C_SMBUS_READ),140 TP_STRUCT__entry(141 __field(int, adapter_nr )142 __field(__u16, addr )143 __field(__u16, flags )144 __field(__u8, command )145 __field(__u8, len )146 __field(__u32, protocol )147 __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ),148 TP_fast_assign(149 __entry->adapter_nr = adap->nr;150 __entry->addr = addr;151 __entry->flags = flags;152 __entry->command = command;153 __entry->protocol = protocol;154 155 switch (protocol) {156 case I2C_SMBUS_BYTE:157 case I2C_SMBUS_BYTE_DATA:158 __entry->len = 1;159 goto copy;160 case I2C_SMBUS_WORD_DATA:161 case I2C_SMBUS_PROC_CALL:162 __entry->len = 2;163 goto copy;164 case I2C_SMBUS_BLOCK_DATA:165 case I2C_SMBUS_BLOCK_PROC_CALL:166 case I2C_SMBUS_I2C_BLOCK_DATA:167 __entry->len = data->block[0] + 1;168 copy:169 memcpy(__entry->buf, data->block, __entry->len);170 break;171 case I2C_SMBUS_QUICK:172 case I2C_SMBUS_I2C_BLOCK_BROKEN:173 default:174 __entry->len = 0;175 }176 ),177 TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",178 __entry->adapter_nr,179 __entry->addr,180 __entry->flags,181 __entry->command,182 __print_symbolic(__entry->protocol,183 { I2C_SMBUS_QUICK, "QUICK" },184 { I2C_SMBUS_BYTE, "BYTE" },185 { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" },186 { I2C_SMBUS_WORD_DATA, "WORD_DATA" },187 { I2C_SMBUS_PROC_CALL, "PROC_CALL" },188 { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" },189 { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" },190 { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" },191 { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }),192 __entry->len,193 __entry->len, __entry->buf194 ));195 196/*197 * i2c_smbus_xfer() result198 */199TRACE_EVENT(smbus_result,200 TP_PROTO(const struct i2c_adapter *adap,201 u16 addr, unsigned short flags,202 char read_write, u8 command, int protocol,203 int res),204 TP_ARGS(adap, addr, flags, read_write, command, protocol, res),205 TP_STRUCT__entry(206 __field(int, adapter_nr )207 __field(__u16, addr )208 __field(__u16, flags )209 __field(__u8, read_write )210 __field(__u8, command )211 __field(__s16, res )212 __field(__u32, protocol )213 ),214 TP_fast_assign(215 __entry->adapter_nr = adap->nr;216 __entry->addr = addr;217 __entry->flags = flags;218 __entry->read_write = read_write;219 __entry->command = command;220 __entry->protocol = protocol;221 __entry->res = res;222 ),223 TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d",224 __entry->adapter_nr,225 __entry->addr,226 __entry->flags,227 __entry->command,228 __print_symbolic(__entry->protocol,229 { I2C_SMBUS_QUICK, "QUICK" },230 { I2C_SMBUS_BYTE, "BYTE" },231 { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" },232 { I2C_SMBUS_WORD_DATA, "WORD_DATA" },233 { I2C_SMBUS_PROC_CALL, "PROC_CALL" },234 { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" },235 { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" },236 { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" },237 { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }),238 __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd",239 __entry->res240 ));241 242#endif /* _TRACE_SMBUS_H */243 244/* This part must be outside protection */245#include <trace/define_trace.h>246