crypto: hisilicon/qm - disable qm clock-gating
authorWeili Qian <qianweili@huawei.com>
Sat, 18 Dec 2021 10:17:20 +0000 (18:17 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 24 Dec 2021 03:18:28 +0000 (14:18 +1100)
For Kunpeng930, if qm clock-gating is enabled, rate limiter
will be inaccurate. Therefore, disable clock-gating before doing task.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c

index b1fe9c7b8cc89d723f5cc3d7a7646e8795fcade2..b731cb4ec29417badcf26a37d437729d4a1e74f6 100644 (file)
 #define QM_CQC_VFT                     0x1
 #define QM_VFT_CFG                     0x100060
 #define QM_VFT_CFG_OP_ENABLE           0x100054
+#define QM_PM_CTRL                     0x100148
+#define QM_IDLE_DISABLE                        BIT(9)
 
 #define QM_VFT_CFG_DATA_L              0x100064
 #define QM_VFT_CFG_DATA_H              0x100068
@@ -800,6 +802,19 @@ static void qm_db(struct hisi_qm *qm, u16 qn, u8 cmd, u16 index, u8 priority)
        qm->ops->qm_db(qm, qn, cmd, index, priority);
 }
 
+static void qm_disable_clock_gate(struct hisi_qm *qm)
+{
+       u32 val;
+
+       /* if qm enables clock gating in Kunpeng930, qos will be inaccurate. */
+       if (qm->ver < QM_HW_V3)
+               return;
+
+       val = readl(qm->io_base + QM_PM_CTRL);
+       val |= QM_IDLE_DISABLE;
+       writel(val, qm->io_base +  QM_PM_CTRL);
+}
+
 static int qm_dev_mem_reset(struct hisi_qm *qm)
 {
        u32 val;
@@ -5935,6 +5950,7 @@ int hisi_qm_init(struct hisi_qm *qm)
        }
 
        if (qm->fun_type == QM_HW_PF) {
+               qm_disable_clock_gate(qm);
                ret = qm_dev_mem_reset(qm);
                if (ret) {
                        dev_err(dev, "failed to reset device memory\n");
@@ -6099,6 +6115,7 @@ static int qm_rebuild_for_resume(struct hisi_qm *qm)
 
        qm_cmd_init(qm);
        hisi_qm_dev_err_init(qm);
+       qm_disable_clock_gate(qm);
        ret = qm_dev_mem_reset(qm);
        if (ret)
                pci_err(pdev, "failed to reset device memory\n");