crypto: hisilicon/qm - add pf ping single vf function
authorKai Ye <yekai13@huawei.com>
Fri, 11 Jun 2021 09:06:46 +0000 (17:06 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 17 Jun 2021 07:07:31 +0000 (15:07 +0800)
According to the function communication, add pf ping single
vf function to be used in the vf read QoS.

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

index 754ddb5dec2198847f878775e2aba7112f3859e2..735c8b07b1e9e04ce215f8f31cef30942d4ccabe 100644 (file)
@@ -2142,6 +2142,42 @@ static void qm_trigger_pf_interrupt(struct hisi_qm *qm)
        writel(val, qm->io_base + QM_IFC_INT_SET_V);
 }
 
+static int qm_ping_single_vf(struct hisi_qm *qm, u64 cmd, u32 fun_num)
+{
+       struct device *dev = &qm->pdev->dev;
+       struct qm_mailbox mailbox;
+       int cnt = 0;
+       u64 val;
+       int ret;
+
+       qm_mb_pre_init(&mailbox, QM_MB_CMD_SRC, cmd, fun_num, 0);
+       mutex_lock(&qm->mailbox_lock);
+       ret = qm_mb_nolock(qm, &mailbox);
+       if (ret) {
+               dev_err(dev, "failed to send command to vf(%u)!\n", fun_num);
+               goto err_unlock;
+       }
+
+       qm_trigger_vf_interrupt(qm, fun_num);
+       while (true) {
+               msleep(QM_WAIT_DST_ACK);
+               val = readq(qm->io_base + QM_IFC_READY_STATUS);
+               /* if VF respond, PF notifies VF successfully. */
+               if (!(val & BIT(fun_num)))
+                       goto err_unlock;
+
+               if (++cnt > QM_MAX_PF_WAIT_COUNT) {
+                       dev_err(dev, "failed to get response from VF(%u)!\n", fun_num);
+                       ret = -ETIMEDOUT;
+                       break;
+               }
+       }
+
+err_unlock:
+       mutex_unlock(&qm->mailbox_lock);
+       return ret;
+}
+
 static int qm_ping_all_vfs(struct hisi_qm *qm, u64 cmd)
 {
        struct device *dev = &qm->pdev->dev;