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: Longfang Liu <liulongfang@huawei.com> Signed-off-by: Shukun Tan <tanshukun1@huawei.com> Reviewed-by: Zaibo Xu <xuzaibo@huawei.com> Reviewed-by: Zhou Wang <wangzhou1@hisilicon.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
7795c0baf5
commit
8502652542
|
@ -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
|
||||||
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
|
||||||
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 {
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 @@ err_unlock:
|
||||||
}
|
}
|
||||||
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);
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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 {
|
||||||
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 {
|
||||||
|
|
||||||
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];
|
||||||
|
|
Loading…
Reference in New Issue