18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Asynchronous Compression operations 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2016, Intel Corporation 68c2ecf20Sopenharmony_ci * Authors: Weigang Li <weigang.li@intel.com> 78c2ecf20Sopenharmony_ci * Giovanni Cabiddu <giovanni.cabiddu@intel.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci#ifndef _CRYPTO_ACOMP_H 108c2ecf20Sopenharmony_ci#define _CRYPTO_ACOMP_H 118c2ecf20Sopenharmony_ci#include <linux/crypto.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define CRYPTO_ACOMP_ALLOC_OUTPUT 0x00000001 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/** 168c2ecf20Sopenharmony_ci * struct acomp_req - asynchronous (de)compression request 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * @base: Common attributes for asynchronous crypto requests 198c2ecf20Sopenharmony_ci * @src: Source Data 208c2ecf20Sopenharmony_ci * @dst: Destination data 218c2ecf20Sopenharmony_ci * @slen: Size of the input buffer 228c2ecf20Sopenharmony_ci * @dlen: Size of the output buffer and number of bytes produced 238c2ecf20Sopenharmony_ci * @flags: Internal flags 248c2ecf20Sopenharmony_ci * @__ctx: Start of private context data 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_cistruct acomp_req { 278c2ecf20Sopenharmony_ci struct crypto_async_request base; 288c2ecf20Sopenharmony_ci struct scatterlist *src; 298c2ecf20Sopenharmony_ci struct scatterlist *dst; 308c2ecf20Sopenharmony_ci unsigned int slen; 318c2ecf20Sopenharmony_ci unsigned int dlen; 328c2ecf20Sopenharmony_ci u32 flags; 338c2ecf20Sopenharmony_ci void *__ctx[] CRYPTO_MINALIGN_ATTR; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/** 378c2ecf20Sopenharmony_ci * struct crypto_acomp - user-instantiated objects which encapsulate 388c2ecf20Sopenharmony_ci * algorithms and core processing logic 398c2ecf20Sopenharmony_ci * 408c2ecf20Sopenharmony_ci * @compress: Function performs a compress operation 418c2ecf20Sopenharmony_ci * @decompress: Function performs a de-compress operation 428c2ecf20Sopenharmony_ci * @dst_free: Frees destination buffer if allocated inside the 438c2ecf20Sopenharmony_ci * algorithm 448c2ecf20Sopenharmony_ci * @reqsize: Context size for (de)compression requests 458c2ecf20Sopenharmony_ci * @base: Common crypto API algorithm data structure 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_cistruct crypto_acomp { 488c2ecf20Sopenharmony_ci int (*compress)(struct acomp_req *req); 498c2ecf20Sopenharmony_ci int (*decompress)(struct acomp_req *req); 508c2ecf20Sopenharmony_ci void (*dst_free)(struct scatterlist *dst); 518c2ecf20Sopenharmony_ci unsigned int reqsize; 528c2ecf20Sopenharmony_ci struct crypto_tfm base; 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/** 568c2ecf20Sopenharmony_ci * struct acomp_alg - asynchronous compression algorithm 578c2ecf20Sopenharmony_ci * 588c2ecf20Sopenharmony_ci * @compress: Function performs a compress operation 598c2ecf20Sopenharmony_ci * @decompress: Function performs a de-compress operation 608c2ecf20Sopenharmony_ci * @dst_free: Frees destination buffer if allocated inside the algorithm 618c2ecf20Sopenharmony_ci * @init: Initialize the cryptographic transformation object. 628c2ecf20Sopenharmony_ci * This function is used to initialize the cryptographic 638c2ecf20Sopenharmony_ci * transformation object. This function is called only once at 648c2ecf20Sopenharmony_ci * the instantiation time, right after the transformation context 658c2ecf20Sopenharmony_ci * was allocated. In case the cryptographic hardware has some 668c2ecf20Sopenharmony_ci * special requirements which need to be handled by software, this 678c2ecf20Sopenharmony_ci * function shall check for the precise requirement of the 688c2ecf20Sopenharmony_ci * transformation and put any software fallbacks in place. 698c2ecf20Sopenharmony_ci * @exit: Deinitialize the cryptographic transformation object. This is a 708c2ecf20Sopenharmony_ci * counterpart to @init, used to remove various changes set in 718c2ecf20Sopenharmony_ci * @init. 728c2ecf20Sopenharmony_ci * 738c2ecf20Sopenharmony_ci * @reqsize: Context size for (de)compression requests 748c2ecf20Sopenharmony_ci * @base: Common crypto API algorithm data structure 758c2ecf20Sopenharmony_ci */ 768c2ecf20Sopenharmony_cistruct acomp_alg { 778c2ecf20Sopenharmony_ci int (*compress)(struct acomp_req *req); 788c2ecf20Sopenharmony_ci int (*decompress)(struct acomp_req *req); 798c2ecf20Sopenharmony_ci void (*dst_free)(struct scatterlist *dst); 808c2ecf20Sopenharmony_ci int (*init)(struct crypto_acomp *tfm); 818c2ecf20Sopenharmony_ci void (*exit)(struct crypto_acomp *tfm); 828c2ecf20Sopenharmony_ci unsigned int reqsize; 838c2ecf20Sopenharmony_ci struct crypto_alg base; 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci/** 878c2ecf20Sopenharmony_ci * DOC: Asynchronous Compression API 888c2ecf20Sopenharmony_ci * 898c2ecf20Sopenharmony_ci * The Asynchronous Compression API is used with the algorithms of type 908c2ecf20Sopenharmony_ci * CRYPTO_ALG_TYPE_ACOMPRESS (listed as type "acomp" in /proc/crypto) 918c2ecf20Sopenharmony_ci */ 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/** 948c2ecf20Sopenharmony_ci * crypto_alloc_acomp() -- allocate ACOMPRESS tfm handle 958c2ecf20Sopenharmony_ci * @alg_name: is the cra_name / name or cra_driver_name / driver name of the 968c2ecf20Sopenharmony_ci * compression algorithm e.g. "deflate" 978c2ecf20Sopenharmony_ci * @type: specifies the type of the algorithm 988c2ecf20Sopenharmony_ci * @mask: specifies the mask for the algorithm 998c2ecf20Sopenharmony_ci * 1008c2ecf20Sopenharmony_ci * Allocate a handle for a compression algorithm. The returned struct 1018c2ecf20Sopenharmony_ci * crypto_acomp is the handle that is required for any subsequent 1028c2ecf20Sopenharmony_ci * API invocation for the compression operations. 1038c2ecf20Sopenharmony_ci * 1048c2ecf20Sopenharmony_ci * Return: allocated handle in case of success; IS_ERR() is true in case 1058c2ecf20Sopenharmony_ci * of an error, PTR_ERR() returns the error code. 1068c2ecf20Sopenharmony_ci */ 1078c2ecf20Sopenharmony_cistruct crypto_acomp *crypto_alloc_acomp(const char *alg_name, u32 type, 1088c2ecf20Sopenharmony_ci u32 mask); 1098c2ecf20Sopenharmony_ci/** 1108c2ecf20Sopenharmony_ci * crypto_alloc_acomp_node() -- allocate ACOMPRESS tfm handle with desired NUMA node 1118c2ecf20Sopenharmony_ci * @alg_name: is the cra_name / name or cra_driver_name / driver name of the 1128c2ecf20Sopenharmony_ci * compression algorithm e.g. "deflate" 1138c2ecf20Sopenharmony_ci * @type: specifies the type of the algorithm 1148c2ecf20Sopenharmony_ci * @mask: specifies the mask for the algorithm 1158c2ecf20Sopenharmony_ci * @node: specifies the NUMA node the ZIP hardware belongs to 1168c2ecf20Sopenharmony_ci * 1178c2ecf20Sopenharmony_ci * Allocate a handle for a compression algorithm. Drivers should try to use 1188c2ecf20Sopenharmony_ci * (de)compressors on the specified NUMA node. 1198c2ecf20Sopenharmony_ci * The returned struct crypto_acomp is the handle that is required for any 1208c2ecf20Sopenharmony_ci * subsequent API invocation for the compression operations. 1218c2ecf20Sopenharmony_ci * 1228c2ecf20Sopenharmony_ci * Return: allocated handle in case of success; IS_ERR() is true in case 1238c2ecf20Sopenharmony_ci * of an error, PTR_ERR() returns the error code. 1248c2ecf20Sopenharmony_ci */ 1258c2ecf20Sopenharmony_cistruct crypto_acomp *crypto_alloc_acomp_node(const char *alg_name, u32 type, 1268c2ecf20Sopenharmony_ci u32 mask, int node); 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistatic inline struct crypto_tfm *crypto_acomp_tfm(struct crypto_acomp *tfm) 1298c2ecf20Sopenharmony_ci{ 1308c2ecf20Sopenharmony_ci return &tfm->base; 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic inline struct acomp_alg *__crypto_acomp_alg(struct crypto_alg *alg) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci return container_of(alg, struct acomp_alg, base); 1368c2ecf20Sopenharmony_ci} 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cistatic inline struct crypto_acomp *__crypto_acomp_tfm(struct crypto_tfm *tfm) 1398c2ecf20Sopenharmony_ci{ 1408c2ecf20Sopenharmony_ci return container_of(tfm, struct crypto_acomp, base); 1418c2ecf20Sopenharmony_ci} 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistatic inline struct acomp_alg *crypto_acomp_alg(struct crypto_acomp *tfm) 1448c2ecf20Sopenharmony_ci{ 1458c2ecf20Sopenharmony_ci return __crypto_acomp_alg(crypto_acomp_tfm(tfm)->__crt_alg); 1468c2ecf20Sopenharmony_ci} 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistatic inline unsigned int crypto_acomp_reqsize(struct crypto_acomp *tfm) 1498c2ecf20Sopenharmony_ci{ 1508c2ecf20Sopenharmony_ci return tfm->reqsize; 1518c2ecf20Sopenharmony_ci} 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic inline void acomp_request_set_tfm(struct acomp_req *req, 1548c2ecf20Sopenharmony_ci struct crypto_acomp *tfm) 1558c2ecf20Sopenharmony_ci{ 1568c2ecf20Sopenharmony_ci req->base.tfm = crypto_acomp_tfm(tfm); 1578c2ecf20Sopenharmony_ci} 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cistatic inline struct crypto_acomp *crypto_acomp_reqtfm(struct acomp_req *req) 1608c2ecf20Sopenharmony_ci{ 1618c2ecf20Sopenharmony_ci return __crypto_acomp_tfm(req->base.tfm); 1628c2ecf20Sopenharmony_ci} 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci/** 1658c2ecf20Sopenharmony_ci * crypto_free_acomp() -- free ACOMPRESS tfm handle 1668c2ecf20Sopenharmony_ci * 1678c2ecf20Sopenharmony_ci * @tfm: ACOMPRESS tfm handle allocated with crypto_alloc_acomp() 1688c2ecf20Sopenharmony_ci * 1698c2ecf20Sopenharmony_ci * If @tfm is a NULL or error pointer, this function does nothing. 1708c2ecf20Sopenharmony_ci */ 1718c2ecf20Sopenharmony_cistatic inline void crypto_free_acomp(struct crypto_acomp *tfm) 1728c2ecf20Sopenharmony_ci{ 1738c2ecf20Sopenharmony_ci crypto_destroy_tfm(tfm, crypto_acomp_tfm(tfm)); 1748c2ecf20Sopenharmony_ci} 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistatic inline int crypto_has_acomp(const char *alg_name, u32 type, u32 mask) 1778c2ecf20Sopenharmony_ci{ 1788c2ecf20Sopenharmony_ci type &= ~CRYPTO_ALG_TYPE_MASK; 1798c2ecf20Sopenharmony_ci type |= CRYPTO_ALG_TYPE_ACOMPRESS; 1808c2ecf20Sopenharmony_ci mask |= CRYPTO_ALG_TYPE_ACOMPRESS_MASK; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci return crypto_has_alg(alg_name, type, mask); 1838c2ecf20Sopenharmony_ci} 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci/** 1868c2ecf20Sopenharmony_ci * acomp_request_alloc() -- allocates asynchronous (de)compression request 1878c2ecf20Sopenharmony_ci * 1888c2ecf20Sopenharmony_ci * @tfm: ACOMPRESS tfm handle allocated with crypto_alloc_acomp() 1898c2ecf20Sopenharmony_ci * 1908c2ecf20Sopenharmony_ci * Return: allocated handle in case of success or NULL in case of an error 1918c2ecf20Sopenharmony_ci */ 1928c2ecf20Sopenharmony_cistruct acomp_req *acomp_request_alloc(struct crypto_acomp *tfm); 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci/** 1958c2ecf20Sopenharmony_ci * acomp_request_free() -- zeroize and free asynchronous (de)compression 1968c2ecf20Sopenharmony_ci * request as well as the output buffer if allocated 1978c2ecf20Sopenharmony_ci * inside the algorithm 1988c2ecf20Sopenharmony_ci * 1998c2ecf20Sopenharmony_ci * @req: request to free 2008c2ecf20Sopenharmony_ci */ 2018c2ecf20Sopenharmony_civoid acomp_request_free(struct acomp_req *req); 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci/** 2048c2ecf20Sopenharmony_ci * acomp_request_set_callback() -- Sets an asynchronous callback 2058c2ecf20Sopenharmony_ci * 2068c2ecf20Sopenharmony_ci * Callback will be called when an asynchronous operation on a given 2078c2ecf20Sopenharmony_ci * request is finished. 2088c2ecf20Sopenharmony_ci * 2098c2ecf20Sopenharmony_ci * @req: request that the callback will be set for 2108c2ecf20Sopenharmony_ci * @flgs: specify for instance if the operation may backlog 2118c2ecf20Sopenharmony_ci * @cmlp: callback which will be called 2128c2ecf20Sopenharmony_ci * @data: private data used by the caller 2138c2ecf20Sopenharmony_ci */ 2148c2ecf20Sopenharmony_cistatic inline void acomp_request_set_callback(struct acomp_req *req, 2158c2ecf20Sopenharmony_ci u32 flgs, 2168c2ecf20Sopenharmony_ci crypto_completion_t cmpl, 2178c2ecf20Sopenharmony_ci void *data) 2188c2ecf20Sopenharmony_ci{ 2198c2ecf20Sopenharmony_ci req->base.complete = cmpl; 2208c2ecf20Sopenharmony_ci req->base.data = data; 2218c2ecf20Sopenharmony_ci req->base.flags = flgs; 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci/** 2258c2ecf20Sopenharmony_ci * acomp_request_set_params() -- Sets request parameters 2268c2ecf20Sopenharmony_ci * 2278c2ecf20Sopenharmony_ci * Sets parameters required by an acomp operation 2288c2ecf20Sopenharmony_ci * 2298c2ecf20Sopenharmony_ci * @req: asynchronous compress request 2308c2ecf20Sopenharmony_ci * @src: pointer to input buffer scatterlist 2318c2ecf20Sopenharmony_ci * @dst: pointer to output buffer scatterlist. If this is NULL, the 2328c2ecf20Sopenharmony_ci * acomp layer will allocate the output memory 2338c2ecf20Sopenharmony_ci * @slen: size of the input buffer 2348c2ecf20Sopenharmony_ci * @dlen: size of the output buffer. If dst is NULL, this can be used by 2358c2ecf20Sopenharmony_ci * the user to specify the maximum amount of memory to allocate 2368c2ecf20Sopenharmony_ci */ 2378c2ecf20Sopenharmony_cistatic inline void acomp_request_set_params(struct acomp_req *req, 2388c2ecf20Sopenharmony_ci struct scatterlist *src, 2398c2ecf20Sopenharmony_ci struct scatterlist *dst, 2408c2ecf20Sopenharmony_ci unsigned int slen, 2418c2ecf20Sopenharmony_ci unsigned int dlen) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci req->src = src; 2448c2ecf20Sopenharmony_ci req->dst = dst; 2458c2ecf20Sopenharmony_ci req->slen = slen; 2468c2ecf20Sopenharmony_ci req->dlen = dlen; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci if (!req->dst) 2498c2ecf20Sopenharmony_ci req->flags |= CRYPTO_ACOMP_ALLOC_OUTPUT; 2508c2ecf20Sopenharmony_ci} 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci/** 2538c2ecf20Sopenharmony_ci * crypto_acomp_compress() -- Invoke asynchronous compress operation 2548c2ecf20Sopenharmony_ci * 2558c2ecf20Sopenharmony_ci * Function invokes the asynchronous compress operation 2568c2ecf20Sopenharmony_ci * 2578c2ecf20Sopenharmony_ci * @req: asynchronous compress request 2588c2ecf20Sopenharmony_ci * 2598c2ecf20Sopenharmony_ci * Return: zero on success; error code in case of error 2608c2ecf20Sopenharmony_ci */ 2618c2ecf20Sopenharmony_cistatic inline int crypto_acomp_compress(struct acomp_req *req) 2628c2ecf20Sopenharmony_ci{ 2638c2ecf20Sopenharmony_ci struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); 2648c2ecf20Sopenharmony_ci struct crypto_alg *alg = tfm->base.__crt_alg; 2658c2ecf20Sopenharmony_ci unsigned int slen = req->slen; 2668c2ecf20Sopenharmony_ci int ret; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci crypto_stats_get(alg); 2698c2ecf20Sopenharmony_ci ret = tfm->compress(req); 2708c2ecf20Sopenharmony_ci crypto_stats_compress(slen, ret, alg); 2718c2ecf20Sopenharmony_ci return ret; 2728c2ecf20Sopenharmony_ci} 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/** 2758c2ecf20Sopenharmony_ci * crypto_acomp_decompress() -- Invoke asynchronous decompress operation 2768c2ecf20Sopenharmony_ci * 2778c2ecf20Sopenharmony_ci * Function invokes the asynchronous decompress operation 2788c2ecf20Sopenharmony_ci * 2798c2ecf20Sopenharmony_ci * @req: asynchronous compress request 2808c2ecf20Sopenharmony_ci * 2818c2ecf20Sopenharmony_ci * Return: zero on success; error code in case of error 2828c2ecf20Sopenharmony_ci */ 2838c2ecf20Sopenharmony_cistatic inline int crypto_acomp_decompress(struct acomp_req *req) 2848c2ecf20Sopenharmony_ci{ 2858c2ecf20Sopenharmony_ci struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); 2868c2ecf20Sopenharmony_ci struct crypto_alg *alg = tfm->base.__crt_alg; 2878c2ecf20Sopenharmony_ci unsigned int slen = req->slen; 2888c2ecf20Sopenharmony_ci int ret; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci crypto_stats_get(alg); 2918c2ecf20Sopenharmony_ci ret = tfm->decompress(req); 2928c2ecf20Sopenharmony_ci crypto_stats_decompress(slen, ret, alg); 2938c2ecf20Sopenharmony_ci return ret; 2948c2ecf20Sopenharmony_ci} 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci#endif 297