Add tracepoint support to the Qualcomm GENI serial driver to provide
runtime visibility into driver behavior without requiring invasive debug
patches.

The trace events cover UART termios configuration, clock setup, modem
control state, interrupt status, and TX/RX data, making it easier to
diagnose communication issues in the field.

Signed-off-by: Praveen Talari <[email protected]>
---
 include/trace/events/qcom_geni_serial.h | 173 ++++++++++++++++++++++++++++++++
 1 file changed, 173 insertions(+)

diff --git a/include/trace/events/qcom_geni_serial.h 
b/include/trace/events/qcom_geni_serial.h
new file mode 100644
index 000000000000..f386d163907a
--- /dev/null
+++ b/include/trace/events/qcom_geni_serial.h
@@ -0,0 +1,173 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM qcom_geni_serial
+
+#if !defined(_TRACE_QCOM_GENI_SERIAL_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_QCOM_GENI_SERIAL_H
+
+#include <linux/device.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(geni_serial_set_termios,
+           TP_PROTO(struct device *dev, unsigned int baud,
+                    unsigned int bits_per_char, u32 tx_trans_cfg,
+                    u32 tx_parity_cfg, u32 rx_trans_cfg,
+                    u32 rx_parity_cfg, u32 stop_bit_len),
+           TP_ARGS(dev, baud, bits_per_char, tx_trans_cfg, tx_parity_cfg,
+                   rx_trans_cfg, rx_parity_cfg, stop_bit_len),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, baud)
+                            __field(unsigned int, bits_per_char)
+                            __field(u32, tx_trans_cfg)
+                            __field(u32, tx_parity_cfg)
+                            __field(u32, rx_trans_cfg)
+                            __field(u32, rx_parity_cfg)
+                            __field(u32, stop_bit_len)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->baud = baud;
+                          __entry->bits_per_char = bits_per_char;
+                          __entry->tx_trans_cfg = tx_trans_cfg;
+                          __entry->tx_parity_cfg = tx_parity_cfg;
+                          __entry->rx_trans_cfg = rx_trans_cfg;
+                          __entry->rx_parity_cfg = rx_parity_cfg;
+                          __entry->stop_bit_len = stop_bit_len;
+           ),
+
+           TP_printk("%s: baud=%u bpc=%u tx_trans=0x%08x tx_par=0x%08x 
rx_trans=0x%08x rx_par=0x%08x stop=%u",
+                     __get_str(name), __entry->baud, __entry->bits_per_char,
+                     __entry->tx_trans_cfg, __entry->tx_parity_cfg,
+                     __entry->rx_trans_cfg, __entry->rx_parity_cfg,
+                     __entry->stop_bit_len)
+);
+
+TRACE_EVENT(geni_serial_clk_cfg,
+           TP_PROTO(struct device *dev, unsigned int desired_rate,
+                    unsigned long clk_rate, unsigned int clk_div,
+                    unsigned int clk_idx),
+           TP_ARGS(dev, desired_rate, clk_rate, clk_div, clk_idx),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, desired_rate)
+                            __field(unsigned long, clk_rate)
+                            __field(unsigned int, clk_div)
+                            __field(unsigned int, clk_idx)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->desired_rate = desired_rate;
+                          __entry->clk_rate = clk_rate;
+                          __entry->clk_div = clk_div;
+                          __entry->clk_idx = clk_idx;
+           ),
+
+           TP_printk("%s: desired_rate=%u clk_rate=%lu clk_div=%u clk_idx=%u",
+                     __get_str(name), __entry->desired_rate, __entry->clk_rate,
+                     __entry->clk_div, __entry->clk_idx)
+);
+
+TRACE_EVENT(geni_serial_irq,
+           TP_PROTO(struct device *dev, u32 m_irq, u32 s_irq,
+                    u32 dma_tx, u32 dma_rx),
+           TP_ARGS(dev, m_irq, s_irq, dma_tx, dma_rx),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(u32, m_irq)
+                            __field(u32, s_irq)
+                            __field(u32, dma_tx)
+                            __field(u32, dma_rx)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->m_irq = m_irq;
+                          __entry->s_irq = s_irq;
+                          __entry->dma_tx = dma_tx;
+                          __entry->dma_rx = dma_rx;
+           ),
+
+           TP_printk("%s: m_irq=0x%08x s_irq=0x%08x dma_tx=0x%08x 
dma_rx=0x%08x",
+                     __get_str(name), __entry->m_irq, __entry->s_irq,
+                     __entry->dma_tx, __entry->dma_rx)
+);
+
+TRACE_EVENT(geni_serial_tx_data,
+           TP_PROTO(struct device *dev, const u8 *buf, unsigned int len),
+           TP_ARGS(dev, buf, len),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, len)
+                            __dynamic_array(u8, data, len)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->len = len;
+                          memcpy(__get_dynamic_array(data), buf, len);
+           ),
+
+           TP_printk("%s: tx_len=%u data=%s",
+                     __get_str(name), __entry->len,
+                     __print_hex(__get_dynamic_array(data), __entry->len))
+);
+
+TRACE_EVENT(geni_serial_rx_data,
+           TP_PROTO(struct device *dev, const u8 *buf, unsigned int len),
+           TP_ARGS(dev, buf, len),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, len)
+                            __dynamic_array(u8, data, len)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->len = len;
+                          memcpy(__get_dynamic_array(data), buf, len);
+           ),
+
+           TP_printk("%s: rx_len=%u data=%s",
+                     __get_str(name), __entry->len,
+                     __print_hex(__get_dynamic_array(data), __entry->len))
+);
+
+TRACE_EVENT(geni_serial_set_mctrl,
+           TP_PROTO(struct device *dev, unsigned int mctrl,
+                    u32 uart_manual_rfr),
+           TP_ARGS(dev, mctrl, uart_manual_rfr),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, mctrl)
+                            __field(u32, uart_manual_rfr)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->mctrl = mctrl;
+                          __entry->uart_manual_rfr = uart_manual_rfr;
+           ),
+
+           TP_printk("%s: mctrl=0x%04x uart_manual_rfr=0x%08x",
+                     __get_str(name), __entry->mctrl, __entry->uart_manual_rfr)
+);
+
+TRACE_EVENT(geni_serial_get_mctrl,
+           TP_PROTO(struct device *dev, unsigned int mctrl, u32 geni_ios),
+           TP_ARGS(dev, mctrl, geni_ios),
+
+           TP_STRUCT__entry(__string(name, dev_name(dev))
+                            __field(unsigned int, mctrl)
+                            __field(u32, geni_ios)
+           ),
+
+           TP_fast_assign(__assign_str(name);
+                          __entry->mctrl = mctrl;
+                          __entry->geni_ios = geni_ios;
+           ),
+
+           TP_printk("%s: mctrl=0x%04x geni_ios=0x%08x",
+                     __get_str(name), __entry->mctrl, __entry->geni_ios)
+);
+
+#endif /* _TRACE_QCOM_GENI_SERIAL_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>

-- 
2.34.1


Reply via email to