Wire up the qcom_gpi tracepoints into the GPI DMA engine driver to
provide runtime visibility into driver behavior without requiring
invasive debug patches.

Tracepoints are added at the same points as their existing dev_dbg()
counterparts: channel/event command dispatch in gpi_send_cmd(),
top-level interrupt type in gpi_handle_irq(), channel state
transitions in gpi_process_ch_ctrl_irq(), completion event handling
in gpi_process_xfer_compl_event() and gpi_process_imed_data_event(),
and TRE queuing in gpi_issue_pending().

Signed-off-by: Praveen Talari <[email protected]>
---
 drivers/dma/qcom/gpi.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/dma/qcom/gpi.c b/drivers/dma/qcom/gpi.c
index a5055a6273af..b09354a73b46 100644
--- a/drivers/dma/qcom/gpi.c
+++ b/drivers/dma/qcom/gpi.c
@@ -17,6 +17,9 @@
 #include "../dmaengine.h"
 #include "../virt-dma.h"
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/qcom_gpi.h>
+
 #define TRE_TYPE_DMA           0x10
 #define TRE_TYPE_IMMEDIATE_DMA 0x11
 #define TRE_TYPE_GO            0x20
@@ -683,6 +686,7 @@ static int gpi_send_cmd(struct gpii *gpii, struct gchan 
*gchan,
 
        dev_dbg(gpii->gpi_dev->dev,
                "sending cmd: %s:%u\n", TO_GPI_CMD_STR(gpi_cmd), chid);
+       trace_gpi_send_cmd(gpii->gpi_dev->dev, chid, gpi_cmd, 
TO_GPI_CMD_STR(gpi_cmd));
 
        /* send opcode and wait for completion */
        reinit_completion(&gpii->cmd_completion);
@@ -773,6 +777,7 @@ static void gpi_process_ch_ctrl_irq(struct gpii *gpii)
                if (gpii->gpi_cmd == GPI_CH_CMD_DE_ALLOC)
                        state = DEFAULT_CH_STATE;
                gchan->ch_state = state;
+               trace_gpi_ch_ctrl_irq(gpii->gpi_dev->dev, chid, 
gchan->ch_state);
 
                /*
                 * Triggering complete all if ch_state is not a stop in process.
@@ -841,6 +846,7 @@ static irqreturn_t gpi_handle_irq(int irq, void *data)
 
        offset = GPII_n_CNTXT_TYPE_IRQ_OFFS(gpii->gpii_id);
        type = gpi_read_reg(gpii, gpii->regs + offset);
+       trace_gpi_irq_status(gpii->gpi_dev->dev, gpii_id, type);
 
        do {
                /* global gpii error */
@@ -968,6 +974,8 @@ static void gpi_process_imed_data_event(struct gchan *gchan,
        smp_wmb();
 
        chid = imed_event->chid;
+       trace_gpi_ev_process(gpii->gpi_dev->dev, chid, IMMEDIATE_DATA_EV_TYPE,
+                            imed_event->code, imed_event->status, 
imed_event->length);
        if (imed_event->code == MSM_GPI_TCE_EOT && gpii->ieob_set) {
                if (chid == GPI_RX_CHAN)
                        goto gpi_free_desc;
@@ -1043,6 +1051,8 @@ static void gpi_process_xfer_compl_event(struct gchan 
*gchan,
        smp_wmb();
 
        chid = compl_event->chid;
+       trace_gpi_ev_process(gpii->gpi_dev->dev, chid, XFER_COMPLETE_EV_TYPE,
+                            compl_event->code, compl_event->status, 
compl_event->length);
        if (compl_event->code == MSM_GPI_TCE_EOT && gpii->ieob_set) {
                if (chid == GPI_RX_CHAN)
                        goto gpi_free_desc;
@@ -1887,6 +1897,7 @@ static void gpi_issue_pending(struct dma_chan *chan)
        }
 
        gpi_desc = to_gpi_desc(vd);
+       trace_gpi_queue_xfer(gpii->gpi_dev->dev, gchan->chid, 
gpi_desc->num_tre);
        for (i = 0; i < gpi_desc->num_tre; i++) {
                tre = &gpi_desc->tre[i];
                gpi_queue_xfer(gpii, gchan, tre, &wp);

-- 
2.34.1


Reply via email to