mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
spi: Add trace events for Qualcomm GENI SPI drivers
Praveen Talari <praveen.talari@oss.qualcomm.com> says:
Add tracepoints to the Qualcomm GENI (Generic Interface) SPI driver.
These trace events enable runtime debugging and performance analysis
of SPI operations.
The trace events capture SPI clock configuration, setup parameters,
transfer details, interrupt status.
Usage examples:
Enable all SPI traces:
echo 1 > /sys/kernel/tracing/events/spi/enable
echo 1 > /sys/kernel/debug/tracing/events/qcom_geni_spi/enable
cat /sys/kernel/debug/tracing/trace_pipe
Example trace output:
1003.956560: spi_message_submit: spi16.0 000000001b20b93c
1003.956642: spi_controller_busy: spi16
1003.956643: spi_message_start: spi16.0 000000001b20b93c
1003.956646: geni_spi_setup_params: 888000.spi: cs=0 mode=0x00000020
mode_changed=0x00000007 cs_changed=0
1003.956647: spi_set_cs: spi16.0 activate
1003.956648: spi_transfer_start: spi16.0 00000000ea1cf8b6 len=16
tx=[4c-80-e4-ca-68-4d-95-aa-ee-99-ae-d7-69-e9-5f-39]
rx=[00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00]
1003.956653: geni_spi_clk_cfg: 888000.spi: req_hz=20000000
sclk_hz=100000000 clk_idx=5 clk_div=5 bpw=8
1003.956691: geni_spi_transfer: 888000.spi: len=16 m_cmd=0x00000003
1003.956708: geni_spi_irq: 888000.spi: m_irq=0x08000081
dma_tx=0x00000000 dma_rx=0x00000000
1003.956717: spi_transfer_stop: spi16.0 00000000ea1cf8b6 len=16
tx=[4c-80-e4-ca-68-4d-95-aa-ee-99-ae-d7-69-e9-5f-39]
rx=[4c-80-e4-ca-68-4d-95-aa-ee-99-ae-d7-69-e9-5f-39]
1003.956717: spi_set_cs: spi16.0 deactivate
1003.956718: spi_message_done: spi16.0 000000001b20b93c len=16/16
Link: https://patch.msgid.link/20260518-add-tracepoints-for-qcom-geni-spi-v3-0-7928f6810a79@oss.qualcomm.com
This commit is contained in:
commit
638f550011
|
|
@ -1,6 +1,9 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (c) 2017-2018, The Linux foundation. All rights reserved.
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/qcom_geni_spi.h>
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
|
@ -332,6 +335,9 @@ static int geni_spi_set_clock_and_bw(struct spi_geni_master *mas,
|
|||
writel(clk_sel, se->base + SE_GENI_CLK_SEL);
|
||||
writel(m_clk_cfg, se->base + GENI_SER_M_CLK_CFG);
|
||||
|
||||
trace_geni_spi_clk_cfg(mas->dev, clk_hz, mas->cur_sclk_hz, idx, div,
|
||||
mas->cur_bits_per_word);
|
||||
|
||||
/* Set BW quota for CPU as driver supports FIFO mode only. */
|
||||
se->icc_paths[CPU_TO_GENI].avg_bw = Bps_to_icc(mas->cur_speed_hz);
|
||||
ret = geni_icc_set_bw(se);
|
||||
|
|
@ -366,6 +372,9 @@ static int setup_fifo_params(struct spi_device *spi_slv,
|
|||
if ((mode_changed & SPI_CS_HIGH) || (cs_changed && (spi_slv->mode & SPI_CS_HIGH)))
|
||||
writel((spi_slv->mode & SPI_CS_HIGH) ? BIT(chipselect) : 0, se->base + SE_SPI_DEMUX_OUTPUT_INV);
|
||||
|
||||
trace_geni_spi_setup_params(mas->dev, chipselect, spi_slv->mode,
|
||||
mode_changed, cs_changed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -861,6 +870,8 @@ static int setup_se_xfer(struct spi_transfer *xfer,
|
|||
spin_lock_irq(&mas->lock);
|
||||
geni_se_setup_m_cmd(se, m_cmd, m_params);
|
||||
|
||||
trace_geni_spi_transfer(mas->dev, len, m_cmd);
|
||||
|
||||
if (mas->cur_xfer_mode == GENI_SE_DMA) {
|
||||
if (m_cmd & SPI_RX_ONLY)
|
||||
geni_se_rx_init_dma(se, sg_dma_address(xfer->rx_sg.sgl),
|
||||
|
|
@ -915,6 +926,8 @@ static irqreturn_t geni_spi_isr(int irq, void *data)
|
|||
if (!m_irq && !dma_tx_status && !dma_rx_status)
|
||||
return IRQ_NONE;
|
||||
|
||||
trace_geni_spi_irq(mas->dev, m_irq, dma_tx_status, dma_rx_status);
|
||||
|
||||
if (m_irq & (M_CMD_OVERRUN_EN | M_ILLEGAL_CMD_EN | M_CMD_FAILURE_EN |
|
||||
M_RX_FIFO_RD_ERR_EN | M_RX_FIFO_WR_ERR_EN |
|
||||
M_TX_FIFO_RD_ERR_EN | M_TX_FIFO_WR_ERR_EN))
|
||||
|
|
|
|||
103
include/trace/events/qcom_geni_spi.h
Normal file
103
include/trace/events/qcom_geni_spi.h
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM qcom_geni_spi
|
||||
|
||||
#if !defined(_TRACE_QCOM_GENI_SPI_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_QCOM_GENI_SPI_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
TRACE_EVENT(geni_spi_setup_params,
|
||||
TP_PROTO(struct device *dev, u8 cs, u32 mode,
|
||||
u32 mode_changed, bool cs_changed),
|
||||
TP_ARGS(dev, cs, mode, mode_changed, cs_changed),
|
||||
|
||||
TP_STRUCT__entry(__string(name, dev_name(dev))
|
||||
__field(u8, cs)
|
||||
__field(u32, mode)
|
||||
__field(u32, mode_changed)
|
||||
__field(bool, cs_changed)
|
||||
),
|
||||
|
||||
TP_fast_assign(__assign_str(name);
|
||||
__entry->cs = cs;
|
||||
__entry->mode = mode;
|
||||
__entry->mode_changed = mode_changed;
|
||||
__entry->cs_changed = cs_changed;
|
||||
),
|
||||
|
||||
TP_printk("%s: cs=%u mode=0x%08x mode_changed=0x%08x cs_changed=%d",
|
||||
__get_str(name), __entry->cs, __entry->mode,
|
||||
__entry->mode_changed, __entry->cs_changed)
|
||||
);
|
||||
|
||||
TRACE_EVENT(geni_spi_clk_cfg,
|
||||
TP_PROTO(struct device *dev, unsigned long req_hz,
|
||||
unsigned long sclk_hz, unsigned int clk_idx,
|
||||
unsigned int clk_div, unsigned int bpw),
|
||||
TP_ARGS(dev, req_hz, sclk_hz, clk_idx, clk_div, bpw),
|
||||
|
||||
TP_STRUCT__entry(__string(name, dev_name(dev))
|
||||
__field(unsigned long, req_hz)
|
||||
__field(unsigned long, sclk_hz)
|
||||
__field(unsigned int, clk_idx)
|
||||
__field(unsigned int, clk_div)
|
||||
__field(unsigned int, bpw)
|
||||
),
|
||||
|
||||
TP_fast_assign(__assign_str(name);
|
||||
__entry->req_hz = req_hz;
|
||||
__entry->sclk_hz = sclk_hz;
|
||||
__entry->clk_idx = clk_idx;
|
||||
__entry->clk_div = clk_div;
|
||||
__entry->bpw = bpw;
|
||||
),
|
||||
|
||||
TP_printk("%s: req_hz=%lu sclk_hz=%lu clk_idx=%u clk_div=%u bpw=%u",
|
||||
__get_str(name), __entry->req_hz, __entry->sclk_hz,
|
||||
__entry->clk_idx, __entry->clk_div, __entry->bpw)
|
||||
);
|
||||
|
||||
TRACE_EVENT(geni_spi_transfer,
|
||||
TP_PROTO(struct device *dev, unsigned int len, u32 m_cmd),
|
||||
TP_ARGS(dev, len, m_cmd),
|
||||
|
||||
TP_STRUCT__entry(__string(name, dev_name(dev))
|
||||
__field(unsigned int, len)
|
||||
__field(u32, m_cmd)
|
||||
),
|
||||
|
||||
TP_fast_assign(__assign_str(name);
|
||||
__entry->len = len;
|
||||
__entry->m_cmd = m_cmd;
|
||||
),
|
||||
|
||||
TP_printk("%s: len=%u m_cmd=0x%08x",
|
||||
__get_str(name), __entry->len, __entry->m_cmd)
|
||||
);
|
||||
|
||||
TRACE_EVENT(geni_spi_irq,
|
||||
TP_PROTO(struct device *dev, u32 m_irq, u32 dma_tx, u32 dma_rx),
|
||||
TP_ARGS(dev, m_irq, dma_tx, dma_rx),
|
||||
|
||||
TP_STRUCT__entry(__string(name, dev_name(dev))
|
||||
__field(u32, m_irq)
|
||||
__field(u32, dma_tx)
|
||||
__field(u32, dma_rx)
|
||||
),
|
||||
|
||||
TP_fast_assign(__assign_str(name);
|
||||
__entry->m_irq = m_irq;
|
||||
__entry->dma_tx = dma_tx;
|
||||
__entry->dma_rx = dma_rx;
|
||||
),
|
||||
|
||||
TP_printk("%s: m_irq=0x%08x dma_tx=0x%08x dma_rx=0x%08x",
|
||||
__get_str(name), __entry->m_irq, __entry->dma_tx,
|
||||
__entry->dma_rx)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_QCOM_GENI_SPI_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
Loading…
Reference in New Issue
Block a user