162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) Facebook, Inc. 462306a36Sopenharmony_ci * All rights reserved. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This source code is licensed under both the BSD-style license (found in the 762306a36Sopenharmony_ci * LICENSE file in the root directory of this source tree) and the GPLv2 (found 862306a36Sopenharmony_ci * in the COPYING file in the root directory of this source tree). 962306a36Sopenharmony_ci * You may select, at your option, one of the above-listed licenses. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/kernel.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci#include <linux/string.h> 1562306a36Sopenharmony_ci#include <linux/zstd.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include "common/zstd_deps.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* Common symbols. zstd_compress must depend on zstd_decompress. */ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciunsigned int zstd_is_error(size_t code) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci return ZSTD_isError(code); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_is_error); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cizstd_error_code zstd_get_error_code(size_t code) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci return ZSTD_getErrorCode(code); 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_get_error_code); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciconst char *zstd_get_error_name(size_t code) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci return ZSTD_getErrorName(code); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_get_error_name); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* Decompression symbols. */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cisize_t zstd_dctx_workspace_bound(void) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci return ZSTD_estimateDCtxSize(); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_dctx_workspace_bound); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cizstd_dctx *zstd_init_dctx(void *workspace, size_t workspace_size) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci if (workspace == NULL) 5062306a36Sopenharmony_ci return NULL; 5162306a36Sopenharmony_ci return ZSTD_initStaticDCtx(workspace, workspace_size); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_init_dctx); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cisize_t zstd_decompress_dctx(zstd_dctx *dctx, void *dst, size_t dst_capacity, 5662306a36Sopenharmony_ci const void *src, size_t src_size) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci return ZSTD_decompressDCtx(dctx, dst, dst_capacity, src, src_size); 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_decompress_dctx); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cisize_t zstd_dstream_workspace_bound(size_t max_window_size) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci return ZSTD_estimateDStreamSize(max_window_size); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_dstream_workspace_bound); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cizstd_dstream *zstd_init_dstream(size_t max_window_size, void *workspace, 6962306a36Sopenharmony_ci size_t workspace_size) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci if (workspace == NULL) 7262306a36Sopenharmony_ci return NULL; 7362306a36Sopenharmony_ci (void)max_window_size; 7462306a36Sopenharmony_ci return ZSTD_initStaticDStream(workspace, workspace_size); 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_init_dstream); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cisize_t zstd_reset_dstream(zstd_dstream *dstream) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci return ZSTD_resetDStream(dstream); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_reset_dstream); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cisize_t zstd_decompress_stream(zstd_dstream *dstream, zstd_out_buffer *output, 8562306a36Sopenharmony_ci zstd_in_buffer *input) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci return ZSTD_decompressStream(dstream, output, input); 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_decompress_stream); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cisize_t zstd_find_frame_compressed_size(const void *src, size_t src_size) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci return ZSTD_findFrameCompressedSize(src, src_size); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_find_frame_compressed_size); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cisize_t zstd_get_frame_header(zstd_frame_header *header, const void *src, 9862306a36Sopenharmony_ci size_t src_size) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci return ZSTD_getFrameHeader(header, src, src_size); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_get_frame_header); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 10562306a36Sopenharmony_ciMODULE_DESCRIPTION("Zstd Decompressor"); 106