]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
dmaengine: ptdma: Extend ptdma-debugfs to support multi-queue
authorBasavaraj Natikar <Basavaraj.Natikar@amd.com>
Fri, 25 Oct 2024 09:59:30 +0000 (15:29 +0530)
committerVinod Koul <vkoul@kernel.org>
Mon, 2 Dec 2024 17:25:28 +0000 (22:55 +0530)
To support multi-channel functionality with AE4DMA engine, extend the
ptdma-debugfs with reusable components.

Reviewed-by: Raju Rangoju <Raju.Rangoju@amd.com>
Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Link: https://lore.kernel.org/r/20241025095931.726018-6-Basavaraj.Natikar@amd.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/amd/ptdma/ptdma-debugfs.c

index c8307d3044a3918a7ab143c48ab63cd42784f9e5..0e54060d6c34d87c5998eb9545cb55d323142d42 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/seq_file.h>
 
 #include "ptdma.h"
+#include "../ae4dma/ae4dma.h"
 
 /* DebugFS helpers */
 #define        RI_VERSION_NUM  0x0000003F
 static int pt_debugfs_info_show(struct seq_file *s, void *p)
 {
        struct pt_device *pt = s->private;
+       struct ae4_device *ae4;
        unsigned int regval;
 
        seq_printf(s, "Device name: %s\n", dev_name(pt->dev));
-       seq_printf(s, "   # Queues: %d\n", 1);
-       seq_printf(s, "     # Cmds: %d\n", pt->cmd_count);
+
+       if (pt->ver == AE4_DMA_VERSION) {
+               ae4 = container_of(pt, struct ae4_device, pt);
+               seq_printf(s, "   # Queues: %d\n", ae4->cmd_q_count);
+               seq_printf(s, "     # Cmds per queue: %d\n", CMD_Q_LEN);
+       } else {
+               seq_printf(s, "   # Queues: %d\n", 1);
+               seq_printf(s, "     # Cmds: %d\n", pt->cmd_count);
+       }
 
        regval = ioread32(pt->io_regs + CMD_PT_VERSION);
 
@@ -55,6 +64,7 @@ static int pt_debugfs_stats_show(struct seq_file *s, void *p)
 static int pt_debugfs_queue_show(struct seq_file *s, void *p)
 {
        struct pt_cmd_queue *cmd_q = s->private;
+       struct pt_device *pt;
        unsigned int regval;
 
        if (!cmd_q)
@@ -62,18 +72,24 @@ static int pt_debugfs_queue_show(struct seq_file *s, void *p)
 
        seq_printf(s, "               Pass-Thru: %ld\n", cmd_q->total_pt_ops);
 
-       regval = ioread32(cmd_q->reg_control + 0x000C);
-
-       seq_puts(s, "      Enabled Interrupts:");
-       if (regval & INT_EMPTY_QUEUE)
-               seq_puts(s, " EMPTY");
-       if (regval & INT_QUEUE_STOPPED)
-               seq_puts(s, " STOPPED");
-       if (regval & INT_ERROR)
-               seq_puts(s, " ERROR");
-       if (regval & INT_COMPLETION)
-               seq_puts(s, " COMPLETION");
-       seq_puts(s, "\n");
+       pt = cmd_q->pt;
+       if (pt->ver == AE4_DMA_VERSION) {
+               regval = readl(cmd_q->reg_control + 0x4);
+               seq_printf(s, "     Enabled Interrupts:: status 0x%x\n", regval);
+       } else {
+               regval = ioread32(cmd_q->reg_control + 0x000C);
+
+               seq_puts(s, "      Enabled Interrupts:");
+               if (regval & INT_EMPTY_QUEUE)
+                       seq_puts(s, " EMPTY");
+               if (regval & INT_QUEUE_STOPPED)
+                       seq_puts(s, " STOPPED");
+               if (regval & INT_ERROR)
+                       seq_puts(s, " ERROR");
+               if (regval & INT_COMPLETION)
+                       seq_puts(s, " COMPLETION");
+               seq_puts(s, "\n");
+       }
 
        return 0;
 }
@@ -84,8 +100,12 @@ DEFINE_SHOW_ATTRIBUTE(pt_debugfs_stats);
 
 void ptdma_debugfs_setup(struct pt_device *pt)
 {
-       struct pt_cmd_queue *cmd_q;
        struct dentry *debugfs_q_instance;
+       struct ae4_cmd_queue *ae4cmd_q;
+       struct pt_cmd_queue *cmd_q;
+       struct ae4_device *ae4;
+       char name[30];
+       int i;
 
        if (!debugfs_initialized())
                return;
@@ -96,11 +116,27 @@ void ptdma_debugfs_setup(struct pt_device *pt)
        debugfs_create_file("stats", 0400, pt->dma_dev.dbg_dev_root, pt,
                            &pt_debugfs_stats_fops);
 
-       cmd_q = &pt->cmd_q;
-
-       debugfs_q_instance =
-               debugfs_create_dir("q", pt->dma_dev.dbg_dev_root);
 
-       debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,
-                           &pt_debugfs_queue_fops);
+       if (pt->ver == AE4_DMA_VERSION) {
+               ae4 = container_of(pt, struct ae4_device, pt);
+               for (i = 0; i < ae4->cmd_q_count; i++) {
+                       ae4cmd_q = &ae4->ae4cmd_q[i];
+                       cmd_q = &ae4cmd_q->cmd_q;
+
+                       memset(name, 0, sizeof(name));
+                       snprintf(name, 29, "q%d", ae4cmd_q->id);
+
+                       debugfs_q_instance =
+                               debugfs_create_dir(name, pt->dma_dev.dbg_dev_root);
+
+                       debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,
+                                           &pt_debugfs_queue_fops);
+               }
+       } else {
+               debugfs_q_instance =
+                       debugfs_create_dir("q", pt->dma_dev.dbg_dev_root);
+               cmd_q = &pt->cmd_q;
+               debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,
+                                   &pt_debugfs_queue_fops);
+       }
 }