178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */ 278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */ 378ee8d1cSJulian Grajkowski /** 478ee8d1cSJulian Grajkowski ***************************************************************************** 578ee8d1cSJulian Grajkowski * @file dc_session.c 678ee8d1cSJulian Grajkowski * 778ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 878ee8d1cSJulian Grajkowski * 978ee8d1cSJulian Grajkowski * @description 1078ee8d1cSJulian Grajkowski * Implementation of the Data Compression session operations. 1178ee8d1cSJulian Grajkowski * 1278ee8d1cSJulian Grajkowski *****************************************************************************/ 1378ee8d1cSJulian Grajkowski 1478ee8d1cSJulian Grajkowski /* 1578ee8d1cSJulian Grajkowski ******************************************************************************* 1678ee8d1cSJulian Grajkowski * Include public/global header files 1778ee8d1cSJulian Grajkowski ******************************************************************************* 1878ee8d1cSJulian Grajkowski */ 1978ee8d1cSJulian Grajkowski #include "cpa.h" 2078ee8d1cSJulian Grajkowski #include "cpa_dc.h" 2178ee8d1cSJulian Grajkowski 2278ee8d1cSJulian Grajkowski #include "icp_qat_fw.h" 2378ee8d1cSJulian Grajkowski #include "icp_qat_fw_comp.h" 2478ee8d1cSJulian Grajkowski #include "icp_qat_hw.h" 25a977168cSMichal Gulbicki #include "icp_qat_hw_20_comp.h" 2678ee8d1cSJulian Grajkowski 2778ee8d1cSJulian Grajkowski /* 2878ee8d1cSJulian Grajkowski ******************************************************************************* 2978ee8d1cSJulian Grajkowski * Include private header files 3078ee8d1cSJulian Grajkowski ******************************************************************************* 3178ee8d1cSJulian Grajkowski */ 3278ee8d1cSJulian Grajkowski #include "dc_session.h" 3378ee8d1cSJulian Grajkowski #include "dc_datapath.h" 3478ee8d1cSJulian Grajkowski #include "lac_mem_pools.h" 3578ee8d1cSJulian Grajkowski #include "sal_types_compression.h" 3678ee8d1cSJulian Grajkowski #include "lac_buffer_desc.h" 3778ee8d1cSJulian Grajkowski #include "sal_service_state.h" 3878ee8d1cSJulian Grajkowski #include "sal_qat_cmn_msg.h" 39a977168cSMichal Gulbicki #include "sal_hw_gen.h" 4078ee8d1cSJulian Grajkowski 4178ee8d1cSJulian Grajkowski /** 4278ee8d1cSJulian Grajkowski ***************************************************************************** 4378ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 4478ee8d1cSJulian Grajkowski * Check that pSessionData is valid 4578ee8d1cSJulian Grajkowski * 4678ee8d1cSJulian Grajkowski * @description 4778ee8d1cSJulian Grajkowski * Check that all the parameters defined in the pSessionData are valid 4878ee8d1cSJulian Grajkowski * 4978ee8d1cSJulian Grajkowski * @param[in] pSessionData Pointer to a user instantiated structure 5078ee8d1cSJulian Grajkowski * containing session data 5178ee8d1cSJulian Grajkowski * 5278ee8d1cSJulian Grajkowski * @retval CPA_STATUS_SUCCESS Function executed successfully 5378ee8d1cSJulian Grajkowski * @retval CPA_STATUS_FAIL Function failed to find device 5478ee8d1cSJulian Grajkowski * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in 5578ee8d1cSJulian Grajkowski * @retval CPA_STATUS_UNSUPPORTED Unsupported algorithm/feature 5678ee8d1cSJulian Grajkowski * 5778ee8d1cSJulian Grajkowski *****************************************************************************/ 58a977168cSMichal Gulbicki CpaStatus 5978ee8d1cSJulian Grajkowski dcCheckSessionData(const CpaDcSessionSetupData *pSessionData, 6078ee8d1cSJulian Grajkowski CpaInstanceHandle dcInstance) 6178ee8d1cSJulian Grajkowski { 6278ee8d1cSJulian Grajkowski CpaDcInstanceCapabilities instanceCapabilities = { 0 }; 6378ee8d1cSJulian Grajkowski 6478ee8d1cSJulian Grajkowski cpaDcQueryCapabilities(dcInstance, &instanceCapabilities); 6578ee8d1cSJulian Grajkowski 6678ee8d1cSJulian Grajkowski if ((pSessionData->compLevel < CPA_DC_L1) || 67266b0663SKrzysztof Zdziarski (pSessionData->compLevel > CPA_DC_L12)) { 6878ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid compLevel value\n"); 6978ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 7078ee8d1cSJulian Grajkowski } 71a977168cSMichal Gulbicki 7278ee8d1cSJulian Grajkowski if ((pSessionData->autoSelectBestHuffmanTree < CPA_DC_ASB_DISABLED) || 73266b0663SKrzysztof Zdziarski (pSessionData->autoSelectBestHuffmanTree > CPA_DC_ASB_ENABLED)) { 7478ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid autoSelectBestHuffmanTree value\n"); 7578ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 7678ee8d1cSJulian Grajkowski } 7778ee8d1cSJulian Grajkowski if (pSessionData->compType != CPA_DC_DEFLATE) { 7878ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid compType value\n"); 7978ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 8078ee8d1cSJulian Grajkowski } 8178ee8d1cSJulian Grajkowski 8278ee8d1cSJulian Grajkowski if ((pSessionData->huffType < CPA_DC_HT_STATIC) || 8378ee8d1cSJulian Grajkowski (pSessionData->huffType > CPA_DC_HT_FULL_DYNAMIC) || 8478ee8d1cSJulian Grajkowski (CPA_DC_HT_PRECOMP == pSessionData->huffType)) { 8578ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid huffType value\n"); 8678ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 8778ee8d1cSJulian Grajkowski } 8878ee8d1cSJulian Grajkowski 8978ee8d1cSJulian Grajkowski if ((pSessionData->sessDirection < CPA_DC_DIR_COMPRESS) || 9078ee8d1cSJulian Grajkowski (pSessionData->sessDirection > CPA_DC_DIR_COMBINED)) { 9178ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid sessDirection value\n"); 9278ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 9378ee8d1cSJulian Grajkowski } 9478ee8d1cSJulian Grajkowski 9578ee8d1cSJulian Grajkowski if ((pSessionData->sessState < CPA_DC_STATEFUL) || 9678ee8d1cSJulian Grajkowski (pSessionData->sessState > CPA_DC_STATELESS)) { 9778ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid sessState value\n"); 9878ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 9978ee8d1cSJulian Grajkowski } 10078ee8d1cSJulian Grajkowski 10178ee8d1cSJulian Grajkowski if ((pSessionData->checksum < CPA_DC_NONE) || 10278ee8d1cSJulian Grajkowski (pSessionData->checksum > CPA_DC_ADLER32)) { 10378ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid checksum value\n"); 10478ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 10578ee8d1cSJulian Grajkowski } 10678ee8d1cSJulian Grajkowski 10778ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS; 10878ee8d1cSJulian Grajkowski } 10978ee8d1cSJulian Grajkowski 11078ee8d1cSJulian Grajkowski /** 11178ee8d1cSJulian Grajkowski ***************************************************************************** 11278ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 11378ee8d1cSJulian Grajkowski * Populate the compression hardware block 11478ee8d1cSJulian Grajkowski * 11578ee8d1cSJulian Grajkowski * @description 11678ee8d1cSJulian Grajkowski * This function will populate the compression hardware block and update 11778ee8d1cSJulian Grajkowski * the size in bytes of the block 11878ee8d1cSJulian Grajkowski * 11978ee8d1cSJulian Grajkowski * @param[in] pSessionDesc Pointer to the session descriptor 12078ee8d1cSJulian Grajkowski * @param[in] pCompConfig Pointer to slice config word 12178ee8d1cSJulian Grajkowski * @param[in] compDecomp Direction of the operation 12278ee8d1cSJulian Grajkowski * @param[in] enableDmm Delayed Match Mode 12378ee8d1cSJulian Grajkowski * 12478ee8d1cSJulian Grajkowski *****************************************************************************/ 12578ee8d1cSJulian Grajkowski static void 126a977168cSMichal Gulbicki dcCompHwBlockPopulate(sal_compression_service_t *pService, 127a977168cSMichal Gulbicki dc_session_desc_t *pSessionDesc, 12878ee8d1cSJulian Grajkowski icp_qat_hw_compression_config_t *pCompConfig, 129a977168cSMichal Gulbicki dc_request_dir_t compDecomp) 13078ee8d1cSJulian Grajkowski { 13178ee8d1cSJulian Grajkowski icp_qat_hw_compression_direction_t dir = 13278ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DIR_COMPRESS; 13378ee8d1cSJulian Grajkowski icp_qat_hw_compression_algo_t algo = 13478ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_ALGO_DEFLATE; 13578ee8d1cSJulian Grajkowski icp_qat_hw_compression_depth_t depth = ICP_QAT_HW_COMPRESSION_DEPTH_1; 13678ee8d1cSJulian Grajkowski icp_qat_hw_compression_file_type_t filetype = 13778ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_FILE_TYPE_0; 138a977168cSMichal Gulbicki icp_qat_hw_compression_delayed_match_t dmm; 13978ee8d1cSJulian Grajkowski 14078ee8d1cSJulian Grajkowski /* Set the direction */ 14178ee8d1cSJulian Grajkowski if (DC_COMPRESSION_REQUEST == compDecomp) { 14278ee8d1cSJulian Grajkowski dir = ICP_QAT_HW_COMPRESSION_DIR_COMPRESS; 14378ee8d1cSJulian Grajkowski } else { 14478ee8d1cSJulian Grajkowski dir = ICP_QAT_HW_COMPRESSION_DIR_DECOMPRESS; 14578ee8d1cSJulian Grajkowski } 14678ee8d1cSJulian Grajkowski 14778ee8d1cSJulian Grajkowski if (CPA_DC_DEFLATE == pSessionDesc->compType) { 14878ee8d1cSJulian Grajkowski algo = ICP_QAT_HW_COMPRESSION_ALGO_DEFLATE; 14978ee8d1cSJulian Grajkowski } else { 15078ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Algorithm not supported for Compression\n"); 15178ee8d1cSJulian Grajkowski } 15278ee8d1cSJulian Grajkowski 153a977168cSMichal Gulbicki /* Set delay match mode */ 154*357378bbSDimitry Andric if (ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED == 155*357378bbSDimitry Andric pService->comp_device_data.enableDmm) { 156a977168cSMichal Gulbicki dmm = ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED; 157a977168cSMichal Gulbicki } else { 158a977168cSMichal Gulbicki dmm = ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_DISABLED; 159a977168cSMichal Gulbicki } 160a977168cSMichal Gulbicki 16178ee8d1cSJulian Grajkowski /* Set the depth */ 16278ee8d1cSJulian Grajkowski if (DC_DECOMPRESSION_REQUEST == compDecomp) { 16378ee8d1cSJulian Grajkowski depth = ICP_QAT_HW_COMPRESSION_DEPTH_1; 16478ee8d1cSJulian Grajkowski } else { 16578ee8d1cSJulian Grajkowski switch (pSessionDesc->compLevel) { 16678ee8d1cSJulian Grajkowski case CPA_DC_L1: 16778ee8d1cSJulian Grajkowski depth = ICP_QAT_HW_COMPRESSION_DEPTH_1; 16878ee8d1cSJulian Grajkowski break; 16978ee8d1cSJulian Grajkowski case CPA_DC_L2: 17078ee8d1cSJulian Grajkowski depth = ICP_QAT_HW_COMPRESSION_DEPTH_4; 17178ee8d1cSJulian Grajkowski break; 17278ee8d1cSJulian Grajkowski case CPA_DC_L3: 17378ee8d1cSJulian Grajkowski depth = ICP_QAT_HW_COMPRESSION_DEPTH_8; 17478ee8d1cSJulian Grajkowski break; 175a977168cSMichal Gulbicki case CPA_DC_L4: 17678ee8d1cSJulian Grajkowski depth = ICP_QAT_HW_COMPRESSION_DEPTH_16; 177a977168cSMichal Gulbicki break; 178a977168cSMichal Gulbicki default: 179a977168cSMichal Gulbicki depth = pService->comp_device_data 180a977168cSMichal Gulbicki .highestHwCompressionDepth; 181a977168cSMichal Gulbicki break; 18278ee8d1cSJulian Grajkowski } 18378ee8d1cSJulian Grajkowski } 18478ee8d1cSJulian Grajkowski 18578ee8d1cSJulian Grajkowski /* The file type is set to ICP_QAT_HW_COMPRESSION_FILE_TYPE_0. The other 18678ee8d1cSJulian Grajkowski * modes will be used in the future for precompiled huffman trees */ 18778ee8d1cSJulian Grajkowski filetype = ICP_QAT_HW_COMPRESSION_FILE_TYPE_0; 18878ee8d1cSJulian Grajkowski 189a977168cSMichal Gulbicki pCompConfig->lower_val = ICP_QAT_HW_COMPRESSION_CONFIG_BUILD( 190a977168cSMichal Gulbicki dir, dmm, algo, depth, filetype); 19178ee8d1cSJulian Grajkowski 192a977168cSMichal Gulbicki /* Upper 32-bits of the configuration word do not need to be 193a977168cSMichal Gulbicki * configured with legacy devices. 194a977168cSMichal Gulbicki */ 195a977168cSMichal Gulbicki pCompConfig->upper_val = 0; 196a977168cSMichal Gulbicki } 197a977168cSMichal Gulbicki 198a977168cSMichal Gulbicki static void 199a977168cSMichal Gulbicki dcCompHwBlockPopulateGen4(sal_compression_service_t *pService, 200a977168cSMichal Gulbicki dc_session_desc_t *pSessionDesc, 201a977168cSMichal Gulbicki icp_qat_hw_compression_config_t *pCompConfig, 202a977168cSMichal Gulbicki dc_request_dir_t compDecomp) 203a977168cSMichal Gulbicki { 204a977168cSMichal Gulbicki /* Compression related */ 205a977168cSMichal Gulbicki if (DC_COMPRESSION_REQUEST == compDecomp) { 206a977168cSMichal Gulbicki icp_qat_hw_comp_20_config_csr_upper_t hw_comp_upper_csr; 207a977168cSMichal Gulbicki icp_qat_hw_comp_20_config_csr_lower_t hw_comp_lower_csr; 208a977168cSMichal Gulbicki 209a977168cSMichal Gulbicki memset(&hw_comp_upper_csr, 0, sizeof hw_comp_upper_csr); 210a977168cSMichal Gulbicki memset(&hw_comp_lower_csr, 0, sizeof hw_comp_lower_csr); 211a977168cSMichal Gulbicki 212a977168cSMichal Gulbicki /* Disable Literal + Length Limit Block Drop by default and 213a977168cSMichal Gulbicki * enable it only for dynamic deflate compression. 214a977168cSMichal Gulbicki */ 215a977168cSMichal Gulbicki hw_comp_lower_csr.lllbd = 216a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_LLLBD_CTRL_LLLBD_DISABLED; 217a977168cSMichal Gulbicki 218a977168cSMichal Gulbicki switch (pSessionDesc->compType) { 219a977168cSMichal Gulbicki case CPA_DC_DEFLATE: 220a977168cSMichal Gulbicki /* DEFLATE algorithm settings */ 221a977168cSMichal Gulbicki hw_comp_lower_csr.skip_ctrl = 222a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_BYTE_SKIP_3BYTE_LITERAL; 223a977168cSMichal Gulbicki 224a977168cSMichal Gulbicki if (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType) { 225a977168cSMichal Gulbicki hw_comp_lower_csr.algo = 226a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_HW_COMP_FORMAT_ILZ77; 227a977168cSMichal Gulbicki } else /* Static DEFLATE */ 228a977168cSMichal Gulbicki { 229a977168cSMichal Gulbicki hw_comp_lower_csr.algo = 230a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_HW_COMP_FORMAT_DEFLATE; 231a977168cSMichal Gulbicki hw_comp_upper_csr.scb_ctrl = 232a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SCB_CONTROL_DISABLE; 233a977168cSMichal Gulbicki } 234a977168cSMichal Gulbicki 235a977168cSMichal Gulbicki if (CPA_DC_STATEFUL == pSessionDesc->sessState) { 236a977168cSMichal Gulbicki hw_comp_upper_csr.som_ctrl = 237a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SOM_CONTROL_REPLAY_MODE; 238a977168cSMichal Gulbicki } 239a977168cSMichal Gulbicki break; 240a977168cSMichal Gulbicki default: 241a977168cSMichal Gulbicki QAT_UTILS_LOG("Compression algorithm not supported\n"); 242a977168cSMichal Gulbicki break; 243a977168cSMichal Gulbicki } 244a977168cSMichal Gulbicki /* Set the search depth */ 245a977168cSMichal Gulbicki switch (pSessionDesc->compLevel) { 246a977168cSMichal Gulbicki case CPA_DC_L1: 247a977168cSMichal Gulbicki case CPA_DC_L2: 248a977168cSMichal Gulbicki case CPA_DC_L3: 249a977168cSMichal Gulbicki case CPA_DC_L4: 250a977168cSMichal Gulbicki case CPA_DC_L5: 251a977168cSMichal Gulbicki hw_comp_lower_csr.sd = 252a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_1; 253a977168cSMichal Gulbicki hw_comp_lower_csr.hash_col = 254a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SKIP_HASH_COLLISION_DONT_ALLOW; 255a977168cSMichal Gulbicki break; 256a977168cSMichal Gulbicki case CPA_DC_L6: 257a977168cSMichal Gulbicki case CPA_DC_L7: 258a977168cSMichal Gulbicki case CPA_DC_L8: 259a977168cSMichal Gulbicki hw_comp_lower_csr.sd = 260a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_6; 261a977168cSMichal Gulbicki break; 262a977168cSMichal Gulbicki case CPA_DC_L9: 263a977168cSMichal Gulbicki hw_comp_lower_csr.sd = 264a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_9; 265a977168cSMichal Gulbicki break; 266a977168cSMichal Gulbicki default: 267a977168cSMichal Gulbicki hw_comp_lower_csr.sd = pService->comp_device_data 268a977168cSMichal Gulbicki .highestHwCompressionDepth; 269a977168cSMichal Gulbicki if ((CPA_DC_HT_FULL_DYNAMIC == 270a977168cSMichal Gulbicki pSessionDesc->huffType) && 271a977168cSMichal Gulbicki (CPA_DC_DEFLATE == pSessionDesc->compType)) { 272a977168cSMichal Gulbicki /* Enable Literal + Length Limit Block Drop 273a977168cSMichal Gulbicki * with dynamic deflate compression when 274a977168cSMichal Gulbicki * highest compression levels are selected. 275a977168cSMichal Gulbicki */ 276a977168cSMichal Gulbicki hw_comp_lower_csr.lllbd = 277a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_LLLBD_CTRL_LLLBD_ENABLED; 278a977168cSMichal Gulbicki } 279a977168cSMichal Gulbicki break; 280a977168cSMichal Gulbicki } 281a977168cSMichal Gulbicki /* Same for all algorithms */ 282a977168cSMichal Gulbicki hw_comp_lower_csr.abd = ICP_QAT_HW_COMP_20_ABD_ABD_DISABLED; 283a977168cSMichal Gulbicki hw_comp_lower_csr.hash_update = 284a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SKIP_HASH_UPDATE_DONT_ALLOW; 285a977168cSMichal Gulbicki hw_comp_lower_csr.edmm = 286*357378bbSDimitry Andric (ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED == 287*357378bbSDimitry Andric pService->comp_device_data.enableDmm) ? 288a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_EXTENDED_DELAY_MATCH_MODE_EDMM_ENABLED : 289a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_EXTENDED_DELAY_MATCH_MODE_EDMM_DISABLED; 290a977168cSMichal Gulbicki 291a977168cSMichal Gulbicki /* Hard-coded HW-specific values */ 292a977168cSMichal Gulbicki hw_comp_upper_csr.nice = 293a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_CONFIG_CSR_NICE_PARAM_DEFAULT_VAL; 294a977168cSMichal Gulbicki hw_comp_upper_csr.lazy = 295a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_CONFIG_CSR_LAZY_PARAM_DEFAULT_VAL; 296a977168cSMichal Gulbicki 297a977168cSMichal Gulbicki pCompConfig->upper_val = 298a977168cSMichal Gulbicki ICP_QAT_FW_COMP_20_BUILD_CONFIG_UPPER(hw_comp_upper_csr); 299a977168cSMichal Gulbicki 300a977168cSMichal Gulbicki pCompConfig->lower_val = 301a977168cSMichal Gulbicki ICP_QAT_FW_COMP_20_BUILD_CONFIG_LOWER(hw_comp_lower_csr); 302a977168cSMichal Gulbicki } else /* Decompress */ 303a977168cSMichal Gulbicki { 304a977168cSMichal Gulbicki icp_qat_hw_decomp_20_config_csr_lower_t hw_decomp_lower_csr; 305a977168cSMichal Gulbicki 306a977168cSMichal Gulbicki memset(&hw_decomp_lower_csr, 0, sizeof hw_decomp_lower_csr); 307a977168cSMichal Gulbicki 308a977168cSMichal Gulbicki /* Set the algorithm */ 309a977168cSMichal Gulbicki if (CPA_DC_DEFLATE == pSessionDesc->compType) { 310a977168cSMichal Gulbicki hw_decomp_lower_csr.algo = 311a977168cSMichal Gulbicki ICP_QAT_HW_DECOMP_20_HW_DECOMP_FORMAT_DEFLATE; 312a977168cSMichal Gulbicki } else { 313a977168cSMichal Gulbicki QAT_UTILS_LOG("Algorithm not supported for " 314a977168cSMichal Gulbicki "Decompression\n"); 315a977168cSMichal Gulbicki } 316a977168cSMichal Gulbicki 317a977168cSMichal Gulbicki pCompConfig->upper_val = 0; 318a977168cSMichal Gulbicki pCompConfig->lower_val = 319a977168cSMichal Gulbicki ICP_QAT_FW_DECOMP_20_BUILD_CONFIG_LOWER( 320a977168cSMichal Gulbicki hw_decomp_lower_csr); 321a977168cSMichal Gulbicki } 32278ee8d1cSJulian Grajkowski } 32378ee8d1cSJulian Grajkowski 32478ee8d1cSJulian Grajkowski /** 32578ee8d1cSJulian Grajkowski ***************************************************************************** 32678ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 32778ee8d1cSJulian Grajkowski * Populate the compression content descriptor 32878ee8d1cSJulian Grajkowski * 32978ee8d1cSJulian Grajkowski * @description 33078ee8d1cSJulian Grajkowski * This function will populate the compression content descriptor 33178ee8d1cSJulian Grajkowski * 33278ee8d1cSJulian Grajkowski * @param[in] pService Pointer to the service 33378ee8d1cSJulian Grajkowski * @param[in] pSessionDesc Pointer to the session descriptor 33478ee8d1cSJulian Grajkowski * @param[in] contextBufferAddrPhys Physical address of the context buffer 33578ee8d1cSJulian Grajkowski * @param[out] pMsg Pointer to the compression message 33678ee8d1cSJulian Grajkowski * @param[in] nextSlice Next slice 33778ee8d1cSJulian Grajkowski * @param[in] compDecomp Direction of the operation 33878ee8d1cSJulian Grajkowski * 33978ee8d1cSJulian Grajkowski *****************************************************************************/ 34078ee8d1cSJulian Grajkowski static void 34178ee8d1cSJulian Grajkowski dcCompContentDescPopulate(sal_compression_service_t *pService, 34278ee8d1cSJulian Grajkowski dc_session_desc_t *pSessionDesc, 34378ee8d1cSJulian Grajkowski CpaPhysicalAddr contextBufferAddrPhys, 34478ee8d1cSJulian Grajkowski icp_qat_fw_comp_req_t *pMsg, 34578ee8d1cSJulian Grajkowski icp_qat_fw_slice_t nextSlice, 34678ee8d1cSJulian Grajkowski dc_request_dir_t compDecomp) 34778ee8d1cSJulian Grajkowski { 34878ee8d1cSJulian Grajkowski 34978ee8d1cSJulian Grajkowski icp_qat_fw_comp_cd_hdr_t *pCompControlBlock = NULL; 35078ee8d1cSJulian Grajkowski icp_qat_hw_compression_config_t *pCompConfig = NULL; 35178ee8d1cSJulian Grajkowski CpaBoolean bankEnabled = CPA_FALSE; 35278ee8d1cSJulian Grajkowski 35378ee8d1cSJulian Grajkowski pCompControlBlock = (icp_qat_fw_comp_cd_hdr_t *)&(pMsg->comp_cd_ctrl); 35478ee8d1cSJulian Grajkowski pCompConfig = 35578ee8d1cSJulian Grajkowski (icp_qat_hw_compression_config_t *)(pMsg->cd_pars.sl 35678ee8d1cSJulian Grajkowski .comp_slice_cfg_word); 35778ee8d1cSJulian Grajkowski 35878ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_NEXT_ID_SET(pCompControlBlock, nextSlice); 35978ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_CURR_ID_SET(pCompControlBlock, ICP_QAT_FW_SLICE_COMP); 36078ee8d1cSJulian Grajkowski 36178ee8d1cSJulian Grajkowski pCompControlBlock->comp_cfg_offset = 0; 36278ee8d1cSJulian Grajkowski 36378ee8d1cSJulian Grajkowski if ((CPA_DC_STATEFUL == pSessionDesc->sessState) && 36478ee8d1cSJulian Grajkowski (CPA_DC_DEFLATE == pSessionDesc->compType) && 36578ee8d1cSJulian Grajkowski (DC_DECOMPRESSION_REQUEST == compDecomp)) { 36678ee8d1cSJulian Grajkowski /* Enable A, B, C, D, and E (CAMs). */ 36778ee8d1cSJulian Grajkowski pCompControlBlock->ram_bank_flags = 36878ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_RAM_FLAGS_BUILD( 36978ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank I */ 37078ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank H */ 37178ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank G */ 37278ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank F */ 37378ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_ENABLED, /* Bank E */ 37478ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_ENABLED, /* Bank D */ 37578ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_ENABLED, /* Bank C */ 37678ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_ENABLED, /* Bank B */ 37778ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_ENABLED); /* Bank A */ 37878ee8d1cSJulian Grajkowski bankEnabled = CPA_TRUE; 37978ee8d1cSJulian Grajkowski } else { 38078ee8d1cSJulian Grajkowski /* Disable all banks */ 38178ee8d1cSJulian Grajkowski pCompControlBlock->ram_bank_flags = 38278ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_RAM_FLAGS_BUILD( 38378ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank I */ 38478ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank H */ 38578ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank G */ 38678ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank F */ 38778ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank E */ 38878ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank D */ 38978ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank C */ 39078ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank B */ 39178ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BANK_DISABLED); /* Bank A */ 39278ee8d1cSJulian Grajkowski } 39378ee8d1cSJulian Grajkowski 39478ee8d1cSJulian Grajkowski if (DC_COMPRESSION_REQUEST == compDecomp) { 39578ee8d1cSJulian Grajkowski LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL( 39678ee8d1cSJulian Grajkowski pService->generic_service_info, 39778ee8d1cSJulian Grajkowski pCompControlBlock->comp_state_addr, 39878ee8d1cSJulian Grajkowski pSessionDesc->stateRegistersComp); 39978ee8d1cSJulian Grajkowski } else { 40078ee8d1cSJulian Grajkowski LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL( 40178ee8d1cSJulian Grajkowski pService->generic_service_info, 40278ee8d1cSJulian Grajkowski pCompControlBlock->comp_state_addr, 40378ee8d1cSJulian Grajkowski pSessionDesc->stateRegistersDecomp); 40478ee8d1cSJulian Grajkowski } 40578ee8d1cSJulian Grajkowski 40678ee8d1cSJulian Grajkowski if (CPA_TRUE == bankEnabled) { 40778ee8d1cSJulian Grajkowski pCompControlBlock->ram_banks_addr = contextBufferAddrPhys; 40878ee8d1cSJulian Grajkowski } else { 40978ee8d1cSJulian Grajkowski pCompControlBlock->ram_banks_addr = 0; 41078ee8d1cSJulian Grajkowski } 41178ee8d1cSJulian Grajkowski 41278ee8d1cSJulian Grajkowski pCompControlBlock->resrvd = 0; 41378ee8d1cSJulian Grajkowski 41478ee8d1cSJulian Grajkowski /* Populate Compression Hardware Setup Block */ 415a977168cSMichal Gulbicki if (isDcGen4x(pService)) { 416a977168cSMichal Gulbicki dcCompHwBlockPopulateGen4(pService, 417a977168cSMichal Gulbicki pSessionDesc, 41878ee8d1cSJulian Grajkowski pCompConfig, 419a977168cSMichal Gulbicki compDecomp); 420a977168cSMichal Gulbicki } else if (isDcGen2x(pService)) { 421a977168cSMichal Gulbicki dcCompHwBlockPopulate(pService, 422a977168cSMichal Gulbicki pSessionDesc, 423a977168cSMichal Gulbicki pCompConfig, 424a977168cSMichal Gulbicki compDecomp); 425a977168cSMichal Gulbicki } else { 426a977168cSMichal Gulbicki QAT_UTILS_LOG("Invalid QAT generation value\n"); 427a977168cSMichal Gulbicki } 42878ee8d1cSJulian Grajkowski } 42978ee8d1cSJulian Grajkowski 43078ee8d1cSJulian Grajkowski /** 43178ee8d1cSJulian Grajkowski ***************************************************************************** 43278ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 43378ee8d1cSJulian Grajkowski * Populate the translator content descriptor 43478ee8d1cSJulian Grajkowski * 43578ee8d1cSJulian Grajkowski * @description 43678ee8d1cSJulian Grajkowski * This function will populate the translator content descriptor 43778ee8d1cSJulian Grajkowski * 43878ee8d1cSJulian Grajkowski * @param[out] pMsg Pointer to the compression message 43978ee8d1cSJulian Grajkowski * @param[in] nextSlice Next slice 44078ee8d1cSJulian Grajkowski * 44178ee8d1cSJulian Grajkowski *****************************************************************************/ 442a977168cSMichal Gulbicki void 44378ee8d1cSJulian Grajkowski dcTransContentDescPopulate(icp_qat_fw_comp_req_t *pMsg, 44478ee8d1cSJulian Grajkowski icp_qat_fw_slice_t nextSlice) 44578ee8d1cSJulian Grajkowski { 44678ee8d1cSJulian Grajkowski 44778ee8d1cSJulian Grajkowski icp_qat_fw_xlt_cd_hdr_t *pTransControlBlock = NULL; 44878ee8d1cSJulian Grajkowski pTransControlBlock = (icp_qat_fw_xlt_cd_hdr_t *)&(pMsg->u2.xlt_cd_ctrl); 44978ee8d1cSJulian Grajkowski 45078ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_NEXT_ID_SET(pTransControlBlock, nextSlice); 45178ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_CURR_ID_SET(pTransControlBlock, ICP_QAT_FW_SLICE_XLAT); 45278ee8d1cSJulian Grajkowski 45378ee8d1cSJulian Grajkowski pTransControlBlock->resrvd1 = 0; 45478ee8d1cSJulian Grajkowski pTransControlBlock->resrvd2 = 0; 45578ee8d1cSJulian Grajkowski pTransControlBlock->resrvd3 = 0; 45678ee8d1cSJulian Grajkowski } 45778ee8d1cSJulian Grajkowski 45878ee8d1cSJulian Grajkowski /** 45978ee8d1cSJulian Grajkowski ***************************************************************************** 46078ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 46178ee8d1cSJulian Grajkowski * Get the context size and the history size 46278ee8d1cSJulian Grajkowski * 46378ee8d1cSJulian Grajkowski * @description 46478ee8d1cSJulian Grajkowski * This function will get the size of the context buffer and the history 46578ee8d1cSJulian Grajkowski * buffer. The history buffer is a subset of the context buffer and its 46678ee8d1cSJulian Grajkowski * size is needed for stateful compression. 46778ee8d1cSJulian Grajkowski 46878ee8d1cSJulian Grajkowski * @param[in] dcInstance DC Instance Handle 46978ee8d1cSJulian Grajkowski * 47078ee8d1cSJulian Grajkowski * @param[in] pSessionData Pointer to a user instantiated 47178ee8d1cSJulian Grajkowski * structure containing session data 47278ee8d1cSJulian Grajkowski * @param[out] pContextSize Pointer to the context size 47378ee8d1cSJulian Grajkowski * 47478ee8d1cSJulian Grajkowski * @retval CPA_STATUS_SUCCESS Function executed successfully 47578ee8d1cSJulian Grajkowski * 47678ee8d1cSJulian Grajkowski * 47778ee8d1cSJulian Grajkowski *****************************************************************************/ 47878ee8d1cSJulian Grajkowski static CpaStatus 47978ee8d1cSJulian Grajkowski dcGetContextSize(CpaInstanceHandle dcInstance, 48078ee8d1cSJulian Grajkowski CpaDcSessionSetupData *pSessionData, 48178ee8d1cSJulian Grajkowski Cpa32U *pContextSize) 48278ee8d1cSJulian Grajkowski { 48378ee8d1cSJulian Grajkowski sal_compression_service_t *pCompService = NULL; 48478ee8d1cSJulian Grajkowski 48578ee8d1cSJulian Grajkowski pCompService = (sal_compression_service_t *)dcInstance; 48678ee8d1cSJulian Grajkowski 48778ee8d1cSJulian Grajkowski *pContextSize = 0; 48878ee8d1cSJulian Grajkowski if ((CPA_DC_STATEFUL == pSessionData->sessState) && 48978ee8d1cSJulian Grajkowski (CPA_DC_DIR_COMPRESS != pSessionData->sessDirection)) { 490a977168cSMichal Gulbicki switch (pSessionData->compType) { 491a977168cSMichal Gulbicki case CPA_DC_DEFLATE: 49278ee8d1cSJulian Grajkowski *pContextSize = 49378ee8d1cSJulian Grajkowski pCompService->comp_device_data.inflateContextSize; 494a977168cSMichal Gulbicki break; 495a977168cSMichal Gulbicki default: 496a977168cSMichal Gulbicki QAT_UTILS_LOG("Invalid compression algorithm."); 497a977168cSMichal Gulbicki return CPA_STATUS_FAIL; 498a977168cSMichal Gulbicki } 49978ee8d1cSJulian Grajkowski } 50078ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS; 50178ee8d1cSJulian Grajkowski } 50278ee8d1cSJulian Grajkowski 50378ee8d1cSJulian Grajkowski CpaStatus 504a977168cSMichal Gulbicki dcGetCompressCommandId(sal_compression_service_t *pService, 505a977168cSMichal Gulbicki CpaDcSessionSetupData *pSessionData, 506a977168cSMichal Gulbicki Cpa8U *pDcCmdId) 507a977168cSMichal Gulbicki { 508a977168cSMichal Gulbicki CpaStatus status = CPA_STATUS_SUCCESS; 509a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pService); 510a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pSessionData); 511a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pDcCmdId); 512a977168cSMichal Gulbicki 513a977168cSMichal Gulbicki switch (pSessionData->compType) { 514a977168cSMichal Gulbicki case CPA_DC_DEFLATE: 515a977168cSMichal Gulbicki *pDcCmdId = (CPA_DC_HT_FULL_DYNAMIC == pSessionData->huffType) ? 516a977168cSMichal Gulbicki ICP_QAT_FW_COMP_CMD_DYNAMIC : 517a977168cSMichal Gulbicki ICP_QAT_FW_COMP_CMD_STATIC; 518a977168cSMichal Gulbicki break; 519a977168cSMichal Gulbicki default: 520a977168cSMichal Gulbicki QAT_UTILS_LOG("Algorithm not supported for " 521a977168cSMichal Gulbicki "compression\n"); 522a977168cSMichal Gulbicki status = CPA_STATUS_UNSUPPORTED; 523a977168cSMichal Gulbicki break; 524a977168cSMichal Gulbicki } 525a977168cSMichal Gulbicki 526a977168cSMichal Gulbicki return status; 527a977168cSMichal Gulbicki } 528a977168cSMichal Gulbicki 529a977168cSMichal Gulbicki CpaStatus 530a977168cSMichal Gulbicki dcGetDecompressCommandId(sal_compression_service_t *pService, 531a977168cSMichal Gulbicki CpaDcSessionSetupData *pSessionData, 532a977168cSMichal Gulbicki Cpa8U *pDcCmdId) 533a977168cSMichal Gulbicki { 534a977168cSMichal Gulbicki CpaStatus status = CPA_STATUS_SUCCESS; 535a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pService); 536a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pSessionData); 537a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pDcCmdId); 538a977168cSMichal Gulbicki 539a977168cSMichal Gulbicki switch (pSessionData->compType) { 540a977168cSMichal Gulbicki case CPA_DC_DEFLATE: 541a977168cSMichal Gulbicki *pDcCmdId = ICP_QAT_FW_COMP_CMD_DECOMPRESS; 542a977168cSMichal Gulbicki break; 543a977168cSMichal Gulbicki default: 544a977168cSMichal Gulbicki QAT_UTILS_LOG("Algorithm not supported for " 545a977168cSMichal Gulbicki "decompression\n"); 546a977168cSMichal Gulbicki status = CPA_STATUS_UNSUPPORTED; 547a977168cSMichal Gulbicki break; 548a977168cSMichal Gulbicki } 549a977168cSMichal Gulbicki 550a977168cSMichal Gulbicki return status; 551a977168cSMichal Gulbicki } 552a977168cSMichal Gulbicki 553a977168cSMichal Gulbicki CpaStatus 55478ee8d1cSJulian Grajkowski dcInitSession(CpaInstanceHandle dcInstance, 55578ee8d1cSJulian Grajkowski CpaDcSessionHandle pSessionHandle, 55678ee8d1cSJulian Grajkowski CpaDcSessionSetupData *pSessionData, 55778ee8d1cSJulian Grajkowski CpaBufferList *pContextBuffer, 55878ee8d1cSJulian Grajkowski CpaDcCallbackFn callbackFn) 55978ee8d1cSJulian Grajkowski { 56078ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS; 56178ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL; 56278ee8d1cSJulian Grajkowski icp_qat_fw_comp_req_t *pReqCache = NULL; 56378ee8d1cSJulian Grajkowski dc_session_desc_t *pSessionDesc = NULL; 56478ee8d1cSJulian Grajkowski CpaPhysicalAddr contextAddrPhys = 0; 56578ee8d1cSJulian Grajkowski CpaPhysicalAddr physAddress = 0; 56678ee8d1cSJulian Grajkowski CpaPhysicalAddr physAddressAligned = 0; 56778ee8d1cSJulian Grajkowski Cpa32U minContextSize = 0, historySize = 0; 56878ee8d1cSJulian Grajkowski Cpa32U rpCmdFlags = 0; 56978ee8d1cSJulian Grajkowski icp_qat_fw_serv_specif_flags cmdFlags = 0; 57078ee8d1cSJulian Grajkowski Cpa8U secureRam = ICP_QAT_FW_COMP_ENABLE_SECURE_RAM_USED_AS_INTMD_BUF; 57178ee8d1cSJulian Grajkowski Cpa8U sessType = ICP_QAT_FW_COMP_STATELESS_SESSION; 57278ee8d1cSJulian Grajkowski Cpa8U autoSelectBest = ICP_QAT_FW_COMP_NOT_AUTO_SELECT_BEST; 57378ee8d1cSJulian Grajkowski Cpa8U enhancedAutoSelectBest = ICP_QAT_FW_COMP_NOT_ENH_AUTO_SELECT_BEST; 57478ee8d1cSJulian Grajkowski Cpa8U disableType0EnhancedAutoSelectBest = 57578ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_NOT_DISABLE_TYPE0_ENH_AUTO_SELECT_BEST; 57678ee8d1cSJulian Grajkowski icp_qat_fw_la_cmd_id_t dcCmdId = 57778ee8d1cSJulian Grajkowski (icp_qat_fw_la_cmd_id_t)ICP_QAT_FW_COMP_CMD_STATIC; 57878ee8d1cSJulian Grajkowski icp_qat_fw_comn_flags cmnRequestFlags = 0; 57978ee8d1cSJulian Grajkowski dc_integrity_crc_fw_t *pDataIntegrityCrcs = NULL; 58078ee8d1cSJulian Grajkowski 58178ee8d1cSJulian Grajkowski cmnRequestFlags = 58278ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_FLAGS_BUILD(DC_DEFAULT_QAT_PTR_TYPE, 58378ee8d1cSJulian Grajkowski QAT_COMN_CD_FLD_TYPE_16BYTE_DATA); 58478ee8d1cSJulian Grajkowski 58578ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)dcInstance; 58678ee8d1cSJulian Grajkowski 58778ee8d1cSJulian Grajkowski secureRam = pService->comp_device_data.useDevRam; 58878ee8d1cSJulian Grajkowski 58978ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionHandle); 59078ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionData); 59178ee8d1cSJulian Grajkowski 59278ee8d1cSJulian Grajkowski /* Check that the parameters defined in the pSessionData are valid for 59378ee8d1cSJulian Grajkowski * the 59478ee8d1cSJulian Grajkowski * device */ 59578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != 59678ee8d1cSJulian Grajkowski dcCheckSessionData(pSessionData, dcInstance)) { 59778ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 59878ee8d1cSJulian Grajkowski } 59978ee8d1cSJulian Grajkowski 60078ee8d1cSJulian Grajkowski if ((CPA_DC_STATEFUL == pSessionData->sessState) && 60178ee8d1cSJulian Grajkowski (CPA_DC_DIR_DECOMPRESS != pSessionData->sessDirection)) { 60278ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Stateful sessions are not supported.\n"); 60378ee8d1cSJulian Grajkowski return CPA_STATUS_UNSUPPORTED; 60478ee8d1cSJulian Grajkowski } 60578ee8d1cSJulian Grajkowski 606a977168cSMichal Gulbicki /* Check for Gen4 and stateful, return error if both exist */ 607a977168cSMichal Gulbicki if ((isDcGen4x(pService)) && 608a977168cSMichal Gulbicki (CPA_DC_STATEFUL == pSessionData->sessState && 609a977168cSMichal Gulbicki CPA_DC_DIR_DECOMPRESS != pSessionData->sessDirection)) { 610a977168cSMichal Gulbicki QAT_UTILS_LOG("Stateful sessions are not supported for " 611a977168cSMichal Gulbicki "compression direction"); 612a977168cSMichal Gulbicki return CPA_STATUS_UNSUPPORTED; 613a977168cSMichal Gulbicki } 614a977168cSMichal Gulbicki 615a977168cSMichal Gulbicki if ((isDcGen2x(pService)) && 616a977168cSMichal Gulbicki (CPA_DC_HT_FULL_DYNAMIC == pSessionData->huffType)) { 61778ee8d1cSJulian Grajkowski /* Test if DRAM is available for the intermediate buffers */ 61878ee8d1cSJulian Grajkowski if ((NULL == pService->pInterBuffPtrsArray) && 61978ee8d1cSJulian Grajkowski (0 == pService->pInterBuffPtrsArrayPhyAddr)) { 62078ee8d1cSJulian Grajkowski if (CPA_DC_ASB_STATIC_DYNAMIC == 62178ee8d1cSJulian Grajkowski pSessionData->autoSelectBestHuffmanTree) { 62278ee8d1cSJulian Grajkowski /* Define the Huffman tree as static */ 62378ee8d1cSJulian Grajkowski pSessionData->huffType = CPA_DC_HT_STATIC; 62478ee8d1cSJulian Grajkowski } else { 62578ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 626a977168cSMichal Gulbicki "No buffer defined for this instance - " 627a977168cSMichal Gulbicki "see cpaDcStartInstance.\n"); 62878ee8d1cSJulian Grajkowski return CPA_STATUS_RESOURCE; 62978ee8d1cSJulian Grajkowski } 63078ee8d1cSJulian Grajkowski } 63178ee8d1cSJulian Grajkowski } 63278ee8d1cSJulian Grajkowski 63378ee8d1cSJulian Grajkowski if ((CPA_DC_STATEFUL == pSessionData->sessState) && 63478ee8d1cSJulian Grajkowski (CPA_DC_DEFLATE == pSessionData->compType)) { 63578ee8d1cSJulian Grajkowski /* Get the size of the context buffer */ 63678ee8d1cSJulian Grajkowski status = 63778ee8d1cSJulian Grajkowski dcGetContextSize(dcInstance, pSessionData, &minContextSize); 63878ee8d1cSJulian Grajkowski 63978ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) { 64078ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 64178ee8d1cSJulian Grajkowski "Unable to get the context size of the session.\n"); 64278ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL; 64378ee8d1cSJulian Grajkowski } 64478ee8d1cSJulian Grajkowski 64578ee8d1cSJulian Grajkowski /* If the minContextSize is zero it means we will not save or 64678ee8d1cSJulian Grajkowski * restore 64778ee8d1cSJulian Grajkowski * any history */ 64878ee8d1cSJulian Grajkowski if (0 != minContextSize) { 64978ee8d1cSJulian Grajkowski Cpa64U contextBuffSize = 0; 65078ee8d1cSJulian Grajkowski 65178ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pContextBuffer); 65278ee8d1cSJulian Grajkowski 65378ee8d1cSJulian Grajkowski if (LacBuffDesc_BufferListVerify( 65478ee8d1cSJulian Grajkowski pContextBuffer, 65578ee8d1cSJulian Grajkowski &contextBuffSize, 65678ee8d1cSJulian Grajkowski LAC_NO_ALIGNMENT_SHIFT) != CPA_STATUS_SUCCESS) { 65778ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 65878ee8d1cSJulian Grajkowski } 65978ee8d1cSJulian Grajkowski 66078ee8d1cSJulian Grajkowski /* Ensure that the context buffer size is greater or 66178ee8d1cSJulian Grajkowski * equal 66278ee8d1cSJulian Grajkowski * to minContextSize */ 66378ee8d1cSJulian Grajkowski if (contextBuffSize < minContextSize) { 66478ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 66578ee8d1cSJulian Grajkowski "Context buffer size should be greater or equal to %d.\n", 66678ee8d1cSJulian Grajkowski minContextSize); 66778ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 66878ee8d1cSJulian Grajkowski } 66978ee8d1cSJulian Grajkowski } 67078ee8d1cSJulian Grajkowski } 67178ee8d1cSJulian Grajkowski 67278ee8d1cSJulian Grajkowski /* Re-align the session structure to 64 byte alignment */ 67378ee8d1cSJulian Grajkowski physAddress = 67478ee8d1cSJulian Grajkowski LAC_OS_VIRT_TO_PHYS_EXTERNAL(pService->generic_service_info, 67578ee8d1cSJulian Grajkowski (Cpa8U *)pSessionHandle + 67678ee8d1cSJulian Grajkowski sizeof(void *)); 67778ee8d1cSJulian Grajkowski 67878ee8d1cSJulian Grajkowski if (physAddress == 0) { 67978ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 68078ee8d1cSJulian Grajkowski "Unable to get the physical address of the session.\n"); 68178ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL; 68278ee8d1cSJulian Grajkowski } 68378ee8d1cSJulian Grajkowski 68478ee8d1cSJulian Grajkowski physAddressAligned = 68578ee8d1cSJulian Grajkowski (CpaPhysicalAddr)LAC_ALIGN_POW2_ROUNDUP(physAddress, 68678ee8d1cSJulian Grajkowski LAC_64BYTE_ALIGNMENT); 68778ee8d1cSJulian Grajkowski 68878ee8d1cSJulian Grajkowski pSessionDesc = (dc_session_desc_t *) 68978ee8d1cSJulian Grajkowski /* Move the session pointer by the physical offset 69078ee8d1cSJulian Grajkowski between aligned and unaligned memory */ 69178ee8d1cSJulian Grajkowski ((Cpa8U *)pSessionHandle + sizeof(void *) + 69278ee8d1cSJulian Grajkowski (physAddressAligned - physAddress)); 69378ee8d1cSJulian Grajkowski 69478ee8d1cSJulian Grajkowski /* Save the aligned pointer in the first bytes (size of LAC_ARCH_UINT) 69578ee8d1cSJulian Grajkowski * of the session memory */ 69678ee8d1cSJulian Grajkowski *((LAC_ARCH_UINT *)pSessionHandle) = (LAC_ARCH_UINT)pSessionDesc; 69778ee8d1cSJulian Grajkowski 69878ee8d1cSJulian Grajkowski /* Zero the compression session */ 69978ee8d1cSJulian Grajkowski LAC_OS_BZERO(pSessionDesc, sizeof(dc_session_desc_t)); 70078ee8d1cSJulian Grajkowski 70178ee8d1cSJulian Grajkowski /* Write the buffer descriptor for context/history */ 70278ee8d1cSJulian Grajkowski if (0 != minContextSize) { 70378ee8d1cSJulian Grajkowski status = LacBuffDesc_BufferListDescWrite( 70478ee8d1cSJulian Grajkowski pContextBuffer, 70578ee8d1cSJulian Grajkowski &contextAddrPhys, 70678ee8d1cSJulian Grajkowski CPA_FALSE, 70778ee8d1cSJulian Grajkowski &(pService->generic_service_info)); 70878ee8d1cSJulian Grajkowski 70978ee8d1cSJulian Grajkowski if (status != CPA_STATUS_SUCCESS) { 71078ee8d1cSJulian Grajkowski return status; 71178ee8d1cSJulian Grajkowski } 71278ee8d1cSJulian Grajkowski 71378ee8d1cSJulian Grajkowski pSessionDesc->pContextBuffer = pContextBuffer; 71478ee8d1cSJulian Grajkowski pSessionDesc->historyBuffSize = historySize; 71578ee8d1cSJulian Grajkowski } 71678ee8d1cSJulian Grajkowski 71778ee8d1cSJulian Grajkowski pSessionDesc->cumulativeConsumedBytes = 0; 71878ee8d1cSJulian Grajkowski 71978ee8d1cSJulian Grajkowski /* Initialise pSessionDesc */ 72078ee8d1cSJulian Grajkowski pSessionDesc->requestType = DC_REQUEST_FIRST; 72178ee8d1cSJulian Grajkowski pSessionDesc->huffType = pSessionData->huffType; 72278ee8d1cSJulian Grajkowski pSessionDesc->compType = pSessionData->compType; 72378ee8d1cSJulian Grajkowski pSessionDesc->checksumType = pSessionData->checksum; 72478ee8d1cSJulian Grajkowski pSessionDesc->autoSelectBestHuffmanTree = 72578ee8d1cSJulian Grajkowski pSessionData->autoSelectBestHuffmanTree; 72678ee8d1cSJulian Grajkowski pSessionDesc->sessDirection = pSessionData->sessDirection; 72778ee8d1cSJulian Grajkowski pSessionDesc->sessState = pSessionData->sessState; 72878ee8d1cSJulian Grajkowski pSessionDesc->compLevel = pSessionData->compLevel; 72978ee8d1cSJulian Grajkowski pSessionDesc->isDcDp = CPA_FALSE; 73078ee8d1cSJulian Grajkowski pSessionDesc->minContextSize = minContextSize; 73178ee8d1cSJulian Grajkowski pSessionDesc->isSopForCompressionProcessed = CPA_FALSE; 73278ee8d1cSJulian Grajkowski pSessionDesc->isSopForDecompressionProcessed = CPA_FALSE; 73378ee8d1cSJulian Grajkowski 73478ee8d1cSJulian Grajkowski if (CPA_DC_ADLER32 == pSessionDesc->checksumType) { 73578ee8d1cSJulian Grajkowski pSessionDesc->previousChecksum = 1; 73678ee8d1cSJulian Grajkowski } else { 73778ee8d1cSJulian Grajkowski pSessionDesc->previousChecksum = 0; 73878ee8d1cSJulian Grajkowski } 73978ee8d1cSJulian Grajkowski 74078ee8d1cSJulian Grajkowski if (CPA_DC_STATEFUL == pSessionData->sessState) { 74178ee8d1cSJulian Grajkowski /* Init the spinlock used to lock the access to the number of 74278ee8d1cSJulian Grajkowski * stateful 74378ee8d1cSJulian Grajkowski * in-flight requests */ 74478ee8d1cSJulian Grajkowski status = LAC_SPINLOCK_INIT(&(pSessionDesc->sessionLock)); 74578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) { 74678ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 74778ee8d1cSJulian Grajkowski "Spinlock init failed for sessionLock.\n"); 74878ee8d1cSJulian Grajkowski return CPA_STATUS_RESOURCE; 74978ee8d1cSJulian Grajkowski } 75078ee8d1cSJulian Grajkowski } 75178ee8d1cSJulian Grajkowski 75278ee8d1cSJulian Grajkowski /* For asynchronous - use the user supplied callback 75378ee8d1cSJulian Grajkowski * for synchronous - use the internal synchronous callback */ 75478ee8d1cSJulian Grajkowski pSessionDesc->pCompressionCb = ((void *)NULL != (void *)callbackFn) ? 75578ee8d1cSJulian Grajkowski callbackFn : 75678ee8d1cSJulian Grajkowski LacSync_GenWakeupSyncCaller; 75778ee8d1cSJulian Grajkowski 75878ee8d1cSJulian Grajkowski /* Reset the pending callback counters */ 75978ee8d1cSJulian Grajkowski qatUtilsAtomicSet(0, &pSessionDesc->pendingStatelessCbCount); 76078ee8d1cSJulian Grajkowski qatUtilsAtomicSet(0, &pSessionDesc->pendingStatefulCbCount); 76178ee8d1cSJulian Grajkowski pSessionDesc->pendingDpStatelessCbCount = 0; 76278ee8d1cSJulian Grajkowski 76378ee8d1cSJulian Grajkowski if (CPA_DC_DIR_DECOMPRESS != pSessionData->sessDirection) { 764a977168cSMichal Gulbicki if ((isDcGen2x(pService)) && 765a977168cSMichal Gulbicki CPA_DC_HT_FULL_DYNAMIC == pSessionData->huffType) { 76678ee8d1cSJulian Grajkowski /* Populate the compression section of the content 76778ee8d1cSJulian Grajkowski * descriptor */ 76878ee8d1cSJulian Grajkowski dcCompContentDescPopulate(pService, 76978ee8d1cSJulian Grajkowski pSessionDesc, 77078ee8d1cSJulian Grajkowski contextAddrPhys, 77178ee8d1cSJulian Grajkowski &(pSessionDesc->reqCacheComp), 77278ee8d1cSJulian Grajkowski ICP_QAT_FW_SLICE_XLAT, 77378ee8d1cSJulian Grajkowski DC_COMPRESSION_REQUEST); 77478ee8d1cSJulian Grajkowski 77578ee8d1cSJulian Grajkowski /* Populate the translator section of the content 77678ee8d1cSJulian Grajkowski * descriptor */ 77778ee8d1cSJulian Grajkowski dcTransContentDescPopulate( 77878ee8d1cSJulian Grajkowski &(pSessionDesc->reqCacheComp), 77978ee8d1cSJulian Grajkowski ICP_QAT_FW_SLICE_DRAM_WR); 78078ee8d1cSJulian Grajkowski 78178ee8d1cSJulian Grajkowski if (0 != pService->pInterBuffPtrsArrayPhyAddr) { 78278ee8d1cSJulian Grajkowski pReqCache = &(pSessionDesc->reqCacheComp); 78378ee8d1cSJulian Grajkowski 78478ee8d1cSJulian Grajkowski pReqCache->u1.xlt_pars.inter_buff_ptr = 78578ee8d1cSJulian Grajkowski pService->pInterBuffPtrsArrayPhyAddr; 78678ee8d1cSJulian Grajkowski } 78778ee8d1cSJulian Grajkowski } else { 78878ee8d1cSJulian Grajkowski dcCompContentDescPopulate(pService, 78978ee8d1cSJulian Grajkowski pSessionDesc, 79078ee8d1cSJulian Grajkowski contextAddrPhys, 79178ee8d1cSJulian Grajkowski &(pSessionDesc->reqCacheComp), 79278ee8d1cSJulian Grajkowski ICP_QAT_FW_SLICE_DRAM_WR, 79378ee8d1cSJulian Grajkowski DC_COMPRESSION_REQUEST); 79478ee8d1cSJulian Grajkowski } 79578ee8d1cSJulian Grajkowski } 79678ee8d1cSJulian Grajkowski 79778ee8d1cSJulian Grajkowski /* Populate the compression section of the content descriptor for 79878ee8d1cSJulian Grajkowski * the decompression case or combined */ 79978ee8d1cSJulian Grajkowski if (CPA_DC_DIR_COMPRESS != pSessionData->sessDirection) { 80078ee8d1cSJulian Grajkowski dcCompContentDescPopulate(pService, 80178ee8d1cSJulian Grajkowski pSessionDesc, 80278ee8d1cSJulian Grajkowski contextAddrPhys, 80378ee8d1cSJulian Grajkowski &(pSessionDesc->reqCacheDecomp), 80478ee8d1cSJulian Grajkowski ICP_QAT_FW_SLICE_DRAM_WR, 80578ee8d1cSJulian Grajkowski DC_DECOMPRESSION_REQUEST); 80678ee8d1cSJulian Grajkowski } 80778ee8d1cSJulian Grajkowski 80878ee8d1cSJulian Grajkowski if (CPA_DC_STATEFUL == pSessionData->sessState) { 80978ee8d1cSJulian Grajkowski sessType = ICP_QAT_FW_COMP_STATEFUL_SESSION; 81078ee8d1cSJulian Grajkowski 81178ee8d1cSJulian Grajkowski LAC_OS_BZERO(&pSessionDesc->stateRegistersComp, 81278ee8d1cSJulian Grajkowski sizeof(pSessionDesc->stateRegistersComp)); 81378ee8d1cSJulian Grajkowski 81478ee8d1cSJulian Grajkowski LAC_OS_BZERO(&pSessionDesc->stateRegistersDecomp, 81578ee8d1cSJulian Grajkowski sizeof(pSessionDesc->stateRegistersDecomp)); 81678ee8d1cSJulian Grajkowski } 81778ee8d1cSJulian Grajkowski 81878ee8d1cSJulian Grajkowski /* Get physical address of E2E CRC buffer */ 81978ee8d1cSJulian Grajkowski pSessionDesc->physDataIntegrityCrcs = (icp_qat_addr_width_t) 82078ee8d1cSJulian Grajkowski LAC_OS_VIRT_TO_PHYS_EXTERNAL(pService->generic_service_info, 82178ee8d1cSJulian Grajkowski &pSessionDesc->dataIntegrityCrcs); 82278ee8d1cSJulian Grajkowski if (0 == pSessionDesc->physDataIntegrityCrcs) { 82378ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 82478ee8d1cSJulian Grajkowski "Unable to get the physical address of Data Integrity buffer.\n"); 82578ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL; 82678ee8d1cSJulian Grajkowski } 82778ee8d1cSJulian Grajkowski /* Initialize default CRC parameters */ 82878ee8d1cSJulian Grajkowski pDataIntegrityCrcs = &pSessionDesc->dataIntegrityCrcs; 82978ee8d1cSJulian Grajkowski pDataIntegrityCrcs->crc32 = 0; 83078ee8d1cSJulian Grajkowski pDataIntegrityCrcs->adler32 = 1; 831a977168cSMichal Gulbicki 832a977168cSMichal Gulbicki if (isDcGen2x(pService)) { 83378ee8d1cSJulian Grajkowski pDataIntegrityCrcs->oCrc32Cpr = DC_INVALID_CRC; 83478ee8d1cSJulian Grajkowski pDataIntegrityCrcs->iCrc32Cpr = DC_INVALID_CRC; 83578ee8d1cSJulian Grajkowski pDataIntegrityCrcs->oCrc32Xlt = DC_INVALID_CRC; 83678ee8d1cSJulian Grajkowski pDataIntegrityCrcs->iCrc32Xlt = DC_INVALID_CRC; 83778ee8d1cSJulian Grajkowski pDataIntegrityCrcs->xorFlags = DC_XOR_FLAGS_DEFAULT; 83878ee8d1cSJulian Grajkowski pDataIntegrityCrcs->crcPoly = DC_CRC_POLY_DEFAULT; 83978ee8d1cSJulian Grajkowski pDataIntegrityCrcs->xorOut = DC_XOR_OUT_DEFAULT; 840a977168cSMichal Gulbicki } else { 841a977168cSMichal Gulbicki pDataIntegrityCrcs->iCrc64Cpr = DC_INVALID_CRC; 842a977168cSMichal Gulbicki pDataIntegrityCrcs->oCrc64Cpr = DC_INVALID_CRC; 843a977168cSMichal Gulbicki pDataIntegrityCrcs->iCrc64Xlt = DC_INVALID_CRC; 844a977168cSMichal Gulbicki pDataIntegrityCrcs->oCrc64Xlt = DC_INVALID_CRC; 845a977168cSMichal Gulbicki pDataIntegrityCrcs->crc64Poly = DC_CRC64_POLY_DEFAULT; 846a977168cSMichal Gulbicki pDataIntegrityCrcs->xor64Out = DC_XOR64_OUT_DEFAULT; 847a977168cSMichal Gulbicki } 84878ee8d1cSJulian Grajkowski 849a977168cSMichal Gulbicki /* Initialise seed checksums. 850a977168cSMichal Gulbicki * It initializes swCrc32I, swCrc32O, too(union). 851a977168cSMichal Gulbicki */ 852a977168cSMichal Gulbicki pSessionDesc->seedSwCrc.swCrc64I = 0; 853a977168cSMichal Gulbicki pSessionDesc->seedSwCrc.swCrc64O = 0; 85478ee8d1cSJulian Grajkowski 85578ee8d1cSJulian Grajkowski /* Populate the cmdFlags */ 85678ee8d1cSJulian Grajkowski switch (pSessionDesc->autoSelectBestHuffmanTree) { 85778ee8d1cSJulian Grajkowski case CPA_DC_ASB_DISABLED: 85878ee8d1cSJulian Grajkowski break; 85978ee8d1cSJulian Grajkowski case CPA_DC_ASB_STATIC_DYNAMIC: 86078ee8d1cSJulian Grajkowski autoSelectBest = ICP_QAT_FW_COMP_AUTO_SELECT_BEST; 86178ee8d1cSJulian Grajkowski break; 86278ee8d1cSJulian Grajkowski case CPA_DC_ASB_UNCOMP_STATIC_DYNAMIC_WITH_STORED_HDRS: 86378ee8d1cSJulian Grajkowski autoSelectBest = ICP_QAT_FW_COMP_AUTO_SELECT_BEST; 86478ee8d1cSJulian Grajkowski enhancedAutoSelectBest = ICP_QAT_FW_COMP_ENH_AUTO_SELECT_BEST; 86578ee8d1cSJulian Grajkowski break; 86678ee8d1cSJulian Grajkowski case CPA_DC_ASB_UNCOMP_STATIC_DYNAMIC_WITH_NO_HDRS: 86778ee8d1cSJulian Grajkowski autoSelectBest = ICP_QAT_FW_COMP_AUTO_SELECT_BEST; 86878ee8d1cSJulian Grajkowski enhancedAutoSelectBest = ICP_QAT_FW_COMP_ENH_AUTO_SELECT_BEST; 86978ee8d1cSJulian Grajkowski disableType0EnhancedAutoSelectBest = 87078ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_DISABLE_TYPE0_ENH_AUTO_SELECT_BEST; 87178ee8d1cSJulian Grajkowski break; 872266b0663SKrzysztof Zdziarski case CPA_DC_ASB_ENABLED: 873266b0663SKrzysztof Zdziarski if (pService->comp_device_data.asbEnableSupport == CPA_FALSE) { 874266b0663SKrzysztof Zdziarski autoSelectBest = ICP_QAT_FW_COMP_AUTO_SELECT_BEST; 875266b0663SKrzysztof Zdziarski enhancedAutoSelectBest = 876266b0663SKrzysztof Zdziarski ICP_QAT_FW_COMP_ENH_AUTO_SELECT_BEST; 877266b0663SKrzysztof Zdziarski } 878266b0663SKrzysztof Zdziarski break; 87978ee8d1cSJulian Grajkowski default: 88078ee8d1cSJulian Grajkowski break; 88178ee8d1cSJulian Grajkowski } 88278ee8d1cSJulian Grajkowski 88378ee8d1cSJulian Grajkowski rpCmdFlags = ICP_QAT_FW_COMP_REQ_PARAM_FLAGS_BUILD( 88478ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_SOP, 88578ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_EOP, 88678ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_BFINAL, 88778ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_NO_CNV, 88878ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_NO_CNV_RECOVERY, 889a977168cSMichal Gulbicki ICP_QAT_FW_COMP_NO_CNV_DFX, 89078ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_CRC_MODE_LEGACY); 89178ee8d1cSJulian Grajkowski 89278ee8d1cSJulian Grajkowski cmdFlags = 89378ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_FLAGS_BUILD(sessType, 89478ee8d1cSJulian Grajkowski autoSelectBest, 89578ee8d1cSJulian Grajkowski enhancedAutoSelectBest, 89678ee8d1cSJulian Grajkowski disableType0EnhancedAutoSelectBest, 89778ee8d1cSJulian Grajkowski secureRam); 89878ee8d1cSJulian Grajkowski 89978ee8d1cSJulian Grajkowski if (CPA_DC_DIR_DECOMPRESS != pSessionData->sessDirection) { 900a977168cSMichal Gulbicki status = dcGetCompressCommandId(pService, 901a977168cSMichal Gulbicki pSessionData, 902a977168cSMichal Gulbicki (Cpa8U *)&dcCmdId); 903a977168cSMichal Gulbicki if (CPA_STATUS_SUCCESS != status) { 904a977168cSMichal Gulbicki QAT_UTILS_LOG( 905a977168cSMichal Gulbicki "Couldn't get compress command ID for current " 906a977168cSMichal Gulbicki "session data."); 90778ee8d1cSJulian Grajkowski 908a977168cSMichal Gulbicki return status; 909a977168cSMichal Gulbicki } 91078ee8d1cSJulian Grajkowski pReqCache = &(pSessionDesc->reqCacheComp); 91178ee8d1cSJulian Grajkowski pReqCache->comp_pars.req_par_flags = rpCmdFlags; 91278ee8d1cSJulian Grajkowski pReqCache->comp_pars.crc.legacy.initial_adler = 1; 91378ee8d1cSJulian Grajkowski pReqCache->comp_pars.crc.legacy.initial_crc32 = 0; 91478ee8d1cSJulian Grajkowski 91578ee8d1cSJulian Grajkowski /* Populate header of the common request message */ 91678ee8d1cSJulian Grajkowski SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)pReqCache, 91778ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_REQ_CPM_FW_COMP, 91878ee8d1cSJulian Grajkowski (uint8_t)dcCmdId, 91978ee8d1cSJulian Grajkowski cmnRequestFlags, 92078ee8d1cSJulian Grajkowski cmdFlags); 92178ee8d1cSJulian Grajkowski } 92278ee8d1cSJulian Grajkowski 92378ee8d1cSJulian Grajkowski if (CPA_DC_DIR_COMPRESS != pSessionData->sessDirection) { 924a977168cSMichal Gulbicki status = dcGetDecompressCommandId(pService, 925a977168cSMichal Gulbicki pSessionData, 926a977168cSMichal Gulbicki (Cpa8U *)&dcCmdId); 927a977168cSMichal Gulbicki if (CPA_STATUS_SUCCESS != status) { 928a977168cSMichal Gulbicki QAT_UTILS_LOG( 929a977168cSMichal Gulbicki "Couldn't get decompress command ID for current " 930a977168cSMichal Gulbicki "session data."); 931a977168cSMichal Gulbicki 932a977168cSMichal Gulbicki return status; 933a977168cSMichal Gulbicki } 93478ee8d1cSJulian Grajkowski pReqCache = &(pSessionDesc->reqCacheDecomp); 93578ee8d1cSJulian Grajkowski pReqCache->comp_pars.req_par_flags = rpCmdFlags; 93678ee8d1cSJulian Grajkowski pReqCache->comp_pars.crc.legacy.initial_adler = 1; 93778ee8d1cSJulian Grajkowski pReqCache->comp_pars.crc.legacy.initial_crc32 = 0; 93878ee8d1cSJulian Grajkowski 93978ee8d1cSJulian Grajkowski /* Populate header of the common request message */ 94078ee8d1cSJulian Grajkowski SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)pReqCache, 94178ee8d1cSJulian Grajkowski ICP_QAT_FW_COMN_REQ_CPM_FW_COMP, 94278ee8d1cSJulian Grajkowski (uint8_t)dcCmdId, 94378ee8d1cSJulian Grajkowski cmnRequestFlags, 94478ee8d1cSJulian Grajkowski cmdFlags); 94578ee8d1cSJulian Grajkowski } 94678ee8d1cSJulian Grajkowski 94778ee8d1cSJulian Grajkowski return status; 94878ee8d1cSJulian Grajkowski } 94978ee8d1cSJulian Grajkowski 95078ee8d1cSJulian Grajkowski CpaStatus 95178ee8d1cSJulian Grajkowski cpaDcInitSession(CpaInstanceHandle dcInstance, 95278ee8d1cSJulian Grajkowski CpaDcSessionHandle pSessionHandle, 95378ee8d1cSJulian Grajkowski CpaDcSessionSetupData *pSessionData, 95478ee8d1cSJulian Grajkowski CpaBufferList *pContextBuffer, 95578ee8d1cSJulian Grajkowski CpaDcCallbackFn callbackFn) 95678ee8d1cSJulian Grajkowski { 95778ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL; 95878ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL; 95978ee8d1cSJulian Grajkowski 96078ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) { 96178ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle(); 96278ee8d1cSJulian Grajkowski } else { 96378ee8d1cSJulian Grajkowski insHandle = dcInstance; 96478ee8d1cSJulian Grajkowski } 96578ee8d1cSJulian Grajkowski 96678ee8d1cSJulian Grajkowski LAC_CHECK_INSTANCE_HANDLE(insHandle); 96778ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION); 96878ee8d1cSJulian Grajkowski 96978ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)insHandle; 97078ee8d1cSJulian Grajkowski 97178ee8d1cSJulian Grajkowski /* Check if SAL is initialised otherwise return an error */ 97278ee8d1cSJulian Grajkowski SAL_RUNNING_CHECK(pService); 97378ee8d1cSJulian Grajkowski 97478ee8d1cSJulian Grajkowski return dcInitSession(insHandle, 97578ee8d1cSJulian Grajkowski pSessionHandle, 97678ee8d1cSJulian Grajkowski pSessionData, 97778ee8d1cSJulian Grajkowski pContextBuffer, 97878ee8d1cSJulian Grajkowski callbackFn); 97978ee8d1cSJulian Grajkowski } 98078ee8d1cSJulian Grajkowski 98178ee8d1cSJulian Grajkowski CpaStatus 98278ee8d1cSJulian Grajkowski cpaDcResetSession(const CpaInstanceHandle dcInstance, 98378ee8d1cSJulian Grajkowski CpaDcSessionHandle pSessionHandle) 98478ee8d1cSJulian Grajkowski { 98578ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS; 98678ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL; 987a977168cSMichal Gulbicki sal_compression_service_t *pService = NULL; 98878ee8d1cSJulian Grajkowski dc_session_desc_t *pSessionDesc = NULL; 98978ee8d1cSJulian Grajkowski Cpa64U numPendingStateless = 0; 99078ee8d1cSJulian Grajkowski Cpa64U numPendingStateful = 0; 99178ee8d1cSJulian Grajkowski icp_comms_trans_handle trans_handle = NULL; 992a977168cSMichal Gulbicki dc_integrity_crc_fw_t *pDataIntegrityCrcs = NULL; 993a977168cSMichal Gulbicki dc_sw_checksums_t *pSwCrcs = NULL; 994a977168cSMichal Gulbicki 99578ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionHandle); 99678ee8d1cSJulian Grajkowski pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle); 99778ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionDesc); 99878ee8d1cSJulian Grajkowski 99978ee8d1cSJulian Grajkowski if (CPA_TRUE == pSessionDesc->isDcDp) { 100078ee8d1cSJulian Grajkowski insHandle = dcInstance; 100178ee8d1cSJulian Grajkowski } else { 100278ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) { 100378ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle(); 100478ee8d1cSJulian Grajkowski } else { 100578ee8d1cSJulian Grajkowski insHandle = dcInstance; 100678ee8d1cSJulian Grajkowski } 100778ee8d1cSJulian Grajkowski } 100878ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle); 100978ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION); 101078ee8d1cSJulian Grajkowski /* Check if SAL is running otherwise return an error */ 101178ee8d1cSJulian Grajkowski SAL_RUNNING_CHECK(insHandle); 101278ee8d1cSJulian Grajkowski if (CPA_TRUE == pSessionDesc->isDcDp) { 1013a977168cSMichal Gulbicki trans_handle = ((sal_compression_service_t *)insHandle) 101478ee8d1cSJulian Grajkowski ->trans_handle_compression_tx; 101578ee8d1cSJulian Grajkowski if (CPA_TRUE == icp_adf_queueDataToSend(trans_handle)) { 101678ee8d1cSJulian Grajkowski /* Process the remaining messages on the ring */ 101778ee8d1cSJulian Grajkowski SalQatMsg_updateQueueTail(trans_handle); 101878ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 101978ee8d1cSJulian Grajkowski "There are remaining messages on the ring\n"); 102078ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 102178ee8d1cSJulian Grajkowski } 102278ee8d1cSJulian Grajkowski 102378ee8d1cSJulian Grajkowski /* Check if there are stateless pending requests */ 102478ee8d1cSJulian Grajkowski if (0 != pSessionDesc->pendingDpStatelessCbCount) { 102578ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 102678ee8d1cSJulian Grajkowski "There are %llu stateless DP requests pending.\n", 102778ee8d1cSJulian Grajkowski (unsigned long long) 102878ee8d1cSJulian Grajkowski pSessionDesc->pendingDpStatelessCbCount); 102978ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 103078ee8d1cSJulian Grajkowski } 103178ee8d1cSJulian Grajkowski } else { 103278ee8d1cSJulian Grajkowski numPendingStateless = 103378ee8d1cSJulian Grajkowski qatUtilsAtomicGet(&(pSessionDesc->pendingStatelessCbCount)); 103478ee8d1cSJulian Grajkowski numPendingStateful = 103578ee8d1cSJulian Grajkowski qatUtilsAtomicGet(&(pSessionDesc->pendingStatefulCbCount)); 103678ee8d1cSJulian Grajkowski /* Check if there are stateless pending requests */ 103778ee8d1cSJulian Grajkowski if (0 != numPendingStateless) { 103878ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 103978ee8d1cSJulian Grajkowski "There are %llu stateless requests pending.\n", 104078ee8d1cSJulian Grajkowski (unsigned long long)numPendingStateless); 104178ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 104278ee8d1cSJulian Grajkowski } 104378ee8d1cSJulian Grajkowski /* Check if there are stateful pending requests */ 104478ee8d1cSJulian Grajkowski if (0 != numPendingStateful) { 104578ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 104678ee8d1cSJulian Grajkowski "There are %llu stateful requests pending.\n", 104778ee8d1cSJulian Grajkowski (unsigned long long)numPendingStateful); 104878ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 104978ee8d1cSJulian Grajkowski } 105078ee8d1cSJulian Grajkowski 105178ee8d1cSJulian Grajkowski /* Reset pSessionDesc */ 105278ee8d1cSJulian Grajkowski pSessionDesc->requestType = DC_REQUEST_FIRST; 105378ee8d1cSJulian Grajkowski pSessionDesc->cumulativeConsumedBytes = 0; 105478ee8d1cSJulian Grajkowski if (CPA_DC_ADLER32 == pSessionDesc->checksumType) { 105578ee8d1cSJulian Grajkowski pSessionDesc->previousChecksum = 1; 105678ee8d1cSJulian Grajkowski } else { 105778ee8d1cSJulian Grajkowski pSessionDesc->previousChecksum = 0; 105878ee8d1cSJulian Grajkowski } 1059a977168cSMichal Gulbicki pSessionDesc->cnvErrorInjection = ICP_QAT_FW_COMP_NO_CNV_DFX; 1060a977168cSMichal Gulbicki 1061a977168cSMichal Gulbicki /* Reset integrity CRCs to default parameters. */ 1062a977168cSMichal Gulbicki pDataIntegrityCrcs = &pSessionDesc->dataIntegrityCrcs; 1063a977168cSMichal Gulbicki memset(pDataIntegrityCrcs, 0, sizeof(dc_integrity_crc_fw_t)); 1064a977168cSMichal Gulbicki pDataIntegrityCrcs->adler32 = 1; 1065a977168cSMichal Gulbicki 1066a977168cSMichal Gulbicki pService = (sal_compression_service_t *)insHandle; 1067a977168cSMichal Gulbicki if (isDcGen2x(pService)) { 1068a977168cSMichal Gulbicki pDataIntegrityCrcs->xorFlags = DC_XOR_FLAGS_DEFAULT; 1069a977168cSMichal Gulbicki pDataIntegrityCrcs->crcPoly = DC_CRC_POLY_DEFAULT; 1070a977168cSMichal Gulbicki pDataIntegrityCrcs->xorOut = DC_XOR_OUT_DEFAULT; 1071a977168cSMichal Gulbicki } else { 1072a977168cSMichal Gulbicki pDataIntegrityCrcs->crc64Poly = DC_CRC64_POLY_DEFAULT; 1073a977168cSMichal Gulbicki pDataIntegrityCrcs->xor64Out = DC_XOR64_OUT_DEFAULT; 107478ee8d1cSJulian Grajkowski } 1075a977168cSMichal Gulbicki 1076a977168cSMichal Gulbicki /* Reset seed SW checksums. */ 1077a977168cSMichal Gulbicki pSwCrcs = &pSessionDesc->seedSwCrc; 1078a977168cSMichal Gulbicki memset(pSwCrcs, 0, sizeof(dc_sw_checksums_t)); 1079a977168cSMichal Gulbicki 1080a977168cSMichal Gulbicki /* Reset integrity SW checksums. */ 1081a977168cSMichal Gulbicki pSwCrcs = &pSessionDesc->integritySwCrc; 1082a977168cSMichal Gulbicki memset(pSwCrcs, 0, sizeof(dc_sw_checksums_t)); 1083a977168cSMichal Gulbicki } 1084a977168cSMichal Gulbicki 108578ee8d1cSJulian Grajkowski /* Reset the pending callback counters */ 108678ee8d1cSJulian Grajkowski qatUtilsAtomicSet(0, &pSessionDesc->pendingStatelessCbCount); 108778ee8d1cSJulian Grajkowski qatUtilsAtomicSet(0, &pSessionDesc->pendingStatefulCbCount); 108878ee8d1cSJulian Grajkowski pSessionDesc->pendingDpStatelessCbCount = 0; 108978ee8d1cSJulian Grajkowski if (CPA_DC_STATEFUL == pSessionDesc->sessState) { 109078ee8d1cSJulian Grajkowski LAC_OS_BZERO(&pSessionDesc->stateRegistersComp, 109178ee8d1cSJulian Grajkowski sizeof(pSessionDesc->stateRegistersComp)); 109278ee8d1cSJulian Grajkowski LAC_OS_BZERO(&pSessionDesc->stateRegistersDecomp, 109378ee8d1cSJulian Grajkowski sizeof(pSessionDesc->stateRegistersDecomp)); 109478ee8d1cSJulian Grajkowski } 109578ee8d1cSJulian Grajkowski return status; 109678ee8d1cSJulian Grajkowski } 109778ee8d1cSJulian Grajkowski 109878ee8d1cSJulian Grajkowski CpaStatus 1099266b0663SKrzysztof Zdziarski cpaDcResetXXHashState(const CpaInstanceHandle dcInstance, 1100266b0663SKrzysztof Zdziarski CpaDcSessionHandle pSessionHandle) 1101266b0663SKrzysztof Zdziarski { 1102266b0663SKrzysztof Zdziarski return CPA_STATUS_UNSUPPORTED; 1103266b0663SKrzysztof Zdziarski } 1104266b0663SKrzysztof Zdziarski 1105266b0663SKrzysztof Zdziarski CpaStatus 1106266b0663SKrzysztof Zdziarski cpaDcUpdateSession(const CpaInstanceHandle dcInstance, 1107266b0663SKrzysztof Zdziarski CpaDcSessionHandle pSessionHandle, 1108266b0663SKrzysztof Zdziarski CpaDcSessionUpdateData *pUpdateSessionData) 1109266b0663SKrzysztof Zdziarski { 1110266b0663SKrzysztof Zdziarski return CPA_STATUS_UNSUPPORTED; 1111266b0663SKrzysztof Zdziarski } 1112266b0663SKrzysztof Zdziarski 1113266b0663SKrzysztof Zdziarski CpaStatus 111478ee8d1cSJulian Grajkowski cpaDcRemoveSession(const CpaInstanceHandle dcInstance, 111578ee8d1cSJulian Grajkowski CpaDcSessionHandle pSessionHandle) 111678ee8d1cSJulian Grajkowski { 111778ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS; 111878ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL; 111978ee8d1cSJulian Grajkowski dc_session_desc_t *pSessionDesc = NULL; 112078ee8d1cSJulian Grajkowski Cpa64U numPendingStateless = 0; 112178ee8d1cSJulian Grajkowski Cpa64U numPendingStateful = 0; 112278ee8d1cSJulian Grajkowski icp_comms_trans_handle trans_handle = NULL; 112378ee8d1cSJulian Grajkowski 112478ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionHandle); 112578ee8d1cSJulian Grajkowski pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle); 112678ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionDesc); 112778ee8d1cSJulian Grajkowski 112878ee8d1cSJulian Grajkowski if (CPA_TRUE == pSessionDesc->isDcDp) { 112978ee8d1cSJulian Grajkowski insHandle = dcInstance; 113078ee8d1cSJulian Grajkowski } else { 113178ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) { 113278ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle(); 113378ee8d1cSJulian Grajkowski } else { 113478ee8d1cSJulian Grajkowski insHandle = dcInstance; 113578ee8d1cSJulian Grajkowski } 113678ee8d1cSJulian Grajkowski } 113778ee8d1cSJulian Grajkowski 113878ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle); 113978ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION); 114078ee8d1cSJulian Grajkowski 114178ee8d1cSJulian Grajkowski /* Check if SAL is running otherwise return an error */ 114278ee8d1cSJulian Grajkowski SAL_RUNNING_CHECK(insHandle); 114378ee8d1cSJulian Grajkowski 114478ee8d1cSJulian Grajkowski if (CPA_TRUE == pSessionDesc->isDcDp) { 114578ee8d1cSJulian Grajkowski trans_handle = ((sal_compression_service_t *)insHandle) 114678ee8d1cSJulian Grajkowski ->trans_handle_compression_tx; 114778ee8d1cSJulian Grajkowski 114878ee8d1cSJulian Grajkowski if (CPA_TRUE == icp_adf_queueDataToSend(trans_handle)) { 114978ee8d1cSJulian Grajkowski /* Process the remaining messages on the ring */ 115078ee8d1cSJulian Grajkowski SalQatMsg_updateQueueTail(trans_handle); 115178ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 115278ee8d1cSJulian Grajkowski "There are remaining messages on the ring.\n"); 115378ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 115478ee8d1cSJulian Grajkowski } 115578ee8d1cSJulian Grajkowski 115678ee8d1cSJulian Grajkowski /* Check if there are stateless pending requests */ 115778ee8d1cSJulian Grajkowski if (0 != pSessionDesc->pendingDpStatelessCbCount) { 115878ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 115978ee8d1cSJulian Grajkowski "There are %llu stateless DP requests pending.\n", 116078ee8d1cSJulian Grajkowski (unsigned long long) 116178ee8d1cSJulian Grajkowski pSessionDesc->pendingDpStatelessCbCount); 116278ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY; 116378ee8d1cSJulian Grajkowski } 116478ee8d1cSJulian Grajkowski } else { 116578ee8d1cSJulian Grajkowski numPendingStateless = 116678ee8d1cSJulian Grajkowski qatUtilsAtomicGet(&(pSessionDesc->pendingStatelessCbCount)); 116778ee8d1cSJulian Grajkowski numPendingStateful = 116878ee8d1cSJulian Grajkowski qatUtilsAtomicGet(&(pSessionDesc->pendingStatefulCbCount)); 116978ee8d1cSJulian Grajkowski 117078ee8d1cSJulian Grajkowski /* Check if there are stateless pending requests */ 117178ee8d1cSJulian Grajkowski if (0 != numPendingStateless) { 117278ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 117378ee8d1cSJulian Grajkowski "There are %llu stateless requests pending.\n", 117478ee8d1cSJulian Grajkowski (unsigned long long)numPendingStateless); 117578ee8d1cSJulian Grajkowski status = CPA_STATUS_RETRY; 117678ee8d1cSJulian Grajkowski } 117778ee8d1cSJulian Grajkowski 117878ee8d1cSJulian Grajkowski /* Check if there are stateful pending requests */ 117978ee8d1cSJulian Grajkowski if (0 != numPendingStateful) { 118078ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 118178ee8d1cSJulian Grajkowski "There are %llu stateful requests pending.\n", 118278ee8d1cSJulian Grajkowski (unsigned long long)numPendingStateful); 118378ee8d1cSJulian Grajkowski status = CPA_STATUS_RETRY; 118478ee8d1cSJulian Grajkowski } 118578ee8d1cSJulian Grajkowski if ((CPA_DC_STATEFUL == pSessionDesc->sessState) && 118678ee8d1cSJulian Grajkowski (CPA_STATUS_SUCCESS == status)) { 1187a977168cSMichal Gulbicki LAC_SPINLOCK_DESTROY(&(pSessionDesc->sessionLock)); 118878ee8d1cSJulian Grajkowski } 118978ee8d1cSJulian Grajkowski } 119078ee8d1cSJulian Grajkowski 119178ee8d1cSJulian Grajkowski return status; 119278ee8d1cSJulian Grajkowski } 119378ee8d1cSJulian Grajkowski 119478ee8d1cSJulian Grajkowski CpaStatus 119578ee8d1cSJulian Grajkowski dcGetSessionSize(CpaInstanceHandle dcInstance, 119678ee8d1cSJulian Grajkowski CpaDcSessionSetupData *pSessionData, 119778ee8d1cSJulian Grajkowski Cpa32U *pSessionSize, 119878ee8d1cSJulian Grajkowski Cpa32U *pContextSize) 119978ee8d1cSJulian Grajkowski { 120078ee8d1cSJulian Grajkowski 120178ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS; 120278ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL; 120378ee8d1cSJulian Grajkowski 120478ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) { 120578ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle(); 120678ee8d1cSJulian Grajkowski } else { 120778ee8d1cSJulian Grajkowski insHandle = dcInstance; 120878ee8d1cSJulian Grajkowski } 120978ee8d1cSJulian Grajkowski 121078ee8d1cSJulian Grajkowski /* Check parameters */ 121178ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle); 121278ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionData); 121378ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pSessionSize); 121478ee8d1cSJulian Grajkowski 121578ee8d1cSJulian Grajkowski if (dcCheckSessionData(pSessionData, insHandle) != CPA_STATUS_SUCCESS) { 121678ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM; 121778ee8d1cSJulian Grajkowski } 121878ee8d1cSJulian Grajkowski 121978ee8d1cSJulian Grajkowski /* Get session size for session data */ 122078ee8d1cSJulian Grajkowski *pSessionSize = sizeof(dc_session_desc_t) + LAC_64BYTE_ALIGNMENT + 122178ee8d1cSJulian Grajkowski sizeof(LAC_ARCH_UINT); 122278ee8d1cSJulian Grajkowski 122378ee8d1cSJulian Grajkowski if (NULL != pContextSize) { 122478ee8d1cSJulian Grajkowski status = 122578ee8d1cSJulian Grajkowski dcGetContextSize(insHandle, pSessionData, pContextSize); 122678ee8d1cSJulian Grajkowski 122778ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) { 122878ee8d1cSJulian Grajkowski QAT_UTILS_LOG( 122978ee8d1cSJulian Grajkowski "Unable to get the context size of the session.\n"); 123078ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL; 123178ee8d1cSJulian Grajkowski } 123278ee8d1cSJulian Grajkowski } 123378ee8d1cSJulian Grajkowski 123478ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS; 123578ee8d1cSJulian Grajkowski } 123678ee8d1cSJulian Grajkowski 123778ee8d1cSJulian Grajkowski CpaStatus 123878ee8d1cSJulian Grajkowski cpaDcGetSessionSize(CpaInstanceHandle dcInstance, 123978ee8d1cSJulian Grajkowski CpaDcSessionSetupData *pSessionData, 124078ee8d1cSJulian Grajkowski Cpa32U *pSessionSize, 124178ee8d1cSJulian Grajkowski Cpa32U *pContextSize) 124278ee8d1cSJulian Grajkowski { 124378ee8d1cSJulian Grajkowski 124478ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pContextSize); 124578ee8d1cSJulian Grajkowski 124678ee8d1cSJulian Grajkowski return dcGetSessionSize(dcInstance, 124778ee8d1cSJulian Grajkowski pSessionData, 124878ee8d1cSJulian Grajkowski pSessionSize, 124978ee8d1cSJulian Grajkowski pContextSize); 125078ee8d1cSJulian Grajkowski } 1251a977168cSMichal Gulbicki 1252a977168cSMichal Gulbicki CpaStatus 1253a977168cSMichal Gulbicki dcSetCnvError(CpaInstanceHandle dcInstance, CpaDcSessionHandle pSessionHandle) 1254a977168cSMichal Gulbicki { 1255a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pSessionHandle); 1256a977168cSMichal Gulbicki 1257a977168cSMichal Gulbicki dc_session_desc_t *pSessionDesc = NULL; 1258a977168cSMichal Gulbicki CpaInstanceHandle insHandle = NULL; 1259a977168cSMichal Gulbicki sal_compression_service_t *pService = NULL; 1260a977168cSMichal Gulbicki 1261a977168cSMichal Gulbicki if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) { 1262a977168cSMichal Gulbicki insHandle = dcGetFirstHandle(); 1263a977168cSMichal Gulbicki } else { 1264a977168cSMichal Gulbicki insHandle = dcInstance; 1265a977168cSMichal Gulbicki } 1266a977168cSMichal Gulbicki 1267a977168cSMichal Gulbicki pService = (sal_compression_service_t *)insHandle; 1268a977168cSMichal Gulbicki 1269a977168cSMichal Gulbicki if (isDcGen2x(pService)) { 1270a977168cSMichal Gulbicki QAT_UTILS_LOG("Unsupported compression feature.\n"); 1271a977168cSMichal Gulbicki return CPA_STATUS_UNSUPPORTED; 1272a977168cSMichal Gulbicki } 1273a977168cSMichal Gulbicki pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle); 1274a977168cSMichal Gulbicki 1275a977168cSMichal Gulbicki LAC_CHECK_NULL_PARAM(pSessionDesc); 1276a977168cSMichal Gulbicki 1277a977168cSMichal Gulbicki pSessionDesc->cnvErrorInjection = ICP_QAT_FW_COMP_CNV_DFX; 1278a977168cSMichal Gulbicki 1279a977168cSMichal Gulbicki return CPA_STATUS_SUCCESS; 1280a977168cSMichal Gulbicki } 1281