Path: blob/master/drivers/dma/amd/ptdma/ptdma-debugfs.c
26285 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* AMD Passthrough DMA device driver3* -- Based on the CCP driver4*5* Copyright (C) 2016,2021 Advanced Micro Devices, Inc.6*7* Author: Sanjay R Mehta <[email protected]>8* Author: Gary R Hook <[email protected]>9*/1011#include <linux/debugfs.h>12#include <linux/seq_file.h>1314#include "ptdma.h"15#include "../ae4dma/ae4dma.h"1617/* DebugFS helpers */18#define RI_VERSION_NUM 0x0000003F1920#define RI_NUM_VQM 0x0007800021#define RI_NVQM_SHIFT 152223static int pt_debugfs_info_show(struct seq_file *s, void *p)24{25struct pt_device *pt = s->private;26struct ae4_device *ae4;27unsigned int regval;2829seq_printf(s, "Device name: %s\n", dev_name(pt->dev));3031if (pt->ver == AE4_DMA_VERSION) {32ae4 = container_of(pt, struct ae4_device, pt);33seq_printf(s, " # Queues: %d\n", ae4->cmd_q_count);34seq_printf(s, " # Cmds per queue: %d\n", CMD_Q_LEN);35} else {36seq_printf(s, " # Queues: %d\n", 1);37seq_printf(s, " # Cmds: %d\n", pt->cmd_count);38}3940regval = ioread32(pt->io_regs + CMD_PT_VERSION);4142seq_printf(s, " Version: %d\n", regval & RI_VERSION_NUM);43seq_puts(s, " Engines:");44seq_puts(s, "\n");45seq_printf(s, " Queues: %d\n", (regval & RI_NUM_VQM) >> RI_NVQM_SHIFT);4647return 0;48}4950/*51* Return a formatted buffer containing the current52* statistics of queue for PTDMA53*/54static int pt_debugfs_stats_show(struct seq_file *s, void *p)55{56struct pt_device *pt = s->private;5758seq_printf(s, "Total Interrupts Handled: %ld\n", pt->total_interrupts);5960return 0;61}6263static int pt_debugfs_queue_show(struct seq_file *s, void *p)64{65struct pt_cmd_queue *cmd_q = s->private;66struct pt_device *pt;67unsigned int regval;6869if (!cmd_q)70return 0;7172seq_printf(s, " Pass-Thru: %ld\n", cmd_q->total_pt_ops);7374pt = cmd_q->pt;75if (pt->ver == AE4_DMA_VERSION) {76regval = readl(cmd_q->reg_control + 0x4);77seq_printf(s, " Enabled Interrupts:: status 0x%x\n", regval);78} else {79regval = ioread32(cmd_q->reg_control + 0x000C);8081seq_puts(s, " Enabled Interrupts:");82if (regval & INT_EMPTY_QUEUE)83seq_puts(s, " EMPTY");84if (regval & INT_QUEUE_STOPPED)85seq_puts(s, " STOPPED");86if (regval & INT_ERROR)87seq_puts(s, " ERROR");88if (regval & INT_COMPLETION)89seq_puts(s, " COMPLETION");90seq_puts(s, "\n");91}9293return 0;94}9596DEFINE_SHOW_ATTRIBUTE(pt_debugfs_info);97DEFINE_SHOW_ATTRIBUTE(pt_debugfs_queue);98DEFINE_SHOW_ATTRIBUTE(pt_debugfs_stats);99100void ptdma_debugfs_setup(struct pt_device *pt)101{102struct dentry *debugfs_q_instance;103struct ae4_cmd_queue *ae4cmd_q;104struct pt_cmd_queue *cmd_q;105struct ae4_device *ae4;106char name[30];107int i;108109if (!debugfs_initialized())110return;111112debugfs_create_file("info", 0400, pt->dma_dev.dbg_dev_root, pt,113&pt_debugfs_info_fops);114115debugfs_create_file("stats", 0400, pt->dma_dev.dbg_dev_root, pt,116&pt_debugfs_stats_fops);117118119if (pt->ver == AE4_DMA_VERSION) {120ae4 = container_of(pt, struct ae4_device, pt);121for (i = 0; i < ae4->cmd_q_count; i++) {122ae4cmd_q = &ae4->ae4cmd_q[i];123cmd_q = &ae4cmd_q->cmd_q;124125memset(name, 0, sizeof(name));126snprintf(name, 29, "q%d", ae4cmd_q->id);127128debugfs_q_instance =129debugfs_create_dir(name, pt->dma_dev.dbg_dev_root);130131debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,132&pt_debugfs_queue_fops);133}134} else {135debugfs_q_instance =136debugfs_create_dir("q", pt->dma_dev.dbg_dev_root);137cmd_q = &pt->cmd_q;138debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,139&pt_debugfs_queue_fops);140}141}142EXPORT_SYMBOL_GPL(ptdma_debugfs_setup);143144145