xref: /linux/drivers/block/zram/zcomp.h (revision 6e11664f148454a127dd89e8698c3e3e80e5f62f)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #ifndef _ZCOMP_H_
4 #define _ZCOMP_H_
5 
6 #include <linux/mutex.h>
7 
8 #define ZCOMP_PARAM_NOT_SET	INT_MIN
9 
10 struct deflate_params {
11 	s32 winbits;
12 };
13 
14 /*
15  * Immutable driver (backend) parameters. The driver may attach private
16  * data to it (e.g. driver representation of the dictionary, etc.).
17  *
18  * This data is kept per-comp and is shared among execution contexts.
19  */
20 struct zcomp_params {
21 	void *dict;
22 	size_t dict_sz;
23 	s32 level;
24 	union {
25 		struct deflate_params deflate;
26 	};
27 
28 	void *drv_data;
29 };
30 
31 /*
32  * Run-time driver context - scratch buffers, etc. It is modified during
33  * request execution (compression/decompression), cannot be shared, so
34  * it's in per-CPU area.
35  */
36 struct zcomp_ctx {
37 	void *context;
38 };
39 
40 struct zcomp_strm {
41 	struct mutex lock;
42 	/* compression buffer */
43 	void *buffer;
44 	/* local copy of handle memory */
45 	void *local_copy;
46 	struct zcomp_ctx ctx;
47 };
48 
49 struct zcomp_req {
50 	const unsigned char *src;
51 	const size_t src_len;
52 
53 	unsigned char *dst;
54 	size_t dst_len;
55 };
56 
57 struct zcomp_ops {
58 	int (*compress)(struct zcomp_params *params, struct zcomp_ctx *ctx,
59 			struct zcomp_req *req);
60 	int (*decompress)(struct zcomp_params *params, struct zcomp_ctx *ctx,
61 			  struct zcomp_req *req);
62 
63 	int (*create_ctx)(struct zcomp_params *params, struct zcomp_ctx *ctx);
64 	void (*destroy_ctx)(struct zcomp_ctx *ctx);
65 
66 	int (*setup_params)(struct zcomp_params *params);
67 	void (*release_params)(struct zcomp_params *params);
68 
69 	const char *name;
70 };
71 
72 /* dynamic per-device compression frontend */
73 struct zcomp {
74 	struct zcomp_strm __percpu *stream;
75 	const struct zcomp_ops *ops;
76 	struct zcomp_params *params;
77 	struct hlist_node node;
78 };
79 
80 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node);
81 int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
82 ssize_t zcomp_available_show(const char *comp, char *buf, ssize_t at);
83 bool zcomp_available_algorithm(const char *comp);
84 
85 struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params);
86 void zcomp_destroy(struct zcomp *comp);
87 
88 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp);
89 void zcomp_stream_put(struct zcomp_strm *zstrm);
90 
91 int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm,
92 		   const void *src, unsigned int *dst_len);
93 int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm,
94 		     const void *src, unsigned int src_len, void *dst);
95 
96 #endif /* _ZCOMP_H_ */
97