xref: /openbmc/linux/lib/zstd/zstd_compress_module.c (revision e0c1b49f5b674cca7b10549c53b3791d0bbc90a8)
1*e0c1b49fSNick Terrell // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2*e0c1b49fSNick Terrell /*
3*e0c1b49fSNick Terrell  * Copyright (c) Facebook, Inc.
4*e0c1b49fSNick Terrell  * All rights reserved.
5*e0c1b49fSNick Terrell  *
6*e0c1b49fSNick Terrell  * This source code is licensed under both the BSD-style license (found in the
7*e0c1b49fSNick Terrell  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8*e0c1b49fSNick Terrell  * in the COPYING file in the root directory of this source tree).
9*e0c1b49fSNick Terrell  * You may select, at your option, one of the above-listed licenses.
10*e0c1b49fSNick Terrell  */
11*e0c1b49fSNick Terrell 
12*e0c1b49fSNick Terrell #include <linux/kernel.h>
13*e0c1b49fSNick Terrell #include <linux/module.h>
14*e0c1b49fSNick Terrell #include <linux/string.h>
15*e0c1b49fSNick Terrell #include <linux/zstd.h>
16*e0c1b49fSNick Terrell 
17*e0c1b49fSNick Terrell #include "common/zstd_deps.h"
18*e0c1b49fSNick Terrell #include "common/zstd_internal.h"
19*e0c1b49fSNick Terrell 
20*e0c1b49fSNick Terrell #define ZSTD_FORWARD_IF_ERR(ret)            \
21*e0c1b49fSNick Terrell 	do {                                \
22*e0c1b49fSNick Terrell 		size_t const __ret = (ret); \
23*e0c1b49fSNick Terrell 		if (ZSTD_isError(__ret))    \
24*e0c1b49fSNick Terrell 			return __ret;       \
25*e0c1b49fSNick Terrell 	} while (0)
26*e0c1b49fSNick Terrell 
27*e0c1b49fSNick Terrell static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters,
28*e0c1b49fSNick Terrell 	unsigned long long pledged_src_size)
29*e0c1b49fSNick Terrell {
30*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset(
31*e0c1b49fSNick Terrell 		cctx, ZSTD_reset_session_and_parameters));
32*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize(
33*e0c1b49fSNick Terrell 		cctx, pledged_src_size));
34*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
35*e0c1b49fSNick Terrell 		cctx, ZSTD_c_windowLog, parameters->cParams.windowLog));
36*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
37*e0c1b49fSNick Terrell 		cctx, ZSTD_c_hashLog, parameters->cParams.hashLog));
38*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
39*e0c1b49fSNick Terrell 		cctx, ZSTD_c_chainLog, parameters->cParams.chainLog));
40*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
41*e0c1b49fSNick Terrell 		cctx, ZSTD_c_searchLog, parameters->cParams.searchLog));
42*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
43*e0c1b49fSNick Terrell 		cctx, ZSTD_c_minMatch, parameters->cParams.minMatch));
44*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
45*e0c1b49fSNick Terrell 		cctx, ZSTD_c_targetLength, parameters->cParams.targetLength));
46*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
47*e0c1b49fSNick Terrell 		cctx, ZSTD_c_strategy, parameters->cParams.strategy));
48*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
49*e0c1b49fSNick Terrell 		cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag));
50*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
51*e0c1b49fSNick Terrell 		cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag));
52*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
53*e0c1b49fSNick Terrell 		cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag));
54*e0c1b49fSNick Terrell 	return 0;
55*e0c1b49fSNick Terrell }
56*e0c1b49fSNick Terrell 
57*e0c1b49fSNick Terrell int zstd_min_clevel(void)
58*e0c1b49fSNick Terrell {
59*e0c1b49fSNick Terrell 	return ZSTD_minCLevel();
60*e0c1b49fSNick Terrell }
61*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_min_clevel);
62*e0c1b49fSNick Terrell 
63*e0c1b49fSNick Terrell int zstd_max_clevel(void)
64*e0c1b49fSNick Terrell {
65*e0c1b49fSNick Terrell 	return ZSTD_maxCLevel();
66*e0c1b49fSNick Terrell }
67*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_max_clevel);
68*e0c1b49fSNick Terrell 
69*e0c1b49fSNick Terrell size_t zstd_compress_bound(size_t src_size)
70*e0c1b49fSNick Terrell {
71*e0c1b49fSNick Terrell 	return ZSTD_compressBound(src_size);
72*e0c1b49fSNick Terrell }
73*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_bound);
74*e0c1b49fSNick Terrell 
75*e0c1b49fSNick Terrell zstd_parameters zstd_get_params(int level,
76*e0c1b49fSNick Terrell 	unsigned long long estimated_src_size)
77*e0c1b49fSNick Terrell {
78*e0c1b49fSNick Terrell 	return ZSTD_getParams(level, estimated_src_size, 0);
79*e0c1b49fSNick Terrell }
80*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_get_params);
81*e0c1b49fSNick Terrell 
82*e0c1b49fSNick Terrell size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams)
83*e0c1b49fSNick Terrell {
84*e0c1b49fSNick Terrell 	return ZSTD_estimateCCtxSize_usingCParams(*cparams);
85*e0c1b49fSNick Terrell }
86*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_cctx_workspace_bound);
87*e0c1b49fSNick Terrell 
88*e0c1b49fSNick Terrell zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size)
89*e0c1b49fSNick Terrell {
90*e0c1b49fSNick Terrell 	if (workspace == NULL)
91*e0c1b49fSNick Terrell 		return NULL;
92*e0c1b49fSNick Terrell 	return ZSTD_initStaticCCtx(workspace, workspace_size);
93*e0c1b49fSNick Terrell }
94*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_cctx);
95*e0c1b49fSNick Terrell 
96*e0c1b49fSNick Terrell size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity,
97*e0c1b49fSNick Terrell 	const void *src, size_t src_size, const zstd_parameters *parameters)
98*e0c1b49fSNick Terrell {
99*e0c1b49fSNick Terrell 	ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size));
100*e0c1b49fSNick Terrell 	return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size);
101*e0c1b49fSNick Terrell }
102*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_cctx);
103*e0c1b49fSNick Terrell 
104*e0c1b49fSNick Terrell size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams)
105*e0c1b49fSNick Terrell {
106*e0c1b49fSNick Terrell 	return ZSTD_estimateCStreamSize_usingCParams(*cparams);
107*e0c1b49fSNick Terrell }
108*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_cstream_workspace_bound);
109*e0c1b49fSNick Terrell 
110*e0c1b49fSNick Terrell zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters,
111*e0c1b49fSNick Terrell 	unsigned long long pledged_src_size, void *workspace, size_t workspace_size)
112*e0c1b49fSNick Terrell {
113*e0c1b49fSNick Terrell 	zstd_cstream *cstream;
114*e0c1b49fSNick Terrell 
115*e0c1b49fSNick Terrell 	if (workspace == NULL)
116*e0c1b49fSNick Terrell 		return NULL;
117*e0c1b49fSNick Terrell 
118*e0c1b49fSNick Terrell 	cstream = ZSTD_initStaticCStream(workspace, workspace_size);
119*e0c1b49fSNick Terrell 	if (cstream == NULL)
120*e0c1b49fSNick Terrell 		return NULL;
121*e0c1b49fSNick Terrell 
122*e0c1b49fSNick Terrell 	/* 0 means unknown in linux zstd API but means 0 in new zstd API */
123*e0c1b49fSNick Terrell 	if (pledged_src_size == 0)
124*e0c1b49fSNick Terrell 		pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN;
125*e0c1b49fSNick Terrell 
126*e0c1b49fSNick Terrell 	if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size)))
127*e0c1b49fSNick Terrell 		return NULL;
128*e0c1b49fSNick Terrell 
129*e0c1b49fSNick Terrell 	return cstream;
130*e0c1b49fSNick Terrell }
131*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_cstream);
132*e0c1b49fSNick Terrell 
133*e0c1b49fSNick Terrell size_t zstd_reset_cstream(zstd_cstream *cstream,
134*e0c1b49fSNick Terrell 	unsigned long long pledged_src_size)
135*e0c1b49fSNick Terrell {
136*e0c1b49fSNick Terrell 	return ZSTD_resetCStream(cstream, pledged_src_size);
137*e0c1b49fSNick Terrell }
138*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_reset_cstream);
139*e0c1b49fSNick Terrell 
140*e0c1b49fSNick Terrell size_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output,
141*e0c1b49fSNick Terrell 	zstd_in_buffer *input)
142*e0c1b49fSNick Terrell {
143*e0c1b49fSNick Terrell 	return ZSTD_compressStream(cstream, output, input);
144*e0c1b49fSNick Terrell }
145*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_stream);
146*e0c1b49fSNick Terrell 
147*e0c1b49fSNick Terrell size_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output)
148*e0c1b49fSNick Terrell {
149*e0c1b49fSNick Terrell 	return ZSTD_flushStream(cstream, output);
150*e0c1b49fSNick Terrell }
151*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_flush_stream);
152*e0c1b49fSNick Terrell 
153*e0c1b49fSNick Terrell size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output)
154*e0c1b49fSNick Terrell {
155*e0c1b49fSNick Terrell 	return ZSTD_endStream(cstream, output);
156*e0c1b49fSNick Terrell }
157*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_end_stream);
158*e0c1b49fSNick Terrell 
159*e0c1b49fSNick Terrell MODULE_LICENSE("Dual BSD/GPL");
160*e0c1b49fSNick Terrell MODULE_DESCRIPTION("Zstd Compressor");
161