162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright (C) 2012-2019 ARM Limited or its affiliates. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/kernel.h> 562306a36Sopenharmony_ci#include <linux/debugfs.h> 662306a36Sopenharmony_ci#include <linux/stringify.h> 762306a36Sopenharmony_ci#include "cc_driver.h" 862306a36Sopenharmony_ci#include "cc_crypto_ctx.h" 962306a36Sopenharmony_ci#include "cc_debugfs.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define CC_DEBUG_REG(_X) { \ 1262306a36Sopenharmony_ci .name = __stringify(_X),\ 1362306a36Sopenharmony_ci .offset = CC_REG(_X) \ 1462306a36Sopenharmony_ci } 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * This is a global var for the dentry of the 1862306a36Sopenharmony_ci * debugfs ccree/ dir. It is not tied down to 1962306a36Sopenharmony_ci * a specific instance of ccree, hence it is 2062306a36Sopenharmony_ci * global. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_cistatic struct dentry *cc_debugfs_dir; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic struct debugfs_reg32 ver_sig_regs[] = { 2562306a36Sopenharmony_ci { .name = "SIGNATURE" }, /* Must be 0th */ 2662306a36Sopenharmony_ci { .name = "VERSION" }, /* Must be 1st */ 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic const struct debugfs_reg32 pid_cid_regs[] = { 3062306a36Sopenharmony_ci CC_DEBUG_REG(PERIPHERAL_ID_0), 3162306a36Sopenharmony_ci CC_DEBUG_REG(PERIPHERAL_ID_1), 3262306a36Sopenharmony_ci CC_DEBUG_REG(PERIPHERAL_ID_2), 3362306a36Sopenharmony_ci CC_DEBUG_REG(PERIPHERAL_ID_3), 3462306a36Sopenharmony_ci CC_DEBUG_REG(PERIPHERAL_ID_4), 3562306a36Sopenharmony_ci CC_DEBUG_REG(COMPONENT_ID_0), 3662306a36Sopenharmony_ci CC_DEBUG_REG(COMPONENT_ID_1), 3762306a36Sopenharmony_ci CC_DEBUG_REG(COMPONENT_ID_2), 3862306a36Sopenharmony_ci CC_DEBUG_REG(COMPONENT_ID_3), 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic const struct debugfs_reg32 debug_regs[] = { 4262306a36Sopenharmony_ci CC_DEBUG_REG(HOST_IRR), 4362306a36Sopenharmony_ci CC_DEBUG_REG(HOST_POWER_DOWN_EN), 4462306a36Sopenharmony_ci CC_DEBUG_REG(AXIM_MON_ERR), 4562306a36Sopenharmony_ci CC_DEBUG_REG(DSCRPTR_QUEUE_CONTENT), 4662306a36Sopenharmony_ci CC_DEBUG_REG(HOST_IMR), 4762306a36Sopenharmony_ci CC_DEBUG_REG(AXIM_CFG), 4862306a36Sopenharmony_ci CC_DEBUG_REG(AXIM_CACHE_PARAMS), 4962306a36Sopenharmony_ci CC_DEBUG_REG(GPR_HOST), 5062306a36Sopenharmony_ci CC_DEBUG_REG(AXIM_MON_COMP), 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_civoid __init cc_debugfs_global_init(void) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci cc_debugfs_dir = debugfs_create_dir("ccree", NULL); 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_civoid cc_debugfs_global_fini(void) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci debugfs_remove(cc_debugfs_dir); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciint cc_debugfs_init(struct cc_drvdata *drvdata) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci struct device *dev = drvdata_to_dev(drvdata); 6662306a36Sopenharmony_ci struct debugfs_regset32 *regset, *verset; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL); 6962306a36Sopenharmony_ci if (!regset) 7062306a36Sopenharmony_ci return -ENOMEM; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci regset->regs = debug_regs; 7362306a36Sopenharmony_ci regset->nregs = ARRAY_SIZE(debug_regs); 7462306a36Sopenharmony_ci regset->base = drvdata->cc_base; 7562306a36Sopenharmony_ci regset->dev = dev; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci drvdata->dir = debugfs_create_dir(drvdata->plat_dev->name, 7862306a36Sopenharmony_ci cc_debugfs_dir); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci debugfs_create_regset32("regs", 0400, drvdata->dir, regset); 8162306a36Sopenharmony_ci debugfs_create_bool("coherent", 0400, drvdata->dir, &drvdata->coherent); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci verset = devm_kzalloc(dev, sizeof(*verset), GFP_KERNEL); 8462306a36Sopenharmony_ci /* Failing here is not important enough to fail the module load */ 8562306a36Sopenharmony_ci if (!verset) 8662306a36Sopenharmony_ci return 0; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci if (drvdata->hw_rev <= CC_HW_REV_712) { 8962306a36Sopenharmony_ci ver_sig_regs[0].offset = drvdata->sig_offset; 9062306a36Sopenharmony_ci ver_sig_regs[1].offset = drvdata->ver_offset; 9162306a36Sopenharmony_ci verset->regs = ver_sig_regs; 9262306a36Sopenharmony_ci verset->nregs = ARRAY_SIZE(ver_sig_regs); 9362306a36Sopenharmony_ci } else { 9462306a36Sopenharmony_ci verset->regs = pid_cid_regs; 9562306a36Sopenharmony_ci verset->nregs = ARRAY_SIZE(pid_cid_regs); 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci verset->base = drvdata->cc_base; 9862306a36Sopenharmony_ci verset->dev = dev; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci debugfs_create_regset32("version", 0400, drvdata->dir, verset); 10162306a36Sopenharmony_ci return 0; 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_civoid cc_debugfs_fini(struct cc_drvdata *drvdata) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci debugfs_remove_recursive(drvdata->dir); 10762306a36Sopenharmony_ci} 108