Add TI sci trace events to help to debug and measure the speed of the communication channel. The xfer_begin and xfer_end calls can be used to time how long a transfer takes. The rx_callback and msg_dump trace events help track the data that gets returned.
Based on tracing done in ARM SCMI Signed-off-by: Jonathan Cormier <[email protected]> --- MAINTAINERS | 1 + drivers/firmware/Makefile | 3 ++ drivers/firmware/ti_sci.c | 11 ++++++ drivers/firmware/ti_sci_trace.h | 87 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index fad6cb025a1918beec113b576cf28b76151745ef..a6fac706feceedfc5039ec07de954ac35a9af848 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24631,6 +24631,7 @@ F: drivers/pmdomain/ti/ti_sci_pm_domains.c F: include/dt-bindings/soc/ti,sci_pm_domain.h F: include/linux/soc/ti/ti_sci_inta_msi.h F: include/linux/soc/ti/ti_sci_protocol.h +F: include/trace/events/ti_sci.h TEXAS INSTRUMENTS' TMP117 TEMPERATURE SENSOR DRIVER M: Puranjay Mohan <[email protected]> diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 4ddec2820c96fa9be012e89dac3038968bb67039..a055c53bdfa9e5c64adb4e20a9ca6c6661d80297 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -2,6 +2,9 @@ # # Makefile for the linux kernel. # + +ccflags-y += -I$(src) # needed for trace events + obj-$(CONFIG_ARM_SCPI_PROTOCOL) += arm_scpi.o obj-$(CONFIG_ARM_SDE_INTERFACE) += arm_sdei.o obj-$(CONFIG_DMI) += dmi_scan.o diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index ae5fd1936ad322e5e3a94897cc042f6548f919e6..87b1330305939bb6b19bbdaa594b17b266092a34 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -127,6 +127,9 @@ struct ti_sci_info { #define cl_to_ti_sci_info(c) container_of(c, struct ti_sci_info, cl) #define handle_to_ti_sci_info(h) container_of(h, struct ti_sci_info, handle) +#define CREATE_TRACE_POINTS +#include "ti_sci_trace.h" + #ifdef CONFIG_DEBUG_FS /** @@ -269,6 +272,9 @@ static void ti_sci_rx_callback(struct mbox_client *cl, void *m) return; } + trace_ti_sci_rx_callback(hdr, 0); + trace_ti_sci_msg_dump(hdr, xfer); + ti_sci_dump_header_dbg(dev, hdr); /* Take a copy to the rx buffer.. */ memcpy(xfer->xfer_buf, mbox_msg->buf, xfer->rx_len); @@ -402,6 +408,9 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, int timeout; struct device *dev = info->dev; bool done_state = true; + struct ti_sci_msg_hdr *hdr = (struct ti_sci_msg_hdr *)xfer->tx_message.buf; + + trace_ti_sci_xfer_begin(hdr, 0); ret = mbox_send_message(info->chan_tx, &xfer->tx_message); if (ret < 0) @@ -437,6 +446,8 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, */ mbox_client_txdone(info->chan_tx, ret); + trace_ti_sci_xfer_end(hdr, ret); + return ret; } diff --git a/drivers/firmware/ti_sci_trace.h b/drivers/firmware/ti_sci_trace.h new file mode 100644 index 0000000000000000000000000000000000000000..7f99c41ea08aec6cf64d601576cad29b14c6ad5b --- /dev/null +++ b/drivers/firmware/ti_sci_trace.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM ti_sci + +#if !defined(_TRACE_TI_SCI_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_TI_SCI_H + +#include <linux/tracepoint.h> + + +DECLARE_EVENT_CLASS(ti_sci_hdr_event_class, + TP_PROTO(struct ti_sci_msg_hdr *hdr, int status), + TP_ARGS(hdr, status), + + TP_STRUCT__entry( + __field(u16, type) + __field(u8, host) + __field(u8, seq) + __field(u32, flags) + __field(int, status) + ), + + TP_fast_assign( + __entry->type = hdr->type; + __entry->host = hdr->host; + __entry->seq = hdr->seq; + __entry->flags = hdr->flags; + __entry->status = status; + ), + + TP_printk("type=%04X host=%02X seq=%02X flags=%08X status=%d", + __entry->type, __entry->host, __entry->seq, __entry->flags, __entry->status) +); + +DEFINE_EVENT(ti_sci_hdr_event_class, + ti_sci_xfer_begin, + TP_PROTO(struct ti_sci_msg_hdr *hdr, int status), + TP_ARGS(hdr, status) +); + +DEFINE_EVENT(ti_sci_hdr_event_class, + ti_sci_rx_callback, + TP_PROTO(struct ti_sci_msg_hdr *hdr, int status), + TP_ARGS(hdr, status) +); + +DEFINE_EVENT(ti_sci_hdr_event_class, + ti_sci_xfer_end, + TP_PROTO(struct ti_sci_msg_hdr *hdr, int status), + TP_ARGS(hdr, status) +); + + +TRACE_EVENT(ti_sci_msg_dump, + TP_PROTO(struct ti_sci_msg_hdr *hdr, struct ti_sci_xfer *xfer), + TP_ARGS(hdr, xfer), + + TP_STRUCT__entry( + __field(u16, type) + __field(u8, host) + __field(u8, seq) + __field(u32, flags) + __field(size_t, len) + __dynamic_array(unsigned char, cmd, xfer->rx_len) + ), + + TP_fast_assign( + __entry->type = hdr->type; + __entry->host = hdr->host; + __entry->seq = hdr->seq; + __entry->flags = hdr->flags; + __entry->len = xfer->rx_len; + memcpy(__get_dynamic_array(cmd), xfer->xfer_buf, __entry->len); + ), + + TP_printk("type=%04X host=%02X seq=%02X flags=%08X data=%s", + __entry->type, __entry->host, __entry->seq, __entry->flags, + __print_hex_str(__get_dynamic_array(cmd), __entry->len)) +); +#endif /* _TRACE_TI_SCI_H */ + +/* This part must be outside protection */ +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH . +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE ti_sci_trace +#include <trace/define_trace.h> -- 2.43.0
