1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Synchronous Compression operations
4  *
5  * Copyright 2015 LG Electronics Inc.
6  * Copyright (c) 2016, Intel Corporation
7  * Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
8  */
9 #ifndef _CRYPTO_SCOMP_INT_H
10 #define _CRYPTO_SCOMP_INT_H
11 
12 #include <crypto/algapi.h>
13 
14 #define SCOMP_SCRATCH_SIZE	131072
15 
16 struct crypto_scomp {
17 	struct crypto_tfm base;
18 };
19 
20 /**
21  * struct scomp_alg - synchronous compression algorithm
22  *
23  * @alloc_ctx:	Function allocates algorithm specific context
24  * @free_ctx:	Function frees context allocated with alloc_ctx
25  * @compress:	Function performs a compress operation
26  * @decompress:	Function performs a de-compress operation
27  * @base:	Common crypto API algorithm data structure
28  */
29 struct scomp_alg {
30 	void *(*alloc_ctx)(struct crypto_scomp *tfm);
31 	void (*free_ctx)(struct crypto_scomp *tfm, void *ctx);
32 	int (*compress)(struct crypto_scomp *tfm, const u8 *src,
33 			unsigned int slen, u8 *dst, unsigned int *dlen,
34 			void *ctx);
35 	int (*decompress)(struct crypto_scomp *tfm, const u8 *src,
36 			  unsigned int slen, u8 *dst, unsigned int *dlen,
37 			  void *ctx);
38 	struct crypto_alg base;
39 };
40 
41 static inline struct scomp_alg *__crypto_scomp_alg(struct crypto_alg *alg)
42 {
43 	return container_of(alg, struct scomp_alg, base);
44 }
45 
46 static inline struct crypto_scomp *__crypto_scomp_tfm(struct crypto_tfm *tfm)
47 {
48 	return container_of(tfm, struct crypto_scomp, base);
49 }
50 
51 static inline struct crypto_tfm *crypto_scomp_tfm(struct crypto_scomp *tfm)
52 {
53 	return &tfm->base;
54 }
55 
56 static inline void crypto_free_scomp(struct crypto_scomp *tfm)
57 {
58 	crypto_destroy_tfm(tfm, crypto_scomp_tfm(tfm));
59 }
60 
61 static inline struct scomp_alg *crypto_scomp_alg(struct crypto_scomp *tfm)
62 {
63 	return __crypto_scomp_alg(crypto_scomp_tfm(tfm)->__crt_alg);
64 }
65 
66 static inline void *crypto_scomp_alloc_ctx(struct crypto_scomp *tfm)
67 {
68 	return crypto_scomp_alg(tfm)->alloc_ctx(tfm);
69 }
70 
71 static inline void crypto_scomp_free_ctx(struct crypto_scomp *tfm,
72 					 void *ctx)
73 {
74 	return crypto_scomp_alg(tfm)->free_ctx(tfm, ctx);
75 }
76 
77 static inline int crypto_scomp_compress(struct crypto_scomp *tfm,
78 					const u8 *src, unsigned int slen,
79 					u8 *dst, unsigned int *dlen, void *ctx)
80 {
81 	return crypto_scomp_alg(tfm)->compress(tfm, src, slen, dst, dlen, ctx);
82 }
83 
84 static inline int crypto_scomp_decompress(struct crypto_scomp *tfm,
85 					  const u8 *src, unsigned int slen,
86 					  u8 *dst, unsigned int *dlen,
87 					  void *ctx)
88 {
89 	return crypto_scomp_alg(tfm)->decompress(tfm, src, slen, dst, dlen,
90 						 ctx);
91 }
92 
93 int crypto_init_scomp_ops_async(struct crypto_tfm *tfm);
94 struct acomp_req *crypto_acomp_scomp_alloc_ctx(struct acomp_req *req);
95 void crypto_acomp_scomp_free_ctx(struct acomp_req *req);
96 
97 /**
98  * crypto_register_scomp() -- Register synchronous compression algorithm
99  *
100  * Function registers an implementation of a synchronous
101  * compression algorithm
102  *
103  * @alg:	algorithm definition
104  *
105  * Return: zero on success; error code in case of error
106  */
107 int crypto_register_scomp(struct scomp_alg *alg);
108 
109 /**
110  * crypto_unregister_scomp() -- Unregister synchronous compression algorithm
111  *
112  * Function unregisters an implementation of a synchronous
113  * compression algorithm
114  *
115  * @alg:	algorithm definition
116  */
117 void crypto_unregister_scomp(struct scomp_alg *alg);
118 
119 int crypto_register_scomps(struct scomp_alg *algs, int count);
120 void crypto_unregister_scomps(struct scomp_alg *algs, int count);
121 
122 #endif
123