0001
0002
0003
0004 #include <linux/kernel.h>
0005 #include <linux/debugfs.h>
0006 #include <linux/stringify.h>
0007 #include "cc_driver.h"
0008 #include "cc_crypto_ctx.h"
0009 #include "cc_debugfs.h"
0010
0011 #define CC_DEBUG_REG(_X) { \
0012 .name = __stringify(_X),\
0013 .offset = CC_REG(_X) \
0014 }
0015
0016
0017
0018
0019
0020
0021
0022 static struct dentry *cc_debugfs_dir;
0023
0024 static struct debugfs_reg32 ver_sig_regs[] = {
0025 { .name = "SIGNATURE" },
0026 { .name = "VERSION" },
0027 };
0028
0029 static const struct debugfs_reg32 pid_cid_regs[] = {
0030 CC_DEBUG_REG(PERIPHERAL_ID_0),
0031 CC_DEBUG_REG(PERIPHERAL_ID_1),
0032 CC_DEBUG_REG(PERIPHERAL_ID_2),
0033 CC_DEBUG_REG(PERIPHERAL_ID_3),
0034 CC_DEBUG_REG(PERIPHERAL_ID_4),
0035 CC_DEBUG_REG(COMPONENT_ID_0),
0036 CC_DEBUG_REG(COMPONENT_ID_1),
0037 CC_DEBUG_REG(COMPONENT_ID_2),
0038 CC_DEBUG_REG(COMPONENT_ID_3),
0039 };
0040
0041 static const struct debugfs_reg32 debug_regs[] = {
0042 CC_DEBUG_REG(HOST_IRR),
0043 CC_DEBUG_REG(HOST_POWER_DOWN_EN),
0044 CC_DEBUG_REG(AXIM_MON_ERR),
0045 CC_DEBUG_REG(DSCRPTR_QUEUE_CONTENT),
0046 CC_DEBUG_REG(HOST_IMR),
0047 CC_DEBUG_REG(AXIM_CFG),
0048 CC_DEBUG_REG(AXIM_CACHE_PARAMS),
0049 CC_DEBUG_REG(GPR_HOST),
0050 CC_DEBUG_REG(AXIM_MON_COMP),
0051 };
0052
0053 void __init cc_debugfs_global_init(void)
0054 {
0055 cc_debugfs_dir = debugfs_create_dir("ccree", NULL);
0056 }
0057
0058 void __exit cc_debugfs_global_fini(void)
0059 {
0060 debugfs_remove(cc_debugfs_dir);
0061 }
0062
0063 int cc_debugfs_init(struct cc_drvdata *drvdata)
0064 {
0065 struct device *dev = drvdata_to_dev(drvdata);
0066 struct debugfs_regset32 *regset, *verset;
0067
0068 regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL);
0069 if (!regset)
0070 return -ENOMEM;
0071
0072 regset->regs = debug_regs;
0073 regset->nregs = ARRAY_SIZE(debug_regs);
0074 regset->base = drvdata->cc_base;
0075 regset->dev = dev;
0076
0077 drvdata->dir = debugfs_create_dir(drvdata->plat_dev->name,
0078 cc_debugfs_dir);
0079
0080 debugfs_create_regset32("regs", 0400, drvdata->dir, regset);
0081 debugfs_create_bool("coherent", 0400, drvdata->dir, &drvdata->coherent);
0082
0083 verset = devm_kzalloc(dev, sizeof(*verset), GFP_KERNEL);
0084
0085 if (!verset)
0086 return 0;
0087
0088 if (drvdata->hw_rev <= CC_HW_REV_712) {
0089 ver_sig_regs[0].offset = drvdata->sig_offset;
0090 ver_sig_regs[1].offset = drvdata->ver_offset;
0091 verset->regs = ver_sig_regs;
0092 verset->nregs = ARRAY_SIZE(ver_sig_regs);
0093 } else {
0094 verset->regs = pid_cid_regs;
0095 verset->nregs = ARRAY_SIZE(pid_cid_regs);
0096 }
0097 verset->base = drvdata->cc_base;
0098 verset->dev = dev;
0099
0100 debugfs_create_regset32("version", 0400, drvdata->dir, verset);
0101 return 0;
0102 }
0103
0104 void cc_debugfs_fini(struct cc_drvdata *drvdata)
0105 {
0106 debugfs_remove_recursive(drvdata->dir);
0107 }