1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Asynchronous Compression operations |
4 | * |
5 | * Copyright (c) 2016, Intel Corporation |
6 | * Authors: Weigang Li <weigang.li@intel.com> |
7 | * Giovanni Cabiddu <giovanni.cabiddu@intel.com> |
8 | */ |
9 | #ifndef _CRYPTO_ACOMP_INT_H |
10 | #define _CRYPTO_ACOMP_INT_H |
11 | |
12 | #include <crypto/acompress.h> |
13 | #include <crypto/algapi.h> |
14 | |
15 | /** |
16 | * struct acomp_alg - asynchronous compression algorithm |
17 | * |
18 | * @compress: Function performs a compress operation |
19 | * @decompress: Function performs a de-compress operation |
20 | * @dst_free: Frees destination buffer if allocated inside the algorithm |
21 | * @init: Initialize the cryptographic transformation object. |
22 | * This function is used to initialize the cryptographic |
23 | * transformation object. This function is called only once at |
24 | * the instantiation time, right after the transformation context |
25 | * was allocated. In case the cryptographic hardware has some |
26 | * special requirements which need to be handled by software, this |
27 | * function shall check for the precise requirement of the |
28 | * transformation and put any software fallbacks in place. |
29 | * @exit: Deinitialize the cryptographic transformation object. This is a |
30 | * counterpart to @init, used to remove various changes set in |
31 | * @init. |
32 | * |
33 | * @reqsize: Context size for (de)compression requests |
34 | * @stat: Statistics for compress algorithm |
35 | * @base: Common crypto API algorithm data structure |
36 | * @calg: Cmonn algorithm data structure shared with scomp |
37 | */ |
38 | struct acomp_alg { |
39 | int (*compress)(struct acomp_req *req); |
40 | int (*decompress)(struct acomp_req *req); |
41 | void (*dst_free)(struct scatterlist *dst); |
42 | int (*init)(struct crypto_acomp *tfm); |
43 | void (*exit)(struct crypto_acomp *tfm); |
44 | |
45 | unsigned int reqsize; |
46 | |
47 | union { |
48 | struct COMP_ALG_COMMON; |
49 | struct comp_alg_common calg; |
50 | }; |
51 | }; |
52 | |
53 | /* |
54 | * Transform internal helpers. |
55 | */ |
56 | static inline void *acomp_request_ctx(struct acomp_req *req) |
57 | { |
58 | return req->__ctx; |
59 | } |
60 | |
61 | static inline void *acomp_tfm_ctx(struct crypto_acomp *tfm) |
62 | { |
63 | return tfm->base.__crt_ctx; |
64 | } |
65 | |
66 | static inline void acomp_request_complete(struct acomp_req *req, |
67 | int err) |
68 | { |
69 | crypto_request_complete(req: &req->base, err); |
70 | } |
71 | |
72 | static inline struct acomp_req *__acomp_request_alloc(struct crypto_acomp *tfm) |
73 | { |
74 | struct acomp_req *req; |
75 | |
76 | req = kzalloc(size: sizeof(*req) + crypto_acomp_reqsize(tfm), GFP_KERNEL); |
77 | if (likely(req)) |
78 | acomp_request_set_tfm(req, tfm); |
79 | return req; |
80 | } |
81 | |
82 | static inline void __acomp_request_free(struct acomp_req *req) |
83 | { |
84 | kfree_sensitive(objp: req); |
85 | } |
86 | |
87 | /** |
88 | * crypto_register_acomp() -- Register asynchronous compression algorithm |
89 | * |
90 | * Function registers an implementation of an asynchronous |
91 | * compression algorithm |
92 | * |
93 | * @alg: algorithm definition |
94 | * |
95 | * Return: zero on success; error code in case of error |
96 | */ |
97 | int crypto_register_acomp(struct acomp_alg *alg); |
98 | |
99 | /** |
100 | * crypto_unregister_acomp() -- Unregister asynchronous compression algorithm |
101 | * |
102 | * Function unregisters an implementation of an asynchronous |
103 | * compression algorithm |
104 | * |
105 | * @alg: algorithm definition |
106 | */ |
107 | void crypto_unregister_acomp(struct acomp_alg *alg); |
108 | |
109 | int crypto_register_acomps(struct acomp_alg *algs, int count); |
110 | void crypto_unregister_acomps(struct acomp_alg *algs, int count); |
111 | |
112 | #endif |
113 | |