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