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