Commit 8213a1a6 authored by Kai Ye's avatar Kai Ye Committed by Herbert Xu

crypto: hisilicon/sec2 - add debugfs for Hisilicon SEC

Hisilicon SEC engine driver uses debugfs
to provides IO operation debug information
Signed-off-by: default avatarKai Ye <yekai13@huawei.com>
Signed-off-by: default avatarLongfang Liu <liulongfang@huawei.com>
Signed-off-by: default avatarShukun Tan <tanshukun1@huawei.com>
Reviewed-by: default avatarZhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 0a3a3960
What: /sys/kernel/debug/hisi_sec/<bdf>/sec_dfx What: /sys/kernel/debug/hisi_sec2/<bdf>/clear_enable
Date: Oct 2019
Contact: linux-crypto@vger.kernel.org
Description: Dump the debug registers of SEC cores.
Only available for PF.
What: /sys/kernel/debug/hisi_sec/<bdf>/clear_enable
Date: Oct 2019 Date: Oct 2019
Contact: linux-crypto@vger.kernel.org Contact: linux-crypto@vger.kernel.org
Description: Enabling/disabling of clear action after reading Description: Enabling/disabling of clear action after reading
...@@ -12,7 +6,7 @@ Description: Enabling/disabling of clear action after reading ...@@ -12,7 +6,7 @@ Description: Enabling/disabling of clear action after reading
0: disable, 1: enable. 0: disable, 1: enable.
Only available for PF, and take no other effect on SEC. Only available for PF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec/<bdf>/current_qm What: /sys/kernel/debug/hisi_sec2/<bdf>/current_qm
Date: Oct 2019 Date: Oct 2019
Contact: linux-crypto@vger.kernel.org Contact: linux-crypto@vger.kernel.org
Description: One SEC controller has one PF and multiple VFs, each function Description: One SEC controller has one PF and multiple VFs, each function
...@@ -20,21 +14,21 @@ Description: One SEC controller has one PF and multiple VFs, each function ...@@ -20,21 +14,21 @@ Description: One SEC controller has one PF and multiple VFs, each function
qm refers to. qm refers to.
Only available for PF. Only available for PF.
What: /sys/kernel/debug/hisi_sec/<bdf>/qm/qm_regs What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/qm_regs
Date: Oct 2019 Date: Oct 2019
Contact: linux-crypto@vger.kernel.org Contact: linux-crypto@vger.kernel.org
Description: Dump of QM related debug registers. Description: Dump of QM related debug registers.
Available for PF and VF in host. VF in guest currently only Available for PF and VF in host. VF in guest currently only
has one debug register. has one debug register.
What: /sys/kernel/debug/hisi_sec/<bdf>/qm/current_q What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/current_q
Date: Oct 2019 Date: Oct 2019
Contact: linux-crypto@vger.kernel.org Contact: linux-crypto@vger.kernel.org
Description: One QM of SEC may contain multiple queues. Select specific Description: One QM of SEC may contain multiple queues. Select specific
queue to show its debug registers in above 'qm_regs'. queue to show its debug registers in above 'qm_regs'.
Only available for PF. Only available for PF.
What: /sys/kernel/debug/hisi_sec/<bdf>/qm/clear_enable What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/clear_enable
Date: Oct 2019 Date: Oct 2019
Contact: linux-crypto@vger.kernel.org Contact: linux-crypto@vger.kernel.org
Description: Enabling/disabling of clear action after reading Description: Enabling/disabling of clear action after reading
...@@ -79,3 +73,41 @@ Contact: linux-crypto@vger.kernel.org ...@@ -79,3 +73,41 @@ Contact: linux-crypto@vger.kernel.org
Description: Dump the status of the QM. Description: Dump the status of the QM.
Four states: initiated, started, stopped and closed. Four states: initiated, started, stopped and closed.
Available for both PF and VF, and take no other effect on SEC. Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/send_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of sent requests.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/recv_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of received requests.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/send_busy_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of requests sent with returning busy.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/err_bd_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of BD type error requests
to be received.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/invalid_req_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of invalid requests being received.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/sec_dfx/done_flag_cnt
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the total number of completed but marked error requests
to be received.
Available for both PF and VF, and take no other effect on SEC.
...@@ -160,6 +160,10 @@ struct sec_debug_file { ...@@ -160,6 +160,10 @@ struct sec_debug_file {
struct sec_dfx { struct sec_dfx {
atomic64_t send_cnt; atomic64_t send_cnt;
atomic64_t recv_cnt; atomic64_t recv_cnt;
atomic64_t send_busy_cnt;
atomic64_t err_bd_cnt;
atomic64_t invalid_req_cnt;
atomic64_t done_flag_cnt;
}; };
struct sec_debug { struct sec_debug {
......
...@@ -148,6 +148,7 @@ static int sec_aead_verify(struct sec_req *req) ...@@ -148,6 +148,7 @@ static int sec_aead_verify(struct sec_req *req)
static void sec_req_cb(struct hisi_qp *qp, void *resp) static void sec_req_cb(struct hisi_qp *qp, void *resp)
{ {
struct sec_qp_ctx *qp_ctx = qp->qp_ctx; struct sec_qp_ctx *qp_ctx = qp->qp_ctx;
struct sec_dfx *dfx = &qp_ctx->ctx->sec->debug.dfx;
struct sec_sqe *bd = resp; struct sec_sqe *bd = resp;
struct sec_ctx *ctx; struct sec_ctx *ctx;
struct sec_req *req; struct sec_req *req;
...@@ -157,11 +158,16 @@ static void sec_req_cb(struct hisi_qp *qp, void *resp) ...@@ -157,11 +158,16 @@ static void sec_req_cb(struct hisi_qp *qp, void *resp)
type = bd->type_cipher_auth & SEC_TYPE_MASK; type = bd->type_cipher_auth & SEC_TYPE_MASK;
if (unlikely(type != SEC_BD_TYPE2)) { if (unlikely(type != SEC_BD_TYPE2)) {
atomic64_inc(&dfx->err_bd_cnt);
pr_err("err bd type [%d]\n", type); pr_err("err bd type [%d]\n", type);
return; return;
} }
req = qp_ctx->req_list[le16_to_cpu(bd->type2.tag)]; req = qp_ctx->req_list[le16_to_cpu(bd->type2.tag)];
if (unlikely(!req)) {
atomic64_inc(&dfx->invalid_req_cnt);
return;
}
req->err_type = bd->type2.error_type; req->err_type = bd->type2.error_type;
ctx = req->ctx; ctx = req->ctx;
done = le16_to_cpu(bd->type2.done_flag) & SEC_DONE_MASK; done = le16_to_cpu(bd->type2.done_flag) & SEC_DONE_MASK;
...@@ -174,12 +180,13 @@ static void sec_req_cb(struct hisi_qp *qp, void *resp) ...@@ -174,12 +180,13 @@ static void sec_req_cb(struct hisi_qp *qp, void *resp)
"err_type[%d],done[%d],flag[%d]\n", "err_type[%d],done[%d],flag[%d]\n",
req->err_type, done, flag); req->err_type, done, flag);
err = -EIO; err = -EIO;
atomic64_inc(&dfx->done_flag_cnt);
} }
if (ctx->alg_type == SEC_AEAD && !req->c_req.encrypt) if (ctx->alg_type == SEC_AEAD && !req->c_req.encrypt)
err = sec_aead_verify(req); err = sec_aead_verify(req);
atomic64_inc(&ctx->sec->debug.dfx.recv_cnt); atomic64_inc(&dfx->recv_cnt);
ctx->req_op->buf_unmap(ctx, req); ctx->req_op->buf_unmap(ctx, req);
...@@ -200,10 +207,12 @@ static int sec_bd_send(struct sec_ctx *ctx, struct sec_req *req) ...@@ -200,10 +207,12 @@ static int sec_bd_send(struct sec_ctx *ctx, struct sec_req *req)
return -ENOBUFS; return -ENOBUFS;
if (!ret) { if (!ret) {
if (req->fake_busy) if (req->fake_busy) {
atomic64_inc(&ctx->sec->debug.dfx.send_busy_cnt);
ret = -EBUSY; ret = -EBUSY;
else } else {
ret = -EINPROGRESS; ret = -EINPROGRESS;
}
} }
return ret; return ret;
......
...@@ -88,6 +88,11 @@ struct sec_hw_error { ...@@ -88,6 +88,11 @@ struct sec_hw_error {
const char *msg; const char *msg;
}; };
struct sec_dfx_item {
const char *name;
u32 offset;
};
static const char sec_name[] = "hisi_sec2"; static const char sec_name[] = "hisi_sec2";
static struct dentry *sec_debugfs_root; static struct dentry *sec_debugfs_root;
static struct hisi_qm_list sec_devices; static struct hisi_qm_list sec_devices;
...@@ -110,6 +115,15 @@ static const char * const sec_dbg_file_name[] = { ...@@ -110,6 +115,15 @@ static const char * const sec_dbg_file_name[] = {
[SEC_CLEAR_ENABLE] = "clear_enable", [SEC_CLEAR_ENABLE] = "clear_enable",
}; };
static struct sec_dfx_item sec_dfx_labels[] = {
{"send_cnt", offsetof(struct sec_dfx, send_cnt)},
{"recv_cnt", offsetof(struct sec_dfx, recv_cnt)},
{"send_busy_cnt", offsetof(struct sec_dfx, send_busy_cnt)},
{"err_bd_cnt", offsetof(struct sec_dfx, err_bd_cnt)},
{"invalid_req_cnt", offsetof(struct sec_dfx, invalid_req_cnt)},
{"done_flag_cnt", offsetof(struct sec_dfx, done_flag_cnt)},
};
static const struct debugfs_reg32 sec_dfx_regs[] = { static const struct debugfs_reg32 sec_dfx_regs[] = {
{"SEC_PF_ABNORMAL_INT_SOURCE ", 0x301010}, {"SEC_PF_ABNORMAL_INT_SOURCE ", 0x301010},
{"SEC_SAA_EN ", 0x301270}, {"SEC_SAA_EN ", 0x301270},
...@@ -543,10 +557,22 @@ static const struct file_operations sec_dbg_fops = { ...@@ -543,10 +557,22 @@ static const struct file_operations sec_dbg_fops = {
static int sec_debugfs_atomic64_get(void *data, u64 *val) static int sec_debugfs_atomic64_get(void *data, u64 *val)
{ {
*val = atomic64_read((atomic64_t *)data); *val = atomic64_read((atomic64_t *)data);
return 0;
}
static int sec_debugfs_atomic64_set(void *data, u64 val)
{
if (val)
return -EINVAL;
atomic64_set((atomic64_t *)data, 0);
return 0; return 0;
} }
DEFINE_DEBUGFS_ATTRIBUTE(sec_atomic64_ops, sec_debugfs_atomic64_get, DEFINE_DEBUGFS_ATTRIBUTE(sec_atomic64_ops, sec_debugfs_atomic64_get,
NULL, "%lld\n"); sec_debugfs_atomic64_set, "%lld\n");
static int sec_core_debug_init(struct sec_dev *sec) static int sec_core_debug_init(struct sec_dev *sec)
{ {
...@@ -555,6 +581,7 @@ static int sec_core_debug_init(struct sec_dev *sec) ...@@ -555,6 +581,7 @@ static int sec_core_debug_init(struct sec_dev *sec)
struct sec_dfx *dfx = &sec->debug.dfx; struct sec_dfx *dfx = &sec->debug.dfx;
struct debugfs_regset32 *regset; struct debugfs_regset32 *regset;
struct dentry *tmp_d; struct dentry *tmp_d;
int i;
tmp_d = debugfs_create_dir("sec_dfx", sec->qm.debug.debug_root); tmp_d = debugfs_create_dir("sec_dfx", sec->qm.debug.debug_root);
...@@ -566,13 +593,15 @@ static int sec_core_debug_init(struct sec_dev *sec) ...@@ -566,13 +593,15 @@ static int sec_core_debug_init(struct sec_dev *sec)
regset->nregs = ARRAY_SIZE(sec_dfx_regs); regset->nregs = ARRAY_SIZE(sec_dfx_regs);
regset->base = qm->io_base; regset->base = qm->io_base;
debugfs_create_regset32("regs", 0444, tmp_d, regset); if (qm->pdev->device == SEC_PF_PCI_DEVICE_ID)
debugfs_create_regset32("regs", 0444, tmp_d, regset);
debugfs_create_file("send_cnt", 0444, tmp_d, for (i = 0; i < ARRAY_SIZE(sec_dfx_labels); i++) {
&dfx->send_cnt, &sec_atomic64_ops); atomic64_t *data = (atomic64_t *)((uintptr_t)dfx +
sec_dfx_labels[i].offset);
debugfs_create_file("recv_cnt", 0444, tmp_d, debugfs_create_file(sec_dfx_labels[i].name, 0644,
&dfx->recv_cnt, &sec_atomic64_ops); tmp_d, data, &sec_atomic64_ops);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment