18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
28c2ecf20Sopenharmony_ci/* Copyright 2019 NXP */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include <linux/debugfs.h>
58c2ecf20Sopenharmony_ci#include "compat.h"
68c2ecf20Sopenharmony_ci#include "debugfs.h"
78c2ecf20Sopenharmony_ci#include "regs.h"
88c2ecf20Sopenharmony_ci#include "intern.h"
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistatic int caam_debugfs_u64_get(void *data, u64 *val)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	*val = caam64_to_cpu(*(u64 *)data);
138c2ecf20Sopenharmony_ci	return 0;
148c2ecf20Sopenharmony_ci}
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistatic int caam_debugfs_u32_get(void *data, u64 *val)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	*val = caam32_to_cpu(*(u32 *)data);
198c2ecf20Sopenharmony_ci	return 0;
208c2ecf20Sopenharmony_ci}
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciDEFINE_SIMPLE_ATTRIBUTE(caam_fops_u32_ro, caam_debugfs_u32_get, NULL, "%llu\n");
238c2ecf20Sopenharmony_ciDEFINE_SIMPLE_ATTRIBUTE(caam_fops_u64_ro, caam_debugfs_u64_get, NULL, "%llu\n");
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#ifdef CONFIG_CAAM_QI
268c2ecf20Sopenharmony_ci/*
278c2ecf20Sopenharmony_ci * This is a counter for the number of times the congestion group (where all
288c2ecf20Sopenharmony_ci * the request and response queueus are) reached congestion. Incremented
298c2ecf20Sopenharmony_ci * each time the congestion callback is called with congested == true.
308c2ecf20Sopenharmony_ci */
318c2ecf20Sopenharmony_cistatic u64 times_congested;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_civoid caam_debugfs_qi_congested(void)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	times_congested++;
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_civoid caam_debugfs_qi_init(struct caam_drv_private *ctrlpriv)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	debugfs_create_file("qi_congested", 0444, ctrlpriv->ctl,
418c2ecf20Sopenharmony_ci			    &times_congested, &caam_fops_u64_ro);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci#endif
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_civoid caam_debugfs_init(struct caam_drv_private *ctrlpriv, struct dentry *root)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	struct caam_perfmon *perfmon;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	/*
508c2ecf20Sopenharmony_ci	 * FIXME: needs better naming distinction, as some amalgamation of
518c2ecf20Sopenharmony_ci	 * "caam" and nprop->full_name. The OF name isn't distinctive,
528c2ecf20Sopenharmony_ci	 * but does separate instances
538c2ecf20Sopenharmony_ci	 */
548c2ecf20Sopenharmony_ci	perfmon = (struct caam_perfmon __force *)&ctrlpriv->ctrl->perfmon;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	ctrlpriv->ctl = debugfs_create_dir("ctl", root);
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	debugfs_create_file("rq_dequeued", 0444, ctrlpriv->ctl,
598c2ecf20Sopenharmony_ci			    &perfmon->req_dequeued, &caam_fops_u64_ro);
608c2ecf20Sopenharmony_ci	debugfs_create_file("ob_rq_encrypted", 0444, ctrlpriv->ctl,
618c2ecf20Sopenharmony_ci			    &perfmon->ob_enc_req, &caam_fops_u64_ro);
628c2ecf20Sopenharmony_ci	debugfs_create_file("ib_rq_decrypted", 0444, ctrlpriv->ctl,
638c2ecf20Sopenharmony_ci			    &perfmon->ib_dec_req, &caam_fops_u64_ro);
648c2ecf20Sopenharmony_ci	debugfs_create_file("ob_bytes_encrypted", 0444, ctrlpriv->ctl,
658c2ecf20Sopenharmony_ci			    &perfmon->ob_enc_bytes, &caam_fops_u64_ro);
668c2ecf20Sopenharmony_ci	debugfs_create_file("ob_bytes_protected", 0444, ctrlpriv->ctl,
678c2ecf20Sopenharmony_ci			    &perfmon->ob_prot_bytes, &caam_fops_u64_ro);
688c2ecf20Sopenharmony_ci	debugfs_create_file("ib_bytes_decrypted", 0444, ctrlpriv->ctl,
698c2ecf20Sopenharmony_ci			    &perfmon->ib_dec_bytes, &caam_fops_u64_ro);
708c2ecf20Sopenharmony_ci	debugfs_create_file("ib_bytes_validated", 0444, ctrlpriv->ctl,
718c2ecf20Sopenharmony_ci			    &perfmon->ib_valid_bytes, &caam_fops_u64_ro);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	/* Controller level - global status values */
748c2ecf20Sopenharmony_ci	debugfs_create_file("fault_addr", 0444, ctrlpriv->ctl,
758c2ecf20Sopenharmony_ci			    &perfmon->faultaddr, &caam_fops_u32_ro);
768c2ecf20Sopenharmony_ci	debugfs_create_file("fault_detail", 0444, ctrlpriv->ctl,
778c2ecf20Sopenharmony_ci			    &perfmon->faultdetail, &caam_fops_u32_ro);
788c2ecf20Sopenharmony_ci	debugfs_create_file("fault_status", 0444, ctrlpriv->ctl,
798c2ecf20Sopenharmony_ci			    &perfmon->status, &caam_fops_u32_ro);
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	/* Internal covering keys (useful in non-secure mode only) */
828c2ecf20Sopenharmony_ci	ctrlpriv->ctl_kek_wrap.data = (__force void *)&ctrlpriv->ctrl->kek[0];
838c2ecf20Sopenharmony_ci	ctrlpriv->ctl_kek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
848c2ecf20Sopenharmony_ci	debugfs_create_blob("kek", 0444, ctrlpriv->ctl,
858c2ecf20Sopenharmony_ci			    &ctrlpriv->ctl_kek_wrap);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	ctrlpriv->ctl_tkek_wrap.data = (__force void *)&ctrlpriv->ctrl->tkek[0];
888c2ecf20Sopenharmony_ci	ctrlpriv->ctl_tkek_wrap.size = KEK_KEY_SIZE * sizeof(u32);
898c2ecf20Sopenharmony_ci	debugfs_create_blob("tkek", 0444, ctrlpriv->ctl,
908c2ecf20Sopenharmony_ci			    &ctrlpriv->ctl_tkek_wrap);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	ctrlpriv->ctl_tdsk_wrap.data = (__force void *)&ctrlpriv->ctrl->tdsk[0];
938c2ecf20Sopenharmony_ci	ctrlpriv->ctl_tdsk_wrap.size = KEK_KEY_SIZE * sizeof(u32);
948c2ecf20Sopenharmony_ci	debugfs_create_blob("tdsk", 0444, ctrlpriv->ctl,
958c2ecf20Sopenharmony_ci			    &ctrlpriv->ctl_tdsk_wrap);
968c2ecf20Sopenharmony_ci}
97