mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
crypto: hisilicon/zip - adjust the way to obtain the req in the callback function
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: 2bcf36348c ("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>
This commit is contained in:
committed by
Herbert Xu
parent
624a6760bf
commit
19c2475ce1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user