162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
262306a36Sopenharmony_ci/* Copyright 2019, 2023 NXP */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/debugfs.h>
562306a36Sopenharmony_ci#include "compat.h"
662306a36Sopenharmony_ci#include "debugfs.h"
762306a36Sopenharmony_ci#include "regs.h"
862306a36Sopenharmony_ci#include "intern.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic int caam_debugfs_u64_get(void *data, u64 *val)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	*val = caam64_to_cpu(*(u64 *)data);
1362306a36Sopenharmony_ci	return 0;
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic int caam_debugfs_u32_get(void *data, u64 *val)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	*val = caam32_to_cpu(*(u32 *)data);
1962306a36Sopenharmony_ci	return 0;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(caam_fops_u32_ro, caam_debugfs_u32_get, NULL, "%llu\n");
2362306a36Sopenharmony_ciDEFINE_DEBUGFS_ATTRIBUTE(caam_fops_u64_ro, caam_debugfs_u64_get, NULL, "%llu\n");
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#ifdef CONFIG_CAAM_QI
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * This is a counter for the number of times the congestion group (where all
2862306a36Sopenharmony_ci * the request and response queueus are) reached congestion. Incremented
2962306a36Sopenharmony_ci * each time the congestion callback is called with congested == true.
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_cistatic u64 times_congested;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_civoid caam_debugfs_qi_congested(void)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	times_congested++;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_civoid caam_debugfs_qi_init(struct caam_drv_private *ctrlpriv)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	debugfs_create_file("qi_congested", 0444, ctrlpriv->ctl,
4162306a36Sopenharmony_ci			    &times_congested, &caam_fops_u64_ro);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci#endif
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_civoid caam_debugfs_init(struct caam_drv_private *ctrlpriv,
4662306a36Sopenharmony_ci		       struct caam_perfmon __force *perfmon,
4762306a36Sopenharmony_ci		       struct dentry *root)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	/*
5062306a36Sopenharmony_ci	 * FIXME: needs better naming distinction, as some amalgamation of
5162306a36Sopenharmony_ci	 * "caam" and nprop->full_name. The OF name isn't distinctive,
5262306a36Sopenharmony_ci	 * but does separate instances
5362306a36Sopenharmony_ci	 */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	ctrlpriv->ctl = debugfs_create_dir("ctl", root);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	debugfs_create_file("rq_dequeued", 0444, ctrlpriv->ctl,
5862306a36Sopenharmony_ci			    &perfmon->req_dequeued, &caam_fops_u64_ro);
5962306a36Sopenharmony_ci	debugfs_create_file("ob_rq_encrypted", 0444, ctrlpriv->ctl,
6062306a36Sopenharmony_ci			    &perfmon->ob_enc_req, &caam_fops_u64_ro);
6162306a36Sopenharmony_ci	debugfs_create_file("ib_rq_decrypted", 0444, ctrlpriv->ctl,
6262306a36Sopenharmony_ci			    &perfmon->ib_dec_req, &caam_fops_u64_ro);
6362306a36Sopenharmony_ci	debugfs_create_file("ob_bytes_encrypted", 0444, ctrlpriv->ctl,
6462306a36Sopenharmony_ci			    &perfmon->ob_enc_bytes, &caam_fops_u64_ro);
6562306a36Sopenharmony_ci	debugfs_create_file("ob_bytes_protected", 0444, ctrlpriv->ctl,
6662306a36Sopenharmony_ci			    &perfmon->ob_prot_bytes, &caam_fops_u64_ro);
6762306a36Sopenharmony_ci	debugfs_create_file("ib_bytes_decrypted", 0444, ctrlpriv->ctl,
6862306a36Sopenharmony_ci			    &perfmon->ib_dec_bytes, &caam_fops_u64_ro);
6962306a36Sopenharmony_ci	debugfs_create_file("ib_bytes_validated", 0444, ctrlpriv->ctl,
7062306a36Sopenharmony_ci			    &perfmon->ib_valid_bytes, &caam_fops_u64_ro);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	/* Controller level - global status values */
7362306a36Sopenharmony_ci	debugfs_create_file("fault_addr", 0444, ctrlpriv->ctl,
7462306a36Sopenharmony_ci			    &perfmon->faultaddr, &caam_fops_u32_ro);
7562306a36Sopenharmony_ci	debugfs_create_file("fault_detail", 0444, ctrlpriv->ctl,
7662306a36Sopenharmony_ci			    &perfmon->faultdetail, &caam_fops_u32_ro);
7762306a36Sopenharmony_ci	debugfs_create_file("fault_status", 0444, ctrlpriv->ctl,
7862306a36Sopenharmony_ci			    &perfmon->status, &caam_fops_u32_ro);
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	if (ctrlpriv->optee_en)
8162306a36Sopenharmony_ci		return;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* Internal covering keys (useful in non-secure mode only) */
8462306a36Sopenharmony_ci	ctrlpriv->ctl_kek_wrap.data = (__force void *)&ctrlpriv->ctrl->kek[0];
8562306a36Sopenharmony_ci	ctrlpriv->ctl_kek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
8662306a36Sopenharmony_ci	debugfs_create_blob("kek", 0444, ctrlpriv->ctl,
8762306a36Sopenharmony_ci			    &ctrlpriv->ctl_kek_wrap);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	ctrlpriv->ctl_tkek_wrap.data = (__force void *)&ctrlpriv->ctrl->tkek[0];
9062306a36Sopenharmony_ci	ctrlpriv->ctl_tkek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
9162306a36Sopenharmony_ci	debugfs_create_blob("tkek", 0444, ctrlpriv->ctl,
9262306a36Sopenharmony_ci			    &ctrlpriv->ctl_tkek_wrap);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	ctrlpriv->ctl_tdsk_wrap.data = (__force void *)&ctrlpriv->ctrl->tdsk[0];
9562306a36Sopenharmony_ci	ctrlpriv->ctl_tdsk_wrap.size = KEK_KEY_SIZE * sizeof(u32);
9662306a36Sopenharmony_ci	debugfs_create_blob("tdsk", 0444, ctrlpriv->ctl,
9762306a36Sopenharmony_ci			    &ctrlpriv->ctl_tdsk_wrap);
9862306a36Sopenharmony_ci}
99