Skip to content

Commit

Permalink
crypto: hisilicon/qm - simplify the status of qm
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Weili Qian authored and herbertx committed Dec 1, 2023
1 parent fb4ac51 commit c66272a
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 127 deletions.
2 changes: 1 addition & 1 deletion Documentation/ABI/testing/debugfs-hisi-hpre
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Documentation/ABI/testing/debugfs-hisi-sec
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Documentation/ABI/testing/debugfs-hisi-zip
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions drivers/crypto/hisilicon/debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
130 changes: 16 additions & 114 deletions drivers/crypto/hisilicon/qm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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",
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 0 additions & 4 deletions drivers/crypto/hisilicon/qm_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 2 additions & 6 deletions include/linux/hisi_acc_qm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit c66272a

Please sign in to comment.