提交 12a20396 编写于 作者: Y Yu'an Wang 提交者: Yang Yingliang

rde: optimize debug regs clear logic

driver inclusion
category: bugfix
bugzilla: NA
CVE: NA

In this patch, we try to optimize debug regs clear logic.
We add hisi_rde_debug_regs_clear interface and this interface
will be called only in probe and remove, which can keep value
of debug regs.
Otherwise, we optimize print interface of hpre_probe and add
qp_num print of hisi_qm_create_qp_nolock.
Signed-off-by: NYu'an Wang <wangyuan46@huawei.com>
Reviewed-by: NCheng Hu <hucheng.hu@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 a7615d0e
...@@ -923,13 +923,17 @@ static int hpre_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -923,13 +923,17 @@ static int hpre_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return ret; return ret;
ret = hisi_qm_init(qm); ret = hisi_qm_init(qm);
if (ret) if (ret) {
pci_err(pdev, "Failed to init qm (%d)!\n", ret);
return ret; return ret;
}
if (pdev->is_physfn) { if (pdev->is_physfn) {
ret = hpre_pf_probe_init(hpre); ret = hpre_pf_probe_init(hpre);
if (ret) if (ret) {
pci_err(pdev, "Failed to init pf probe (%d)!\n", ret);
goto err_with_qm_init; goto err_with_qm_init;
}
} else if (qm->fun_type == QM_HW_VF && qm->ver == QM_HW_V2) { } else if (qm->fun_type == QM_HW_VF && qm->ver == QM_HW_V2) {
/* v2 starts to support get vft by mailbox */ /* v2 starts to support get vft by mailbox */
ret = hisi_qm_get_vft(qm, &qm->qp_base, &qm->qp_num); ret = hisi_qm_get_vft(qm, &qm->qp_base, &qm->qp_num);
...@@ -938,12 +942,14 @@ static int hpre_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -938,12 +942,14 @@ static int hpre_probe(struct pci_dev *pdev, const struct pci_device_id *id)
} }
ret = hisi_qm_start(qm); ret = hisi_qm_start(qm);
if (ret) if (ret) {
pci_err(pdev, "Failed to start qm (%d)!\n", ret);
goto err_with_err_init; goto err_with_err_init;
}
ret = hpre_debugfs_init(hpre); ret = hpre_debugfs_init(hpre);
if (ret) if (ret)
dev_warn(&pdev->dev, "init debugfs fail!\n"); pci_warn(pdev, "init debugfs fail!\n");
hpre_add_to_list(hpre); hpre_add_to_list(hpre);
......
...@@ -1195,7 +1195,9 @@ static struct hisi_qp *hisi_qm_create_qp_nolock(struct hisi_qm *qm, ...@@ -1195,7 +1195,9 @@ static struct hisi_qp *hisi_qm_create_qp_nolock(struct hisi_qm *qm,
qp_id = find_first_zero_bit(qm->qp_bitmap, qm->qp_num); qp_id = find_first_zero_bit(qm->qp_bitmap, qm->qp_num);
if (qp_id >= qm->qp_num) { if (qp_id >= qm->qp_num) {
dev_info_ratelimited(&qm->pdev->dev, "QM all queues are busy!\n"); dev_info_ratelimited(&qm->pdev->dev,
"All %u queues of QM are busy!\n",
qm->qp_num);
ret = -EBUSY; ret = -EBUSY;
goto err_free_qp; goto err_free_qp;
} }
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#define HRDE_INT_MSK 0x310314 #define HRDE_INT_MSK 0x310314
#define HRDE_INT_ENABLE 0x0 #define HRDE_INT_ENABLE 0x0
#define HRDE_INT_DISABLE 0x3ffff #define HRDE_INT_DISABLE 0x3ffff
#define HRDE_BD_PREFETCH BIT(8)
#define HRDE_INT_SOURCE 0x31030c #define HRDE_INT_SOURCE 0x31030c
#define HRDE_INT_SOURCE_CLEAR GENMASK(17, 0) #define HRDE_INT_SOURCE_CLEAR GENMASK(17, 0)
#define HRDE_INT_STATUS 0x310318 #define HRDE_INT_STATUS 0x310318
...@@ -57,7 +58,7 @@ ...@@ -57,7 +58,7 @@
#define HRDE_FIFO_STAT_0 0x310200 #define HRDE_FIFO_STAT_0 0x310200
#define HRDE_DFX_STAT_7 0x310334 #define HRDE_DFX_STAT_7 0x310334
#define HRDE_DFX_STAT_8 0x310338 #define HRDE_DFX_STAT_8 0x310338
#define DFX_CTRL0 0x2 #define DFX_CTRL0 0x3
#define WRITE_CLEAR_VAL GENMASK(31, 0) #define WRITE_CLEAR_VAL GENMASK(31, 0)
#define HRDE_AWCACHE 0x310154 #define HRDE_AWCACHE 0x310154
#define HRDE_ARCACHE 0x31015c #define HRDE_ARCACHE 0x31015c
...@@ -354,6 +355,95 @@ static inline void hisi_rde_remove_from_list(struct hisi_rde *hisi_rde) ...@@ -354,6 +355,95 @@ static inline void hisi_rde_remove_from_list(struct hisi_rde *hisi_rde)
mutex_unlock(&hisi_rde_list_lock); mutex_unlock(&hisi_rde_list_lock);
} }
static void hisi_rde_engine_init(struct hisi_rde *hisi_rde)
{
writel(DFX_CTRL0, hisi_rde->qm.io_base + HRDE_DFX_CTRL_0);
/* usr domain */
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_AWUSER_BD_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_BD_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_AWUSER_DAT_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_DAT_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_SGL_1);
/* rde cache */
writel(AWCACHE, hisi_rde->qm.io_base + HRDE_AWCACHE);
writel(ARCACHE, hisi_rde->qm.io_base + HRDE_ARCACHE);
/* rde chn enable + outstangding config */
writel(CHN_CFG, hisi_rde->qm.io_base + HRDE_CFG);
}
static void hisi_rde_set_user_domain_and_cache(struct hisi_rde *hisi_rde)
{
/* qm user domain */
writel(AXUSER_BASE, hisi_rde->qm.io_base + QM_ARUSER_M_CFG_1);
writel(ARUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_ARUSER_M_CFG_ENABLE);
writel(AXUSER_BASE, hisi_rde->qm.io_base + QM_AWUSER_M_CFG_1);
writel(AWUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_AWUSER_M_CFG_ENABLE);
writel(WUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_WUSER_M_CFG_ENABLE);
/* qm cache */
writel(AXI_M_CFG, hisi_rde->qm.io_base + QM_AXI_M_CFG);
writel(AXI_M_CFG_ENABLE, hisi_rde->qm.io_base + QM_AXI_M_CFG_ENABLE);
/* disable BME/PM/SRIOV FLR*/
writel(PEH_AXUSER_CFG, hisi_rde->qm.io_base + QM_PEH_AXUSER_CFG);
writel(PEH_AXUSER_CFG_ENABLE, hisi_rde->qm.io_base +
QM_PEH_AXUSER_CFG_ENABLE);
writel(CACHE_CTL, hisi_rde->qm.io_base + QM_CACHE_CTL);
hisi_rde_engine_init(hisi_rde);
}
static void hisi_rde_debug_regs_clear(struct hisi_qm *qm)
{
/* clear rde debug regs */
readl(qm->io_base + HRDE_ECC_ERR);
readl(qm->io_base + HRDE_ECC_ERR_CNT);
readl(qm->io_base + HRDE_OP_DONE_CNT);
readl(qm->io_base + HRDE_OP_ERR_CNT);
readl(qm->io_base + HRDE_OP_ABORT_CNT);
writel(WRITE_CLEAR_VAL, qm->io_base + HRDE_FIFO_STAT_0);
writel(WRITE_CLEAR_VAL, qm->io_base + HRDE_DFX_STAT_7);
writel(WRITE_CLEAR_VAL, qm->io_base + HRDE_DFX_STAT_8);
/* clear current_qm */
writel(0x0, qm->io_base + QM_DFX_MB_CNT_VF);
writel(0x0, qm->io_base + QM_DFX_DB_CNT_VF);
hisi_qm_debug_regs_clear(qm);
}
static void hisi_rde_hw_error_set_state(struct hisi_rde *hisi_rde, bool state)
{
u32 ras_msk = (HRDE_RAS_CE_MSK | HRDE_RAS_NFE_MSK);
u32 val;
val = readl(hisi_rde->qm.io_base + HRDE_CFG);
if (state) {
writel(HRDE_INT_SOURCE_CLEAR,
hisi_rde->qm.io_base + HRDE_INT_SOURCE);
writel(HRDE_RAS_ENABLE,
hisi_rde->qm.io_base + HRDE_RAS_INT_MSK);
/* bd prefetch should bd masked to prevent misreport */
writel((HRDE_INT_ENABLE | HRDE_BD_PREFETCH),
hisi_rde->qm.io_base + HRDE_INT_MSK);
/* make master ooo close, when m-bits error happens*/
val = val | HRDE_AXI_SHUTDOWN_EN;
} else {
writel(ras_msk, hisi_rde->qm.io_base + HRDE_RAS_INT_MSK);
writel(HRDE_INT_DISABLE, hisi_rde->qm.io_base + HRDE_INT_MSK);
/* make master ooo open, when m-bits error happens*/
val = val & HRDE_AXI_SHUTDOWN_DIS;
}
writel(val, hisi_rde->qm.io_base + HRDE_CFG);
}
static inline struct hisi_qm *file_to_qm(struct ctrl_debug_file *file) static inline struct hisi_qm *file_to_qm(struct ctrl_debug_file *file)
{ {
struct hisi_rde *hisi_rde = file->ctrl->hisi_rde; struct hisi_rde *hisi_rde = file->ctrl->hisi_rde;
...@@ -409,8 +499,7 @@ static int current_bd_write(struct ctrl_debug_file *file, u32 val) ...@@ -409,8 +499,7 @@ static int current_bd_write(struct ctrl_debug_file *file, u32 val)
return -EINVAL; return -EINVAL;
} }
tmp = HRDE_PROBE_DATA_EN | HRDE_PROBE_EN | tmp = HRDE_PROBE_DATA_EN | HRDE_PROBE_EN | (val << HRDE_STRB_CS_SHIFT);
(val << HRDE_STRB_CS_SHIFT);
writel(tmp, qm->io_base + HRDE_PROBE_ADDR); writel(tmp, qm->io_base + HRDE_PROBE_ADDR);
return 0; return 0;
...@@ -594,84 +683,10 @@ static void hisi_rde_debugfs_exit(struct hisi_rde *hisi_rde) ...@@ -594,84 +683,10 @@ static void hisi_rde_debugfs_exit(struct hisi_rde *hisi_rde)
struct hisi_qm *qm = &hisi_rde->qm; struct hisi_qm *qm = &hisi_rde->qm;
debugfs_remove_recursive(qm->debug.debug_root); debugfs_remove_recursive(qm->debug.debug_root);
} if (qm->fun_type == QM_HW_PF) {
hisi_rde_debug_regs_clear(qm);
static void hisi_rde_engine_init(struct hisi_rde *hisi_rde) qm->debug.curr_qm_qp_num = 0;
{
writel(DFX_CTRL0, hisi_rde->qm.io_base + HRDE_DFX_CTRL_0);
readl(hisi_rde->qm.io_base + HRDE_ECC_ERR);
readl(hisi_rde->qm.io_base + HRDE_ECC_ERR_CNT);
readl(hisi_rde->qm.io_base + HRDE_OP_DONE_CNT);
readl(hisi_rde->qm.io_base + HRDE_OP_ERR_CNT);
readl(hisi_rde->qm.io_base + HRDE_OP_ABORT_CNT);
writel(WRITE_CLEAR_VAL, hisi_rde->qm.io_base + HRDE_FIFO_STAT_0);
writel(WRITE_CLEAR_VAL, hisi_rde->qm.io_base + HRDE_DFX_STAT_7);
writel(WRITE_CLEAR_VAL, hisi_rde->qm.io_base + HRDE_DFX_STAT_8);
/* usr domain */
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_AWUSER_BD_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_BD_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_AWUSER_DAT_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_DAT_1);
writel(HRDE_USER_SMMU, hisi_rde->qm.io_base + HRDE_ARUSER_SGL_1);
/* rde cache */
writel(AWCACHE, hisi_rde->qm.io_base + HRDE_AWCACHE);
writel(ARCACHE, hisi_rde->qm.io_base + HRDE_ARCACHE);
/* rde chn enable + outstangding config */
writel(CHN_CFG, hisi_rde->qm.io_base + HRDE_CFG);
}
static void hisi_rde_set_user_domain_and_cache(struct hisi_rde *hisi_rde)
{
/* qm user domain */
writel(AXUSER_BASE, hisi_rde->qm.io_base + QM_ARUSER_M_CFG_1);
writel(ARUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_ARUSER_M_CFG_ENABLE);
writel(AXUSER_BASE, hisi_rde->qm.io_base + QM_AWUSER_M_CFG_1);
writel(AWUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_AWUSER_M_CFG_ENABLE);
writel(WUSER_M_CFG_ENABLE, hisi_rde->qm.io_base +
QM_WUSER_M_CFG_ENABLE);
/* qm cache */
writel(AXI_M_CFG, hisi_rde->qm.io_base + QM_AXI_M_CFG);
writel(AXI_M_CFG_ENABLE, hisi_rde->qm.io_base + QM_AXI_M_CFG_ENABLE);
/* disable BME/PM/SRIOV FLR*/
writel(PEH_AXUSER_CFG, hisi_rde->qm.io_base + QM_PEH_AXUSER_CFG);
writel(PEH_AXUSER_CFG_ENABLE, hisi_rde->qm.io_base +
QM_PEH_AXUSER_CFG_ENABLE);
writel(CACHE_CTL, hisi_rde->qm.io_base + QM_CACHE_CTL);
hisi_rde_engine_init(hisi_rde);
}
static void hisi_rde_hw_error_set_state(struct hisi_rde *hisi_rde, bool state)
{
u32 ras_msk = (HRDE_RAS_CE_MSK | HRDE_RAS_NFE_MSK);
u32 val;
val = readl(hisi_rde->qm.io_base + HRDE_CFG);
if (state) {
writel(HRDE_INT_SOURCE_CLEAR,
hisi_rde->qm.io_base + HRDE_INT_SOURCE);
writel(HRDE_RAS_ENABLE,
hisi_rde->qm.io_base + HRDE_RAS_INT_MSK);
/* bd prefetch should bd masked to prevent misreport */
writel((HRDE_INT_ENABLE | BIT(8)),
hisi_rde->qm.io_base + HRDE_INT_MSK);
/* make master ooo close, when m-bits error happens*/
val = val | HRDE_AXI_SHUTDOWN_EN;
} else {
writel(ras_msk, hisi_rde->qm.io_base + HRDE_RAS_INT_MSK);
writel(HRDE_INT_DISABLE, hisi_rde->qm.io_base + HRDE_INT_MSK);
/* make master ooo open, when m-bits error happens*/
val = val & HRDE_AXI_SHUTDOWN_DIS;
} }
writel(val, hisi_rde->qm.io_base + HRDE_CFG);
} }
static void hisi_rde_set_hw_error(struct hisi_rde *hisi_rde, bool state) static void hisi_rde_set_hw_error(struct hisi_rde *hisi_rde, bool state)
...@@ -770,6 +785,7 @@ static int hisi_rde_pf_probe_init(struct hisi_rde *hisi_rde) ...@@ -770,6 +785,7 @@ static int hisi_rde_pf_probe_init(struct hisi_rde *hisi_rde)
hisi_rde_set_user_domain_and_cache(hisi_rde); hisi_rde_set_user_domain_and_cache(hisi_rde);
hisi_rde_set_hw_error(hisi_rde, true); hisi_rde_set_hw_error(hisi_rde, true);
qm->err_ini.open_axi_master_ooo(qm); qm->err_ini.open_axi_master_ooo(qm);
hisi_rde_debug_regs_clear(qm);
return 0; return 0;
} }
...@@ -883,7 +899,6 @@ static void hisi_rde_remove(struct pci_dev *pdev) ...@@ -883,7 +899,6 @@ static void hisi_rde_remove(struct pci_dev *pdev)
struct hisi_qm *qm = &hisi_rde->qm; struct hisi_qm *qm = &hisi_rde->qm;
qm->abnormal_fix = NULL; qm->abnormal_fix = NULL;
qm->debug.curr_qm_qp_num = 0;
hisi_rde_hw_error_set_state(hisi_rde, false); hisi_rde_hw_error_set_state(hisi_rde, false);
cancel_work_sync(&hisi_rde->reset_work); cancel_work_sync(&hisi_rde->reset_work);
hisi_rde_remove_from_list(hisi_rde); hisi_rde_remove_from_list(hisi_rde);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册