Branch data Line data Source code
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_H 10 : : #define _CRYPTO_ACOMP_H 11 : : #include <linux/crypto.h> 12 : : 13 : : #define CRYPTO_ACOMP_ALLOC_OUTPUT 0x00000001 14 : : 15 : : /** 16 : : * struct acomp_req - asynchronous (de)compression request 17 : : * 18 : : * @base: Common attributes for asynchronous crypto requests 19 : : * @src: Source Data 20 : : * @dst: Destination data 21 : : * @slen: Size of the input buffer 22 : : * @dlen: Size of the output buffer and number of bytes produced 23 : : * @flags: Internal flags 24 : : * @__ctx: Start of private context data 25 : : */ 26 : : struct acomp_req { 27 : : struct crypto_async_request base; 28 : : struct scatterlist *src; 29 : : struct scatterlist *dst; 30 : : unsigned int slen; 31 : : unsigned int dlen; 32 : : u32 flags; 33 : : void *__ctx[] CRYPTO_MINALIGN_ATTR; 34 : : }; 35 : : 36 : : /** 37 : : * struct crypto_acomp - user-instantiated objects which encapsulate 38 : : * algorithms and core processing logic 39 : : * 40 : : * @compress: Function performs a compress operation 41 : : * @decompress: Function performs a de-compress operation 42 : : * @dst_free: Frees destination buffer if allocated inside the 43 : : * algorithm 44 : : * @reqsize: Context size for (de)compression requests 45 : : * @base: Common crypto API algorithm data structure 46 : : */ 47 : : struct crypto_acomp { 48 : : int (*compress)(struct acomp_req *req); 49 : : int (*decompress)(struct acomp_req *req); 50 : : void (*dst_free)(struct scatterlist *dst); 51 : : unsigned int reqsize; 52 : : struct crypto_tfm base; 53 : : }; 54 : : 55 : : /** 56 : : * struct acomp_alg - asynchronous compression algorithm 57 : : * 58 : : * @compress: Function performs a compress operation 59 : : * @decompress: Function performs a de-compress operation 60 : : * @dst_free: Frees destination buffer if allocated inside the algorithm 61 : : * @init: Initialize the cryptographic transformation object. 62 : : * This function is used to initialize the cryptographic 63 : : * transformation object. This function is called only once at 64 : : * the instantiation time, right after the transformation context 65 : : * was allocated. In case the cryptographic hardware has some 66 : : * special requirements which need to be handled by software, this 67 : : * function shall check for the precise requirement of the 68 : : * transformation and put any software fallbacks in place. 69 : : * @exit: Deinitialize the cryptographic transformation object. This is a 70 : : * counterpart to @init, used to remove various changes set in 71 : : * @init. 72 : : * 73 : : * @reqsize: Context size for (de)compression requests 74 : : * @base: Common crypto API algorithm data structure 75 : : */ 76 : : struct acomp_alg { 77 : : int (*compress)(struct acomp_req *req); 78 : : int (*decompress)(struct acomp_req *req); 79 : : void (*dst_free)(struct scatterlist *dst); 80 : : int (*init)(struct crypto_acomp *tfm); 81 : : void (*exit)(struct crypto_acomp *tfm); 82 : : unsigned int reqsize; 83 : : struct crypto_alg base; 84 : : }; 85 : : 86 : : /** 87 : : * DOC: Asynchronous Compression API 88 : : * 89 : : * The Asynchronous Compression API is used with the algorithms of type 90 : : * CRYPTO_ALG_TYPE_ACOMPRESS (listed as type "acomp" in /proc/crypto) 91 : : */ 92 : : 93 : : /** 94 : : * crypto_alloc_acomp() -- allocate ACOMPRESS tfm handle 95 : : * @alg_name: is the cra_name / name or cra_driver_name / driver name of the 96 : : * compression algorithm e.g. "deflate" 97 : : * @type: specifies the type of the algorithm 98 : : * @mask: specifies the mask for the algorithm 99 : : * 100 : : * Allocate a handle for a compression algorithm. The returned struct 101 : : * crypto_acomp is the handle that is required for any subsequent 102 : : * API invocation for the compression operations. 103 : : * 104 : : * Return: allocated handle in case of success; IS_ERR() is true in case 105 : : * of an error, PTR_ERR() returns the error code. 106 : : */ 107 : : struct crypto_acomp *crypto_alloc_acomp(const char *alg_name, u32 type, 108 : : u32 mask); 109 : : 110 : 0 : static inline struct crypto_tfm *crypto_acomp_tfm(struct crypto_acomp *tfm) 111 : : { 112 [ # # ]: 0 : return &tfm->base; 113 : : } 114 : : 115 : 0 : static inline struct acomp_alg *__crypto_acomp_alg(struct crypto_alg *alg) 116 : : { 117 : 0 : return container_of(alg, struct acomp_alg, base); 118 : : } 119 : : 120 : 0 : static inline struct crypto_acomp *__crypto_acomp_tfm(struct crypto_tfm *tfm) 121 : : { 122 [ # # ]: 0 : return container_of(tfm, struct crypto_acomp, base); 123 : : } 124 : : 125 : 0 : static inline struct acomp_alg *crypto_acomp_alg(struct crypto_acomp *tfm) 126 : : { 127 [ # # ]: 0 : return __crypto_acomp_alg(crypto_acomp_tfm(tfm)->__crt_alg); 128 : : } 129 : : 130 : 0 : static inline unsigned int crypto_acomp_reqsize(struct crypto_acomp *tfm) 131 : : { 132 : 0 : return tfm->reqsize; 133 : : } 134 : : 135 : 0 : static inline void acomp_request_set_tfm(struct acomp_req *req, 136 : : struct crypto_acomp *tfm) 137 : : { 138 : 0 : req->base.tfm = crypto_acomp_tfm(tfm); 139 : 0 : } 140 : : 141 : 0 : static inline struct crypto_acomp *crypto_acomp_reqtfm(struct acomp_req *req) 142 : : { 143 [ # # # # ]: 0 : return __crypto_acomp_tfm(req->base.tfm); 144 : : } 145 : : 146 : : /** 147 : : * crypto_free_acomp() -- free ACOMPRESS tfm handle 148 : : * 149 : : * @tfm: ACOMPRESS tfm handle allocated with crypto_alloc_acomp() 150 : : */ 151 : : static inline void crypto_free_acomp(struct crypto_acomp *tfm) 152 : : { 153 : : crypto_destroy_tfm(tfm, crypto_acomp_tfm(tfm)); 154 : : } 155 : : 156 : : static inline int crypto_has_acomp(const char *alg_name, u32 type, u32 mask) 157 : : { 158 : : type &= ~CRYPTO_ALG_TYPE_MASK; 159 : : type |= CRYPTO_ALG_TYPE_ACOMPRESS; 160 : : mask |= CRYPTO_ALG_TYPE_MASK; 161 : : 162 : : return crypto_has_alg(alg_name, type, mask); 163 : : } 164 : : 165 : : /** 166 : : * acomp_request_alloc() -- allocates asynchronous (de)compression request 167 : : * 168 : : * @tfm: ACOMPRESS tfm handle allocated with crypto_alloc_acomp() 169 : : * 170 : : * Return: allocated handle in case of success or NULL in case of an error 171 : : */ 172 : : struct acomp_req *acomp_request_alloc(struct crypto_acomp *tfm); 173 : : 174 : : /** 175 : : * acomp_request_free() -- zeroize and free asynchronous (de)compression 176 : : * request as well as the output buffer if allocated 177 : : * inside the algorithm 178 : : * 179 : : * @req: request to free 180 : : */ 181 : : void acomp_request_free(struct acomp_req *req); 182 : : 183 : : /** 184 : : * acomp_request_set_callback() -- Sets an asynchronous callback 185 : : * 186 : : * Callback will be called when an asynchronous operation on a given 187 : : * request is finished. 188 : : * 189 : : * @req: request that the callback will be set for 190 : : * @flgs: specify for instance if the operation may backlog 191 : : * @cmlp: callback which will be called 192 : : * @data: private data used by the caller 193 : : */ 194 : : static inline void acomp_request_set_callback(struct acomp_req *req, 195 : : u32 flgs, 196 : : crypto_completion_t cmpl, 197 : : void *data) 198 : : { 199 : : req->base.complete = cmpl; 200 : : req->base.data = data; 201 : : req->base.flags = flgs; 202 : : } 203 : : 204 : : /** 205 : : * acomp_request_set_params() -- Sets request parameters 206 : : * 207 : : * Sets parameters required by an acomp operation 208 : : * 209 : : * @req: asynchronous compress request 210 : : * @src: pointer to input buffer scatterlist 211 : : * @dst: pointer to output buffer scatterlist. If this is NULL, the 212 : : * acomp layer will allocate the output memory 213 : : * @slen: size of the input buffer 214 : : * @dlen: size of the output buffer. If dst is NULL, this can be used by 215 : : * the user to specify the maximum amount of memory to allocate 216 : : */ 217 : : static inline void acomp_request_set_params(struct acomp_req *req, 218 : : struct scatterlist *src, 219 : : struct scatterlist *dst, 220 : : unsigned int slen, 221 : : unsigned int dlen) 222 : : { 223 : : req->src = src; 224 : : req->dst = dst; 225 : : req->slen = slen; 226 : : req->dlen = dlen; 227 : : 228 : : if (!req->dst) 229 : : req->flags |= CRYPTO_ACOMP_ALLOC_OUTPUT; 230 : : } 231 : : 232 : : /** 233 : : * crypto_acomp_compress() -- Invoke asynchronous compress operation 234 : : * 235 : : * Function invokes the asynchronous compress operation 236 : : * 237 : : * @req: asynchronous compress request 238 : : * 239 : : * Return: zero on success; error code in case of error 240 : : */ 241 : : static inline int crypto_acomp_compress(struct acomp_req *req) 242 : : { 243 : : struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); 244 : : struct crypto_alg *alg = tfm->base.__crt_alg; 245 : : unsigned int slen = req->slen; 246 : : int ret; 247 : : 248 : : crypto_stats_get(alg); 249 : : ret = tfm->compress(req); 250 : : crypto_stats_compress(slen, ret, alg); 251 : : return ret; 252 : : } 253 : : 254 : : /** 255 : : * crypto_acomp_decompress() -- Invoke asynchronous decompress operation 256 : : * 257 : : * Function invokes the asynchronous decompress operation 258 : : * 259 : : * @req: asynchronous compress request 260 : : * 261 : : * Return: zero on success; error code in case of error 262 : : */ 263 : : static inline int crypto_acomp_decompress(struct acomp_req *req) 264 : : { 265 : : struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); 266 : : struct crypto_alg *alg = tfm->base.__crt_alg; 267 : : unsigned int slen = req->slen; 268 : : int ret; 269 : : 270 : : crypto_stats_get(alg); 271 : : ret = tfm->decompress(req); 272 : : crypto_stats_decompress(slen, ret, alg); 273 : : return ret; 274 : : } 275 : : 276 : : #endif