xref: /openbmc/linux/include/trace/events/smbus.h (revision b4d0d230)
1b4d0d230SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
222c78d1cSWolfram Sang /* SMBUS message transfer tracepoints
322c78d1cSWolfram Sang  *
422c78d1cSWolfram Sang  * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
522c78d1cSWolfram Sang  * Written by David Howells (dhowells@redhat.com)
622c78d1cSWolfram Sang  */
722c78d1cSWolfram Sang #undef TRACE_SYSTEM
822c78d1cSWolfram Sang #define TRACE_SYSTEM smbus
922c78d1cSWolfram Sang 
1022c78d1cSWolfram Sang #if !defined(_TRACE_SMBUS_H) || defined(TRACE_HEADER_MULTI_READ)
1122c78d1cSWolfram Sang #define _TRACE_SMBUS_H
1222c78d1cSWolfram Sang 
1322c78d1cSWolfram Sang #include <linux/i2c.h>
1422c78d1cSWolfram Sang #include <linux/tracepoint.h>
1522c78d1cSWolfram Sang 
1622c78d1cSWolfram Sang /*
1722c78d1cSWolfram Sang  * drivers/i2c/i2c-core-smbus.c
1822c78d1cSWolfram Sang  */
1922c78d1cSWolfram Sang 
2022c78d1cSWolfram Sang /*
2122c78d1cSWolfram Sang  * i2c_smbus_xfer() write data or procedure call request
2222c78d1cSWolfram Sang  */
2322c78d1cSWolfram Sang TRACE_EVENT_CONDITION(smbus_write,
2422c78d1cSWolfram Sang 	TP_PROTO(const struct i2c_adapter *adap,
2522c78d1cSWolfram Sang 		 u16 addr, unsigned short flags,
2622c78d1cSWolfram Sang 		 char read_write, u8 command, int protocol,
2722c78d1cSWolfram Sang 		 const union i2c_smbus_data *data),
2822c78d1cSWolfram Sang 	TP_ARGS(adap, addr, flags, read_write, command, protocol, data),
2922c78d1cSWolfram Sang 	TP_CONDITION(read_write == I2C_SMBUS_WRITE ||
3022c78d1cSWolfram Sang 		     protocol == I2C_SMBUS_PROC_CALL ||
3122c78d1cSWolfram Sang 		     protocol == I2C_SMBUS_BLOCK_PROC_CALL),
3222c78d1cSWolfram Sang 	TP_STRUCT__entry(
3322c78d1cSWolfram Sang 		__field(int,	adapter_nr		)
3422c78d1cSWolfram Sang 		__field(__u16,	addr			)
3522c78d1cSWolfram Sang 		__field(__u16,	flags			)
3622c78d1cSWolfram Sang 		__field(__u8,	command			)
3722c78d1cSWolfram Sang 		__field(__u8,	len			)
3822c78d1cSWolfram Sang 		__field(__u32,	protocol		)
3922c78d1cSWolfram Sang 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
4022c78d1cSWolfram Sang 	TP_fast_assign(
4122c78d1cSWolfram Sang 		__entry->adapter_nr = adap->nr;
4222c78d1cSWolfram Sang 		__entry->addr = addr;
4322c78d1cSWolfram Sang 		__entry->flags = flags;
4422c78d1cSWolfram Sang 		__entry->command = command;
4522c78d1cSWolfram Sang 		__entry->protocol = protocol;
4622c78d1cSWolfram Sang 
4722c78d1cSWolfram Sang 		switch (protocol) {
4822c78d1cSWolfram Sang 		case I2C_SMBUS_BYTE_DATA:
4922c78d1cSWolfram Sang 			__entry->len = 1;
5022c78d1cSWolfram Sang 			goto copy;
5122c78d1cSWolfram Sang 		case I2C_SMBUS_WORD_DATA:
5222c78d1cSWolfram Sang 		case I2C_SMBUS_PROC_CALL:
5322c78d1cSWolfram Sang 			__entry->len = 2;
5422c78d1cSWolfram Sang 			goto copy;
5522c78d1cSWolfram Sang 		case I2C_SMBUS_BLOCK_DATA:
5622c78d1cSWolfram Sang 		case I2C_SMBUS_BLOCK_PROC_CALL:
5722c78d1cSWolfram Sang 		case I2C_SMBUS_I2C_BLOCK_DATA:
5822c78d1cSWolfram Sang 			__entry->len = data->block[0] + 1;
5922c78d1cSWolfram Sang 		copy:
6022c78d1cSWolfram Sang 			memcpy(__entry->buf, data->block, __entry->len);
6122c78d1cSWolfram Sang 			break;
6222c78d1cSWolfram Sang 		case I2C_SMBUS_QUICK:
6322c78d1cSWolfram Sang 		case I2C_SMBUS_BYTE:
6422c78d1cSWolfram Sang 		case I2C_SMBUS_I2C_BLOCK_BROKEN:
6522c78d1cSWolfram Sang 		default:
6622c78d1cSWolfram Sang 			__entry->len = 0;
6722c78d1cSWolfram Sang 		}
6822c78d1cSWolfram Sang 		       ),
6922c78d1cSWolfram Sang 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
7022c78d1cSWolfram Sang 		  __entry->adapter_nr,
7122c78d1cSWolfram Sang 		  __entry->addr,
7222c78d1cSWolfram Sang 		  __entry->flags,
7322c78d1cSWolfram Sang 		  __entry->command,
7422c78d1cSWolfram Sang 		  __print_symbolic(__entry->protocol,
7522c78d1cSWolfram Sang 				   { I2C_SMBUS_QUICK,		"QUICK"	},
7622c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE,		"BYTE"	},
7722c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
7822c78d1cSWolfram Sang 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
7922c78d1cSWolfram Sang 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
8022c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
8122c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
8222c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
8322c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
8422c78d1cSWolfram Sang 		  __entry->len,
8522c78d1cSWolfram Sang 		  __entry->len, __entry->buf
8622c78d1cSWolfram Sang 		  ));
8722c78d1cSWolfram Sang 
8822c78d1cSWolfram Sang /*
8922c78d1cSWolfram Sang  * i2c_smbus_xfer() read data request
9022c78d1cSWolfram Sang  */
9122c78d1cSWolfram Sang TRACE_EVENT_CONDITION(smbus_read,
9222c78d1cSWolfram Sang 	TP_PROTO(const struct i2c_adapter *adap,
9322c78d1cSWolfram Sang 		 u16 addr, unsigned short flags,
9422c78d1cSWolfram Sang 		 char read_write, u8 command, int protocol),
9522c78d1cSWolfram Sang 	TP_ARGS(adap, addr, flags, read_write, command, protocol),
9622c78d1cSWolfram Sang 	TP_CONDITION(!(read_write == I2C_SMBUS_WRITE ||
9722c78d1cSWolfram Sang 		       protocol == I2C_SMBUS_PROC_CALL ||
9822c78d1cSWolfram Sang 		       protocol == I2C_SMBUS_BLOCK_PROC_CALL)),
9922c78d1cSWolfram Sang 	TP_STRUCT__entry(
10022c78d1cSWolfram Sang 		__field(int,	adapter_nr		)
10122c78d1cSWolfram Sang 		__field(__u16,	flags			)
10222c78d1cSWolfram Sang 		__field(__u16,	addr			)
10322c78d1cSWolfram Sang 		__field(__u8,	command			)
10422c78d1cSWolfram Sang 		__field(__u32,	protocol		)
10522c78d1cSWolfram Sang 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
10622c78d1cSWolfram Sang 	TP_fast_assign(
10722c78d1cSWolfram Sang 		__entry->adapter_nr = adap->nr;
10822c78d1cSWolfram Sang 		__entry->addr = addr;
10922c78d1cSWolfram Sang 		__entry->flags = flags;
11022c78d1cSWolfram Sang 		__entry->command = command;
11122c78d1cSWolfram Sang 		__entry->protocol = protocol;
11222c78d1cSWolfram Sang 		       ),
11322c78d1cSWolfram Sang 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s",
11422c78d1cSWolfram Sang 		  __entry->adapter_nr,
11522c78d1cSWolfram Sang 		  __entry->addr,
11622c78d1cSWolfram Sang 		  __entry->flags,
11722c78d1cSWolfram Sang 		  __entry->command,
11822c78d1cSWolfram Sang 		  __print_symbolic(__entry->protocol,
11922c78d1cSWolfram Sang 				   { I2C_SMBUS_QUICK,		"QUICK"	},
12022c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE,		"BYTE"	},
12122c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
12222c78d1cSWolfram Sang 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
12322c78d1cSWolfram Sang 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
12422c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
12522c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
12622c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
12722c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" })
12822c78d1cSWolfram Sang 		  ));
12922c78d1cSWolfram Sang 
13022c78d1cSWolfram Sang /*
13122c78d1cSWolfram Sang  * i2c_smbus_xfer() read data or procedure call reply
13222c78d1cSWolfram Sang  */
13322c78d1cSWolfram Sang TRACE_EVENT_CONDITION(smbus_reply,
13422c78d1cSWolfram Sang 	TP_PROTO(const struct i2c_adapter *adap,
13522c78d1cSWolfram Sang 		 u16 addr, unsigned short flags,
13622c78d1cSWolfram Sang 		 char read_write, u8 command, int protocol,
137d8434c31SJohn Sperbeck 		 const union i2c_smbus_data *data, int res),
138d8434c31SJohn Sperbeck 	TP_ARGS(adap, addr, flags, read_write, command, protocol, data, res),
139d8434c31SJohn Sperbeck 	TP_CONDITION(res >= 0 && read_write == I2C_SMBUS_READ),
14022c78d1cSWolfram Sang 	TP_STRUCT__entry(
14122c78d1cSWolfram Sang 		__field(int,	adapter_nr		)
14222c78d1cSWolfram Sang 		__field(__u16,	addr			)
14322c78d1cSWolfram Sang 		__field(__u16,	flags			)
14422c78d1cSWolfram Sang 		__field(__u8,	command			)
14522c78d1cSWolfram Sang 		__field(__u8,	len			)
14622c78d1cSWolfram Sang 		__field(__u32,	protocol		)
14722c78d1cSWolfram Sang 		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	),
14822c78d1cSWolfram Sang 	TP_fast_assign(
14922c78d1cSWolfram Sang 		__entry->adapter_nr = adap->nr;
15022c78d1cSWolfram Sang 		__entry->addr = addr;
15122c78d1cSWolfram Sang 		__entry->flags = flags;
15222c78d1cSWolfram Sang 		__entry->command = command;
15322c78d1cSWolfram Sang 		__entry->protocol = protocol;
15422c78d1cSWolfram Sang 
15522c78d1cSWolfram Sang 		switch (protocol) {
15622c78d1cSWolfram Sang 		case I2C_SMBUS_BYTE:
15722c78d1cSWolfram Sang 		case I2C_SMBUS_BYTE_DATA:
15822c78d1cSWolfram Sang 			__entry->len = 1;
15922c78d1cSWolfram Sang 			goto copy;
16022c78d1cSWolfram Sang 		case I2C_SMBUS_WORD_DATA:
16122c78d1cSWolfram Sang 		case I2C_SMBUS_PROC_CALL:
16222c78d1cSWolfram Sang 			__entry->len = 2;
16322c78d1cSWolfram Sang 			goto copy;
16422c78d1cSWolfram Sang 		case I2C_SMBUS_BLOCK_DATA:
16522c78d1cSWolfram Sang 		case I2C_SMBUS_BLOCK_PROC_CALL:
16622c78d1cSWolfram Sang 		case I2C_SMBUS_I2C_BLOCK_DATA:
16722c78d1cSWolfram Sang 			__entry->len = data->block[0] + 1;
16822c78d1cSWolfram Sang 		copy:
16922c78d1cSWolfram Sang 			memcpy(__entry->buf, data->block, __entry->len);
17022c78d1cSWolfram Sang 			break;
17122c78d1cSWolfram Sang 		case I2C_SMBUS_QUICK:
17222c78d1cSWolfram Sang 		case I2C_SMBUS_I2C_BLOCK_BROKEN:
17322c78d1cSWolfram Sang 		default:
17422c78d1cSWolfram Sang 			__entry->len = 0;
17522c78d1cSWolfram Sang 		}
17622c78d1cSWolfram Sang 		       ),
17722c78d1cSWolfram Sang 	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]",
17822c78d1cSWolfram Sang 		  __entry->adapter_nr,
17922c78d1cSWolfram Sang 		  __entry->addr,
18022c78d1cSWolfram Sang 		  __entry->flags,
18122c78d1cSWolfram Sang 		  __entry->command,
18222c78d1cSWolfram Sang 		  __print_symbolic(__entry->protocol,
18322c78d1cSWolfram Sang 				   { I2C_SMBUS_QUICK,		"QUICK"	},
18422c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE,		"BYTE"	},
18522c78d1cSWolfram Sang 				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
18622c78d1cSWolfram Sang 				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
18722c78d1cSWolfram Sang 				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
18822c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
18922c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
19022c78d1cSWolfram Sang 				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
19122c78d1cSWolfram Sang 				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
19222c78d1cSWolfram Sang 		  __entry->len,
19322c78d1cSWolfram Sang 		  __entry->len, __entry->buf
19422c78d1cSWolfram Sang 		  ));
19522c78d1cSWolfram Sang 
19622c78d1cSWolfram Sang /*
19722c78d1cSWolfram Sang  * i2c_smbus_xfer() result
19822c78d1cSWolfram Sang  */
19922c78d1cSWolfram Sang TRACE_EVENT(smbus_result,
20022c78d1cSWolfram Sang 	    TP_PROTO(const struct i2c_adapter *adap,
20122c78d1cSWolfram Sang 		     u16 addr, unsigned short flags,
20222c78d1cSWolfram Sang 		     char read_write, u8 command, int protocol,
20322c78d1cSWolfram Sang 		     int res),
20422c78d1cSWolfram Sang 	    TP_ARGS(adap, addr, flags, read_write, command, protocol, res),
20522c78d1cSWolfram Sang 	    TP_STRUCT__entry(
20622c78d1cSWolfram Sang 		    __field(int,	adapter_nr		)
20722c78d1cSWolfram Sang 		    __field(__u16,	addr			)
20822c78d1cSWolfram Sang 		    __field(__u16,	flags			)
20922c78d1cSWolfram Sang 		    __field(__u8,	read_write		)
21022c78d1cSWolfram Sang 		    __field(__u8,	command			)
21122c78d1cSWolfram Sang 		    __field(__s16,	res			)
21222c78d1cSWolfram Sang 		    __field(__u32,	protocol		)
21322c78d1cSWolfram Sang 			     ),
21422c78d1cSWolfram Sang 	    TP_fast_assign(
21522c78d1cSWolfram Sang 		    __entry->adapter_nr = adap->nr;
21622c78d1cSWolfram Sang 		    __entry->addr = addr;
21722c78d1cSWolfram Sang 		    __entry->flags = flags;
21822c78d1cSWolfram Sang 		    __entry->read_write = read_write;
21922c78d1cSWolfram Sang 		    __entry->command = command;
22022c78d1cSWolfram Sang 		    __entry->protocol = protocol;
22122c78d1cSWolfram Sang 		    __entry->res = res;
22222c78d1cSWolfram Sang 			   ),
22322c78d1cSWolfram Sang 	    TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d",
22422c78d1cSWolfram Sang 		      __entry->adapter_nr,
22522c78d1cSWolfram Sang 		      __entry->addr,
22622c78d1cSWolfram Sang 		      __entry->flags,
22722c78d1cSWolfram Sang 		      __entry->command,
22822c78d1cSWolfram Sang 		      __print_symbolic(__entry->protocol,
22922c78d1cSWolfram Sang 				       { I2C_SMBUS_QUICK,		"QUICK"	},
23022c78d1cSWolfram Sang 				       { I2C_SMBUS_BYTE,		"BYTE"	},
23122c78d1cSWolfram Sang 				       { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" },
23222c78d1cSWolfram Sang 				       { I2C_SMBUS_WORD_DATA,		"WORD_DATA" },
23322c78d1cSWolfram Sang 				       { I2C_SMBUS_PROC_CALL,		"PROC_CALL" },
23422c78d1cSWolfram Sang 				       { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" },
23522c78d1cSWolfram Sang 				       { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" },
23622c78d1cSWolfram Sang 				       { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" },
23722c78d1cSWolfram Sang 				       { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }),
23822c78d1cSWolfram Sang 		      __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd",
23922c78d1cSWolfram Sang 		      __entry->res
24022c78d1cSWolfram Sang 		      ));
24122c78d1cSWolfram Sang 
24222c78d1cSWolfram Sang #endif /* _TRACE_SMBUS_H */
24322c78d1cSWolfram Sang 
24422c78d1cSWolfram Sang /* This part must be outside protection */
24522c78d1cSWolfram Sang #include <trace/define_trace.h>
246