dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Fri, 6 Mar 2020 14:28:38 +0000 (16:28 +0200)
committerVinod Koul <vkoul@kernel.org>
Wed, 11 Mar 2020 09:26:14 +0000 (14:56 +0530)
With the custom dbg_summary_show the driver can show useful information
about the used channels.

dma0 (285c0000.dma-controller): number of channels: 24

dma1 (31150000.dma-controller): number of channels: 84
 dma1chan0    | 2b00000.mcasp:tx (MEM_TO_DEV, tchan16 [0x1010 -> 0xc400], PDMA[ ACC32 BURST ], TR mode)
 dma1chan1    | 2b00000.mcasp:rx (DEV_TO_MEM, rchan16 [0x4400 -> 0x9010], PDMA[ ACC32 BURST ], TR mode)
 dma1chan2    | 2ba0000.mcasp:tx (MEM_TO_DEV, tchan17 [0x1011 -> 0xc507], PDMA[ ACC32 BURST ], TR mode)
 dma1chan3    | 2ba0000.mcasp:rx (DEV_TO_MEM, rchan17 [0x4507 -> 0x9011], PDMA[ ACC32 BURST ], TR mode)
 dma1chan4    | in-use (MEM_TO_MEM, chan0 pair [0x1000 -> 0x9000], PSI-L Native, TR mode)
 dma1chan5    | in-use (MEM_TO_MEM, chan1 pair [0x1001 -> 0x9001], PSI-L Native, TR mode)
 dma1chan6    | in-use (MEM_TO_MEM, chan4 pair [0x1004 -> 0x9004], PSI-L Native, TR mode)
 dma1chan7    | in-use (MEM_TO_MEM, chan5 pair [0x1005 -> 0x9005], PSI-L Native, TR mode)

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Link: https://lore.kernel.org/r/20200306142839.17910-3-peter.ujfalusi@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ti/k3-udma.c

index 205141494fc18399562ebdf0de3e419ce7de5ec3..1e6aac87302d35400929549543f0c5c59fe8f720 100644 (file)
@@ -3276,6 +3276,66 @@ static int udma_setup_resources(struct udma_dev *ud)
        return ch_count;
 }
 
+#ifdef CONFIG_DEBUG_FS
+static void udma_dbg_summary_show_chan(struct seq_file *s,
+                                      struct dma_chan *chan)
+{
+       struct udma_chan *uc = to_udma_chan(chan);
+       struct udma_chan_config *ucc = &uc->config;
+
+       seq_printf(s, " %-13s| %s", dma_chan_name(chan),
+                  chan->dbg_client_name ?: "in-use");
+       seq_printf(s, " (%s, ", dmaengine_get_direction_text(uc->config.dir));
+
+       switch (uc->config.dir) {
+       case DMA_MEM_TO_MEM:
+               seq_printf(s, "chan%d pair [0x%04x -> 0x%04x], ", uc->tchan->id,
+                          ucc->src_thread, ucc->dst_thread);
+               break;
+       case DMA_DEV_TO_MEM:
+               seq_printf(s, "rchan%d [0x%04x -> 0x%04x], ", uc->rchan->id,
+                          ucc->src_thread, ucc->dst_thread);
+               break;
+       case DMA_MEM_TO_DEV:
+               seq_printf(s, "tchan%d [0x%04x -> 0x%04x], ", uc->tchan->id,
+                          ucc->src_thread, ucc->dst_thread);
+               break;
+       default:
+               seq_printf(s, ")\n");
+               return;
+       }
+
+       if (ucc->ep_type == PSIL_EP_NATIVE) {
+               seq_printf(s, "PSI-L Native");
+               if (ucc->metadata_size) {
+                       seq_printf(s, "[%s", ucc->needs_epib ? " EPIB" : "");
+                       if (ucc->psd_size)
+                               seq_printf(s, " PSDsize:%u", ucc->psd_size);
+                       seq_printf(s, " ]");
+               }
+       } else {
+               seq_printf(s, "PDMA");
+               if (ucc->enable_acc32 || ucc->enable_burst)
+                       seq_printf(s, "[%s%s ]",
+                                  ucc->enable_acc32 ? " ACC32" : "",
+                                  ucc->enable_burst ? " BURST" : "");
+       }
+
+       seq_printf(s, ", %s)\n", ucc->pkt_mode ? "Packet mode" : "TR mode");
+}
+
+static void udma_dbg_summary_show(struct seq_file *s,
+                                 struct dma_device *dma_dev)
+{
+       struct dma_chan *chan;
+
+       list_for_each_entry(chan, &dma_dev->channels, device_node) {
+               if (chan->client_count)
+                       udma_dbg_summary_show_chan(s, chan);
+       }
+}
+#endif /* CONFIG_DEBUG_FS */
+
 #define TI_UDMAC_BUSWIDTHS     (BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
                                 BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
                                 BIT(DMA_SLAVE_BUSWIDTH_3_BYTES) | \
@@ -3362,6 +3422,9 @@ static int udma_probe(struct platform_device *pdev)
        ud->ddev.device_resume = udma_resume;
        ud->ddev.device_terminate_all = udma_terminate_all;
        ud->ddev.device_synchronize = udma_synchronize;
+#ifdef CONFIG_DEBUG_FS
+       ud->ddev.dbg_summary_show = udma_dbg_summary_show;
+#endif
 
        ud->ddev.device_free_chan_resources = udma_free_chan_resources;
        ud->ddev.src_addr_widths = TI_UDMAC_BUSWIDTHS;