1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2019 HiSilicon Limited. */
3 #include <crypto/internal/acompress.h>
4 #include <linux/bitfield.h>
5 #include <linux/dma-mapping.h>
6 #include <linux/scatterlist.h>
10 #define HZIP_BD_STATUS_M GENMASK(7, 0)
11 /* hisi_zip_sqe dw7 */
12 #define HZIP_IN_SGE_DATA_OFFSET_M GENMASK(23, 0)
13 /* hisi_zip_sqe dw8 */
14 #define HZIP_OUT_SGE_DATA_OFFSET_M GENMASK(23, 0)
15 /* hisi_zip_sqe dw9 */
16 #define HZIP_REQ_TYPE_M GENMASK(7, 0)
17 #define HZIP_ALG_TYPE_ZLIB 0x02
18 #define HZIP_ALG_TYPE_GZIP 0x03
19 #define HZIP_BUF_TYPE_M GENMASK(11, 8)
20 #define HZIP_PBUFFER 0x0
23 #define HZIP_ZLIB_HEAD_SIZE 2
24 #define HZIP_GZIP_HEAD_SIZE 10
26 #define GZIP_HEAD_FHCRC_BIT BIT(1)
27 #define GZIP_HEAD_FEXTRA_BIT BIT(2)
28 #define GZIP_HEAD_FNAME_BIT BIT(3)
29 #define GZIP_HEAD_FCOMMENT_BIT BIT(4)
31 #define GZIP_HEAD_FLG_SHIFT 3
32 #define GZIP_HEAD_FEXTRA_SHIFT 10
33 #define GZIP_HEAD_FEXTRA_XLEN 2UL
34 #define GZIP_HEAD_FHCRC_SIZE 2
36 #define HZIP_GZIP_HEAD_BUF 256
37 #define HZIP_ALG_PRIORITY 300
38 #define HZIP_SGL_SGE_NR 10
40 static const u8 zlib_head
[HZIP_ZLIB_HEAD_SIZE
] = {0x78, 0x9c};
41 static const u8 gzip_head
[HZIP_GZIP_HEAD_SIZE
] = {
42 0x1f, 0x8b, 0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x03
45 enum hisi_zip_alg_type
{
46 HZIP_ALG_TYPE_COMP
= 0,
47 HZIP_ALG_TYPE_DECOMP
= 1,
56 #define COMP_NAME_TO_TYPE(alg_name) \
57 (!strcmp((alg_name), "zlib-deflate") ? HZIP_ALG_TYPE_ZLIB : \
58 !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0) \
60 #define TO_HEAD_SIZE(req_type) \
61 (((req_type) == HZIP_ALG_TYPE_ZLIB) ? sizeof(zlib_head) : \
62 ((req_type) == HZIP_ALG_TYPE_GZIP) ? sizeof(gzip_head) : 0) \
64 #define TO_HEAD(req_type) \
65 (((req_type) == HZIP_ALG_TYPE_ZLIB) ? zlib_head : \
66 ((req_type) == HZIP_ALG_TYPE_GZIP) ? gzip_head : NULL) \
69 struct acomp_req
*req
;
72 struct hisi_acc_hw_sgl
*hw_src
;
73 struct hisi_acc_hw_sgl
*hw_dst
;
79 struct hisi_zip_req_q
{
80 struct hisi_zip_req
*q
;
81 unsigned long *req_bitmap
;
86 struct hisi_zip_qp_ctx
{
88 struct hisi_zip_req_q req_q
;
89 struct hisi_acc_sgl_pool
*sgl_pool
;
90 struct hisi_zip
*zip_dev
;
91 struct hisi_zip_ctx
*ctx
;
95 struct hisi_zip_qp_ctx qp_ctx
[HZIP_CTX_Q_NUM
];
98 static int sgl_sge_nr_set(const char *val
, const struct kernel_param
*kp
)
106 ret
= kstrtou16(val
, 10, &n
);
107 if (ret
|| n
== 0 || n
> HISI_ACC_SGL_SGE_NR_MAX
)
110 return param_set_int(val
, kp
);
113 static const struct kernel_param_ops sgl_sge_nr_ops
= {
114 .set
= sgl_sge_nr_set
,
115 .get
= param_get_int
,
118 static u16 sgl_sge_nr
= HZIP_SGL_SGE_NR
;
119 module_param_cb(sgl_sge_nr
, &sgl_sge_nr_ops
, &sgl_sge_nr
, 0444);
120 MODULE_PARM_DESC(sgl_sge_nr
, "Number of sge in sgl(1-255)");
122 static void hisi_zip_config_buf_type(struct hisi_zip_sqe
*sqe
, u8 buf_type
)
126 val
= (sqe
->dw9
) & ~HZIP_BUF_TYPE_M
;
127 val
|= FIELD_PREP(HZIP_BUF_TYPE_M
, buf_type
);
131 static void hisi_zip_config_tag(struct hisi_zip_sqe
*sqe
, u32 tag
)
136 static void hisi_zip_fill_sqe(struct hisi_zip_sqe
*sqe
, u8 req_type
,
137 dma_addr_t s_addr
, dma_addr_t d_addr
, u32 slen
,
138 u32 dlen
, u32 sskip
, u32 dskip
)
140 memset(sqe
, 0, sizeof(struct hisi_zip_sqe
));
142 sqe
->input_data_length
= slen
- sskip
;
143 sqe
->dw7
= FIELD_PREP(HZIP_IN_SGE_DATA_OFFSET_M
, sskip
);
144 sqe
->dw8
= FIELD_PREP(HZIP_OUT_SGE_DATA_OFFSET_M
, dskip
);
145 sqe
->dw9
= FIELD_PREP(HZIP_REQ_TYPE_M
, req_type
);
146 sqe
->dest_avail_out
= dlen
- dskip
;
147 sqe
->source_addr_l
= lower_32_bits(s_addr
);
148 sqe
->source_addr_h
= upper_32_bits(s_addr
);
149 sqe
->dest_addr_l
= lower_32_bits(d_addr
);
150 sqe
->dest_addr_h
= upper_32_bits(d_addr
);
153 static int hisi_zip_start_qp(struct hisi_qp
*qp
, struct hisi_zip_qp_ctx
*ctx
,
154 int alg_type
, int req_type
)
156 struct device
*dev
= &qp
->qm
->pdev
->dev
;
159 qp
->req_type
= req_type
;
160 qp
->alg_type
= alg_type
;
163 ret
= hisi_qm_start_qp(qp
, 0);
165 dev_err(dev
, "failed to start qp (%d)!\n", ret
);
174 static void hisi_zip_release_qp(struct hisi_zip_qp_ctx
*ctx
)
176 hisi_qm_stop_qp(ctx
->qp
);
177 hisi_qm_release_qp(ctx
->qp
);
180 static int hisi_zip_ctx_init(struct hisi_zip_ctx
*hisi_zip_ctx
, u8 req_type
, int node
)
182 struct hisi_qp
*qps
[HZIP_CTX_Q_NUM
] = { NULL
};
183 struct hisi_zip
*hisi_zip
;
186 ret
= zip_create_qps(qps
, HZIP_CTX_Q_NUM
, node
);
188 pr_err("failed to create zip qps (%d)!\n", ret
);
192 hisi_zip
= container_of(qps
[0]->qm
, struct hisi_zip
, qm
);
194 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++) {
195 /* alg_type = 0 for compress, 1 for decompress in hw sqe */
196 ret
= hisi_zip_start_qp(qps
[i
], &hisi_zip_ctx
->qp_ctx
[i
], i
,
199 for (j
= i
- 1; j
>= 0; j
--)
200 hisi_qm_stop_qp(hisi_zip_ctx
->qp_ctx
[j
].qp
);
202 hisi_qm_free_qps(qps
, HZIP_CTX_Q_NUM
);
206 hisi_zip_ctx
->qp_ctx
[i
].zip_dev
= hisi_zip
;
212 static void hisi_zip_ctx_exit(struct hisi_zip_ctx
*hisi_zip_ctx
)
216 for (i
= 1; i
>= 0; i
--)
217 hisi_zip_release_qp(&hisi_zip_ctx
->qp_ctx
[i
]);
220 static u16
get_extra_field_size(const u8
*start
)
222 return *((u16
*)start
) + GZIP_HEAD_FEXTRA_XLEN
;
225 static u32
get_name_field_size(const u8
*start
)
227 return strlen(start
) + 1;
230 static u32
get_comment_field_size(const u8
*start
)
232 return strlen(start
) + 1;
235 static u32
__get_gzip_head_size(const u8
*src
)
237 u8 head_flg
= *(src
+ GZIP_HEAD_FLG_SHIFT
);
238 u32 size
= GZIP_HEAD_FEXTRA_SHIFT
;
240 if (head_flg
& GZIP_HEAD_FEXTRA_BIT
)
241 size
+= get_extra_field_size(src
+ size
);
242 if (head_flg
& GZIP_HEAD_FNAME_BIT
)
243 size
+= get_name_field_size(src
+ size
);
244 if (head_flg
& GZIP_HEAD_FCOMMENT_BIT
)
245 size
+= get_comment_field_size(src
+ size
);
246 if (head_flg
& GZIP_HEAD_FHCRC_BIT
)
247 size
+= GZIP_HEAD_FHCRC_SIZE
;
252 static int hisi_zip_create_req_q(struct hisi_zip_ctx
*ctx
)
254 struct hisi_zip_req_q
*req_q
;
257 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++) {
258 req_q
= &ctx
->qp_ctx
[i
].req_q
;
259 req_q
->size
= QM_Q_DEPTH
;
261 req_q
->req_bitmap
= kcalloc(BITS_TO_LONGS(req_q
->size
),
262 sizeof(long), GFP_KERNEL
);
263 if (!req_q
->req_bitmap
) {
270 rwlock_init(&req_q
->req_lock
);
272 req_q
->q
= kcalloc(req_q
->size
, sizeof(struct hisi_zip_req
),
277 goto err_free_bitmap
;
286 kfree(ctx
->qp_ctx
[HZIP_QPC_DECOMP
].req_q
.req_bitmap
);
288 kfree(ctx
->qp_ctx
[HZIP_QPC_COMP
].req_q
.q
);
290 kfree(ctx
->qp_ctx
[HZIP_QPC_COMP
].req_q
.req_bitmap
);
294 static void hisi_zip_release_req_q(struct hisi_zip_ctx
*ctx
)
298 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++) {
299 kfree(ctx
->qp_ctx
[i
].req_q
.q
);
300 kfree(ctx
->qp_ctx
[i
].req_q
.req_bitmap
);
304 static int hisi_zip_create_sgl_pool(struct hisi_zip_ctx
*ctx
)
306 struct hisi_zip_qp_ctx
*tmp
;
310 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++) {
311 tmp
= &ctx
->qp_ctx
[i
];
312 dev
= &tmp
->qp
->qm
->pdev
->dev
;
313 tmp
->sgl_pool
= hisi_acc_create_sgl_pool(dev
, QM_Q_DEPTH
<< 1,
315 if (IS_ERR(tmp
->sgl_pool
)) {
317 goto err_free_sgl_pool0
;
325 hisi_acc_free_sgl_pool(&ctx
->qp_ctx
[HZIP_QPC_COMP
].qp
->qm
->pdev
->dev
,
326 ctx
->qp_ctx
[HZIP_QPC_COMP
].sgl_pool
);
330 static void hisi_zip_release_sgl_pool(struct hisi_zip_ctx
*ctx
)
334 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++)
335 hisi_acc_free_sgl_pool(&ctx
->qp_ctx
[i
].qp
->qm
->pdev
->dev
,
336 ctx
->qp_ctx
[i
].sgl_pool
);
339 static void hisi_zip_remove_req(struct hisi_zip_qp_ctx
*qp_ctx
,
340 struct hisi_zip_req
*req
)
342 struct hisi_zip_req_q
*req_q
= &qp_ctx
->req_q
;
344 write_lock(&req_q
->req_lock
);
345 clear_bit(req
->req_id
, req_q
->req_bitmap
);
346 memset(req
, 0, sizeof(struct hisi_zip_req
));
347 write_unlock(&req_q
->req_lock
);
350 static void hisi_zip_acomp_cb(struct hisi_qp
*qp
, void *data
)
352 struct hisi_zip_sqe
*sqe
= data
;
353 struct hisi_zip_qp_ctx
*qp_ctx
= qp
->qp_ctx
;
354 struct hisi_zip_dfx
*dfx
= &qp_ctx
->zip_dev
->dfx
;
355 struct hisi_zip_req_q
*req_q
= &qp_ctx
->req_q
;
356 struct hisi_zip_req
*req
= req_q
->q
+ sqe
->tag
;
357 struct acomp_req
*acomp_req
= req
->req
;
358 struct device
*dev
= &qp
->qm
->pdev
->dev
;
359 u32 status
, dlen
, head_size
;
362 atomic64_inc(&dfx
->recv_cnt
);
363 status
= sqe
->dw3
& HZIP_BD_STATUS_M
;
364 if (status
!= 0 && status
!= HZIP_NC_ERR
) {
365 dev_err(dev
, "%scompress fail in qp%u: %u, output: %u\n",
366 (qp
->alg_type
== 0) ? "" : "de", qp
->qp_id
, status
,
368 atomic64_inc(&dfx
->err_bd_cnt
);
371 dlen
= sqe
->produced
;
373 hisi_acc_sg_buf_unmap(dev
, acomp_req
->src
, req
->hw_src
);
374 hisi_acc_sg_buf_unmap(dev
, acomp_req
->dst
, req
->hw_dst
);
376 head_size
= (qp
->alg_type
== 0) ? TO_HEAD_SIZE(qp
->req_type
) : 0;
377 acomp_req
->dlen
= dlen
+ head_size
;
379 if (acomp_req
->base
.complete
)
380 acomp_request_complete(acomp_req
, err
);
382 hisi_zip_remove_req(qp_ctx
, req
);
385 static void hisi_zip_set_acomp_cb(struct hisi_zip_ctx
*ctx
,
386 void (*fn
)(struct hisi_qp
*, void *))
390 for (i
= 0; i
< HZIP_CTX_Q_NUM
; i
++)
391 ctx
->qp_ctx
[i
].qp
->req_cb
= fn
;
394 static int hisi_zip_acomp_init(struct crypto_acomp
*tfm
)
396 const char *alg_name
= crypto_tfm_alg_name(&tfm
->base
);
397 struct hisi_zip_ctx
*ctx
= crypto_tfm_ctx(&tfm
->base
);
401 ret
= hisi_zip_ctx_init(ctx
, COMP_NAME_TO_TYPE(alg_name
), tfm
->base
.node
);
403 pr_err("failed to init ctx (%d)!\n", ret
);
407 dev
= &ctx
->qp_ctx
[0].qp
->qm
->pdev
->dev
;
409 ret
= hisi_zip_create_req_q(ctx
);
411 dev_err(dev
, "failed to create request queue (%d)!\n", ret
);
415 ret
= hisi_zip_create_sgl_pool(ctx
);
417 dev_err(dev
, "failed to create sgl pool (%d)!\n", ret
);
418 goto err_release_req_q
;
421 hisi_zip_set_acomp_cb(ctx
, hisi_zip_acomp_cb
);
426 hisi_zip_release_req_q(ctx
);
428 hisi_zip_ctx_exit(ctx
);
432 static void hisi_zip_acomp_exit(struct crypto_acomp
*tfm
)
434 struct hisi_zip_ctx
*ctx
= crypto_tfm_ctx(&tfm
->base
);
436 hisi_zip_set_acomp_cb(ctx
, NULL
);
437 hisi_zip_release_sgl_pool(ctx
);
438 hisi_zip_release_req_q(ctx
);
439 hisi_zip_ctx_exit(ctx
);
442 static int add_comp_head(struct scatterlist
*dst
, u8 req_type
)
444 int head_size
= TO_HEAD_SIZE(req_type
);
445 const u8
*head
= TO_HEAD(req_type
);
448 ret
= sg_copy_from_buffer(dst
, sg_nents(dst
), head
, head_size
);
449 if (ret
!= head_size
) {
450 pr_err("the head size of buffer is wrong (%d)!\n", ret
);
457 static size_t __maybe_unused
get_gzip_head_size(struct scatterlist
*sgl
)
459 char buf
[HZIP_GZIP_HEAD_BUF
];
461 sg_copy_to_buffer(sgl
, sg_nents(sgl
), buf
, sizeof(buf
));
463 return __get_gzip_head_size(buf
);
466 static int get_comp_head_size(struct acomp_req
*acomp_req
, u8 req_type
)
468 if (!acomp_req
->src
|| !acomp_req
->slen
)
471 if ((req_type
== HZIP_ALG_TYPE_GZIP
) &&
472 (acomp_req
->slen
< GZIP_HEAD_FEXTRA_SHIFT
))
476 case HZIP_ALG_TYPE_ZLIB
:
477 return TO_HEAD_SIZE(HZIP_ALG_TYPE_ZLIB
);
478 case HZIP_ALG_TYPE_GZIP
:
479 return TO_HEAD_SIZE(HZIP_ALG_TYPE_GZIP
);
481 pr_err("request type does not support!\n");
486 static struct hisi_zip_req
*hisi_zip_create_req(struct acomp_req
*req
,
487 struct hisi_zip_qp_ctx
*qp_ctx
,
488 size_t head_size
, bool is_comp
)
490 struct hisi_zip_req_q
*req_q
= &qp_ctx
->req_q
;
491 struct hisi_zip_req
*q
= req_q
->q
;
492 struct hisi_zip_req
*req_cache
;
495 write_lock(&req_q
->req_lock
);
497 req_id
= find_first_zero_bit(req_q
->req_bitmap
, req_q
->size
);
498 if (req_id
>= req_q
->size
) {
499 write_unlock(&req_q
->req_lock
);
500 dev_dbg(&qp_ctx
->qp
->qm
->pdev
->dev
, "req cache is full!\n");
501 return ERR_PTR(-EAGAIN
);
503 set_bit(req_id
, req_q
->req_bitmap
);
505 req_cache
= q
+ req_id
;
506 req_cache
->req_id
= req_id
;
507 req_cache
->req
= req
;
510 req_cache
->sskip
= 0;
511 req_cache
->dskip
= head_size
;
513 req_cache
->sskip
= head_size
;
514 req_cache
->dskip
= 0;
517 write_unlock(&req_q
->req_lock
);
522 static int hisi_zip_do_work(struct hisi_zip_req
*req
,
523 struct hisi_zip_qp_ctx
*qp_ctx
)
525 struct acomp_req
*a_req
= req
->req
;
526 struct hisi_qp
*qp
= qp_ctx
->qp
;
527 struct device
*dev
= &qp
->qm
->pdev
->dev
;
528 struct hisi_acc_sgl_pool
*pool
= qp_ctx
->sgl_pool
;
529 struct hisi_zip_dfx
*dfx
= &qp_ctx
->zip_dev
->dfx
;
530 struct hisi_zip_sqe zip_sqe
;
531 dma_addr_t input
, output
;
534 if (!a_req
->src
|| !a_req
->slen
|| !a_req
->dst
|| !a_req
->dlen
)
537 req
->hw_src
= hisi_acc_sg_buf_map_to_hw_sgl(dev
, a_req
->src
, pool
,
538 req
->req_id
<< 1, &input
);
539 if (IS_ERR(req
->hw_src
)) {
540 dev_err(dev
, "failed to map the src buffer to hw sgl (%ld)!\n",
541 PTR_ERR(req
->hw_src
));
542 return PTR_ERR(req
->hw_src
);
544 req
->dma_src
= input
;
546 req
->hw_dst
= hisi_acc_sg_buf_map_to_hw_sgl(dev
, a_req
->dst
, pool
,
547 (req
->req_id
<< 1) + 1,
549 if (IS_ERR(req
->hw_dst
)) {
550 ret
= PTR_ERR(req
->hw_dst
);
551 dev_err(dev
, "failed to map the dst buffer to hw slg (%d)!\n",
553 goto err_unmap_input
;
555 req
->dma_dst
= output
;
557 hisi_zip_fill_sqe(&zip_sqe
, qp
->req_type
, input
, output
, a_req
->slen
,
558 a_req
->dlen
, req
->sskip
, req
->dskip
);
559 hisi_zip_config_buf_type(&zip_sqe
, HZIP_SGL
);
560 hisi_zip_config_tag(&zip_sqe
, req
->req_id
);
562 /* send command to start a task */
563 atomic64_inc(&dfx
->send_cnt
);
564 ret
= hisi_qp_send(qp
, &zip_sqe
);
566 atomic64_inc(&dfx
->send_busy_cnt
);
568 dev_dbg_ratelimited(dev
, "failed to send request!\n");
569 goto err_unmap_output
;
575 hisi_acc_sg_buf_unmap(dev
, a_req
->dst
, req
->hw_dst
);
577 hisi_acc_sg_buf_unmap(dev
, a_req
->src
, req
->hw_src
);
581 static int hisi_zip_acompress(struct acomp_req
*acomp_req
)
583 struct hisi_zip_ctx
*ctx
= crypto_tfm_ctx(acomp_req
->base
.tfm
);
584 struct hisi_zip_qp_ctx
*qp_ctx
= &ctx
->qp_ctx
[HZIP_QPC_COMP
];
585 struct device
*dev
= &qp_ctx
->qp
->qm
->pdev
->dev
;
586 struct hisi_zip_req
*req
;
590 /* let's output compression head now */
591 head_size
= add_comp_head(acomp_req
->dst
, qp_ctx
->qp
->req_type
);
593 dev_err_ratelimited(dev
, "failed to add comp head (%d)!\n",
598 req
= hisi_zip_create_req(acomp_req
, qp_ctx
, head_size
, true);
602 ret
= hisi_zip_do_work(req
, qp_ctx
);
603 if (ret
!= -EINPROGRESS
) {
604 dev_info_ratelimited(dev
, "failed to do compress (%d)!\n", ret
);
605 hisi_zip_remove_req(qp_ctx
, req
);
611 static int hisi_zip_adecompress(struct acomp_req
*acomp_req
)
613 struct hisi_zip_ctx
*ctx
= crypto_tfm_ctx(acomp_req
->base
.tfm
);
614 struct hisi_zip_qp_ctx
*qp_ctx
= &ctx
->qp_ctx
[HZIP_QPC_DECOMP
];
615 struct device
*dev
= &qp_ctx
->qp
->qm
->pdev
->dev
;
616 struct hisi_zip_req
*req
;
619 head_size
= get_comp_head_size(acomp_req
, qp_ctx
->qp
->req_type
);
621 dev_err_ratelimited(dev
, "failed to get comp head size (%d)!\n",
626 req
= hisi_zip_create_req(acomp_req
, qp_ctx
, head_size
, false);
630 ret
= hisi_zip_do_work(req
, qp_ctx
);
631 if (ret
!= -EINPROGRESS
) {
632 dev_info_ratelimited(dev
, "failed to do decompress (%d)!\n",
634 hisi_zip_remove_req(qp_ctx
, req
);
640 static struct acomp_alg hisi_zip_acomp_zlib
= {
641 .init
= hisi_zip_acomp_init
,
642 .exit
= hisi_zip_acomp_exit
,
643 .compress
= hisi_zip_acompress
,
644 .decompress
= hisi_zip_adecompress
,
646 .cra_name
= "zlib-deflate",
647 .cra_driver_name
= "hisi-zlib-acomp",
648 .cra_module
= THIS_MODULE
,
649 .cra_priority
= HZIP_ALG_PRIORITY
,
650 .cra_ctxsize
= sizeof(struct hisi_zip_ctx
),
654 static struct acomp_alg hisi_zip_acomp_gzip
= {
655 .init
= hisi_zip_acomp_init
,
656 .exit
= hisi_zip_acomp_exit
,
657 .compress
= hisi_zip_acompress
,
658 .decompress
= hisi_zip_adecompress
,
661 .cra_driver_name
= "hisi-gzip-acomp",
662 .cra_module
= THIS_MODULE
,
663 .cra_priority
= HZIP_ALG_PRIORITY
,
664 .cra_ctxsize
= sizeof(struct hisi_zip_ctx
),
668 int hisi_zip_register_to_crypto(void)
672 ret
= crypto_register_acomp(&hisi_zip_acomp_zlib
);
674 pr_err("failed to register to zlib (%d)!\n", ret
);
678 ret
= crypto_register_acomp(&hisi_zip_acomp_gzip
);
680 pr_err("failed to register to gzip (%d)!\n", ret
);
681 crypto_unregister_acomp(&hisi_zip_acomp_zlib
);
687 void hisi_zip_unregister_from_crypto(void)
689 crypto_unregister_acomp(&hisi_zip_acomp_gzip
);
690 crypto_unregister_acomp(&hisi_zip_acomp_zlib
);