crypto: hisilicon/zip - support deflate algorithm
authorYang Shen <shenyang39@huawei.com>
Thu, 14 Sep 2023 09:09:07 +0000 (17:09 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 20 Sep 2023 05:15:29 +0000 (13:15 +0800)
Add the deflate algorithm support for hisilicon zip hardware.

Signed-off-by: Yang Shen <shenyang39@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/zip/zip_crypto.c
drivers/crypto/hisilicon/zip/zip_main.c

index 6608971d10cdc18ef73bcfc9a0af89d825314710..09f60f786779596ec16419f9f622cdc600b3f01a 100644 (file)
@@ -16,6 +16,7 @@
 #define HZIP_OUT_SGE_DATA_OFFSET_M             GENMASK(23, 0)
 /* hisi_zip_sqe dw9 */
 #define HZIP_REQ_TYPE_M                                GENMASK(7, 0)
+#define HZIP_ALG_TYPE_DEFLATE                  0x01
 #define HZIP_ALG_TYPE_ZLIB                     0x02
 #define HZIP_ALG_TYPE_GZIP                     0x03
 #define HZIP_BUF_TYPE_M                                GENMASK(11, 8)
@@ -41,6 +42,7 @@
 
 #define HZIP_ALG_ZLIB                          GENMASK(1, 0)
 #define HZIP_ALG_GZIP                          GENMASK(3, 2)
+#define HZIP_ALG_DEFLATE                       GENMASK(5, 4)
 
 static const u8 zlib_head[HZIP_ZLIB_HEAD_SIZE] = {0x78, 0x9c};
 static const u8 gzip_head[HZIP_GZIP_HEAD_SIZE] = {
@@ -59,8 +61,9 @@ enum {
 };
 
 #define COMP_NAME_TO_TYPE(alg_name)                                    \
+       (!strcmp((alg_name), "deflate") ? HZIP_ALG_TYPE_DEFLATE :       \
        (!strcmp((alg_name), "zlib-deflate") ? HZIP_ALG_TYPE_ZLIB :     \
-        !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0)          \
+        !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0))         \
 
 #define TO_HEAD_SIZE(req_type)                                         \
        (((req_type) == HZIP_ALG_TYPE_ZLIB) ? sizeof(zlib_head) :       \
@@ -447,15 +450,17 @@ static int hisi_zip_acompress(struct acomp_req *acomp_req)
        struct hisi_zip_qp_ctx *qp_ctx = &ctx->qp_ctx[HZIP_QPC_COMP];
        struct device *dev = &qp_ctx->qp->qm->pdev->dev;
        struct hisi_zip_req *req;
-       int head_size;
+       int head_size = 0;
        int ret;
 
        /* let's output compression head now */
-       head_size = add_comp_head(acomp_req->dst, qp_ctx->qp->req_type);
-       if (unlikely(head_size < 0)) {
-               dev_err_ratelimited(dev, "failed to add comp head (%d)!\n",
-                                   head_size);
-               return head_size;
+       if (qp_ctx->qp->req_type != HZIP_ALG_TYPE_DEFLATE) {
+               head_size = add_comp_head(acomp_req->dst, qp_ctx->qp->req_type);
+               if (unlikely(head_size < 0)) {
+                       dev_err_ratelimited(dev, "failed to add comp head (%d)!\n",
+                                       head_size);
+                       return head_size;
+               }
        }
 
        req = hisi_zip_create_req(acomp_req, qp_ctx, head_size, true);
@@ -477,13 +482,15 @@ static int hisi_zip_adecompress(struct acomp_req *acomp_req)
        struct hisi_zip_qp_ctx *qp_ctx = &ctx->qp_ctx[HZIP_QPC_DECOMP];
        struct device *dev = &qp_ctx->qp->qm->pdev->dev;
        struct hisi_zip_req *req;
-       int head_size, ret;
-
-       head_size = get_comp_head_size(acomp_req, qp_ctx->qp->req_type);
-       if (unlikely(head_size < 0)) {
-               dev_err_ratelimited(dev, "failed to get comp head size (%d)!\n",
-                                   head_size);
-               return head_size;
+       int head_size = 0, ret;
+
+       if (qp_ctx->qp->req_type != HZIP_ALG_TYPE_DEFLATE) {
+               head_size = get_comp_head_size(acomp_req, qp_ctx->qp->req_type);
+               if (unlikely(head_size < 0)) {
+                       dev_err_ratelimited(dev, "failed to get comp head size (%d)!\n",
+                                       head_size);
+                       return head_size;
+               }
        }
 
        req = hisi_zip_create_req(acomp_req, qp_ctx, head_size, false);
@@ -745,6 +752,42 @@ static void hisi_zip_acomp_exit(struct crypto_acomp *tfm)
        hisi_zip_ctx_exit(ctx);
 }
 
+static struct acomp_alg hisi_zip_acomp_deflate = {
+       .init                   = hisi_zip_acomp_init,
+       .exit                   = hisi_zip_acomp_exit,
+       .compress               = hisi_zip_acompress,
+       .decompress             = hisi_zip_adecompress,
+       .base                   = {
+               .cra_name               = "deflate",
+               .cra_driver_name        = "hisi-deflate-acomp",
+               .cra_module             = THIS_MODULE,
+               .cra_priority           = HZIP_ALG_PRIORITY,
+               .cra_ctxsize            = sizeof(struct hisi_zip_ctx),
+       }
+};
+
+static int hisi_zip_register_deflate(struct hisi_qm *qm)
+{
+       int ret;
+
+       if (!hisi_zip_alg_support(qm, HZIP_ALG_DEFLATE))
+               return 0;
+
+       ret = crypto_register_acomp(&hisi_zip_acomp_deflate);
+       if (ret)
+               dev_err(&qm->pdev->dev, "failed to register to deflate (%d)!\n", ret);
+
+       return ret;
+}
+
+static void hisi_zip_unregister_deflate(struct hisi_qm *qm)
+{
+       if (!hisi_zip_alg_support(qm, HZIP_ALG_DEFLATE))
+               return;
+
+       crypto_unregister_acomp(&hisi_zip_acomp_deflate);
+}
+
 static struct acomp_alg hisi_zip_acomp_zlib = {
        .init                   = hisi_zip_acomp_init,
        .exit                   = hisi_zip_acomp_exit,
@@ -821,19 +864,30 @@ int hisi_zip_register_to_crypto(struct hisi_qm *qm)
 {
        int ret = 0;
 
-       ret = hisi_zip_register_zlib(qm);
+       ret = hisi_zip_register_deflate(qm);
        if (ret)
                return ret;
 
+       ret = hisi_zip_register_zlib(qm);
+       if (ret)
+               goto err_unreg_deflate;
+
        ret = hisi_zip_register_gzip(qm);
        if (ret)
-               hisi_zip_unregister_zlib(qm);
+               goto err_unreg_zlib;
+
+       return 0;
 
+err_unreg_zlib:
+       hisi_zip_unregister_zlib(qm);
+err_unreg_deflate:
+       hisi_zip_unregister_deflate(qm);
        return ret;
 }
 
 void hisi_zip_unregister_from_crypto(struct hisi_qm *qm)
 {
+       hisi_zip_unregister_deflate(qm);
        hisi_zip_unregister_zlib(qm);
        hisi_zip_unregister_gzip(qm);
 }
index f3ce34198775d889d30e20f50df660e39edf7fde..da7a23c0e594dce77264ff07422b8f308153fa34 100644 (file)
@@ -236,8 +236,8 @@ static struct hisi_qm_cap_info zip_basic_cap_info[] = {
        {ZIP_CLUSTER_DECOMP_NUM_CAP, 0x313C, 0, GENMASK(7, 0), 0x6, 0x6, 0x3},
        {ZIP_DECOMP_ENABLE_BITMAP, 0x3140, 16, GENMASK(15, 0), 0xFC, 0xFC, 0x1C},
        {ZIP_COMP_ENABLE_BITMAP, 0x3140, 0, GENMASK(15, 0), 0x3, 0x3, 0x3},
-       {ZIP_DRV_ALG_BITMAP, 0x3144, 0, GENMASK(31, 0), 0xF, 0xF, 0xF},
-       {ZIP_DEV_ALG_BITMAP, 0x3148, 0, GENMASK(31, 0), 0xF, 0xF, 0xFF},
+       {ZIP_DRV_ALG_BITMAP, 0x3144, 0, GENMASK(31, 0), 0xF, 0xF, 0x3F},
+       {ZIP_DEV_ALG_BITMAP, 0x3148, 0, GENMASK(31, 0), 0xF, 0xF, 0x3F},
        {ZIP_CORE1_ALG_BITMAP, 0x314C, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5},
        {ZIP_CORE2_ALG_BITMAP, 0x3150, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5},
        {ZIP_CORE3_ALG_BITMAP, 0x3154, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A},