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