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#include "common/zstd_internal.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define ZSTD_FORWARD_IF_ERR(ret) \ 2162306a36Sopenharmony_ci do { \ 2262306a36Sopenharmony_ci size_t const __ret = (ret); \ 2362306a36Sopenharmony_ci if (ZSTD_isError(__ret)) \ 2462306a36Sopenharmony_ci return __ret; \ 2562306a36Sopenharmony_ci } while (0) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters, 2862306a36Sopenharmony_ci unsigned long long pledged_src_size) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset( 3162306a36Sopenharmony_ci cctx, ZSTD_reset_session_and_parameters)); 3262306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize( 3362306a36Sopenharmony_ci cctx, pledged_src_size)); 3462306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 3562306a36Sopenharmony_ci cctx, ZSTD_c_windowLog, parameters->cParams.windowLog)); 3662306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 3762306a36Sopenharmony_ci cctx, ZSTD_c_hashLog, parameters->cParams.hashLog)); 3862306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 3962306a36Sopenharmony_ci cctx, ZSTD_c_chainLog, parameters->cParams.chainLog)); 4062306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 4162306a36Sopenharmony_ci cctx, ZSTD_c_searchLog, parameters->cParams.searchLog)); 4262306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 4362306a36Sopenharmony_ci cctx, ZSTD_c_minMatch, parameters->cParams.minMatch)); 4462306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 4562306a36Sopenharmony_ci cctx, ZSTD_c_targetLength, parameters->cParams.targetLength)); 4662306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 4762306a36Sopenharmony_ci cctx, ZSTD_c_strategy, parameters->cParams.strategy)); 4862306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 4962306a36Sopenharmony_ci cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag)); 5062306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 5162306a36Sopenharmony_ci cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag)); 5262306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 5362306a36Sopenharmony_ci cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag)); 5462306a36Sopenharmony_ci return 0; 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciint zstd_min_clevel(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci return ZSTD_minCLevel(); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_min_clevel); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciint zstd_max_clevel(void) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci return ZSTD_maxCLevel(); 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_max_clevel); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cisize_t zstd_compress_bound(size_t src_size) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci return ZSTD_compressBound(src_size); 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_compress_bound); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cizstd_parameters zstd_get_params(int level, 7662306a36Sopenharmony_ci unsigned long long estimated_src_size) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci return ZSTD_getParams(level, estimated_src_size, 0); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_get_params); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cisize_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci return ZSTD_estimateCCtxSize_usingCParams(*cparams); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_cctx_workspace_bound); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cizstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci if (workspace == NULL) 9162306a36Sopenharmony_ci return NULL; 9262306a36Sopenharmony_ci return ZSTD_initStaticCCtx(workspace, workspace_size); 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_init_cctx); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cisize_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, 9762306a36Sopenharmony_ci const void *src, size_t src_size, const zstd_parameters *parameters) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size)); 10062306a36Sopenharmony_ci return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_compress_cctx); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cisize_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci return ZSTD_estimateCStreamSize_usingCParams(*cparams); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_cstream_workspace_bound); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cizstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, 11162306a36Sopenharmony_ci unsigned long long pledged_src_size, void *workspace, size_t workspace_size) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci zstd_cstream *cstream; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci if (workspace == NULL) 11662306a36Sopenharmony_ci return NULL; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci cstream = ZSTD_initStaticCStream(workspace, workspace_size); 11962306a36Sopenharmony_ci if (cstream == NULL) 12062306a36Sopenharmony_ci return NULL; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* 0 means unknown in linux zstd API but means 0 in new zstd API */ 12362306a36Sopenharmony_ci if (pledged_src_size == 0) 12462306a36Sopenharmony_ci pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size))) 12762306a36Sopenharmony_ci return NULL; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci return cstream; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_init_cstream); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cisize_t zstd_reset_cstream(zstd_cstream *cstream, 13462306a36Sopenharmony_ci unsigned long long pledged_src_size) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci if (pledged_src_size == 0) 13762306a36Sopenharmony_ci pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; 13862306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_reset(cstream, ZSTD_reset_session_only) ); 13962306a36Sopenharmony_ci ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_setPledgedSrcSize(cstream, pledged_src_size) ); 14062306a36Sopenharmony_ci return 0; 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_reset_cstream); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cisize_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output, 14562306a36Sopenharmony_ci zstd_in_buffer *input) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci return ZSTD_compressStream(cstream, output, input); 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_compress_stream); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cisize_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci return ZSTD_flushStream(cstream, output); 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_flush_stream); 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cisize_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci return ZSTD_endStream(cstream, output); 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ciEXPORT_SYMBOL(zstd_end_stream); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 16462306a36Sopenharmony_ciMODULE_DESCRIPTION("Zstd Compressor"); 165