Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Copyright 2014 IBM Corp.
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 /* Helpers to export CXL mmaped IO registers via debugfs */
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 }