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 
19*e0c1b49fSNick Terrell /* Common symbols. zstd_compress must depend on zstd_decompress. */
20*e0c1b49fSNick Terrell 
zstd_is_error(size_t code)21*e0c1b49fSNick Terrell unsigned int zstd_is_error(size_t code)
22*e0c1b49fSNick Terrell {
23*e0c1b49fSNick Terrell 	return ZSTD_isError(code);
24*e0c1b49fSNick Terrell }
25*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_is_error);
26*e0c1b49fSNick Terrell 
zstd_get_error_code(size_t code)27*e0c1b49fSNick Terrell zstd_error_code zstd_get_error_code(size_t code)
28*e0c1b49fSNick Terrell {
29*e0c1b49fSNick Terrell 	return ZSTD_getErrorCode(code);
30*e0c1b49fSNick Terrell }
31*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_get_error_code);
32*e0c1b49fSNick Terrell 
zstd_get_error_name(size_t code)33*e0c1b49fSNick Terrell const char *zstd_get_error_name(size_t code)
34*e0c1b49fSNick Terrell {
35*e0c1b49fSNick Terrell 	return ZSTD_getErrorName(code);
36*e0c1b49fSNick Terrell }
37*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_get_error_name);
38*e0c1b49fSNick Terrell 
39*e0c1b49fSNick Terrell /* Decompression symbols. */
40*e0c1b49fSNick Terrell 
zstd_dctx_workspace_bound(void)41*e0c1b49fSNick Terrell size_t zstd_dctx_workspace_bound(void)
42*e0c1b49fSNick Terrell {
43*e0c1b49fSNick Terrell 	return ZSTD_estimateDCtxSize();
44*e0c1b49fSNick Terrell }
45*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_dctx_workspace_bound);
46*e0c1b49fSNick Terrell 
zstd_init_dctx(void * workspace,size_t workspace_size)47*e0c1b49fSNick Terrell zstd_dctx *zstd_init_dctx(void *workspace, size_t workspace_size)
48*e0c1b49fSNick Terrell {
49*e0c1b49fSNick Terrell 	if (workspace == NULL)
50*e0c1b49fSNick Terrell 		return NULL;
51*e0c1b49fSNick Terrell 	return ZSTD_initStaticDCtx(workspace, workspace_size);
52*e0c1b49fSNick Terrell }
53*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_dctx);
54*e0c1b49fSNick Terrell 
zstd_decompress_dctx(zstd_dctx * dctx,void * dst,size_t dst_capacity,const void * src,size_t src_size)55*e0c1b49fSNick Terrell size_t zstd_decompress_dctx(zstd_dctx *dctx, void *dst, size_t dst_capacity,
56*e0c1b49fSNick Terrell 	const void *src, size_t src_size)
57*e0c1b49fSNick Terrell {
58*e0c1b49fSNick Terrell 	return ZSTD_decompressDCtx(dctx, dst, dst_capacity, src, src_size);
59*e0c1b49fSNick Terrell }
60*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_decompress_dctx);
61*e0c1b49fSNick Terrell 
zstd_dstream_workspace_bound(size_t max_window_size)62*e0c1b49fSNick Terrell size_t zstd_dstream_workspace_bound(size_t max_window_size)
63*e0c1b49fSNick Terrell {
64*e0c1b49fSNick Terrell 	return ZSTD_estimateDStreamSize(max_window_size);
65*e0c1b49fSNick Terrell }
66*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_dstream_workspace_bound);
67*e0c1b49fSNick Terrell 
zstd_init_dstream(size_t max_window_size,void * workspace,size_t workspace_size)68*e0c1b49fSNick Terrell zstd_dstream *zstd_init_dstream(size_t max_window_size, void *workspace,
69*e0c1b49fSNick Terrell 	size_t workspace_size)
70*e0c1b49fSNick Terrell {
71*e0c1b49fSNick Terrell 	if (workspace == NULL)
72*e0c1b49fSNick Terrell 		return NULL;
73*e0c1b49fSNick Terrell 	(void)max_window_size;
74*e0c1b49fSNick Terrell 	return ZSTD_initStaticDStream(workspace, workspace_size);
75*e0c1b49fSNick Terrell }
76*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_dstream);
77*e0c1b49fSNick Terrell 
zstd_reset_dstream(zstd_dstream * dstream)78*e0c1b49fSNick Terrell size_t zstd_reset_dstream(zstd_dstream *dstream)
79*e0c1b49fSNick Terrell {
80*e0c1b49fSNick Terrell 	return ZSTD_resetDStream(dstream);
81*e0c1b49fSNick Terrell }
82*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_reset_dstream);
83*e0c1b49fSNick Terrell 
zstd_decompress_stream(zstd_dstream * dstream,zstd_out_buffer * output,zstd_in_buffer * input)84*e0c1b49fSNick Terrell size_t zstd_decompress_stream(zstd_dstream *dstream, zstd_out_buffer *output,
85*e0c1b49fSNick Terrell 	zstd_in_buffer *input)
86*e0c1b49fSNick Terrell {
87*e0c1b49fSNick Terrell 	return ZSTD_decompressStream(dstream, output, input);
88*e0c1b49fSNick Terrell }
89*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_decompress_stream);
90*e0c1b49fSNick Terrell 
zstd_find_frame_compressed_size(const void * src,size_t src_size)91*e0c1b49fSNick Terrell size_t zstd_find_frame_compressed_size(const void *src, size_t src_size)
92*e0c1b49fSNick Terrell {
93*e0c1b49fSNick Terrell 	return ZSTD_findFrameCompressedSize(src, src_size);
94*e0c1b49fSNick Terrell }
95*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_find_frame_compressed_size);
96*e0c1b49fSNick Terrell 
zstd_get_frame_header(zstd_frame_header * header,const void * src,size_t src_size)97*e0c1b49fSNick Terrell size_t zstd_get_frame_header(zstd_frame_header *header, const void *src,
98*e0c1b49fSNick Terrell 	size_t src_size)
99*e0c1b49fSNick Terrell {
100*e0c1b49fSNick Terrell 	return ZSTD_getFrameHeader(header, src, src_size);
101*e0c1b49fSNick Terrell }
102*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_get_frame_header);
103*e0c1b49fSNick Terrell 
104*e0c1b49fSNick Terrell MODULE_LICENSE("Dual BSD/GPL");
105*e0c1b49fSNick Terrell MODULE_DESCRIPTION("Zstd Decompressor");
106