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