d714fb25e7
I2C slave events tracepoints can be enabled by: echo 1 > /sys/kernel/tracing/events/i2c_slave/enable and logs in /sys/kernel/tracing/trace will look like: ... i2c_slave: i2c-0 a=010 ret=0 WR_REQ [] ... i2c_slave: i2c-0 a=010 ret=0 WR_RCV [02] ... i2c_slave: i2c-0 a=010 ret=0 WR_RCV [0c] ... i2c_slave: i2c-0 a=010 ret=0 STOP [] ... i2c_slave: i2c-0 a=010 ret=0 RD_REQ [04] ... i2c_slave: i2c-0 a=010 ret=0 RD_PRO [b4] ... i2c_slave: i2c-0 a=010 ret=0 STOP [] formatted as: i2c-<adapter_nr> a=<addr> ret=<ret> <- callback return value <event> [<data>] trace printings can be selected by adding a filter like: echo adapter_nr==1 >/sys/kernel/tracing/events/i2c_slave/filter Signed-off-by: Jae Hyun Yoo <quic_jaehyoo@quicinc.com> Signed-off-by: Wolfram Sang <wsa@kernel.org>
68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* I2C slave tracepoints
|
|
*
|
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM i2c_slave
|
|
|
|
#if !defined(_TRACE_I2C_SLAVE_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_I2C_SLAVE_H
|
|
|
|
#include <linux/i2c.h>
|
|
#include <linux/tracepoint.h>
|
|
|
|
TRACE_DEFINE_ENUM(I2C_SLAVE_READ_REQUESTED);
|
|
TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_REQUESTED);
|
|
TRACE_DEFINE_ENUM(I2C_SLAVE_READ_PROCESSED);
|
|
TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_RECEIVED);
|
|
TRACE_DEFINE_ENUM(I2C_SLAVE_STOP);
|
|
|
|
#define show_event_type(type) \
|
|
__print_symbolic(type, \
|
|
{ I2C_SLAVE_READ_REQUESTED, "RD_REQ" }, \
|
|
{ I2C_SLAVE_WRITE_REQUESTED, "WR_REQ" }, \
|
|
{ I2C_SLAVE_READ_PROCESSED, "RD_PRO" }, \
|
|
{ I2C_SLAVE_WRITE_RECEIVED, "WR_RCV" }, \
|
|
{ I2C_SLAVE_STOP, " STOP" })
|
|
|
|
TRACE_EVENT(i2c_slave,
|
|
TP_PROTO(const struct i2c_client *client, enum i2c_slave_event event,
|
|
__u8 *val, int cb_ret),
|
|
TP_ARGS(client, event, val, cb_ret),
|
|
TP_STRUCT__entry(
|
|
__field(int, adapter_nr )
|
|
__field(int, ret )
|
|
__field(__u16, addr )
|
|
__field(__u16, len )
|
|
__field(enum i2c_slave_event, event )
|
|
__array(__u8, buf, 1) ),
|
|
|
|
TP_fast_assign(
|
|
__entry->adapter_nr = client->adapter->nr;
|
|
__entry->addr = client->addr;
|
|
__entry->event = event;
|
|
__entry->ret = cb_ret;
|
|
switch (event) {
|
|
case I2C_SLAVE_READ_REQUESTED:
|
|
case I2C_SLAVE_READ_PROCESSED:
|
|
case I2C_SLAVE_WRITE_RECEIVED:
|
|
__entry->len = 1;
|
|
memcpy(__entry->buf, val, __entry->len);
|
|
break;
|
|
default:
|
|
__entry->len = 0;
|
|
break;
|
|
}
|
|
),
|
|
TP_printk("i2c-%d a=%03x ret=%d %s [%*phD]",
|
|
__entry->adapter_nr, __entry->addr, __entry->ret,
|
|
show_event_type(__entry->event), __entry->len, __entry->buf
|
|
));
|
|
|
|
#endif /* _TRACE_I2C_SLAVE_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|