debugfs.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright 2014 IBM Corp.
  4. */
  5. #include <linux/debugfs.h>
  6. #include <linux/kernel.h>
  7. #include <linux/slab.h>
  8. #include "cxl.h"
  9. static struct dentry *cxl_debugfs;
  10. /* Helpers to export CXL mmaped IO registers via debugfs */
  11. static int debugfs_io_u64_get(void *data, u64 *val)
  12. {
  13. *val = in_be64((u64 __iomem *)data);
  14. return 0;
  15. }
  16. static int debugfs_io_u64_set(void *data, u64 val)
  17. {
  18. out_be64((u64 __iomem *)data, val);
  19. return 0;
  20. }
  21. DEFINE_DEBUGFS_ATTRIBUTE(fops_io_x64, debugfs_io_u64_get, debugfs_io_u64_set,
  22. "0x%016llx\n");
  23. static void debugfs_create_io_x64(const char *name, umode_t mode,
  24. struct dentry *parent, u64 __iomem *value)
  25. {
  26. debugfs_create_file_unsafe(name, mode, parent, (void __force *)value,
  27. &fops_io_x64);
  28. }
  29. void cxl_debugfs_add_adapter_regs_psl9(struct cxl *adapter, struct dentry *dir)
  30. {
  31. debugfs_create_io_x64("fir1", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_FIR1));
  32. debugfs_create_io_x64("fir_mask", 0400, dir,
  33. _cxl_p1_addr(adapter, CXL_PSL9_FIR_MASK));
  34. debugfs_create_io_x64("fir_cntl", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_FIR_CNTL));
  35. debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_TRACECFG));
  36. debugfs_create_io_x64("debug", 0600, dir,
  37. _cxl_p1_addr(adapter, CXL_PSL9_DEBUG));
  38. debugfs_create_io_x64("xsl-debug", 0600, dir,
  39. _cxl_p1_addr(adapter, CXL_XSL9_DBG));
  40. }
  41. void cxl_debugfs_add_adapter_regs_psl8(struct cxl *adapter, struct dentry *dir)
  42. {
  43. debugfs_create_io_x64("fir1", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR1));
  44. debugfs_create_io_x64("fir2", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR2));
  45. debugfs_create_io_x64("fir_cntl", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR_CNTL));
  46. debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_TRACE));
  47. }
  48. void cxl_debugfs_adapter_add(struct cxl *adapter)
  49. {
  50. struct dentry *dir;
  51. char buf[32];
  52. if (!cxl_debugfs)
  53. return;
  54. snprintf(buf, 32, "card%i", adapter->adapter_num);
  55. dir = debugfs_create_dir(buf, cxl_debugfs);
  56. adapter->debugfs = dir;
  57. debugfs_create_io_x64("err_ivte", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_ErrIVTE));
  58. if (adapter->native->sl_ops->debugfs_add_adapter_regs)
  59. adapter->native->sl_ops->debugfs_add_adapter_regs(adapter, dir);
  60. }
  61. void cxl_debugfs_adapter_remove(struct cxl *adapter)
  62. {
  63. debugfs_remove_recursive(adapter->debugfs);
  64. }
  65. void cxl_debugfs_add_afu_regs_psl9(struct cxl_afu *afu, struct dentry *dir)
  66. {
  67. debugfs_create_io_x64("serr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SERR_An));
  68. }
  69. void cxl_debugfs_add_afu_regs_psl8(struct cxl_afu *afu, struct dentry *dir)
  70. {
  71. debugfs_create_io_x64("sstp0", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_SSTP0_An));
  72. debugfs_create_io_x64("sstp1", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_SSTP1_An));
  73. debugfs_create_io_x64("fir", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_FIR_SLICE_An));
  74. debugfs_create_io_x64("serr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SERR_An));
  75. debugfs_create_io_x64("afu_debug", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_AFU_DEBUG_An));
  76. debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SLICE_TRACE));
  77. }
  78. void cxl_debugfs_afu_add(struct cxl_afu *afu)
  79. {
  80. struct dentry *dir;
  81. char buf[32];
  82. if (!afu->adapter->debugfs)
  83. return;
  84. snprintf(buf, 32, "psl%i.%i", afu->adapter->adapter_num, afu->slice);
  85. dir = debugfs_create_dir(buf, afu->adapter->debugfs);
  86. afu->debugfs = dir;
  87. debugfs_create_io_x64("sr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SR_An));
  88. debugfs_create_io_x64("dsisr", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_DSISR_An));
  89. debugfs_create_io_x64("dar", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_DAR_An));
  90. debugfs_create_io_x64("err_status", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_ErrStat_An));
  91. if (afu->adapter->native->sl_ops->debugfs_add_afu_regs)
  92. afu->adapter->native->sl_ops->debugfs_add_afu_regs(afu, dir);
  93. }
  94. void cxl_debugfs_afu_remove(struct cxl_afu *afu)
  95. {
  96. debugfs_remove_recursive(afu->debugfs);
  97. }
  98. void __init cxl_debugfs_init(void)
  99. {
  100. if (!cpu_has_feature(CPU_FTR_HVMODE))
  101. return;
  102. cxl_debugfs = debugfs_create_dir("cxl", NULL);
  103. }
  104. void cxl_debugfs_exit(void)
  105. {
  106. debugfs_remove_recursive(cxl_debugfs);
  107. }