Lines Matching full:qm
49 int (*dump_fn)(struct hisi_qm *qm, char *cmd, char *info_name);
117 /* define the QM's dfx regs region and region length */
153 static void dump_show(struct hisi_qm *qm, void *info, in dump_show() argument
156 struct device *dev = &qm->pdev->dev; in dump_show()
168 static int qm_sqc_dump(struct hisi_qm *qm, char *s, char *name) in qm_sqc_dump() argument
170 struct device *dev = &qm->pdev->dev; in qm_sqc_dump()
179 if (ret || qp_id >= qm->qp_num) { in qm_sqc_dump()
180 dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1); in qm_sqc_dump()
184 ret = qm_set_and_get_xqc(qm, QM_MB_CMD_SQC, &sqc, qp_id, 1); in qm_sqc_dump()
188 dump_show(qm, &sqc, sizeof(struct qm_sqc), name); in qm_sqc_dump()
193 down_read(&qm->qps_lock); in qm_sqc_dump()
194 if (qm->sqc) { in qm_sqc_dump()
195 memcpy(&sqc, qm->sqc + qp_id, sizeof(struct qm_sqc)); in qm_sqc_dump()
198 dump_show(qm, &sqc, sizeof(struct qm_sqc), "SOFT SQC"); in qm_sqc_dump()
200 up_read(&qm->qps_lock); in qm_sqc_dump()
205 static int qm_cqc_dump(struct hisi_qm *qm, char *s, char *name) in qm_cqc_dump() argument
207 struct device *dev = &qm->pdev->dev; in qm_cqc_dump()
216 if (ret || qp_id >= qm->qp_num) { in qm_cqc_dump()
217 dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1); in qm_cqc_dump()
221 ret = qm_set_and_get_xqc(qm, QM_MB_CMD_CQC, &cqc, qp_id, 1); in qm_cqc_dump()
225 dump_show(qm, &cqc, sizeof(struct qm_cqc), name); in qm_cqc_dump()
230 down_read(&qm->qps_lock); in qm_cqc_dump()
231 if (qm->cqc) { in qm_cqc_dump()
232 memcpy(&cqc, qm->cqc + qp_id, sizeof(struct qm_cqc)); in qm_cqc_dump()
235 dump_show(qm, &cqc, sizeof(struct qm_cqc), "SOFT CQC"); in qm_cqc_dump()
237 up_read(&qm->qps_lock); in qm_cqc_dump()
242 static int qm_eqc_aeqc_dump(struct hisi_qm *qm, char *s, char *name) in qm_eqc_aeqc_dump() argument
244 struct device *dev = &qm->pdev->dev; in qm_eqc_aeqc_dump()
267 ret = qm_set_and_get_xqc(qm, cmd, xeqc, 0, 1); in qm_eqc_aeqc_dump()
275 dump_show(qm, xeqc, size, name); in qm_eqc_aeqc_dump()
280 static int q_dump_param_parse(struct hisi_qm *qm, char *s, in q_dump_param_parse() argument
283 struct device *dev = &qm->pdev->dev; in q_dump_param_parse()
284 unsigned int qp_num = qm->qp_num; in q_dump_param_parse()
320 static int qm_sq_dump(struct hisi_qm *qm, char *s, char *name) in qm_sq_dump() argument
322 u16 sq_depth = qm->qp_array->sq_depth; in qm_sq_dump()
328 ret = q_dump_param_parse(qm, s, &sqe_id, &qp_id, sq_depth); in qm_sq_dump()
332 sqe = kzalloc(qm->sqe_size, GFP_KERNEL); in qm_sq_dump()
336 qp = &qm->qp_array[qp_id]; in qm_sq_dump()
337 memcpy(sqe, qp->sqe + sqe_id * qm->sqe_size, qm->sqe_size); in qm_sq_dump()
338 memset(sqe + qm->debug.sqe_mask_offset, QM_SQE_ADDR_MASK, in qm_sq_dump()
339 qm->debug.sqe_mask_len); in qm_sq_dump()
341 dump_show(qm, sqe, qm->sqe_size, name); in qm_sq_dump()
348 static int qm_cq_dump(struct hisi_qm *qm, char *s, char *name) in qm_cq_dump() argument
355 ret = q_dump_param_parse(qm, s, &cqe_id, &qp_id, qm->qp_array->cq_depth); in qm_cq_dump()
359 qp = &qm->qp_array[qp_id]; in qm_cq_dump()
361 dump_show(qm, cqe_curr, sizeof(struct qm_cqe), name); in qm_cq_dump()
366 static int qm_eq_aeq_dump(struct hisi_qm *qm, char *s, char *name) in qm_eq_aeq_dump() argument
368 struct device *dev = &qm->pdev->dev; in qm_eq_aeq_dump()
383 xeq_depth = qm->eq_depth; in qm_eq_aeq_dump()
386 xeq_depth = qm->aeq_depth; in qm_eq_aeq_dump()
395 down_read(&qm->qps_lock); in qm_eq_aeq_dump()
397 if (qm->eqe && !strcmp(name, "EQE")) { in qm_eq_aeq_dump()
398 xeqe = qm->eqe + xeqe_id; in qm_eq_aeq_dump()
399 } else if (qm->aeqe && !strcmp(name, "AEQE")) { in qm_eq_aeq_dump()
400 xeqe = qm->aeqe + xeqe_id; in qm_eq_aeq_dump()
406 dump_show(qm, xeqe, size, name); in qm_eq_aeq_dump()
409 up_read(&qm->qps_lock); in qm_eq_aeq_dump()
413 static int qm_dbg_help(struct hisi_qm *qm, char *s) in qm_dbg_help() argument
415 struct device *dev = &qm->pdev->dev; in qm_dbg_help()
471 static int qm_cmd_write_dump(struct hisi_qm *qm, const char *cmd_buf) in qm_cmd_write_dump() argument
473 struct device *dev = &qm->pdev->dev; in qm_cmd_write_dump()
489 ret = qm_dbg_help(qm, s); in qm_cmd_write_dump()
496 ret = qm_cmd_dump_table[i].dump_fn(qm, s, in qm_cmd_write_dump()
516 struct hisi_qm *qm = filp->private_data; in qm_cmd_write() local
523 ret = hisi_qm_get_dfx_access(qm); in qm_cmd_write()
528 if (unlikely(atomic_read(&qm->status.flags) == QM_STOP)) { in qm_cmd_write()
550 ret = qm_cmd_write_dump(qm, cmd_buf); in qm_cmd_write()
561 hisi_qm_put_dfx_access(qm); in qm_cmd_write()
582 struct hisi_qm *qm = pci_get_drvdata(pdev); in hisi_qm_regs_dump() local
588 ret = hisi_qm_get_dfx_access(qm); in hisi_qm_regs_dump()
597 hisi_qm_put_dfx_access(qm); in hisi_qm_regs_dump()
603 struct hisi_qm *qm = s->private; in qm_regs_show() local
606 if (qm->fun_type == QM_HW_PF) { in qm_regs_show()
614 regset.base = qm->io_base; in qm_regs_show()
615 regset.dev = &qm->pdev->dev; in qm_regs_show()
624 static u32 current_q_read(struct hisi_qm *qm) in current_q_read() argument
626 return readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) >> QM_DFX_QN_SHIFT; in current_q_read()
629 static int current_q_write(struct hisi_qm *qm, u32 val) in current_q_write() argument
633 if (val >= qm->debug.curr_qm_qp_num) in current_q_write()
637 (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_FUN_MASK); in current_q_write()
638 writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); in current_q_write()
641 (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_FUN_MASK); in current_q_write()
642 writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); in current_q_write()
647 static u32 clear_enable_read(struct hisi_qm *qm) in clear_enable_read() argument
649 return readl(qm->io_base + QM_DFX_CNT_CLR_CE); in clear_enable_read()
653 static int clear_enable_write(struct hisi_qm *qm, u32 rd_clr_ctrl) in clear_enable_write() argument
658 writel(rd_clr_ctrl, qm->io_base + QM_DFX_CNT_CLR_CE); in clear_enable_write()
663 static u32 current_qm_read(struct hisi_qm *qm) in current_qm_read() argument
665 return readl(qm->io_base + QM_DFX_MB_CNT_VF); in current_qm_read()
668 static int qm_get_vf_qp_num(struct hisi_qm *qm, u32 fun_num) in qm_get_vf_qp_num() argument
671 u32 num_vfs = qm->vfs_num; in qm_get_vf_qp_num()
673 vfq_num = (qm->ctrl_qp_num - qm->qp_num) / num_vfs; in qm_get_vf_qp_num()
674 if (vfq_num >= qm->max_qp_num) in qm_get_vf_qp_num()
675 return qm->max_qp_num; in qm_get_vf_qp_num()
677 remain_q_num = (qm->ctrl_qp_num - qm->qp_num) % num_vfs; in qm_get_vf_qp_num()
678 if (vfq_num + remain_q_num <= qm->max_qp_num) in qm_get_vf_qp_num()
688 static int current_qm_write(struct hisi_qm *qm, u32 val) in current_qm_write() argument
692 if (val > qm->vfs_num) in current_qm_write()
697 qm->debug.curr_qm_qp_num = qm->qp_num; in current_qm_write()
699 qm->debug.curr_qm_qp_num = qm_get_vf_qp_num(qm, val); in current_qm_write()
701 writel(val, qm->io_base + QM_DFX_MB_CNT_VF); in current_qm_write()
702 writel(val, qm->io_base + QM_DFX_DB_CNT_VF); in current_qm_write()
705 (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_Q_MASK); in current_qm_write()
706 writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); in current_qm_write()
709 (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_Q_MASK); in current_qm_write()
710 writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); in current_qm_write()
720 struct hisi_qm *qm = file_to_qm(file); in qm_debug_read() local
725 ret = hisi_qm_get_dfx_access(qm); in qm_debug_read()
732 val = current_qm_read(qm); in qm_debug_read()
735 val = current_q_read(qm); in qm_debug_read()
738 val = clear_enable_read(qm); in qm_debug_read()
745 hisi_qm_put_dfx_access(qm); in qm_debug_read()
751 hisi_qm_put_dfx_access(qm); in qm_debug_read()
760 struct hisi_qm *qm = file_to_qm(file); in qm_debug_write() local
780 ret = hisi_qm_get_dfx_access(qm); in qm_debug_write()
787 ret = current_qm_write(qm, val); in qm_debug_write()
790 ret = current_q_write(qm, val); in qm_debug_write()
793 ret = clear_enable_write(qm, val); in qm_debug_write()
800 hisi_qm_put_dfx_access(qm); in qm_debug_write()
815 static void dfx_regs_uninit(struct hisi_qm *qm, in dfx_regs_uninit() argument
834 static struct dfx_diff_registers *dfx_regs_init(struct hisi_qm *qm, in dfx_regs_init() argument
859 diff_regs[i].regs[j] = readl(qm->io_base + base_offset); in dfx_regs_init()
874 static int qm_diff_regs_init(struct hisi_qm *qm, in qm_diff_regs_init() argument
879 qm->debug.qm_diff_regs = dfx_regs_init(qm, qm_diff_regs, ARRAY_SIZE(qm_diff_regs)); in qm_diff_regs_init()
880 if (IS_ERR(qm->debug.qm_diff_regs)) { in qm_diff_regs_init()
881 ret = PTR_ERR(qm->debug.qm_diff_regs); in qm_diff_regs_init()
882 qm->debug.qm_diff_regs = NULL; in qm_diff_regs_init()
886 qm->debug.acc_diff_regs = dfx_regs_init(qm, dregs, reg_len); in qm_diff_regs_init()
887 if (IS_ERR(qm->debug.acc_diff_regs)) { in qm_diff_regs_init()
888 dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs)); in qm_diff_regs_init()
889 ret = PTR_ERR(qm->debug.acc_diff_regs); in qm_diff_regs_init()
890 qm->debug.acc_diff_regs = NULL; in qm_diff_regs_init()
897 static void qm_last_regs_uninit(struct hisi_qm *qm) in qm_last_regs_uninit() argument
899 struct qm_debug *debug = &qm->debug; in qm_last_regs_uninit()
901 if (qm->fun_type == QM_HW_VF || !debug->qm_last_words) in qm_last_regs_uninit()
908 static int qm_last_regs_init(struct hisi_qm *qm) in qm_last_regs_init() argument
911 struct qm_debug *debug = &qm->debug; in qm_last_regs_init()
914 if (qm->fun_type == QM_HW_VF) in qm_last_regs_init()
922 debug->qm_last_words[i] = readl_relaxed(qm->io_base + in qm_last_regs_init()
929 static void qm_diff_regs_uninit(struct hisi_qm *qm, u32 reg_len) in qm_diff_regs_uninit() argument
931 dfx_regs_uninit(qm, qm->debug.acc_diff_regs, reg_len); in qm_diff_regs_uninit()
932 qm->debug.acc_diff_regs = NULL; in qm_diff_regs_uninit()
933 dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs)); in qm_diff_regs_uninit()
934 qm->debug.qm_diff_regs = NULL; in qm_diff_regs_uninit()
939 * @qm: device qm handle.
943 int hisi_qm_regs_debugfs_init(struct hisi_qm *qm, in hisi_qm_regs_debugfs_init() argument
948 if (!qm || !dregs) in hisi_qm_regs_debugfs_init()
951 if (qm->fun_type != QM_HW_PF) in hisi_qm_regs_debugfs_init()
954 ret = qm_last_regs_init(qm); in hisi_qm_regs_debugfs_init()
956 dev_info(&qm->pdev->dev, "failed to init qm words memory!\n"); in hisi_qm_regs_debugfs_init()
960 ret = qm_diff_regs_init(qm, dregs, reg_len); in hisi_qm_regs_debugfs_init()
962 qm_last_regs_uninit(qm); in hisi_qm_regs_debugfs_init()
972 * @qm: device qm handle.
975 void hisi_qm_regs_debugfs_uninit(struct hisi_qm *qm, u32 reg_len) in hisi_qm_regs_debugfs_uninit() argument
977 if (!qm || qm->fun_type != QM_HW_PF) in hisi_qm_regs_debugfs_uninit()
980 qm_diff_regs_uninit(qm, reg_len); in hisi_qm_regs_debugfs_uninit()
981 qm_last_regs_uninit(qm); in hisi_qm_regs_debugfs_uninit()
987 * @qm: device qm handle.
992 void hisi_qm_acc_diff_regs_dump(struct hisi_qm *qm, struct seq_file *s, in hisi_qm_acc_diff_regs_dump() argument
998 if (!qm || !s || !dregs) in hisi_qm_acc_diff_regs_dump()
1001 ret = hisi_qm_get_dfx_access(qm); in hisi_qm_acc_diff_regs_dump()
1005 down_read(&qm->qps_lock); in hisi_qm_acc_diff_regs_dump()
1012 val = readl(qm->io_base + base_offset); in hisi_qm_acc_diff_regs_dump()
1018 up_read(&qm->qps_lock); in hisi_qm_acc_diff_regs_dump()
1020 hisi_qm_put_dfx_access(qm); in hisi_qm_acc_diff_regs_dump()
1024 void hisi_qm_show_last_dfx_regs(struct hisi_qm *qm) in hisi_qm_show_last_dfx_regs() argument
1026 struct qm_debug *debug = &qm->debug; in hisi_qm_show_last_dfx_regs()
1027 struct pci_dev *pdev = qm->pdev; in hisi_qm_show_last_dfx_regs()
1031 if (qm->fun_type == QM_HW_VF || !debug->qm_last_words) in hisi_qm_show_last_dfx_regs()
1035 val = readl_relaxed(qm->io_base + qm_dfx_regs[i].offset); in hisi_qm_show_last_dfx_regs()
1044 struct hisi_qm *qm = s->private; in qm_diff_regs_show() local
1046 hisi_qm_acc_diff_regs_dump(qm, s, qm->debug.qm_diff_regs, in qm_diff_regs_show()
1055 struct hisi_qm *qm = s->private; in qm_state_show() local
1060 ret = hisi_qm_get_dfx_access(qm); in qm_state_show()
1062 val = readl(qm->io_base + QM_IN_IDLE_ST_REG); in qm_state_show()
1063 hisi_qm_put_dfx_access(qm); in qm_state_show()
1080 struct hisi_qm *qm = filp->private_data; in qm_status_read() local
1084 val = atomic_read(&qm->status.flags); in qm_status_read()
1096 static void qm_create_debugfs_file(struct hisi_qm *qm, struct dentry *dir, in qm_create_debugfs_file() argument
1099 struct debugfs_file *file = qm->debug.files + index; in qm_create_debugfs_file()
1103 file->debug = &qm->debug; in qm_create_debugfs_file()
1130 * hisi_qm_debug_init() - Initialize qm related debugfs files.
1131 * @qm: The qm for which we want to add debugfs files.
1133 * Create qm related debugfs files.
1135 void hisi_qm_debug_init(struct hisi_qm *qm) in hisi_qm_debug_init() argument
1137 struct dfx_diff_registers *qm_regs = qm->debug.qm_diff_regs; in hisi_qm_debug_init()
1138 struct qm_dev_dfx *dev_dfx = &qm->debug.dev_dfx; in hisi_qm_debug_init()
1139 struct qm_dfx *dfx = &qm->debug.dfx; in hisi_qm_debug_init()
1144 qm_d = debugfs_create_dir("qm", qm->debug.debug_root); in hisi_qm_debug_init()
1145 qm->debug.qm_d = qm_d; in hisi_qm_debug_init()
1148 if (qm->fun_type == QM_HW_PF) { in hisi_qm_debug_init()
1149 debugfs_create_file("qm_state", 0444, qm->debug.qm_d, in hisi_qm_debug_init()
1150 qm, &qm_state_fops); in hisi_qm_debug_init()
1152 qm_create_debugfs_file(qm, qm->debug.debug_root, CURRENT_QM); in hisi_qm_debug_init()
1154 qm_create_debugfs_file(qm, qm->debug.qm_d, i); in hisi_qm_debug_init()
1158 debugfs_create_file("diff_regs", 0444, qm->debug.qm_d, in hisi_qm_debug_init()
1159 qm, &qm_diff_regs_fops); in hisi_qm_debug_init()
1161 debugfs_create_file("regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops); in hisi_qm_debug_init()
1163 debugfs_create_file("cmd", 0600, qm->debug.qm_d, qm, &qm_cmd_fops); in hisi_qm_debug_init()
1165 debugfs_create_file("status", 0444, qm->debug.qm_d, qm, in hisi_qm_debug_init()
1168 debugfs_create_u32("dev_state", 0444, qm->debug.qm_d, &dev_dfx->dev_state); in hisi_qm_debug_init()
1169 debugfs_create_u32("dev_timeout", 0644, qm->debug.qm_d, &dev_dfx->dev_timeout); in hisi_qm_debug_init()
1180 if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) in hisi_qm_debug_init()
1181 hisi_qm_set_algqos_init(qm); in hisi_qm_debug_init()
1186 * hisi_qm_debug_regs_clear() - clear qm debug related registers.
1187 * @qm: The qm for which we want to clear its debug registers.
1189 void hisi_qm_debug_regs_clear(struct hisi_qm *qm) in hisi_qm_debug_regs_clear() argument
1195 writel(0x0, qm->io_base + QM_DFX_MB_CNT_VF); in hisi_qm_debug_regs_clear()
1196 writel(0x0, qm->io_base + QM_DFX_DB_CNT_VF); in hisi_qm_debug_regs_clear()
1199 writel(0x0, qm->io_base + QM_DFX_SQE_CNT_VF_SQN); in hisi_qm_debug_regs_clear()
1200 writel(0x0, qm->io_base + QM_DFX_CQE_CNT_VF_CQN); in hisi_qm_debug_regs_clear()
1206 writel(0x1, qm->io_base + QM_DFX_CNT_CLR_CE); in hisi_qm_debug_regs_clear()
1210 readl(qm->io_base + regs->offset); in hisi_qm_debug_regs_clear()
1215 writel(0x0, qm->io_base + QM_DFX_CNT_CLR_CE); in hisi_qm_debug_regs_clear()