new file mode 100644
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM rwmmio
+
+#if !defined(_TRACE_RWMMIO_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_RWMMIO_H
+
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(rwmmio_write,
+
+ TP_PROTO(unsigned long caller, unsigned long parent, u64 val,
+ u8 width, volatile void __iomem *addr),
+
+ TP_ARGS(caller, parent, val, width, addr),
+
+ TP_STRUCT__entry(
+ __field(u64, caller)
+ __field(u64, parent)
+ __field(u64, val)
+ __field(u64, addr)
+ __field(u8, width)
+ ),
+
+ TP_fast_assign(
+ __entry->caller = caller;
+ __entry->parent = parent;
+ __entry->val = val;
+ __entry->addr = (unsigned long)(void *)addr;
+ __entry->width = width;
+ ),
+
+ TP_printk("%pS <- %pS width=%d val=%#llx addr=%#llx",
+ (void *)(unsigned long)__entry->caller, (void *)(unsigned long)__entry->parent,
+ __entry->width, __entry->val, __entry->addr)
+);
+
+TRACE_EVENT(rwmmio_read,
+
+ TP_PROTO(unsigned long caller, unsigned long parent, u8 width,
+ const volatile void __iomem *addr),
+
+ TP_ARGS(caller, parent, width, addr),
+
+ TP_STRUCT__entry(
+ __field(u64, caller)
+ __field(u64, parent)
+ __field(u64, addr)
+ __field(u8, width)
+ ),
+
+ TP_fast_assign(
+ __entry->caller = caller;
+ __entry->parent = parent;
+ __entry->addr = (unsigned long)(void *)addr;
+ __entry->width = width;
+ ),
+
+ TP_printk("%pS <- %pS width=%d addr=%#llx",
+ (void *)(unsigned long)__entry->caller, (void *)(unsigned long)__entry->parent,
+ __entry->width, __entry->addr)
+);
+
+#endif /* _TRACE_RWMMIO_H */
+
+#include <trace/define_trace.h>
@@ -95,6 +95,13 @@ config RING_BUFFER_ALLOW_SWAP
Allow the use of ring_buffer_swap_cpu.
Adds a very slight overhead to tracing when enabled.
+config TRACE_MMIO_ACCESS
+ bool "Register read/write tracing"
+ depends on TRACING
+ help
+ Create tracepoints for MMIO read/write operations. These trace events
+ can be used for logging all MMIO read/write operations.
+
config PREEMPTIRQ_TRACEPOINTS
bool
depends on TRACE_PREEMPT_TOGGLE || TRACE_IRQFLAGS
@@ -99,5 +99,6 @@ obj-$(CONFIG_BOOTTIME_TRACING) += trace_boot.o
obj-$(CONFIG_FTRACE_RECORD_RECURSION) += trace_recursion_record.o
obj-$(CONFIG_TRACEPOINT_BENCHMARK) += trace_benchmark.o
+obj-$(CONFIG_TRACE_MMIO_ACCESS) += trace_readwrite.o
libftrace-y := ftrace.o
new file mode 100644
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Register read and write tracepoints
+ *
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#include <linux/ftrace.h>
+#include <linux/module.h>
+#include <asm-generic/io.h>
+
+#define CREATE_TRACE_POINTS
+#include <trace/events/rwmmio.h>
+
+#ifdef CONFIG_TRACE_MMIO_ACCESS
+void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr)
+{
+ trace_rwmmio_write(CALLER_ADDR0, CALLER_ADDR1, val, width, addr);
+}
+EXPORT_SYMBOL_GPL(log_write_mmio);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rwmmio_write);
+
+void log_read_mmio(u8 width, const volatile void __iomem *addr)
+{
+ trace_rwmmio_read(CALLER_ADDR0, CALLER_ADDR1, width, addr);
+}
+EXPORT_SYMBOL_GPL(log_read_mmio);
+EXPORT_TRACEPOINT_SYMBOL_GPL(rwmmio_read);
+#endif /* CONFIG_TRACE_MMIO_ACCESS */