1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright 2014 IBM Corp.
6 #include <linux/debugfs.h>
7 #include <linux/kernel.h>
8 #include <linux/slab.h>
12 static struct dentry
*cxl_debugfs
;
14 /* Helpers to export CXL mmaped IO registers via debugfs */
15 static int debugfs_io_u64_get(void *data
, u64
*val
)
17 *val
= in_be64((u64 __iomem
*)data
);
21 static int debugfs_io_u64_set(void *data
, u64 val
)
23 out_be64((u64 __iomem
*)data
, val
);
26 DEFINE_DEBUGFS_ATTRIBUTE(fops_io_x64
, debugfs_io_u64_get
, debugfs_io_u64_set
,
29 static void debugfs_create_io_x64(const char *name
, umode_t mode
,
30 struct dentry
*parent
, u64 __iomem
*value
)
32 debugfs_create_file_unsafe(name
, mode
, parent
, (void __force
*)value
,
36 void cxl_debugfs_add_adapter_regs_psl9(struct cxl
*adapter
, struct dentry
*dir
)
38 debugfs_create_io_x64("fir1", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL9_FIR1
));
39 debugfs_create_io_x64("fir_mask", 0400, dir
,
40 _cxl_p1_addr(adapter
, CXL_PSL9_FIR_MASK
));
41 debugfs_create_io_x64("fir_cntl", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL9_FIR_CNTL
));
42 debugfs_create_io_x64("trace", S_IRUSR
| S_IWUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL9_TRACECFG
));
43 debugfs_create_io_x64("debug", 0600, dir
,
44 _cxl_p1_addr(adapter
, CXL_PSL9_DEBUG
));
45 debugfs_create_io_x64("xsl-debug", 0600, dir
,
46 _cxl_p1_addr(adapter
, CXL_XSL9_DBG
));
49 void cxl_debugfs_add_adapter_regs_psl8(struct cxl
*adapter
, struct dentry
*dir
)
51 debugfs_create_io_x64("fir1", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL_FIR1
));
52 debugfs_create_io_x64("fir2", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL_FIR2
));
53 debugfs_create_io_x64("fir_cntl", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL_FIR_CNTL
));
54 debugfs_create_io_x64("trace", S_IRUSR
| S_IWUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL_TRACE
));
57 void cxl_debugfs_adapter_add(struct cxl
*adapter
)
65 snprintf(buf
, 32, "card%i", adapter
->adapter_num
);
66 dir
= debugfs_create_dir(buf
, cxl_debugfs
);
67 adapter
->debugfs
= dir
;
69 debugfs_create_io_x64("err_ivte", S_IRUSR
, dir
, _cxl_p1_addr(adapter
, CXL_PSL_ErrIVTE
));
71 if (adapter
->native
->sl_ops
->debugfs_add_adapter_regs
)
72 adapter
->native
->sl_ops
->debugfs_add_adapter_regs(adapter
, dir
);
75 void cxl_debugfs_adapter_remove(struct cxl
*adapter
)
77 debugfs_remove_recursive(adapter
->debugfs
);
80 void cxl_debugfs_add_afu_regs_psl9(struct cxl_afu
*afu
, struct dentry
*dir
)
82 debugfs_create_io_x64("serr", S_IRUSR
, dir
, _cxl_p1n_addr(afu
, CXL_PSL_SERR_An
));
85 void cxl_debugfs_add_afu_regs_psl8(struct cxl_afu
*afu
, struct dentry
*dir
)
87 debugfs_create_io_x64("sstp0", S_IRUSR
, dir
, _cxl_p2n_addr(afu
, CXL_SSTP0_An
));
88 debugfs_create_io_x64("sstp1", S_IRUSR
, dir
, _cxl_p2n_addr(afu
, CXL_SSTP1_An
));
90 debugfs_create_io_x64("fir", S_IRUSR
, dir
, _cxl_p1n_addr(afu
, CXL_PSL_FIR_SLICE_An
));
91 debugfs_create_io_x64("serr", S_IRUSR
, dir
, _cxl_p1n_addr(afu
, CXL_PSL_SERR_An
));
92 debugfs_create_io_x64("afu_debug", S_IRUSR
, dir
, _cxl_p1n_addr(afu
, CXL_AFU_DEBUG_An
));
93 debugfs_create_io_x64("trace", S_IRUSR
| S_IWUSR
, dir
, _cxl_p1n_addr(afu
, CXL_PSL_SLICE_TRACE
));
96 void cxl_debugfs_afu_add(struct cxl_afu
*afu
)
101 if (!afu
->adapter
->debugfs
)
104 snprintf(buf
, 32, "psl%i.%i", afu
->adapter
->adapter_num
, afu
->slice
);
105 dir
= debugfs_create_dir(buf
, afu
->adapter
->debugfs
);
108 debugfs_create_io_x64("sr", S_IRUSR
, dir
, _cxl_p1n_addr(afu
, CXL_PSL_SR_An
));
109 debugfs_create_io_x64("dsisr", S_IRUSR
, dir
, _cxl_p2n_addr(afu
, CXL_PSL_DSISR_An
));
110 debugfs_create_io_x64("dar", S_IRUSR
, dir
, _cxl_p2n_addr(afu
, CXL_PSL_DAR_An
));
112 debugfs_create_io_x64("err_status", S_IRUSR
, dir
, _cxl_p2n_addr(afu
, CXL_PSL_ErrStat_An
));
114 if (afu
->adapter
->native
->sl_ops
->debugfs_add_afu_regs
)
115 afu
->adapter
->native
->sl_ops
->debugfs_add_afu_regs(afu
, dir
);
118 void cxl_debugfs_afu_remove(struct cxl_afu
*afu
)
120 debugfs_remove_recursive(afu
->debugfs
);
123 void __init
cxl_debugfs_init(void)
125 if (!cpu_has_feature(CPU_FTR_HVMODE
))
128 cxl_debugfs
= debugfs_create_dir("cxl", NULL
);
131 void cxl_debugfs_exit(void)
133 debugfs_remove_recursive(cxl_debugfs
);