lkml.org 
[lkml]   [2021]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v11 3/3] dmaengine: ptdma: Add debugfs entries for PTDMA
    Date
    From: Sanjay R Mehta <sanju.mehta@amd.com>

    Expose data about the configuration and operation of the
    PTDMA through debugfs entries: device name, capabilities,
    configuration, statistics.

    Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
    ---
    drivers/dma/ptdma/Makefile | 2 +-
    drivers/dma/ptdma/ptdma-debugfs.c | 110 ++++++++++++++++++++++++++++++++++++++
    drivers/dma/ptdma/ptdma-dev.c | 5 ++
    drivers/dma/ptdma/ptdma.h | 6 +++
    4 files changed, 122 insertions(+), 1 deletion(-)
    create mode 100644 drivers/dma/ptdma/ptdma-debugfs.c

    diff --git a/drivers/dma/ptdma/Makefile b/drivers/dma/ptdma/Makefile
    index a528cb0..ce54102 100644
    --- a/drivers/dma/ptdma/Makefile
    +++ b/drivers/dma/ptdma/Makefile
    @@ -5,6 +5,6 @@

    obj-$(CONFIG_AMD_PTDMA) += ptdma.o

    -ptdma-objs := ptdma-dev.o ptdma-dmaengine.o
    +ptdma-objs := ptdma-dev.o ptdma-dmaengine.o ptdma-debugfs.o

    ptdma-$(CONFIG_PCI) += ptdma-pci.o
    diff --git a/drivers/dma/ptdma/ptdma-debugfs.c b/drivers/dma/ptdma/ptdma-debugfs.c
    new file mode 100644
    index 0000000..5277a2a
    --- /dev/null
    +++ b/drivers/dma/ptdma/ptdma-debugfs.c
    @@ -0,0 +1,110 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +/*
    + * AMD Passthrough DMA device driver
    + * -- Based on the CCP driver
    + *
    + * Copyright (C) 2016,2021 Advanced Micro Devices, Inc.
    + *
    + * Author: Sanjay R Mehta <sanju.mehta@amd.com>
    + * Author: Gary R Hook <gary.hook@amd.com>
    + */
    +
    +#include <linux/debugfs.h>
    +#include <linux/seq_file.h>
    +
    +#include "ptdma.h"
    +
    +/* DebugFS helpers */
    +#define MAX_NAME_LEN 20
    +#define RI_VERSION_NUM 0x0000003F
    +
    +#define RI_NUM_VQM 0x00078000
    +#define RI_NVQM_SHIFT 15
    +
    +static int pt_debugfs_info_show(struct seq_file *s, void *p)
    +{
    + struct pt_device *pt = s->private;
    + 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);
    +
    + regval = ioread32(pt->io_regs + CMD_PT_VERSION);
    +
    + seq_printf(s, " Version: %d\n", regval & RI_VERSION_NUM);
    + seq_puts(s, " Engines:");
    + seq_puts(s, "\n");
    + seq_printf(s, " Queues: %d\n", (regval & RI_NUM_VQM) >> RI_NVQM_SHIFT);
    +
    + return 0;
    +}
    +
    +/*
    + * Return a formatted buffer containing the current
    + * statistics of queue for PTDMA
    + */
    +static int pt_debugfs_stats_show(struct seq_file *s, void *p)
    +{
    + struct pt_device *pt = s->private;
    +
    + seq_printf(s, "Total Interrupts Handled: %ld\n", pt->total_interrupts);
    +
    + return 0;
    +}
    +
    +static int pt_debugfs_queue_show(struct seq_file *s, void *p)
    +{
    + struct pt_cmd_queue *cmd_q = s->private;
    + unsigned int regval;
    +
    + if (!cmd_q)
    + return 0;
    +
    + 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");
    +
    + return 0;
    +}
    +
    +DEFINE_SHOW_ATTRIBUTE(pt_debugfs_info);
    +DEFINE_SHOW_ATTRIBUTE(pt_debugfs_queue);
    +DEFINE_SHOW_ATTRIBUTE(pt_debugfs_stats);
    +
    +void ptdma_debugfs_setup(struct pt_device *pt)
    +{
    + struct pt_cmd_queue *cmd_q;
    + char name[MAX_NAME_LEN + 1];
    + struct dentry *debugfs_q_instance;
    +
    + if (!debugfs_initialized())
    + return;
    +
    + debugfs_create_file("info", 0400, pt->dma_dev.dbg_dev_root, pt,
    + &pt_debugfs_info_fops);
    +
    + debugfs_create_file("stats", 0400, pt->dma_dev.dbg_dev_root, pt,
    + &pt_debugfs_stats_fops);
    +
    + cmd_q = &pt->cmd_q;
    +
    + snprintf(name, MAX_NAME_LEN - 1, "q");
    +
    + 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);
    +}
    diff --git a/drivers/dma/ptdma/ptdma-dev.c b/drivers/dma/ptdma/ptdma-dev.c
    index 42b9de3..354284a 100644
    --- a/drivers/dma/ptdma/ptdma-dev.c
    +++ b/drivers/dma/ptdma/ptdma-dev.c
    @@ -102,6 +102,7 @@ int pt_core_perform_passthru(struct pt_cmd_queue *cmd_q,
    struct ptdma_desc desc;

    cmd_q->cmd_error = 0;
    + cmd_q->total_pt_ops++;
    memset(&desc, 0, sizeof(desc));
    desc.dw0 = CMD_DESC_DW0_VAL;
    desc.length = pt_engine->src_len;
    @@ -151,6 +152,7 @@ static irqreturn_t pt_core_irq_handler(int irq, void *data)
    bool err = true;

    pt_core_disable_queue_interrupts(pt);
    + pt->total_interrupts++;
    status = ioread32(cmd_q->reg_control + 0x0010);
    if (status) {
    cmd_q->int_status = status;
    @@ -253,6 +255,9 @@ int pt_core_init(struct pt_device *pt)
    if (ret)
    goto e_dmaengine;

    + /* Set up debugfs entries */
    + ptdma_debugfs_setup(pt);
    +
    return 0;

    e_dmaengine:
    diff --git a/drivers/dma/ptdma/ptdma.h b/drivers/dma/ptdma/ptdma.h
    index 1329c55..860e302 100644
    --- a/drivers/dma/ptdma/ptdma.h
    +++ b/drivers/dma/ptdma/ptdma.h
    @@ -216,6 +216,8 @@ struct pt_cmd_queue {
    u32 q_status;
    u32 q_int_status;
    u32 cmd_error;
    + /* Queue Statistics */
    + unsigned long total_pt_ops;
    } ____cacheline_aligned;

    struct pt_device {
    @@ -254,6 +256,9 @@ struct pt_device {

    wait_queue_head_t lsb_queue;

    + /* Device Statistics */
    + unsigned long total_interrupts;
    +
    struct pt_tasklet_data tdata;
    };

    @@ -307,6 +312,7 @@ struct pt_dev_vdata {
    int pt_dmaengine_register(struct pt_device *pt);
    void pt_dmaengine_unregister(struct pt_device *pt);

    +void ptdma_debugfs_setup(struct pt_device *pt);
    int pt_core_init(struct pt_device *pt);
    void pt_core_destroy(struct pt_device *pt);

    --
    2.7.4
    \
     
     \ /
      Last update: 2021-08-02 12:34    [W:3.185 / U:1.460 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site