ptdma-debugfs.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * AMD Passthrough DMA device driver
  4. * -- Based on the CCP driver
  5. *
  6. * Copyright (C) 2016,2021 Advanced Micro Devices, Inc.
  7. *
  8. * Author: Sanjay R Mehta <[email protected]>
  9. * Author: Gary R Hook <[email protected]>
  10. */
  11. #include <linux/debugfs.h>
  12. #include <linux/seq_file.h>
  13. #include "ptdma.h"
  14. /* DebugFS helpers */
  15. #define RI_VERSION_NUM 0x0000003F
  16. #define RI_NUM_VQM 0x00078000
  17. #define RI_NVQM_SHIFT 15
  18. static int pt_debugfs_info_show(struct seq_file *s, void *p)
  19. {
  20. struct pt_device *pt = s->private;
  21. unsigned int regval;
  22. seq_printf(s, "Device name: %s\n", dev_name(pt->dev));
  23. seq_printf(s, " # Queues: %d\n", 1);
  24. seq_printf(s, " # Cmds: %d\n", pt->cmd_count);
  25. regval = ioread32(pt->io_regs + CMD_PT_VERSION);
  26. seq_printf(s, " Version: %d\n", regval & RI_VERSION_NUM);
  27. seq_puts(s, " Engines:");
  28. seq_puts(s, "\n");
  29. seq_printf(s, " Queues: %d\n", (regval & RI_NUM_VQM) >> RI_NVQM_SHIFT);
  30. return 0;
  31. }
  32. /*
  33. * Return a formatted buffer containing the current
  34. * statistics of queue for PTDMA
  35. */
  36. static int pt_debugfs_stats_show(struct seq_file *s, void *p)
  37. {
  38. struct pt_device *pt = s->private;
  39. seq_printf(s, "Total Interrupts Handled: %ld\n", pt->total_interrupts);
  40. return 0;
  41. }
  42. static int pt_debugfs_queue_show(struct seq_file *s, void *p)
  43. {
  44. struct pt_cmd_queue *cmd_q = s->private;
  45. unsigned int regval;
  46. if (!cmd_q)
  47. return 0;
  48. seq_printf(s, " Pass-Thru: %ld\n", cmd_q->total_pt_ops);
  49. regval = ioread32(cmd_q->reg_control + 0x000C);
  50. seq_puts(s, " Enabled Interrupts:");
  51. if (regval & INT_EMPTY_QUEUE)
  52. seq_puts(s, " EMPTY");
  53. if (regval & INT_QUEUE_STOPPED)
  54. seq_puts(s, " STOPPED");
  55. if (regval & INT_ERROR)
  56. seq_puts(s, " ERROR");
  57. if (regval & INT_COMPLETION)
  58. seq_puts(s, " COMPLETION");
  59. seq_puts(s, "\n");
  60. return 0;
  61. }
  62. DEFINE_SHOW_ATTRIBUTE(pt_debugfs_info);
  63. DEFINE_SHOW_ATTRIBUTE(pt_debugfs_queue);
  64. DEFINE_SHOW_ATTRIBUTE(pt_debugfs_stats);
  65. void ptdma_debugfs_setup(struct pt_device *pt)
  66. {
  67. struct pt_cmd_queue *cmd_q;
  68. struct dentry *debugfs_q_instance;
  69. if (!debugfs_initialized())
  70. return;
  71. debugfs_create_file("info", 0400, pt->dma_dev.dbg_dev_root, pt,
  72. &pt_debugfs_info_fops);
  73. debugfs_create_file("stats", 0400, pt->dma_dev.dbg_dev_root, pt,
  74. &pt_debugfs_stats_fops);
  75. cmd_q = &pt->cmd_q;
  76. debugfs_q_instance =
  77. debugfs_create_dir("q", pt->dma_dev.dbg_dev_root);
  78. debugfs_create_file("stats", 0400, debugfs_q_instance, cmd_q,
  79. &pt_debugfs_queue_fops);
  80. }