]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: hisilicon/zip - adjust the way to obtain the req in the callback function
authorChenghai Huang <huangchenghai2@huawei.com>
Thu, 18 Dec 2025 13:44:42 +0000 (21:44 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 16 Jan 2026 06:02:06 +0000 (14:02 +0800)
In the shared queue design, multiple tfms use same qp, and one qp
need to corresponds to multiple qp_ctx. So use tag to obtain the
req virtual address. Build a one-to-one relationship between tfm
and qp_ctx. finaly remove the old get_tag operation.

Fixes: 2bcf36348ce5 ("crypto: hisilicon/zip - initialize operations about 'sqe' in 'acomp_alg.init'")
Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/zip/zip_crypto.c

index b97513981a3b795d04b7f26a56bad7f1bacbba6b..b4a656e0177d2dc7857cf5d1259581a6651b6571 100644 (file)
@@ -39,6 +39,7 @@ enum {
        HZIP_CTX_Q_NUM
 };
 
+#define GET_REQ_FROM_SQE(sqe)  ((u64)(sqe)->dw26 | (u64)(sqe)->dw27 << 32)
 #define COMP_NAME_TO_TYPE(alg_name)                                    \
        (!strcmp((alg_name), "deflate") ? HZIP_ALG_TYPE_DEFLATE : 0)
 
@@ -48,6 +49,7 @@ struct hisi_zip_req {
        struct hisi_acc_hw_sgl *hw_dst;
        dma_addr_t dma_src;
        dma_addr_t dma_dst;
+       struct hisi_zip_qp_ctx *qp_ctx;
        u16 req_id;
 };
 
@@ -74,7 +76,6 @@ struct hisi_zip_sqe_ops {
        void (*fill_req_type)(struct hisi_zip_sqe *sqe, u8 req_type);
        void (*fill_tag)(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req);
        void (*fill_sqe_type)(struct hisi_zip_sqe *sqe, u8 sqe_type);
-       u32 (*get_tag)(struct hisi_zip_sqe *sqe);
        u32 (*get_status)(struct hisi_zip_sqe *sqe);
        u32 (*get_dstlen)(struct hisi_zip_sqe *sqe);
 };
@@ -131,6 +132,7 @@ static struct hisi_zip_req *hisi_zip_create_req(struct hisi_zip_qp_ctx *qp_ctx,
        req_cache = q + req_id;
        req_cache->req_id = req_id;
        req_cache->req = req;
+       req_cache->qp_ctx = qp_ctx;
 
        return req_cache;
 }
@@ -181,7 +183,8 @@ static void hisi_zip_fill_req_type(struct hisi_zip_sqe *sqe, u8 req_type)
 
 static void hisi_zip_fill_tag(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req)
 {
-       sqe->dw26 = req->req_id;
+       sqe->dw26 = lower_32_bits((u64)req);
+       sqe->dw27 = upper_32_bits((u64)req);
 }
 
 static void hisi_zip_fill_sqe_type(struct hisi_zip_sqe *sqe, u8 sqe_type)
@@ -237,7 +240,7 @@ static int hisi_zip_do_work(struct hisi_zip_qp_ctx *qp_ctx,
                                                    &req->dma_dst, DMA_FROM_DEVICE);
        if (IS_ERR(req->hw_dst)) {
                ret = PTR_ERR(req->hw_dst);
-               dev_err(dev, "failed to map the dst buffer to hw slg (%d)!\n",
+               dev_err(dev, "failed to map the dst buffer to hw sgl (%d)!\n",
                        ret);
                goto err_unmap_input;
        }
@@ -265,11 +268,6 @@ err_unmap_input:
        return ret;
 }
 
-static u32 hisi_zip_get_tag(struct hisi_zip_sqe *sqe)
-{
-       return sqe->dw26;
-}
-
 static u32 hisi_zip_get_status(struct hisi_zip_sqe *sqe)
 {
        return sqe->dw3 & HZIP_BD_STATUS_M;
@@ -282,14 +280,12 @@ static u32 hisi_zip_get_dstlen(struct hisi_zip_sqe *sqe)
 
 static void hisi_zip_acomp_cb(struct hisi_qp *qp, void *data)
 {
-       struct hisi_zip_qp_ctx *qp_ctx = qp->qp_ctx;
+       struct hisi_zip_sqe *sqe = data;
+       struct hisi_zip_req *req = (struct hisi_zip_req *)GET_REQ_FROM_SQE(sqe);
+       struct hisi_zip_qp_ctx *qp_ctx = req->qp_ctx;
        const struct hisi_zip_sqe_ops *ops = qp_ctx->ctx->ops;
        struct hisi_zip_dfx *dfx = &qp_ctx->zip_dev->dfx;
-       struct hisi_zip_req_q *req_q = &qp_ctx->req_q;
        struct device *dev = &qp->qm->pdev->dev;
-       struct hisi_zip_sqe *sqe = data;
-       u32 tag = ops->get_tag(sqe);
-       struct hisi_zip_req *req = req_q->q + tag;
        struct acomp_req *acomp_req = req->req;
        int err = 0;
        u32 status;
@@ -393,7 +389,6 @@ static const struct hisi_zip_sqe_ops hisi_zip_ops = {
        .fill_req_type          = hisi_zip_fill_req_type,
        .fill_tag               = hisi_zip_fill_tag,
        .fill_sqe_type          = hisi_zip_fill_sqe_type,
-       .get_tag                = hisi_zip_get_tag,
        .get_status             = hisi_zip_get_status,
        .get_dstlen             = hisi_zip_get_dstlen,
 };
@@ -581,7 +576,6 @@ static void hisi_zip_acomp_exit(struct crypto_acomp *tfm)
 {
        struct hisi_zip_ctx *ctx = crypto_tfm_ctx(&tfm->base);
 
-       hisi_zip_set_acomp_cb(ctx, NULL);
        hisi_zip_release_sgl_pool(ctx);
        hisi_zip_release_req_q(ctx);
        hisi_zip_ctx_exit(ctx);