crypto: hisilicon/qm - simplify the status of qm
authorWeili Qian <qianweili@huawei.com>
Sat, 25 Nov 2023 11:50:10 +0000 (19:50 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Dec 2023 10:03:26 +0000 (18:03 +0800)
The 'QM_INIT' and 'QM_CLOSE' status of qm and 'QP_INIT'
and 'QP_CLOSE' status of queue are not actually used. Currently,
driver only needs to switch status when the device or queue
is enabled or stopped, Therefore, remove unneeded status to
simplify driver. In addition, rename'QM_START to'QM_WORK' for
ease to understand.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Documentation/ABI/testing/debugfs-hisi-hpre
Documentation/ABI/testing/debugfs-hisi-sec
Documentation/ABI/testing/debugfs-hisi-zip
drivers/crypto/hisilicon/debugfs.c
drivers/crypto/hisilicon/qm.c
drivers/crypto/hisilicon/qm_common.h
include/linux/hisi_acc_qm.h

index 82abf92df429fdafa8001f44cca91fa17d51519c..8e8de49c5cc6698704057de6ade9f339898873ce 100644 (file)
@@ -101,7 +101,7 @@ What:               /sys/kernel/debug/hisi_hpre/<bdf>/qm/status
 Date:          Apr 2020
 Contact:       linux-crypto@vger.kernel.org
 Description:   Dump the status of the QM.
-               Four states: initiated, started, stopped and closed.
+               Two states: work, stop.
                Available for both PF and VF, and take no other effect on HPRE.
 
 What:          /sys/kernel/debug/hisi_hpre/<bdf>/qm/diff_regs
index 93c530d1bf0fcb096f1620df5e73dc40689f5cc5..deeefe2c735ed7822856c5bea84a8e8909a5ec4e 100644 (file)
@@ -81,7 +81,7 @@ What:         /sys/kernel/debug/hisi_sec2/<bdf>/qm/status
 Date:          Apr 2020
 Contact:       linux-crypto@vger.kernel.org
 Description:   Dump the status of the QM.
-               Four states: initiated, started, stopped and closed.
+               Two states: work, stop.
                Available for both PF and VF, and take no other effect on SEC.
 
 What:          /sys/kernel/debug/hisi_sec2/<bdf>/qm/diff_regs
index fd3f314cf8d1c73f4a84c590db7fc978362aa654..593714afaed249327778ce82d8263893b8800884 100644 (file)
@@ -94,7 +94,7 @@ What:         /sys/kernel/debug/hisi_zip/<bdf>/qm/status
 Date:          Apr 2020
 Contact:       linux-crypto@vger.kernel.org
 Description:   Dump the status of the QM.
-               Four states: initiated, started, stopped and closed.
+               Two states: work, stop.
                Available for both PF and VF, and take no other effect on ZIP.
 
 What:          /sys/kernel/debug/hisi_zip/<bdf>/qm/diff_regs
index 415139b4abc1f8a3a8b04a33f5ac2e28874ba501..80ed4b2d209cac85a4ad435bcf882c8bd5ba14d0 100644 (file)
@@ -31,6 +31,10 @@ static const char * const qm_debug_file_name[] = {
        [CLEAR_ENABLE] = "clear_enable",
 };
 
+static const char * const qm_s[] = {
+       "work", "stop",
+};
+
 struct qm_dfx_item {
        const char *name;
        u32 offset;
index 4d91a249be74d3d9bc3200d34baf92d15965fb40..7d22412774baaac7a322362403e3d70a843a56dd 100644 (file)
@@ -402,10 +402,6 @@ static const char * const qm_fifo_overflow[] = {
        "cq", "eq", "aeq",
 };
 
-static const char * const qp_s[] = {
-       "none", "init", "start", "stop", "close",
-};
-
 struct qm_typical_qos_table {
        u32 start;
        u32 end;
@@ -433,85 +429,6 @@ static struct qm_typical_qos_table shaper_cbs_s[] = {
 
 static void qm_irqs_unregister(struct hisi_qm *qm);
 
-static bool qm_avail_state(struct hisi_qm *qm, enum qm_state new)
-{
-       enum qm_state curr = atomic_read(&qm->status.flags);
-       bool avail = false;
-
-       switch (curr) {
-       case QM_INIT:
-               if (new == QM_START || new == QM_CLOSE)
-                       avail = true;
-               break;
-       case QM_START:
-               if (new == QM_STOP)
-                       avail = true;
-               break;
-       case QM_STOP:
-               if (new == QM_CLOSE || new == QM_START)
-                       avail = true;
-               break;
-       default:
-               break;
-       }
-
-       dev_dbg(&qm->pdev->dev, "change qm state from %s to %s\n",
-               qm_s[curr], qm_s[new]);
-
-       if (!avail)
-               dev_warn(&qm->pdev->dev, "Can not change qm state from %s to %s\n",
-                        qm_s[curr], qm_s[new]);
-
-       return avail;
-}
-
-static bool qm_qp_avail_state(struct hisi_qm *qm, struct hisi_qp *qp,
-                             enum qp_state new)
-{
-       enum qm_state qm_curr = atomic_read(&qm->status.flags);
-       enum qp_state qp_curr = 0;
-       bool avail = false;
-
-       if (qp)
-               qp_curr = atomic_read(&qp->qp_status.flags);
-
-       switch (new) {
-       case QP_INIT:
-               if (qm_curr == QM_START || qm_curr == QM_INIT)
-                       avail = true;
-               break;
-       case QP_START:
-               if ((qm_curr == QM_START && qp_curr == QP_INIT) ||
-                   (qm_curr == QM_START && qp_curr == QP_STOP))
-                       avail = true;
-               break;
-       case QP_STOP:
-               if ((qm_curr == QM_START && qp_curr == QP_START) ||
-                   (qp_curr == QP_INIT))
-                       avail = true;
-               break;
-       case QP_CLOSE:
-               if ((qm_curr == QM_START && qp_curr == QP_INIT) ||
-                   (qm_curr == QM_START && qp_curr == QP_STOP) ||
-                   (qm_curr == QM_STOP && qp_curr == QP_STOP)  ||
-                   (qm_curr == QM_STOP && qp_curr == QP_INIT))
-                       avail = true;
-               break;
-       default:
-               break;
-       }
-
-       dev_dbg(&qm->pdev->dev, "change qp state from %s to %s in QM %s\n",
-               qp_s[qp_curr], qp_s[new], qm_s[qm_curr]);
-
-       if (!avail)
-               dev_warn(&qm->pdev->dev,
-                        "Can not change qp state from %s to %s in QM %s\n",
-                        qp_s[qp_curr], qp_s[new], qm_s[qm_curr]);
-
-       return avail;
-}
-
 static u32 qm_get_hw_error_status(struct hisi_qm *qm)
 {
        return readl(qm->io_base + QM_ABNORMAL_INT_STATUS);
@@ -1853,8 +1770,10 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type)
        struct hisi_qp *qp;
        int qp_id;
 
-       if (!qm_qp_avail_state(qm, NULL, QP_INIT))
+       if (atomic_read(&qm->status.flags) == QM_STOP) {
+               dev_info_ratelimited(dev, "failed to create qp as qm is stop!\n");
                return ERR_PTR(-EPERM);
+       }
 
        if (qm->qp_in_used == qm->qp_num) {
                dev_info_ratelimited(dev, "All %u queues of QM are busy!\n",
@@ -1881,7 +1800,6 @@ static struct hisi_qp *qm_create_qp_nolock(struct hisi_qm *qm, u8 alg_type)
        qp->alg_type = alg_type;
        qp->is_in_kernel = true;
        qm->qp_in_used++;
-       atomic_set(&qp->qp_status.flags, QP_INIT);
 
        return qp;
 }
@@ -1924,11 +1842,6 @@ static void hisi_qm_release_qp(struct hisi_qp *qp)
 
        down_write(&qm->qps_lock);
 
-       if (!qm_qp_avail_state(qm, qp, QP_CLOSE)) {
-               up_write(&qm->qps_lock);
-               return;
-       }
-
        qm->qp_in_used--;
        idr_remove(&qm->qp_idr, qp->qp_id);
 
@@ -2008,8 +1921,10 @@ static int qm_start_qp_nolock(struct hisi_qp *qp, unsigned long arg)
        u32 pasid = arg;
        int ret;
 
-       if (!qm_qp_avail_state(qm, qp, QP_START))
+       if (atomic_read(&qm->status.flags) == QM_STOP) {
+               dev_info_ratelimited(dev, "failed to start qp as qm is stop!\n");
                return -EPERM;
+       }
 
        ret = qm_qp_ctx_cfg(qp, qp_id, pasid);
        if (ret)
@@ -2131,21 +2046,17 @@ static int qm_stop_qp_nolock(struct hisi_qp *qp)
         * is_resetting flag should be set negative so that this qp will not
         * be restarted after reset.
         */
-       if (atomic_read(&qp->qp_status.flags) == QP_STOP) {
+       if (atomic_read(&qp->qp_status.flags) != QP_START) {
                qp->is_resetting = false;
                return 0;
        }
 
-       if (!qm_qp_avail_state(qp->qm, qp, QP_STOP))
-               return -EPERM;
-
        atomic_set(&qp->qp_status.flags, QP_STOP);
 
        ret = qm_drain_qp(qp);
        if (ret)
                dev_err(dev, "Failed to drain out data for stopping!\n");
 
-
        flush_workqueue(qp->qm->wq);
        if (unlikely(qp->is_resetting && atomic_read(&qp->qp_status.used)))
                qp_stop_fail_cb(qp);
@@ -2865,13 +2776,8 @@ void hisi_qm_uninit(struct hisi_qm *qm)
 {
        qm_cmd_uninit(qm);
        hisi_qm_unint_work(qm);
-       down_write(&qm->qps_lock);
-
-       if (!qm_avail_state(qm, QM_CLOSE)) {
-               up_write(&qm->qps_lock);
-               return;
-       }
 
+       down_write(&qm->qps_lock);
        hisi_qm_memory_uninit(qm);
        hisi_qm_set_state(qm, QM_NOT_READY);
        up_write(&qm->qps_lock);
@@ -3045,11 +2951,6 @@ int hisi_qm_start(struct hisi_qm *qm)
 
        down_write(&qm->qps_lock);
 
-       if (!qm_avail_state(qm, QM_START)) {
-               up_write(&qm->qps_lock);
-               return -EPERM;
-       }
-
        dev_dbg(dev, "qm start with %u queue pairs\n", qm->qp_num);
 
        if (!qm->qp_num) {
@@ -3059,10 +2960,12 @@ int hisi_qm_start(struct hisi_qm *qm)
        }
 
        ret = __hisi_qm_start(qm);
-       if (!ret)
-               atomic_set(&qm->status.flags, QM_START);
+       if (ret)
+               goto err_unlock;
 
+       atomic_set(&qm->status.flags, QM_WORK);
        hisi_qm_set_state(qm, QM_READY);
+
 err_unlock:
        up_write(&qm->qps_lock);
        return ret;
@@ -3159,10 +3062,11 @@ int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r)
        down_write(&qm->qps_lock);
 
        qm->status.stop_reason = r;
-       if (!qm_avail_state(qm, QM_STOP)) {
-               ret = -EPERM;
+       if (atomic_read(&qm->status.flags) == QM_STOP)
                goto err_unlock;
-       }
+
+       /* Stop all the request sending at first. */
+       atomic_set(&qm->status.flags, QM_STOP);
 
        if (qm->status.stop_reason == QM_SOFT_RESET ||
            qm->status.stop_reason == QM_DOWN) {
@@ -3186,7 +3090,6 @@ int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r)
        }
 
        qm_clear_queues(qm);
-       atomic_set(&qm->status.flags, QM_STOP);
 
 err_unlock:
        up_write(&qm->qps_lock);
@@ -5350,7 +5253,6 @@ int hisi_qm_init(struct hisi_qm *qm)
                goto err_free_qm_memory;
 
        qm_cmd_init(qm);
-       atomic_set(&qm->status.flags, QM_INIT);
 
        return 0;
 
index 7b0b15c83ec1205fa69bad6f48f3f8fd9a9353fa..0760bf55f13e8d4fcaf49e1d0c6ca682e2a6f600 100644 (file)
@@ -72,10 +72,6 @@ struct qm_aeqc {
        __le32 dw6;
 };
 
-static const char * const qm_s[] = {
-       "init", "start", "close", "stop",
-};
-
 int qm_set_and_get_xqc(struct hisi_qm *qm, u8 cmd, void *xqc, u32 qp_id, bool op);
 void hisi_qm_show_last_dfx_regs(struct hisi_qm *qm);
 void hisi_qm_set_algqos_init(struct hisi_qm *qm);
index ddc7ebb705234c321d2cd7af0047f8a9c32c38ba..e3c0a1297b2c0aaf20a703c9519063a6e0d57daf 100644 (file)
@@ -108,17 +108,13 @@ enum qm_stop_reason {
 };
 
 enum qm_state {
-       QM_INIT = 0,
-       QM_START,
-       QM_CLOSE,
+       QM_WORK = 0,
        QM_STOP,
 };
 
 enum qp_state {
-       QP_INIT = 1,
-       QP_START,
+       QP_START = 1,
        QP_STOP,
-       QP_CLOSE,
 };
 
 enum qm_hw_ver {