1*b4d0d230SThomas 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