0001
0002
0003
0004
0005
0006 #include <linux/debugfs.h>
0007 #include <linux/kernel.h>
0008 #include <linux/slab.h>
0009
0010 #include "cxl.h"
0011
0012 static struct dentry *cxl_debugfs;
0013
0014
0015 static int debugfs_io_u64_get(void *data, u64 *val)
0016 {
0017 *val = in_be64((u64 __iomem *)data);
0018 return 0;
0019 }
0020
0021 static int debugfs_io_u64_set(void *data, u64 val)
0022 {
0023 out_be64((u64 __iomem *)data, val);
0024 return 0;
0025 }
0026 DEFINE_DEBUGFS_ATTRIBUTE(fops_io_x64, debugfs_io_u64_get, debugfs_io_u64_set,
0027 "0x%016llx\n");
0028
0029 static void debugfs_create_io_x64(const char *name, umode_t mode,
0030 struct dentry *parent, u64 __iomem *value)
0031 {
0032 debugfs_create_file_unsafe(name, mode, parent, (void __force *)value,
0033 &fops_io_x64);
0034 }
0035
0036 void cxl_debugfs_add_adapter_regs_psl9(struct cxl *adapter, struct dentry *dir)
0037 {
0038 debugfs_create_io_x64("fir1", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_FIR1));
0039 debugfs_create_io_x64("fir_mask", 0400, dir,
0040 _cxl_p1_addr(adapter, CXL_PSL9_FIR_MASK));
0041 debugfs_create_io_x64("fir_cntl", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_FIR_CNTL));
0042 debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1_addr(adapter, CXL_PSL9_TRACECFG));
0043 debugfs_create_io_x64("debug", 0600, dir,
0044 _cxl_p1_addr(adapter, CXL_PSL9_DEBUG));
0045 debugfs_create_io_x64("xsl-debug", 0600, dir,
0046 _cxl_p1_addr(adapter, CXL_XSL9_DBG));
0047 }
0048
0049 void cxl_debugfs_add_adapter_regs_psl8(struct cxl *adapter, struct dentry *dir)
0050 {
0051 debugfs_create_io_x64("fir1", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR1));
0052 debugfs_create_io_x64("fir2", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR2));
0053 debugfs_create_io_x64("fir_cntl", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_FIR_CNTL));
0054 debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_TRACE));
0055 }
0056
0057 void cxl_debugfs_adapter_add(struct cxl *adapter)
0058 {
0059 struct dentry *dir;
0060 char buf[32];
0061
0062 if (!cxl_debugfs)
0063 return;
0064
0065 snprintf(buf, 32, "card%i", adapter->adapter_num);
0066 dir = debugfs_create_dir(buf, cxl_debugfs);
0067 adapter->debugfs = dir;
0068
0069 debugfs_create_io_x64("err_ivte", S_IRUSR, dir, _cxl_p1_addr(adapter, CXL_PSL_ErrIVTE));
0070
0071 if (adapter->native->sl_ops->debugfs_add_adapter_regs)
0072 adapter->native->sl_ops->debugfs_add_adapter_regs(adapter, dir);
0073 }
0074
0075 void cxl_debugfs_adapter_remove(struct cxl *adapter)
0076 {
0077 debugfs_remove_recursive(adapter->debugfs);
0078 }
0079
0080 void cxl_debugfs_add_afu_regs_psl9(struct cxl_afu *afu, struct dentry *dir)
0081 {
0082 debugfs_create_io_x64("serr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SERR_An));
0083 }
0084
0085 void cxl_debugfs_add_afu_regs_psl8(struct cxl_afu *afu, struct dentry *dir)
0086 {
0087 debugfs_create_io_x64("sstp0", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_SSTP0_An));
0088 debugfs_create_io_x64("sstp1", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_SSTP1_An));
0089
0090 debugfs_create_io_x64("fir", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_FIR_SLICE_An));
0091 debugfs_create_io_x64("serr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SERR_An));
0092 debugfs_create_io_x64("afu_debug", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_AFU_DEBUG_An));
0093 debugfs_create_io_x64("trace", S_IRUSR | S_IWUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SLICE_TRACE));
0094 }
0095
0096 void cxl_debugfs_afu_add(struct cxl_afu *afu)
0097 {
0098 struct dentry *dir;
0099 char buf[32];
0100
0101 if (!afu->adapter->debugfs)
0102 return;
0103
0104 snprintf(buf, 32, "psl%i.%i", afu->adapter->adapter_num, afu->slice);
0105 dir = debugfs_create_dir(buf, afu->adapter->debugfs);
0106 afu->debugfs = dir;
0107
0108 debugfs_create_io_x64("sr", S_IRUSR, dir, _cxl_p1n_addr(afu, CXL_PSL_SR_An));
0109 debugfs_create_io_x64("dsisr", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_DSISR_An));
0110 debugfs_create_io_x64("dar", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_DAR_An));
0111
0112 debugfs_create_io_x64("err_status", S_IRUSR, dir, _cxl_p2n_addr(afu, CXL_PSL_ErrStat_An));
0113
0114 if (afu->adapter->native->sl_ops->debugfs_add_afu_regs)
0115 afu->adapter->native->sl_ops->debugfs_add_afu_regs(afu, dir);
0116 }
0117
0118 void cxl_debugfs_afu_remove(struct cxl_afu *afu)
0119 {
0120 debugfs_remove_recursive(afu->debugfs);
0121 }
0122
0123 void __init cxl_debugfs_init(void)
0124 {
0125 if (!cpu_has_feature(CPU_FTR_HVMODE))
0126 return;
0127
0128 cxl_debugfs = debugfs_create_dir("cxl", NULL);
0129 }
0130
0131 void cxl_debugfs_exit(void)
0132 {
0133 debugfs_remove_recursive(cxl_debugfs);
0134 }