From: Frank Li <Frank.li@oss.nxp.com>
To: Praveen Talari <praveen.talari@oss.qualcomm.com>
Cc: konrad.dybcio@oss.qualcomm.com,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Vinod Koul <vkoul@kernel.org>, Frank Li <Frank.Li@kernel.org>,
chandana.chiluveru@oss.qualcomm.com,
mukesh.savaliya@oss.qualcomm.com, linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org,
linux-arm-msm@vger.kernel.org, dmaengine@vger.kernel.org
Subject: Re: [PATCH v2 1/3] dmaengine: qcom: gpi: trace: Add trace events header for Qualcomm GPI DMA
Date: Wed, 9 Sep 2026 15:56:18 -0500 [thread overview]
Message-ID: <aqHH8rliEDTmrW9P@SMW015318> (raw)
In-Reply-To: <20260909-add-trace-support-gpio-v2-1-01f81739bb88@oss.qualcomm.com>
On Wed, Sep 09, 2026 at 10:39:41AM +0530, Praveen Talari wrote:
> Add a tracepoint header for the Qualcomm GPI DMA engine driver.
>
> The events defined here cover channel/event command dispatch, IRQ
> type handling, channel/event control state transitions, error IRQ
> status, completion event processing (including the no-pending-
> descriptor and transfer result paths), per-event processing in the
> event ring, ring allocation/programming details, already-in-state
> checks for pause/resume, and TRE queuing and contents. Together they
> give full runtime visibility into GPI DMA behavior in place of the
> driver's former dev_dbg() based debug logging.
>
> Signed-off-by: Praveen Talari <praveen.talari@oss.qualcomm.com>
> ---
> include/trace/events/qcom_gpi.h | 313 ++++++++++++++++++++++++++++++++++++++++
Any user use it outside drivers/dma? if no, move it in drivers/dma
and please squash to patch 2, with user together.
Frank
> 1 file changed, 313 insertions(+)
>
> diff --git a/include/trace/events/qcom_gpi.h b/include/trace/events/qcom_gpi.h
> new file mode 100644
> index 000000000000..241d76855ac8
> --- /dev/null
> +++ b/include/trace/events/qcom_gpi.h
> @@ -0,0 +1,313 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM qcom_gpi
> +
> +#if !defined(_TRACE_QCOM_GPI_H) || defined(TRACE_HEADER_MULTI_READ)
> +#define _TRACE_QCOM_GPI_H
> +
> +#include <linux/tracepoint.h>
> +
> +TRACE_EVENT(gpi_send_cmd,
> + TP_PROTO(struct device *dev, u32 chid, u32 cmd, const char *cmd_str),
> + TP_ARGS(dev, chid, cmd, cmd_str),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __string(cmd_str, cmd_str)
> + __field(u32, chid)
> + __field(u32, cmd)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __assign_str(cmd_str);
> + __entry->chid = chid;
> + __entry->cmd = cmd;
> + ),
> +
> + TP_printk("%s: chid=%u cmd=%s(%u)",
> + __get_str(name), __entry->chid, __get_str(cmd_str),
> + __entry->cmd)
> +);
> +
> +TRACE_EVENT(gpi_irq_status,
> + TP_PROTO(struct device *dev, u32 gpii_id, u32 irq_type),
> + TP_ARGS(dev, gpii_id, irq_type),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, gpii_id)
> + __field(u32, irq_type)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->gpii_id = gpii_id;
> + __entry->irq_type = irq_type;
> + ),
> +
> + TP_printk("%s: gpii=%u irq_type=0x%08x",
> + __get_str(name), __entry->gpii_id, __entry->irq_type)
> +);
> +
> +TRACE_EVENT(gpi_ch_ctrl_irq,
> + TP_PROTO(struct device *dev, u32 chid, u32 ch_state),
> + TP_ARGS(dev, chid, ch_state),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(u32, ch_state)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->ch_state = ch_state;
> + ),
> +
> + TP_printk("%s: chid=%u ch_state=%u",
> + __get_str(name), __entry->chid, __entry->ch_state)
> +);
> +
> +TRACE_EVENT(gpi_ev_process,
> + TP_PROTO(struct device *dev, u32 chid, u32 ev_type, u8 code,
> + u16 status, u32 length),
> + TP_ARGS(dev, chid, ev_type, code, status, length),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(u32, ev_type)
> + __field(u32, length)
> + __field(u16, status)
> + __field(u8, code)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->ev_type = ev_type;
> + __entry->code = code;
> + __entry->status = status;
> + __entry->length = length;
> + ),
> +
> + TP_printk("%s: chid=%u ev_type=0x%02x code=%u status=%u length=%u",
> + __get_str(name), __entry->chid, __entry->ev_type,
> + __entry->code, __entry->status, __entry->length)
> +);
> +
> +TRACE_EVENT(gpi_queue_xfer,
> + TP_PROTO(struct device *dev, u32 chid, u32 num_tre),
> + TP_ARGS(dev, chid, num_tre),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(u32, num_tre)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->num_tre = num_tre;
> + ),
> +
> + TP_printk("%s: chid=%u num_tre=%u",
> + __get_str(name), __entry->chid, __entry->num_tre)
> +);
> +
> +TRACE_EVENT(gpi_gen_err_irq,
> + TP_PROTO(struct device *dev, u32 gpii_id, u32 irq_stts),
> + TP_ARGS(dev, gpii_id, irq_stts),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, gpii_id)
> + __field(u32, irq_stts)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->gpii_id = gpii_id;
> + __entry->irq_stts = irq_stts;
> + ),
> +
> + TP_printk("%s: gpii=%u irq_stts=0x%08x",
> + __get_str(name), __entry->gpii_id, __entry->irq_stts)
> +);
> +
> +TRACE_EVENT(gpi_ev_ctrl_irq,
> + TP_PROTO(struct device *dev, u32 gpii_id, u32 ev_ch_irq, u32 ev_state),
> + TP_ARGS(dev, gpii_id, ev_ch_irq, ev_state),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, gpii_id)
> + __field(u32, ev_ch_irq)
> + __field(u32, ev_state)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->gpii_id = gpii_id;
> + __entry->ev_ch_irq = ev_ch_irq;
> + __entry->ev_state = ev_state;
> + ),
> +
> + TP_printk("%s: gpii=%u ev_ch_irq=0x%08x ev_state=%u",
> + __get_str(name), __entry->gpii_id, __entry->ev_ch_irq,
> + __entry->ev_state)
> +);
> +
> +TRACE_EVENT(gpi_ev_no_desc,
> + TP_PROTO(struct device *dev, u32 chid, const u32 *ev_dword,
> + const u32 *tre_dword),
> + TP_ARGS(dev, chid, ev_dword, tre_dword),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __array(u32, ev_dword, 4)
> + __array(u32, tre_dword, 4)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + memcpy(__entry->ev_dword, ev_dword, sizeof(__entry->ev_dword));
> + memcpy(__entry->tre_dword, tre_dword, sizeof(__entry->tre_dword));
> + ),
> +
> + TP_printk("%s: chid=%u event=%08x:%08x:%08x:%08x pending_tre=%08x:%08x:%08x:%08x",
> + __get_str(name), __entry->chid,
> + __entry->ev_dword[0], __entry->ev_dword[1],
> + __entry->ev_dword[2], __entry->ev_dword[3],
> + __entry->tre_dword[0], __entry->tre_dword[1],
> + __entry->tre_dword[2], __entry->tre_dword[3])
> +);
> +
> +TRACE_EVENT(gpi_xfer_result,
> + TP_PROTO(struct device *dev, u32 chid, int result, u32 residue),
> + TP_ARGS(dev, chid, result, residue),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(int, result)
> + __field(u32, residue)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->result = result;
> + __entry->residue = residue;
> + ),
> +
> + TP_printk("%s: chid=%u result=%d residue=%u",
> + __get_str(name), __entry->chid, __entry->result,
> + __entry->residue)
> +);
> +
> +TRACE_EVENT(gpi_process_event,
> + TP_PROTO(struct device *dev, u32 chid, u32 type, const u32 *dword),
> + TP_ARGS(dev, chid, type, dword),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(u32, type)
> + __array(u32, dword, 4)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->type = type;
> + memcpy(__entry->dword, dword, sizeof(__entry->dword));
> + ),
> +
> + TP_printk("%s: chid=%u type=0x%02x %08x:%08x:%08x:%08x",
> + __get_str(name), __entry->chid, __entry->type,
> + __entry->dword[0], __entry->dword[1],
> + __entry->dword[2], __entry->dword[3])
> +);
> +
> +TRACE_EVENT(gpi_alloc_ring,
> + TP_PROTO(struct device *dev, u32 elements, u32 el_size,
> + u32 req_len, u64 len, size_t alloc_size),
> + TP_ARGS(dev, elements, el_size, req_len, len, alloc_size),
> +
> + TP_STRUCT__entry(__field(u64, len)
> + __field(size_t, alloc_size)
> + __string(name, dev_name(dev))
> + __field(u32, elements)
> + __field(u32, el_size)
> + __field(u32, req_len)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->elements = elements;
> + __entry->el_size = el_size;
> + __entry->req_len = req_len;
> + __entry->len = len;
> + __entry->alloc_size = alloc_size;
> + ),
> +
> + TP_printk("%s: elements=%u el_size=%u req_len=%u len=%llu alloc_size=%zu",
> + __get_str(name), __entry->elements, __entry->el_size,
> + __entry->req_len, __entry->len, __entry->alloc_size)
> +);
> +
> +TRACE_EVENT(gpi_ring_info,
> + TP_PROTO(struct device *dev, dma_addr_t dma_handle, phys_addr_t phys_addr,
> + u32 len, u32 el_size, u32 elements),
> + TP_ARGS(dev, dma_handle, phys_addr, len, el_size, elements),
> +
> + TP_STRUCT__entry(__field(u64, dma_handle)
> + __field(u64, phys_addr)
> + __string(name, dev_name(dev))
> + __field(u32, len)
> + __field(u32, el_size)
> + __field(u32, elements)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->dma_handle = dma_handle;
> + __entry->phys_addr = phys_addr;
> + __entry->len = len;
> + __entry->el_size = el_size;
> + __entry->elements = elements;
> + ),
> +
> + TP_printk("%s: dma_handle=%llx phys_addr=%llx len=%u el_size=%u elements=%u",
> + __get_str(name), __entry->dma_handle, __entry->phys_addr,
> + __entry->len, __entry->el_size, __entry->elements)
> +);
> +
> +TRACE_EVENT(gpi_already_state,
> + TP_PROTO(struct device *dev, u32 gpii_id, u32 pm_state),
> + TP_ARGS(dev, gpii_id, pm_state),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, gpii_id)
> + __field(u32, pm_state)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->gpii_id = gpii_id;
> + __entry->pm_state = pm_state;
> + ),
> +
> + TP_printk("%s: gpii=%u already in pm_state=%u",
> + __get_str(name), __entry->gpii_id, __entry->pm_state)
> +);
> +
> +TRACE_EVENT(gpi_tre,
> + TP_PROTO(struct device *dev, u32 chid, u32 idx, const u32 *dword),
> + TP_ARGS(dev, chid, idx, dword),
> +
> + TP_STRUCT__entry(__string(name, dev_name(dev))
> + __field(u32, chid)
> + __field(u32, idx)
> + __array(u32, dword, 4)
> + ),
> +
> + TP_fast_assign(__assign_str(name);
> + __entry->chid = chid;
> + __entry->idx = idx;
> + memcpy(__entry->dword, dword, sizeof(__entry->dword));
> + ),
> +
> + TP_printk("%s: chid=%u tre[%u]=%08x:%08x:%08x:%08x",
> + __get_str(name), __entry->chid, __entry->idx,
> + __entry->dword[0], __entry->dword[1],
> + __entry->dword[2], __entry->dword[3])
> +);
> +
> +#endif /* _TRACE_QCOM_GPI_H */
> +
> +/* This part must be outside protection */
> +#include <trace/define_trace.h>
>
> --
> 2.34.1
>
next prev parent reply other threads:[~2026-09-09 20:56 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 5:09 [PATCH v2 0/3] dmaengine: qcom: gpi: Add trace event support Praveen Talari
2026-09-09 5:09 ` [PATCH v2 1/3] dmaengine: qcom: gpi: trace: Add trace events header for Qualcomm GPI DMA Praveen Talari
2026-09-09 20:56 ` Frank Li [this message]
2026-09-09 5:09 ` [PATCH v2 2/3] dmaengine: qcom: gpi: Add trace event support Praveen Talari
2026-09-09 5:23 ` sashiko-bot
2026-09-09 5:09 ` [PATCH v2 3/3] dmaengine: qcom: gpi: Convert dev_dbg() calls to tracepoints Praveen Talari
2026-09-09 5:22 ` sashiko-bot
2026-09-09 20:58 ` Frank Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aqHH8rliEDTmrW9P@SMW015318 \
--to=frank.li@oss.nxp.com \
--cc=Frank.Li@kernel.org \
--cc=chandana.chiluveru@oss.qualcomm.com \
--cc=dmaengine@vger.kernel.org \
--cc=konrad.dybcio@oss.qualcomm.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mukesh.savaliya@oss.qualcomm.com \
--cc=praveen.talari@oss.qualcomm.com \
--cc=rostedt@goodmis.org \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox