xref: /freebsd-src/sys/dev/qat/qat_api/common/compression/dc_session.c (revision 357378bbdedf24ce2b90e9bd831af4a9db3ec70a)
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