Commit 85026525 authored by Longfang Liu's avatar Longfang Liu Committed by Herbert Xu

crypto: hisilicon/qm - add debugfs for QM

Add DebugFS method to get the information of IRQ/Requests/QP .etc of QM
for HPRE/ZIP/SEC drivers.
Signed-off-by: default avatarLongfang Liu <liulongfang@huawei.com>
Signed-off-by: default avatarShukun Tan <tanshukun1@huawei.com>
Reviewed-by: default avatarZaibo Xu <xuzaibo@huawei.com>
Reviewed-by: default avatarZhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 7795c0ba
...@@ -55,3 +55,34 @@ Description: QM debug registers(qm_regs) read clear control. 1 means enable ...@@ -55,3 +55,34 @@ Description: QM debug registers(qm_regs) read clear control. 1 means enable
Writing to this file has no functional effect, only enable or Writing to this file has no functional effect, only enable or
disable counters clear after reading of these registers. disable counters clear after reading of these registers.
Only available for PF. Only available for PF.
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/err_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of invalid interrupts for
QM task completion.
Available for both PF and VF, and take no other effect on HPRE.
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/aeq_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of QM async event queue interrupts.
Available for both PF and VF, and take no other effect on HPRE.
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/abnormal_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of interrupts for QM abnormal event.
Available for both PF and VF, and take no other effect on HPRE.
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/create_qp_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of queue allocation errors.
Available for both PF and VF, and take no other effect on HPRE.
What: /sys/kernel/debug/hisi_hpre/<bdf>/qm/mb_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of failed QM mailbox commands.
Available for both PF and VF, and take no other effect on HPRE.
...@@ -41,3 +41,34 @@ Description: Enabling/disabling of clear action after reading ...@@ -41,3 +41,34 @@ Description: Enabling/disabling of clear action after reading
the SEC's QM debug registers. the SEC's QM debug registers.
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_sec2/<bdf>/qm/err_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of invalid interrupts for
QM task completion.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/aeq_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of QM async event queue interrupts.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/abnormal_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of interrupts for QM abnormal event.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/create_qp_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of queue allocation errors.
Available for both PF and VF, and take no other effect on SEC.
What: /sys/kernel/debug/hisi_sec2/<bdf>/qm/mb_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of failed QM mailbox commands.
Available for both PF and VF, and take no other effect on SEC.
...@@ -48,3 +48,34 @@ Description: QM debug registers(qm_regs) read clear control. 1 means enable ...@@ -48,3 +48,34 @@ Description: QM debug registers(qm_regs) read clear control. 1 means enable
Writing to this file has no functional effect, only enable or Writing to this file has no functional effect, only enable or
disable counters clear after reading of these registers. disable counters clear after reading of these registers.
Only available for PF. Only available for PF.
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/err_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of invalid interrupts for
QM task completion.
Available for both PF and VF, and take no other effect on ZIP.
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/aeq_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of QM async event queue interrupts.
Available for both PF and VF, and take no other effect on ZIP.
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/abnormal_irq
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of interrupts for QM abnormal event.
Available for both PF and VF, and take no other effect on ZIP.
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/create_qp_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of queue allocation errors.
Available for both PF and VF, and take no other effect on ZIP.
What: /sys/kernel/debug/hisi_zip/<bdf>/qm/mb_err
Date: Apr 2020
Contact: linux-crypto@vger.kernel.org
Description: Dump the number of failed QM mailbox commands.
Available for both PF and VF, and take no other effect on ZIP.
...@@ -324,6 +324,19 @@ struct hisi_qm_hw_ops { ...@@ -324,6 +324,19 @@ struct hisi_qm_hw_ops {
enum acc_err_result (*hw_error_handle)(struct hisi_qm *qm); enum acc_err_result (*hw_error_handle)(struct hisi_qm *qm);
}; };
struct qm_dfx_item {
const char *name;
u32 offset;
};
static struct qm_dfx_item qm_dfx_files[] = {
{"err_irq", offsetof(struct qm_dfx, err_irq_cnt)},
{"aeq_irq", offsetof(struct qm_dfx, aeq_irq_cnt)},
{"abnormal_irq", offsetof(struct qm_dfx, abnormal_irq_cnt)},
{"create_qp_err", offsetof(struct qm_dfx, create_qp_err_cnt)},
{"mb_err", offsetof(struct qm_dfx, mb_err_cnt)},
};
static const char * const qm_debug_file_name[] = { static const char * const qm_debug_file_name[] = {
[CURRENT_Q] = "current_q", [CURRENT_Q] = "current_q",
[CLEAR_ENABLE] = "clear_enable", [CLEAR_ENABLE] = "clear_enable",
...@@ -514,6 +527,8 @@ static int qm_mb(struct hisi_qm *qm, u8 cmd, dma_addr_t dma_addr, u16 queue, ...@@ -514,6 +527,8 @@ static int qm_mb(struct hisi_qm *qm, u8 cmd, dma_addr_t dma_addr, u16 queue,
busy_unlock: busy_unlock:
mutex_unlock(&qm->mailbox_lock); mutex_unlock(&qm->mailbox_lock);
if (ret)
atomic64_inc(&qm->debug.dfx.mb_err_cnt);
return ret; return ret;
} }
...@@ -671,6 +686,7 @@ static irqreturn_t qm_irq(int irq, void *data) ...@@ -671,6 +686,7 @@ static irqreturn_t qm_irq(int irq, void *data)
if (readl(qm->io_base + QM_VF_EQ_INT_SOURCE)) if (readl(qm->io_base + QM_VF_EQ_INT_SOURCE))
return do_qm_irq(irq, data); return do_qm_irq(irq, data);
atomic64_inc(&qm->debug.dfx.err_irq_cnt);
dev_err(&qm->pdev->dev, "invalid int source\n"); dev_err(&qm->pdev->dev, "invalid int source\n");
qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0);
...@@ -683,6 +699,7 @@ static irqreturn_t qm_aeq_irq(int irq, void *data) ...@@ -683,6 +699,7 @@ static irqreturn_t qm_aeq_irq(int irq, void *data)
struct qm_aeqe *aeqe = qm->aeqe + qm->status.aeq_head; struct qm_aeqe *aeqe = qm->aeqe + qm->status.aeq_head;
u32 type; u32 type;
atomic64_inc(&qm->debug.dfx.aeq_irq_cnt);
if (!readl(qm->io_base + QM_VF_AEQ_INT_SOURCE)) if (!readl(qm->io_base + QM_VF_AEQ_INT_SOURCE))
return IRQ_NONE; return IRQ_NONE;
...@@ -1192,6 +1209,7 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type) ...@@ -1192,6 +1209,7 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type)
if (qm->qp_in_used == qm->qp_num) { if (qm->qp_in_used == qm->qp_num) {
dev_info_ratelimited(dev, "All %u queues of QM are busy!\n", dev_info_ratelimited(dev, "All %u queues of QM are busy!\n",
qm->qp_num); qm->qp_num);
atomic64_inc(&qm->debug.dfx.create_qp_err_cnt);
return ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
} }
...@@ -1199,6 +1217,7 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type) ...@@ -1199,6 +1217,7 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type)
if (qp_id < 0) { if (qp_id < 0) {
dev_info_ratelimited(dev, "All %u queues of QM are busy!\n", dev_info_ratelimited(dev, "All %u queues of QM are busy!\n",
qm->qp_num); qm->qp_num);
atomic64_inc(&qm->debug.dfx.create_qp_err_cnt);
return ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
} }
...@@ -2249,6 +2268,26 @@ int hisi_qm_stop(struct hisi_qm *qm) ...@@ -2249,6 +2268,26 @@ int hisi_qm_stop(struct hisi_qm *qm)
} }
EXPORT_SYMBOL_GPL(hisi_qm_stop); EXPORT_SYMBOL_GPL(hisi_qm_stop);
static int qm_debugfs_atomic64_set(void *data, u64 val)
{
if (val)
return -EINVAL;
atomic64_set((atomic64_t *)data, 0);
return 0;
}
static int qm_debugfs_atomic64_get(void *data, u64 *val)
{
*val = atomic64_read((atomic64_t *)data);
return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(qm_atomic64_ops, qm_debugfs_atomic64_get,
qm_debugfs_atomic64_set, "%llu\n");
/** /**
* hisi_qm_debug_init() - Initialize qm related debugfs files. * hisi_qm_debug_init() - Initialize qm related debugfs files.
* @qm: The qm for which we want to add debugfs files. * @qm: The qm for which we want to add debugfs files.
...@@ -2257,7 +2296,9 @@ EXPORT_SYMBOL_GPL(hisi_qm_stop); ...@@ -2257,7 +2296,9 @@ EXPORT_SYMBOL_GPL(hisi_qm_stop);
*/ */
int hisi_qm_debug_init(struct hisi_qm *qm) int hisi_qm_debug_init(struct hisi_qm *qm)
{ {
struct qm_dfx *dfx = &qm->debug.dfx;
struct dentry *qm_d; struct dentry *qm_d;
void *data;
int i, ret; int i, ret;
qm_d = debugfs_create_dir("qm", qm->debug.debug_root); qm_d = debugfs_create_dir("qm", qm->debug.debug_root);
...@@ -2273,6 +2314,15 @@ int hisi_qm_debug_init(struct hisi_qm *qm) ...@@ -2273,6 +2314,15 @@ int hisi_qm_debug_init(struct hisi_qm *qm)
debugfs_create_file("qm_regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops); debugfs_create_file("qm_regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops);
for (i = 0; i < ARRAY_SIZE(qm_dfx_files); i++) {
data = (atomic64_t *)((uintptr_t)dfx + qm_dfx_files[i].offset);
debugfs_create_file(qm_dfx_files[i].name,
0644,
qm_d,
data,
&qm_atomic64_ops);
}
return 0; return 0;
failed_to_create: failed_to_create:
...@@ -3311,6 +3361,7 @@ static irqreturn_t qm_abnormal_irq(int irq, void *data) ...@@ -3311,6 +3361,7 @@ static irqreturn_t qm_abnormal_irq(int irq, void *data)
struct hisi_qm *qm = data; struct hisi_qm *qm = data;
enum acc_err_result ret; enum acc_err_result ret;
atomic64_inc(&qm->debug.dfx.abnormal_irq_cnt);
ret = qm_process_dev_error(qm); ret = qm_process_dev_error(qm);
if (ret == ACC_ERR_NEED_RESET) if (ret == ACC_ERR_NEED_RESET)
schedule_work(&qm->rst_work); schedule_work(&qm->rst_work);
......
...@@ -121,6 +121,14 @@ enum qm_debug_file { ...@@ -121,6 +121,14 @@ enum qm_debug_file {
DEBUG_FILE_NUM, DEBUG_FILE_NUM,
}; };
struct qm_dfx {
atomic64_t err_irq_cnt;
atomic64_t aeq_irq_cnt;
atomic64_t abnormal_irq_cnt;
atomic64_t create_qp_err_cnt;
atomic64_t mb_err_cnt;
};
struct debugfs_file { struct debugfs_file {
enum qm_debug_file index; enum qm_debug_file index;
struct mutex lock; struct mutex lock;
...@@ -129,6 +137,7 @@ struct debugfs_file { ...@@ -129,6 +137,7 @@ struct debugfs_file {
struct qm_debug { struct qm_debug {
u32 curr_qm_qp_num; u32 curr_qm_qp_num;
struct qm_dfx dfx;
struct dentry *debug_root; struct dentry *debug_root;
struct dentry *qm_d; struct dentry *qm_d;
struct debugfs_file files[DEBUG_FILE_NUM]; struct debugfs_file files[DEBUG_FILE_NUM];
......
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