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 #include "common/zstd_internal.h" 19*e0c1b49fSNick Terrell 20*e0c1b49fSNick Terrell #define ZSTD_FORWARD_IF_ERR(ret) \ 21*e0c1b49fSNick Terrell do { \ 22*e0c1b49fSNick Terrell size_t const __ret = (ret); \ 23*e0c1b49fSNick Terrell if (ZSTD_isError(__ret)) \ 24*e0c1b49fSNick Terrell return __ret; \ 25*e0c1b49fSNick Terrell } while (0) 26*e0c1b49fSNick Terrell 27*e0c1b49fSNick Terrell static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters, 28*e0c1b49fSNick Terrell unsigned long long pledged_src_size) 29*e0c1b49fSNick Terrell { 30*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset( 31*e0c1b49fSNick Terrell cctx, ZSTD_reset_session_and_parameters)); 32*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize( 33*e0c1b49fSNick Terrell cctx, pledged_src_size)); 34*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 35*e0c1b49fSNick Terrell cctx, ZSTD_c_windowLog, parameters->cParams.windowLog)); 36*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 37*e0c1b49fSNick Terrell cctx, ZSTD_c_hashLog, parameters->cParams.hashLog)); 38*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 39*e0c1b49fSNick Terrell cctx, ZSTD_c_chainLog, parameters->cParams.chainLog)); 40*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 41*e0c1b49fSNick Terrell cctx, ZSTD_c_searchLog, parameters->cParams.searchLog)); 42*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 43*e0c1b49fSNick Terrell cctx, ZSTD_c_minMatch, parameters->cParams.minMatch)); 44*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 45*e0c1b49fSNick Terrell cctx, ZSTD_c_targetLength, parameters->cParams.targetLength)); 46*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 47*e0c1b49fSNick Terrell cctx, ZSTD_c_strategy, parameters->cParams.strategy)); 48*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 49*e0c1b49fSNick Terrell cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag)); 50*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 51*e0c1b49fSNick Terrell cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag)); 52*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 53*e0c1b49fSNick Terrell cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag)); 54*e0c1b49fSNick Terrell return 0; 55*e0c1b49fSNick Terrell } 56*e0c1b49fSNick Terrell 57*e0c1b49fSNick Terrell int zstd_min_clevel(void) 58*e0c1b49fSNick Terrell { 59*e0c1b49fSNick Terrell return ZSTD_minCLevel(); 60*e0c1b49fSNick Terrell } 61*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_min_clevel); 62*e0c1b49fSNick Terrell 63*e0c1b49fSNick Terrell int zstd_max_clevel(void) 64*e0c1b49fSNick Terrell { 65*e0c1b49fSNick Terrell return ZSTD_maxCLevel(); 66*e0c1b49fSNick Terrell } 67*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_max_clevel); 68*e0c1b49fSNick Terrell 69*e0c1b49fSNick Terrell size_t zstd_compress_bound(size_t src_size) 70*e0c1b49fSNick Terrell { 71*e0c1b49fSNick Terrell return ZSTD_compressBound(src_size); 72*e0c1b49fSNick Terrell } 73*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_bound); 74*e0c1b49fSNick Terrell 75*e0c1b49fSNick Terrell zstd_parameters zstd_get_params(int level, 76*e0c1b49fSNick Terrell unsigned long long estimated_src_size) 77*e0c1b49fSNick Terrell { 78*e0c1b49fSNick Terrell return ZSTD_getParams(level, estimated_src_size, 0); 79*e0c1b49fSNick Terrell } 80*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_get_params); 81*e0c1b49fSNick Terrell 82*e0c1b49fSNick Terrell size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams) 83*e0c1b49fSNick Terrell { 84*e0c1b49fSNick Terrell return ZSTD_estimateCCtxSize_usingCParams(*cparams); 85*e0c1b49fSNick Terrell } 86*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_cctx_workspace_bound); 87*e0c1b49fSNick Terrell 88*e0c1b49fSNick Terrell zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size) 89*e0c1b49fSNick Terrell { 90*e0c1b49fSNick Terrell if (workspace == NULL) 91*e0c1b49fSNick Terrell return NULL; 92*e0c1b49fSNick Terrell return ZSTD_initStaticCCtx(workspace, workspace_size); 93*e0c1b49fSNick Terrell } 94*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_cctx); 95*e0c1b49fSNick Terrell 96*e0c1b49fSNick Terrell size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, 97*e0c1b49fSNick Terrell const void *src, size_t src_size, const zstd_parameters *parameters) 98*e0c1b49fSNick Terrell { 99*e0c1b49fSNick Terrell ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size)); 100*e0c1b49fSNick Terrell return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size); 101*e0c1b49fSNick Terrell } 102*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_cctx); 103*e0c1b49fSNick Terrell 104*e0c1b49fSNick Terrell size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams) 105*e0c1b49fSNick Terrell { 106*e0c1b49fSNick Terrell return ZSTD_estimateCStreamSize_usingCParams(*cparams); 107*e0c1b49fSNick Terrell } 108*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_cstream_workspace_bound); 109*e0c1b49fSNick Terrell 110*e0c1b49fSNick Terrell zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, 111*e0c1b49fSNick Terrell unsigned long long pledged_src_size, void *workspace, size_t workspace_size) 112*e0c1b49fSNick Terrell { 113*e0c1b49fSNick Terrell zstd_cstream *cstream; 114*e0c1b49fSNick Terrell 115*e0c1b49fSNick Terrell if (workspace == NULL) 116*e0c1b49fSNick Terrell return NULL; 117*e0c1b49fSNick Terrell 118*e0c1b49fSNick Terrell cstream = ZSTD_initStaticCStream(workspace, workspace_size); 119*e0c1b49fSNick Terrell if (cstream == NULL) 120*e0c1b49fSNick Terrell return NULL; 121*e0c1b49fSNick Terrell 122*e0c1b49fSNick Terrell /* 0 means unknown in linux zstd API but means 0 in new zstd API */ 123*e0c1b49fSNick Terrell if (pledged_src_size == 0) 124*e0c1b49fSNick Terrell pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; 125*e0c1b49fSNick Terrell 126*e0c1b49fSNick Terrell if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size))) 127*e0c1b49fSNick Terrell return NULL; 128*e0c1b49fSNick Terrell 129*e0c1b49fSNick Terrell return cstream; 130*e0c1b49fSNick Terrell } 131*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_init_cstream); 132*e0c1b49fSNick Terrell 133*e0c1b49fSNick Terrell size_t zstd_reset_cstream(zstd_cstream *cstream, 134*e0c1b49fSNick Terrell unsigned long long pledged_src_size) 135*e0c1b49fSNick Terrell { 136*e0c1b49fSNick Terrell return ZSTD_resetCStream(cstream, pledged_src_size); 137*e0c1b49fSNick Terrell } 138*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_reset_cstream); 139*e0c1b49fSNick Terrell 140*e0c1b49fSNick Terrell size_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output, 141*e0c1b49fSNick Terrell zstd_in_buffer *input) 142*e0c1b49fSNick Terrell { 143*e0c1b49fSNick Terrell return ZSTD_compressStream(cstream, output, input); 144*e0c1b49fSNick Terrell } 145*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_compress_stream); 146*e0c1b49fSNick Terrell 147*e0c1b49fSNick Terrell size_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output) 148*e0c1b49fSNick Terrell { 149*e0c1b49fSNick Terrell return ZSTD_flushStream(cstream, output); 150*e0c1b49fSNick Terrell } 151*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_flush_stream); 152*e0c1b49fSNick Terrell 153*e0c1b49fSNick Terrell size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output) 154*e0c1b49fSNick Terrell { 155*e0c1b49fSNick Terrell return ZSTD_endStream(cstream, output); 156*e0c1b49fSNick Terrell } 157*e0c1b49fSNick Terrell EXPORT_SYMBOL(zstd_end_stream); 158*e0c1b49fSNick Terrell 159*e0c1b49fSNick Terrell MODULE_LICENSE("Dual BSD/GPL"); 160*e0c1b49fSNick Terrell MODULE_DESCRIPTION("Zstd Compressor"); 161