[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250820-linux_master_ti_sci_trace-v1-1-2a69c0abf55e@criticallink.com>
Date: Wed, 20 Aug 2025 14:10:44 -0400
From: Jonathan Cormier <jcormier@...ticallink.com>
To: Nishanth Menon <nm@...com>, Tero Kristo <kristo@...nel.org>,
Santosh Shilimkar <ssantosh@...nel.org>,
Steven Rostedt <rostedt@...dmis.org>,
Masami Hiramatsu <mhiramat@...nel.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Nishanth Menon <nm@...com>, Vignesh Raghavendra <vigneshr@...com>
Cc: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linux-trace-kernel@...r.kernel.org,
Jonathan Cormier <jcormier@...ticallink.com>
Subject: [PATCH 1/2] firmware: ti_sci: Add trace events
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 <jcormier@...ticallink.com>
---
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 <puranjay@...nel.org>
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
Powered by blists - more mailing lists