brintos

brintos / linux-shallow public Read only

0
0
Text · 7.3 KiB · 71a87ed Raw
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