xref: /freebsd/sys/dev/qat/qat_api/common/compression/dc_datapath.c (revision ded037e65e5239671b1292ec987a2e0894b217b5)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
225f09d4aSHareshx Sankar Raj /* Copyright(c) 2007-2025 Intel Corporation */
378ee8d1cSJulian Grajkowski /**
478ee8d1cSJulian Grajkowski  *****************************************************************************
578ee8d1cSJulian Grajkowski  * @file dc_datapath.c
678ee8d1cSJulian Grajkowski  *
778ee8d1cSJulian Grajkowski  * @defgroup Dc_DataCompression DC Data Compression
878ee8d1cSJulian Grajkowski  *
978ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
1078ee8d1cSJulian Grajkowski  *
1178ee8d1cSJulian Grajkowski  * @description
1278ee8d1cSJulian Grajkowski  *      Implementation of the Data Compression datapath operations.
1378ee8d1cSJulian Grajkowski  *
1478ee8d1cSJulian Grajkowski  *****************************************************************************/
1578ee8d1cSJulian Grajkowski 
1678ee8d1cSJulian Grajkowski /*
1778ee8d1cSJulian Grajkowski *******************************************************************************
1878ee8d1cSJulian Grajkowski * Include public/global header files
1978ee8d1cSJulian Grajkowski *******************************************************************************
2078ee8d1cSJulian Grajkowski */
2178ee8d1cSJulian Grajkowski #include "cpa.h"
2278ee8d1cSJulian Grajkowski #include "cpa_dc.h"
2378ee8d1cSJulian Grajkowski #include "cpa_dc_dp.h"
2478ee8d1cSJulian Grajkowski 
2578ee8d1cSJulian Grajkowski /*
2678ee8d1cSJulian Grajkowski *******************************************************************************
2778ee8d1cSJulian Grajkowski * Include private header files
2878ee8d1cSJulian Grajkowski *******************************************************************************
2978ee8d1cSJulian Grajkowski */
3078ee8d1cSJulian Grajkowski #include "dc_session.h"
3178ee8d1cSJulian Grajkowski #include "dc_datapath.h"
3278ee8d1cSJulian Grajkowski #include "sal_statistics.h"
3378ee8d1cSJulian Grajkowski #include "lac_common.h"
3478ee8d1cSJulian Grajkowski #include "lac_mem.h"
3578ee8d1cSJulian Grajkowski #include "lac_mem_pools.h"
3678ee8d1cSJulian Grajkowski #include "sal_types_compression.h"
3778ee8d1cSJulian Grajkowski #include "dc_stats.h"
3878ee8d1cSJulian Grajkowski #include "lac_buffer_desc.h"
3978ee8d1cSJulian Grajkowski #include "lac_sal.h"
4078ee8d1cSJulian Grajkowski #include "lac_log.h"
4178ee8d1cSJulian Grajkowski #include "lac_sync.h"
4278ee8d1cSJulian Grajkowski #include "sal_service_state.h"
4378ee8d1cSJulian Grajkowski #include "sal_qat_cmn_msg.h"
44a977168cSMichal Gulbicki #include "sal_hw_gen.h"
4578ee8d1cSJulian Grajkowski #include "dc_error_counter.h"
4678ee8d1cSJulian Grajkowski #define DC_COMP_MAX_BUFF_SIZE (1024 * 64)
4778ee8d1cSJulian Grajkowski 
4878ee8d1cSJulian Grajkowski static QatUtilsAtomic dcErrorCount[MAX_DC_ERROR_TYPE];
4978ee8d1cSJulian Grajkowski 
5078ee8d1cSJulian Grajkowski void
dcErrorLog(CpaDcReqStatus dcError)5178ee8d1cSJulian Grajkowski dcErrorLog(CpaDcReqStatus dcError)
5278ee8d1cSJulian Grajkowski {
5378ee8d1cSJulian Grajkowski 	Cpa32U absError = 0;
5478ee8d1cSJulian Grajkowski 
5578ee8d1cSJulian Grajkowski 	absError = abs(dcError);
5678ee8d1cSJulian Grajkowski 	if ((dcError < CPA_DC_OK) && (absError < MAX_DC_ERROR_TYPE)) {
5778ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(dcErrorCount[absError]));
5878ee8d1cSJulian Grajkowski 	}
5978ee8d1cSJulian Grajkowski }
6078ee8d1cSJulian Grajkowski 
6178ee8d1cSJulian Grajkowski Cpa64U
getDcErrorCounter(CpaDcReqStatus dcError)6278ee8d1cSJulian Grajkowski getDcErrorCounter(CpaDcReqStatus dcError)
6378ee8d1cSJulian Grajkowski {
6478ee8d1cSJulian Grajkowski 	Cpa32U absError = 0;
6578ee8d1cSJulian Grajkowski 
6678ee8d1cSJulian Grajkowski 	absError = abs(dcError);
6778ee8d1cSJulian Grajkowski 	if (!(dcError >= CPA_DC_OK || dcError < CPA_DC_EMPTY_DYM_BLK)) {
6878ee8d1cSJulian Grajkowski 		return (Cpa64U)qatUtilsAtomicGet(&dcErrorCount[absError]);
6978ee8d1cSJulian Grajkowski 	}
7078ee8d1cSJulian Grajkowski 
7178ee8d1cSJulian Grajkowski 	return 0;
7278ee8d1cSJulian Grajkowski }
7378ee8d1cSJulian Grajkowski 
74a977168cSMichal Gulbicki static inline void
dcUpdateXltOverflowChecksumsGen4(const dc_compression_cookie_t * pCookie,const icp_qat_fw_resp_comp_pars_t * pRespPars,CpaDcRqResults * pDcResults)75a977168cSMichal Gulbicki dcUpdateXltOverflowChecksumsGen4(const dc_compression_cookie_t *pCookie,
76a977168cSMichal Gulbicki 				 const icp_qat_fw_resp_comp_pars_t *pRespPars,
77a977168cSMichal Gulbicki 				 CpaDcRqResults *pDcResults)
78a977168cSMichal Gulbicki {
79a977168cSMichal Gulbicki 	dc_session_desc_t *pSessionDesc =
80a977168cSMichal Gulbicki 	    DC_SESSION_DESC_FROM_CTX_GET(pCookie->pSessionHandle);
81a977168cSMichal Gulbicki 
82a977168cSMichal Gulbicki 	/* Recompute CRC checksum when either the checksum type
83a977168cSMichal Gulbicki 	 * is CPA_DC_CRC32 or when the integrity CRCs are enabled.
84a977168cSMichal Gulbicki 	 */
85a977168cSMichal Gulbicki 	if (CPA_DC_CRC32 == pSessionDesc->checksumType) {
86a977168cSMichal Gulbicki 		pDcResults->checksum = pRespPars->crc.legacy.curr_crc32;
87a977168cSMichal Gulbicki 
88a977168cSMichal Gulbicki 		/* No need to recalculate the swCrc64I here as this will get
89a977168cSMichal Gulbicki 		 * handled later in dcHandleIntegrityChecksumsGen4.
90a977168cSMichal Gulbicki 		 */
91a977168cSMichal Gulbicki 	} else if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
92a977168cSMichal Gulbicki 		pDcResults->checksum = pRespPars->crc.legacy.curr_adler_32;
93a977168cSMichal Gulbicki 	}
94a977168cSMichal Gulbicki }
95a977168cSMichal Gulbicki 
9678ee8d1cSJulian Grajkowski void
dcCompression_ProcessCallback(void * pRespMsg)9778ee8d1cSJulian Grajkowski dcCompression_ProcessCallback(void *pRespMsg)
9878ee8d1cSJulian Grajkowski {
9978ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
10078ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_resp_t *pCompRespMsg = NULL;
10178ee8d1cSJulian Grajkowski 	void *callbackTag = NULL;
10278ee8d1cSJulian Grajkowski 	Cpa64U *pReqData = NULL;
10378ee8d1cSJulian Grajkowski 	CpaDcDpOpData *pResponse = NULL;
10478ee8d1cSJulian Grajkowski 	CpaDcRqResults *pResults = NULL;
10578ee8d1cSJulian Grajkowski 	CpaDcCallbackFn pCbFunc = NULL;
10678ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
10778ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
10878ee8d1cSJulian Grajkowski 	dc_compression_cookie_t *pCookie = NULL;
10978ee8d1cSJulian Grajkowski 	CpaDcOpData *pOpData = NULL;
11078ee8d1cSJulian Grajkowski 	CpaBoolean cmpPass = CPA_TRUE, xlatPass = CPA_TRUE;
111a977168cSMichal Gulbicki 	CpaBoolean isDcDp = CPA_FALSE;
112a977168cSMichal Gulbicki 	CpaBoolean integrityCrcCheck = CPA_FALSE;
11378ee8d1cSJulian Grajkowski 	CpaBoolean verifyHwIntegrityCrcs = CPA_FALSE;
11478ee8d1cSJulian Grajkowski 	Cpa8U cmpErr = ERR_CODE_NO_ERROR, xlatErr = ERR_CODE_NO_ERROR;
11578ee8d1cSJulian Grajkowski 	dc_request_dir_t compDecomp = DC_COMPRESSION_REQUEST;
11678ee8d1cSJulian Grajkowski 	Cpa8U opStatus = ICP_QAT_FW_COMN_STATUS_FLAG_OK;
11778ee8d1cSJulian Grajkowski 	Cpa8U hdrFlags = 0;
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski 	/* Cast response message to compression response message type */
12078ee8d1cSJulian Grajkowski 	pCompRespMsg = (icp_qat_fw_comp_resp_t *)pRespMsg;
121*ded037e6SHareshx Sankar Raj 	if (!(pCompRespMsg)) {
122*ded037e6SHareshx Sankar Raj 		QAT_UTILS_LOG("pCompRespMsg is NULL\n");
123*ded037e6SHareshx Sankar Raj 		return;
124*ded037e6SHareshx Sankar Raj 	}
12578ee8d1cSJulian Grajkowski 	/* Extract request data pointer from the opaque data */
12678ee8d1cSJulian Grajkowski 	LAC_MEM_SHARED_READ_TO_PTR(pCompRespMsg->opaque_data, pReqData);
127*ded037e6SHareshx Sankar Raj 	if (!(pReqData)) {
128*ded037e6SHareshx Sankar Raj 		QAT_UTILS_LOG("pReqData is NULL\n");
129*ded037e6SHareshx Sankar Raj 		return;
130*ded037e6SHareshx Sankar Raj 	}
13178ee8d1cSJulian Grajkowski 
13278ee8d1cSJulian Grajkowski 	/* Extract fields from the request data structure */
13378ee8d1cSJulian Grajkowski 	pCookie = (dc_compression_cookie_t *)pReqData;
13478ee8d1cSJulian Grajkowski 
135a977168cSMichal Gulbicki 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pCookie->pSessionHandle);
136a977168cSMichal Gulbicki 	pService = (sal_compression_service_t *)(pCookie->dcInstance);
137a977168cSMichal Gulbicki 
138a977168cSMichal Gulbicki 	isDcDp = pSessionDesc->isDcDp;
139a977168cSMichal Gulbicki 	if (CPA_TRUE == isDcDp) {
14078ee8d1cSJulian Grajkowski 		pResponse = (CpaDcDpOpData *)pReqData;
14178ee8d1cSJulian Grajkowski 		pResults = &(pResponse->results);
14278ee8d1cSJulian Grajkowski 
14378ee8d1cSJulian Grajkowski 		if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
14478ee8d1cSJulian Grajkowski 			compDecomp = DC_DECOMPRESSION_REQUEST;
14578ee8d1cSJulian Grajkowski 		}
146a977168cSMichal Gulbicki 		pCookie = NULL;
14778ee8d1cSJulian Grajkowski 	} else {
14878ee8d1cSJulian Grajkowski 		pResults = pCookie->pResults;
14978ee8d1cSJulian Grajkowski 		callbackTag = pCookie->callbackTag;
15078ee8d1cSJulian Grajkowski 		pCbFunc = pCookie->pSessionDesc->pCompressionCb;
15178ee8d1cSJulian Grajkowski 		compDecomp = pCookie->compDecomp;
15278ee8d1cSJulian Grajkowski 		pOpData = pCookie->pDcOpData;
15378ee8d1cSJulian Grajkowski 	}
15478ee8d1cSJulian Grajkowski 
15578ee8d1cSJulian Grajkowski 	opStatus = pCompRespMsg->comn_resp.comn_status;
15678ee8d1cSJulian Grajkowski 
15778ee8d1cSJulian Grajkowski 	if (NULL != pOpData) {
15878ee8d1cSJulian Grajkowski 		verifyHwIntegrityCrcs = pOpData->verifyHwIntegrityCrcs;
159c0a4a7bbSKrzysztof Zdziarski 		integrityCrcCheck = pOpData->integrityCrcCheck;
16078ee8d1cSJulian Grajkowski 	}
16178ee8d1cSJulian Grajkowski 
16278ee8d1cSJulian Grajkowski 	hdrFlags = pCompRespMsg->comn_resp.hdr_flags;
16378ee8d1cSJulian Grajkowski 
16478ee8d1cSJulian Grajkowski 	/* Get the cmp error code */
16578ee8d1cSJulian Grajkowski 	cmpErr = pCompRespMsg->comn_resp.comn_error.s1.cmp_err_code;
16678ee8d1cSJulian Grajkowski 	if (ICP_QAT_FW_COMN_RESP_UNSUPPORTED_REQUEST_STAT_GET(opStatus)) {
16778ee8d1cSJulian Grajkowski 		/* Compression not supported by firmware, set produced/consumed
16878ee8d1cSJulian Grajkowski 		   to zero
16978ee8d1cSJulian Grajkowski 		   and call the cb function with status CPA_STATUS_UNSUPPORTED
17078ee8d1cSJulian Grajkowski 		   */
17178ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Compression feature not supported\n");
17278ee8d1cSJulian Grajkowski 		status = CPA_STATUS_UNSUPPORTED;
17378ee8d1cSJulian Grajkowski 		pResults->status = (Cpa8S)cmpErr;
17478ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
17578ee8d1cSJulian Grajkowski 		pResults->produced = 0;
176a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
17778ee8d1cSJulian Grajkowski 			if (pResponse)
17878ee8d1cSJulian Grajkowski 				pResponse->responseStatus =
17978ee8d1cSJulian Grajkowski 				    CPA_STATUS_UNSUPPORTED;
18078ee8d1cSJulian Grajkowski 			(pService->pDcDpCb)(pResponse);
18178ee8d1cSJulian Grajkowski 		} else {
18278ee8d1cSJulian Grajkowski 			/* Free the memory pool */
18378ee8d1cSJulian Grajkowski 			Lac_MemPoolEntryFree(pCookie);
18478ee8d1cSJulian Grajkowski 			pCookie = NULL;
185c0a4a7bbSKrzysztof Zdziarski 
18678ee8d1cSJulian Grajkowski 			if (NULL != pCbFunc) {
18778ee8d1cSJulian Grajkowski 				pCbFunc(callbackTag, status);
18878ee8d1cSJulian Grajkowski 			}
18978ee8d1cSJulian Grajkowski 		}
19078ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
19178ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCompletedErrors, pService);
19278ee8d1cSJulian Grajkowski 		} else {
19378ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompCompletedErrors,
19478ee8d1cSJulian Grajkowski 					     pService);
19578ee8d1cSJulian Grajkowski 		}
19678ee8d1cSJulian Grajkowski 		return;
19778ee8d1cSJulian Grajkowski 	} else {
19878ee8d1cSJulian Grajkowski 		/* Check compression response status */
19978ee8d1cSJulian Grajkowski 		cmpPass =
20078ee8d1cSJulian Grajkowski 		    (CpaBoolean)(ICP_QAT_FW_COMN_STATUS_FLAG_OK ==
20178ee8d1cSJulian Grajkowski 				 ICP_QAT_FW_COMN_RESP_CMP_STAT_GET(opStatus));
20278ee8d1cSJulian Grajkowski 	}
20378ee8d1cSJulian Grajkowski 
204a977168cSMichal Gulbicki 	if (isDcGen2x(pService)) {
205a977168cSMichal Gulbicki 		/* QAT1.7 and QAT 1.8 hardware */
20678ee8d1cSJulian Grajkowski 		if (CPA_DC_INCOMPLETE_FILE_ERR == (Cpa8S)cmpErr) {
20778ee8d1cSJulian Grajkowski 			cmpPass = CPA_TRUE;
20878ee8d1cSJulian Grajkowski 			cmpErr = ERR_CODE_NO_ERROR;
20978ee8d1cSJulian Grajkowski 		}
210a977168cSMichal Gulbicki 	} else {
211a977168cSMichal Gulbicki 		/* QAT2.0 hardware cancels the incomplete file errors
212a977168cSMichal Gulbicki 		 * only for DEFLATE algorithm.
213a977168cSMichal Gulbicki 		 * Decompression direction is not tested in the callback as
214a977168cSMichal Gulbicki 		 * the request does not allow it.
215a977168cSMichal Gulbicki 		 */
216a977168cSMichal Gulbicki 		if ((pSessionDesc->compType == CPA_DC_DEFLATE) &&
217a977168cSMichal Gulbicki 		    (CPA_DC_INCOMPLETE_FILE_ERR == (Cpa8S)cmpErr)) {
218a977168cSMichal Gulbicki 			cmpPass = CPA_TRUE;
219a977168cSMichal Gulbicki 			cmpErr = ERR_CODE_NO_ERROR;
220a977168cSMichal Gulbicki 		}
221a977168cSMichal Gulbicki 	}
22278ee8d1cSJulian Grajkowski 	/* log the slice hang and endpoint push/pull error inside the response
22378ee8d1cSJulian Grajkowski 	 */
22478ee8d1cSJulian Grajkowski 	if (ERR_CODE_SSM_ERROR == (Cpa8S)cmpErr) {
22578ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
22678ee8d1cSJulian Grajkowski 		    "Slice hang detected on the compression slice.\n");
22778ee8d1cSJulian Grajkowski 	} else if (ERR_CODE_ENDPOINT_ERROR == (Cpa8S)cmpErr) {
22878ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
22978ee8d1cSJulian Grajkowski 		    "PCIe End Point Push/Pull or TI/RI Parity error detected.\n");
23078ee8d1cSJulian Grajkowski 	}
23178ee8d1cSJulian Grajkowski 
23278ee8d1cSJulian Grajkowski 	/* We return the compression error code for now. We would need to update
23378ee8d1cSJulian Grajkowski 	 * the API if we decide to return both error codes */
23478ee8d1cSJulian Grajkowski 	pResults->status = (Cpa8S)cmpErr;
23578ee8d1cSJulian Grajkowski 
23678ee8d1cSJulian Grajkowski 	/* Check the translator status */
23778ee8d1cSJulian Grajkowski 	if ((DC_COMPRESSION_REQUEST == compDecomp) &&
23878ee8d1cSJulian Grajkowski 	    (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType)) {
23978ee8d1cSJulian Grajkowski 		/* Check translator response status */
24078ee8d1cSJulian Grajkowski 		xlatPass =
24178ee8d1cSJulian Grajkowski 		    (CpaBoolean)(ICP_QAT_FW_COMN_STATUS_FLAG_OK ==
24278ee8d1cSJulian Grajkowski 				 ICP_QAT_FW_COMN_RESP_XLAT_STAT_GET(opStatus));
24378ee8d1cSJulian Grajkowski 
24478ee8d1cSJulian Grajkowski 		/* Get the translator error code */
24578ee8d1cSJulian Grajkowski 		xlatErr = pCompRespMsg->comn_resp.comn_error.s1.xlat_err_code;
24678ee8d1cSJulian Grajkowski 
24778ee8d1cSJulian Grajkowski 		/* Return a fatal error or a potential error in the translator
248a977168cSMichal Gulbicki 		 * slice if the compression slice did not return any error */
24978ee8d1cSJulian Grajkowski 		if ((CPA_DC_OK == pResults->status) ||
25078ee8d1cSJulian Grajkowski 		    (CPA_DC_FATALERR == (Cpa8S)xlatErr)) {
25178ee8d1cSJulian Grajkowski 			pResults->status = (Cpa8S)xlatErr;
25278ee8d1cSJulian Grajkowski 		}
25378ee8d1cSJulian Grajkowski 	}
25478ee8d1cSJulian Grajkowski 	/* Update dc error counter */
25578ee8d1cSJulian Grajkowski 	dcErrorLog(pResults->status);
25678ee8d1cSJulian Grajkowski 
257a977168cSMichal Gulbicki 	if (CPA_FALSE == isDcDp) {
25878ee8d1cSJulian Grajkowski 		/* In case of any error for an end of packet request, we need to
25978ee8d1cSJulian Grajkowski 		 * update
26078ee8d1cSJulian Grajkowski 		 * the request type for the following request */
26178ee8d1cSJulian Grajkowski 		if (CPA_DC_FLUSH_FINAL == pCookie->flushFlag && cmpPass &&
26278ee8d1cSJulian Grajkowski 		    xlatPass) {
26378ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_FIRST;
26478ee8d1cSJulian Grajkowski 		} else {
26578ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_SUBSEQUENT;
26678ee8d1cSJulian Grajkowski 		}
26778ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) ||
26878ee8d1cSJulian Grajkowski 		    ((CPA_DC_STATELESS == pSessionDesc->sessState) &&
26978ee8d1cSJulian Grajkowski 		     (DC_COMPRESSION_REQUEST == compDecomp))) {
27078ee8d1cSJulian Grajkowski 			/* Overflow is a valid use case for Traditional API
271a977168cSMichal Gulbicki 			 * only. Stateful Overflow is supported in both
272a977168cSMichal Gulbicki 			 * compression and decompression direction. Stateless
273a977168cSMichal Gulbicki 			 * Overflow is supported only in compression direction.
27478ee8d1cSJulian Grajkowski 			 */
27578ee8d1cSJulian Grajkowski 			if (CPA_DC_OVERFLOW == (Cpa8S)cmpErr)
27678ee8d1cSJulian Grajkowski 				cmpPass = CPA_TRUE;
27778ee8d1cSJulian Grajkowski 
27878ee8d1cSJulian Grajkowski 			if (CPA_DC_OVERFLOW == (Cpa8S)xlatErr) {
279a977168cSMichal Gulbicki 				if (isDcGen4x(pService) &&
280a977168cSMichal Gulbicki 				    (CPA_TRUE ==
281a977168cSMichal Gulbicki 				     pService->comp_device_data
282a977168cSMichal Gulbicki 					 .translatorOverflow)) {
283a977168cSMichal Gulbicki 					pResults->consumed =
284a977168cSMichal Gulbicki 					    pCompRespMsg->comp_resp_pars
285a977168cSMichal Gulbicki 						.input_byte_counter;
286a977168cSMichal Gulbicki 
287a977168cSMichal Gulbicki 					dcUpdateXltOverflowChecksumsGen4(
288a977168cSMichal Gulbicki 					    pCookie,
289a977168cSMichal Gulbicki 					    &pCompRespMsg->comp_resp_pars,
290a977168cSMichal Gulbicki 					    pResults);
291a977168cSMichal Gulbicki 				}
29278ee8d1cSJulian Grajkowski 				xlatPass = CPA_TRUE;
29378ee8d1cSJulian Grajkowski 			}
29478ee8d1cSJulian Grajkowski 		}
29578ee8d1cSJulian Grajkowski 	} else {
29678ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == (Cpa8S)cmpErr) {
29778ee8d1cSJulian Grajkowski 			cmpPass = CPA_FALSE;
29878ee8d1cSJulian Grajkowski 		}
29978ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == (Cpa8S)xlatErr) {
300a977168cSMichal Gulbicki 			/* XLT overflow is not valid for Data Plane requests */
30178ee8d1cSJulian Grajkowski 			xlatPass = CPA_FALSE;
30278ee8d1cSJulian Grajkowski 		}
30378ee8d1cSJulian Grajkowski 	}
30478ee8d1cSJulian Grajkowski 
30578ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == cmpPass) && (CPA_TRUE == xlatPass)) {
30678ee8d1cSJulian Grajkowski 		/* Extract the response from the firmware */
30778ee8d1cSJulian Grajkowski 		pResults->consumed =
30878ee8d1cSJulian Grajkowski 		    pCompRespMsg->comp_resp_pars.input_byte_counter;
30978ee8d1cSJulian Grajkowski 		pResults->produced =
31078ee8d1cSJulian Grajkowski 		    pCompRespMsg->comp_resp_pars.output_byte_counter;
31178ee8d1cSJulian Grajkowski 		pSessionDesc->cumulativeConsumedBytes += pResults->consumed;
31278ee8d1cSJulian Grajkowski 
313a977168cSMichal Gulbicki 		/* Handle Checksum for end to end data integrity. */
314a977168cSMichal Gulbicki 		if (CPA_TRUE ==
315a977168cSMichal Gulbicki 			pService->generic_service_info.integrityCrcCheck &&
316a977168cSMichal Gulbicki 		    CPA_TRUE == integrityCrcCheck) {
317a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum =
318a977168cSMichal Gulbicki 			    pSessionDesc->seedSwCrc.swCrc32I;
319a977168cSMichal Gulbicki 		} else if (CPA_DC_OVERFLOW != (Cpa8S)xlatErr) {
32078ee8d1cSJulian Grajkowski 			if (CPA_DC_CRC32 == pSessionDesc->checksumType) {
32178ee8d1cSJulian Grajkowski 				pResults->checksum =
32278ee8d1cSJulian Grajkowski 				    pCompRespMsg->comp_resp_pars.crc.legacy
32378ee8d1cSJulian Grajkowski 					.curr_crc32;
32478ee8d1cSJulian Grajkowski 			} else if (CPA_DC_ADLER32 ==
32578ee8d1cSJulian Grajkowski 				   pSessionDesc->checksumType) {
32678ee8d1cSJulian Grajkowski 				pResults->checksum =
32778ee8d1cSJulian Grajkowski 				    pCompRespMsg->comp_resp_pars.crc.legacy
32878ee8d1cSJulian Grajkowski 					.curr_adler_32;
32978ee8d1cSJulian Grajkowski 			}
33078ee8d1cSJulian Grajkowski 			pSessionDesc->previousChecksum = pResults->checksum;
33178ee8d1cSJulian Grajkowski 		}
33278ee8d1cSJulian Grajkowski 
33378ee8d1cSJulian Grajkowski 		if (DC_DECOMPRESSION_REQUEST == compDecomp) {
33478ee8d1cSJulian Grajkowski 			pResults->endOfLastBlock =
33578ee8d1cSJulian Grajkowski 			    (ICP_QAT_FW_COMN_STATUS_CMP_END_OF_LAST_BLK_FLAG_SET ==
33678ee8d1cSJulian Grajkowski 			     ICP_QAT_FW_COMN_RESP_CMP_END_OF_LAST_BLK_FLAG_GET(
33778ee8d1cSJulian Grajkowski 				 opStatus));
338266b0663SKrzysztof Zdziarski 		} else {
339266b0663SKrzysztof Zdziarski 			/* Check if returned data is a stored block
340266b0663SKrzysztof Zdziarski 			 * in compression direction
341266b0663SKrzysztof Zdziarski 			 */
342266b0663SKrzysztof Zdziarski 			pResults->dataUncompressed =
343266b0663SKrzysztof Zdziarski 			    ICP_QAT_FW_COMN_HDR_ST_BLK_FLAG_GET(hdrFlags);
34478ee8d1cSJulian Grajkowski 		}
34578ee8d1cSJulian Grajkowski 
34678ee8d1cSJulian Grajkowski 		/* Save the checksum for the next request */
34778ee8d1cSJulian Grajkowski 		if ((CPA_DC_OVERFLOW != (Cpa8S)xlatErr) &&
34878ee8d1cSJulian Grajkowski 		    (CPA_TRUE == verifyHwIntegrityCrcs)) {
34978ee8d1cSJulian Grajkowski 			pSessionDesc->previousChecksum =
350a977168cSMichal Gulbicki 			    pSessionDesc->seedSwCrc.swCrc32I;
35178ee8d1cSJulian Grajkowski 		}
35278ee8d1cSJulian Grajkowski 
35378ee8d1cSJulian Grajkowski 		/* Check if a CNV recovery happened and
35478ee8d1cSJulian Grajkowski 		 * increase stats counter
35578ee8d1cSJulian Grajkowski 		 */
35678ee8d1cSJulian Grajkowski 		if ((DC_COMPRESSION_REQUEST == compDecomp) &&
35778ee8d1cSJulian Grajkowski 		    ICP_QAT_FW_COMN_HDR_CNV_FLAG_GET(hdrFlags) &&
35878ee8d1cSJulian Grajkowski 		    ICP_QAT_FW_COMN_HDR_CNVNR_FLAG_GET(hdrFlags)) {
35978ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCnvErrorsRecovered,
36078ee8d1cSJulian Grajkowski 					     pService);
36178ee8d1cSJulian Grajkowski 		}
36278ee8d1cSJulian Grajkowski 
363a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
36478ee8d1cSJulian Grajkowski 			if (pResponse)
36578ee8d1cSJulian Grajkowski 				pResponse->responseStatus = CPA_STATUS_SUCCESS;
36678ee8d1cSJulian Grajkowski 		} else {
36778ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
36878ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numCompCompleted,
36978ee8d1cSJulian Grajkowski 						     pService);
37078ee8d1cSJulian Grajkowski 			} else {
37178ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numDecompCompleted,
37278ee8d1cSJulian Grajkowski 						     pService);
37378ee8d1cSJulian Grajkowski 			}
37478ee8d1cSJulian Grajkowski 		}
37578ee8d1cSJulian Grajkowski 	} else {
376a977168cSMichal Gulbicki #ifdef ICP_DC_RETURN_COUNTERS_ON_ERROR
377a977168cSMichal Gulbicki 		/* Extract the response from the firmware */
378a977168cSMichal Gulbicki 		pResults->consumed =
379a977168cSMichal Gulbicki 		    pCompRespMsg->comp_resp_pars.input_byte_counter;
380a977168cSMichal Gulbicki 		pResults->produced =
381a977168cSMichal Gulbicki 		    pCompRespMsg->comp_resp_pars.output_byte_counter;
382a977168cSMichal Gulbicki 
383a977168cSMichal Gulbicki 		if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
384a977168cSMichal Gulbicki 			pSessionDesc->cumulativeConsumedBytes +=
385a977168cSMichal Gulbicki 			    pResults->consumed;
386a977168cSMichal Gulbicki 		} else {
387a977168cSMichal Gulbicki 			/* In the stateless case all requests have both SOP and
388a977168cSMichal Gulbicki 			 * EOP set */
389a977168cSMichal Gulbicki 			pSessionDesc->cumulativeConsumedBytes =
390a977168cSMichal Gulbicki 			    pResults->consumed;
391a977168cSMichal Gulbicki 		}
392a977168cSMichal Gulbicki #else
39378ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
39478ee8d1cSJulian Grajkowski 		pResults->produced = 0;
395a977168cSMichal Gulbicki #endif
39678ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == pResults->status &&
39778ee8d1cSJulian Grajkowski 		    CPA_DC_STATELESS == pSessionDesc->sessState) {
39878ee8d1cSJulian Grajkowski 			/* This error message will be returned by Data Plane API
39978ee8d1cSJulian Grajkowski 			 * in both
40078ee8d1cSJulian Grajkowski 			 * compression and decompression direction. With
40178ee8d1cSJulian Grajkowski 			 * Traditional API
40278ee8d1cSJulian Grajkowski 			 * this error message will be returned only in stateless
40378ee8d1cSJulian Grajkowski 			 * decompression direction */
40478ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
40578ee8d1cSJulian Grajkowski 			    "Unrecoverable error: stateless overflow. You may need to increase the size of your destination buffer.\n");
40678ee8d1cSJulian Grajkowski 		}
40778ee8d1cSJulian Grajkowski 
408a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
40978ee8d1cSJulian Grajkowski 			if (pResponse)
41078ee8d1cSJulian Grajkowski 				pResponse->responseStatus = CPA_STATUS_FAIL;
41178ee8d1cSJulian Grajkowski 		} else {
41278ee8d1cSJulian Grajkowski 			if (CPA_DC_OK != pResults->status &&
41378ee8d1cSJulian Grajkowski 			    CPA_DC_INCOMPLETE_FILE_ERR != pResults->status) {
41478ee8d1cSJulian Grajkowski 				status = CPA_STATUS_FAIL;
41578ee8d1cSJulian Grajkowski 			}
41678ee8d1cSJulian Grajkowski 
41778ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
41878ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numCompCompletedErrors,
41978ee8d1cSJulian Grajkowski 						     pService);
42078ee8d1cSJulian Grajkowski 			} else {
42178ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numDecompCompletedErrors,
42278ee8d1cSJulian Grajkowski 						     pService);
42378ee8d1cSJulian Grajkowski 			}
42478ee8d1cSJulian Grajkowski 		}
42578ee8d1cSJulian Grajkowski 	}
42678ee8d1cSJulian Grajkowski 
427a977168cSMichal Gulbicki 	if (CPA_TRUE == isDcDp) {
42878ee8d1cSJulian Grajkowski 		/* Decrement number of stateless pending callbacks for session
42978ee8d1cSJulian Grajkowski 		 */
43078ee8d1cSJulian Grajkowski 		pSessionDesc->pendingDpStatelessCbCount--;
43178ee8d1cSJulian Grajkowski 		(pService->pDcDpCb)(pResponse);
43278ee8d1cSJulian Grajkowski 	} else {
43378ee8d1cSJulian Grajkowski 		/* Decrement number of pending callbacks for session */
43478ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
43578ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
43678ee8d1cSJulian Grajkowski 			    &(pCookie->pSessionDesc->pendingStatelessCbCount));
43778ee8d1cSJulian Grajkowski 		} else if (0 !=
43878ee8d1cSJulian Grajkowski 			   qatUtilsAtomicGet(&pCookie->pSessionDesc
43978ee8d1cSJulian Grajkowski 						  ->pendingStatefulCbCount)) {
44078ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
44178ee8d1cSJulian Grajkowski 			    &(pCookie->pSessionDesc->pendingStatefulCbCount));
44278ee8d1cSJulian Grajkowski 		}
44378ee8d1cSJulian Grajkowski 
44478ee8d1cSJulian Grajkowski 		/* Free the memory pool */
44578ee8d1cSJulian Grajkowski 		Lac_MemPoolEntryFree(pCookie);
44678ee8d1cSJulian Grajkowski 		pCookie = NULL;
44778ee8d1cSJulian Grajkowski 
44878ee8d1cSJulian Grajkowski 		if (NULL != pCbFunc) {
44978ee8d1cSJulian Grajkowski 			pCbFunc(callbackTag, status);
45078ee8d1cSJulian Grajkowski 		}
45178ee8d1cSJulian Grajkowski 	}
45278ee8d1cSJulian Grajkowski }
45378ee8d1cSJulian Grajkowski 
45478ee8d1cSJulian Grajkowski /**
45578ee8d1cSJulian Grajkowski  *****************************************************************************
45678ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
45778ee8d1cSJulian Grajkowski  *      Check that all the parameters in the pOpData structure are valid
45878ee8d1cSJulian Grajkowski  *
45978ee8d1cSJulian Grajkowski  * @description
46078ee8d1cSJulian Grajkowski  *      Check that all the parameters in the pOpData structure are valid
46178ee8d1cSJulian Grajkowski  *
46278ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
46378ee8d1cSJulian Grajkowski  * @param[in]   pOpData               Pointer to request information structure
46478ee8d1cSJulian Grajkowski  *                                    holding parameters for cpaDcCompress2 and
46578ee8d1cSJulian Grajkowski  *                                    CpaDcDecompressData2
46678ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
46778ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
46878ee8d1cSJulian Grajkowski  *
46978ee8d1cSJulian Grajkowski  *****************************************************************************/
470a977168cSMichal Gulbicki CpaStatus
dcCheckOpData(sal_compression_service_t * pService,CpaDcOpData * pOpData)47178ee8d1cSJulian Grajkowski dcCheckOpData(sal_compression_service_t *pService, CpaDcOpData *pOpData)
47278ee8d1cSJulian Grajkowski {
47378ee8d1cSJulian Grajkowski 	CpaDcSkipMode skipMode = 0;
47478ee8d1cSJulian Grajkowski 
47578ee8d1cSJulian Grajkowski 	if ((pOpData->flushFlag < CPA_DC_FLUSH_NONE) ||
47678ee8d1cSJulian Grajkowski 	    (pOpData->flushFlag > CPA_DC_FLUSH_FULL)) {
47778ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid flushFlag value");
47878ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
47978ee8d1cSJulian Grajkowski 	}
48078ee8d1cSJulian Grajkowski 
48178ee8d1cSJulian Grajkowski 	skipMode = pOpData->inputSkipData.skipMode;
48278ee8d1cSJulian Grajkowski 	if ((skipMode < CPA_DC_SKIP_DISABLED) ||
48378ee8d1cSJulian Grajkowski 	    (skipMode > CPA_DC_SKIP_STRIDE)) {
48478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid input skip mode value");
48578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
48678ee8d1cSJulian Grajkowski 	}
48778ee8d1cSJulian Grajkowski 
48878ee8d1cSJulian Grajkowski 	skipMode = pOpData->outputSkipData.skipMode;
48978ee8d1cSJulian Grajkowski 	if ((skipMode < CPA_DC_SKIP_DISABLED) ||
49078ee8d1cSJulian Grajkowski 	    (skipMode > CPA_DC_SKIP_STRIDE)) {
49178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid output skip mode value");
49278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
49378ee8d1cSJulian Grajkowski 	}
49478ee8d1cSJulian Grajkowski 
49578ee8d1cSJulian Grajkowski 	if (pOpData->integrityCrcCheck == CPA_FALSE &&
49678ee8d1cSJulian Grajkowski 	    pOpData->verifyHwIntegrityCrcs == CPA_TRUE) {
49778ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
49878ee8d1cSJulian Grajkowski 		    "integrityCrcCheck must be set to true"
49978ee8d1cSJulian Grajkowski 		    "in order to enable verifyHwIntegrityCrcs");
50078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
50178ee8d1cSJulian Grajkowski 	}
50278ee8d1cSJulian Grajkowski 
50378ee8d1cSJulian Grajkowski 	if (pOpData->integrityCrcCheck != CPA_TRUE &&
50478ee8d1cSJulian Grajkowski 	    pOpData->integrityCrcCheck != CPA_FALSE) {
50578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid integrityCrcCheck value");
50678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
50778ee8d1cSJulian Grajkowski 	}
50878ee8d1cSJulian Grajkowski 
50978ee8d1cSJulian Grajkowski 	if (pOpData->verifyHwIntegrityCrcs != CPA_TRUE &&
51078ee8d1cSJulian Grajkowski 	    pOpData->verifyHwIntegrityCrcs != CPA_FALSE) {
51178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid verifyHwIntegrityCrcs value");
51278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
51378ee8d1cSJulian Grajkowski 	}
51478ee8d1cSJulian Grajkowski 
51578ee8d1cSJulian Grajkowski 	if (pOpData->compressAndVerify != CPA_TRUE &&
51678ee8d1cSJulian Grajkowski 	    pOpData->compressAndVerify != CPA_FALSE) {
51778ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid cnv decompress check value");
51878ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
51978ee8d1cSJulian Grajkowski 	}
52078ee8d1cSJulian Grajkowski 
52178ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->integrityCrcCheck &&
52278ee8d1cSJulian Grajkowski 	    CPA_FALSE == pService->generic_service_info.integrityCrcCheck) {
52378ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Integrity CRC check is not "
52478ee8d1cSJulian Grajkowski 				      "supported on this device");
52578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
52678ee8d1cSJulian Grajkowski 	}
527a977168cSMichal Gulbicki 
528a977168cSMichal Gulbicki 	if (CPA_TRUE == pOpData->integrityCrcCheck &&
529a977168cSMichal Gulbicki 	    NULL == pOpData->pCrcData) {
530a977168cSMichal Gulbicki 		LAC_INVALID_PARAM_LOG("Integrity CRC data structure "
53125f09d4aSHareshx Sankar Raj 				      "not initialized in CpaDcOpData");
532a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
533a977168cSMichal Gulbicki 	}
534a977168cSMichal Gulbicki 
53578ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
53678ee8d1cSJulian Grajkowski }
53778ee8d1cSJulian Grajkowski 
53878ee8d1cSJulian Grajkowski /**
53978ee8d1cSJulian Grajkowski  *****************************************************************************
54078ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
54178ee8d1cSJulian Grajkowski  *      Check the compression source buffer for Batch and Pack API.
54278ee8d1cSJulian Grajkowski  *
54378ee8d1cSJulian Grajkowski  * @description
54478ee8d1cSJulian Grajkowski  *      Check that all the parameters used for Pack compression
54578ee8d1cSJulian Grajkowski  *      request are valid. This function essentially checks the source buffer
54678ee8d1cSJulian Grajkowski  *      parameters and results structure parameters.
54778ee8d1cSJulian Grajkowski  *
54878ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle        Session handle
54978ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff              Pointer to data buffer for compression
55078ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff             Pointer to buffer space allocated for
55178ee8d1cSJulian Grajkowski  *                                    output data
55278ee8d1cSJulian Grajkowski  * @param[in]   pResults              Pointer to results structure
55378ee8d1cSJulian Grajkowski  * @param[in]   flushFlag             Indicates the type of flush to be
55478ee8d1cSJulian Grajkowski  *                                    performed
55578ee8d1cSJulian Grajkowski  * @param[in]   srcBuffSize           Size of the source buffer
55678ee8d1cSJulian Grajkowski  *
55778ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
55878ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
55978ee8d1cSJulian Grajkowski  *
56078ee8d1cSJulian Grajkowski  *****************************************************************************/
56178ee8d1cSJulian Grajkowski static CpaStatus
dcCheckSourceData(CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,Cpa64U srcBuffSize,CpaDcSkipData * skipData)56278ee8d1cSJulian Grajkowski dcCheckSourceData(CpaDcSessionHandle pSessionHandle,
56378ee8d1cSJulian Grajkowski 		  CpaBufferList *pSrcBuff,
56478ee8d1cSJulian Grajkowski 		  CpaBufferList *pDestBuff,
56578ee8d1cSJulian Grajkowski 		  CpaDcRqResults *pResults,
56678ee8d1cSJulian Grajkowski 		  CpaDcFlush flushFlag,
56778ee8d1cSJulian Grajkowski 		  Cpa64U srcBuffSize,
56878ee8d1cSJulian Grajkowski 		  CpaDcSkipData *skipData)
56978ee8d1cSJulian Grajkowski {
57078ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
57178ee8d1cSJulian Grajkowski 
57278ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
57378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSrcBuff);
57478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pDestBuff);
57578ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pResults);
57678ee8d1cSJulian Grajkowski 
57778ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
57878ee8d1cSJulian Grajkowski 	if (NULL == pSessionDesc) {
57978ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Session handle not as expected");
58078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
58178ee8d1cSJulian Grajkowski 	}
58278ee8d1cSJulian Grajkowski 
58378ee8d1cSJulian Grajkowski 	if ((flushFlag < CPA_DC_FLUSH_NONE) ||
58478ee8d1cSJulian Grajkowski 	    (flushFlag > CPA_DC_FLUSH_FULL)) {
58578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid flushFlag value");
58678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
58778ee8d1cSJulian Grajkowski 	}
58878ee8d1cSJulian Grajkowski 
58978ee8d1cSJulian Grajkowski 	if (pSrcBuff == pDestBuff) {
59078ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("In place operation not supported");
59178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
59278ee8d1cSJulian Grajkowski 	}
59378ee8d1cSJulian Grajkowski 
59478ee8d1cSJulian Grajkowski 	/* Compressing zero bytes is not supported for stateless sessions
59578ee8d1cSJulian Grajkowski 	 * for non Batch and Pack requests */
59678ee8d1cSJulian Grajkowski 	if ((CPA_DC_STATELESS == pSessionDesc->sessState) &&
59778ee8d1cSJulian Grajkowski 	    (0 == srcBuffSize) && (NULL == skipData)) {
59878ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
59978ee8d1cSJulian Grajkowski 		    "The source buffer size needs to be greater than "
60078ee8d1cSJulian Grajkowski 		    "zero bytes for stateless sessions");
60178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
60278ee8d1cSJulian Grajkowski 	}
60378ee8d1cSJulian Grajkowski 
60478ee8d1cSJulian Grajkowski 	if (srcBuffSize > DC_BUFFER_MAX_SIZE) {
60578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
60678ee8d1cSJulian Grajkowski 		    "The source buffer size needs to be less than or "
60778ee8d1cSJulian Grajkowski 		    "equal to 2^32-1 bytes");
60878ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
60978ee8d1cSJulian Grajkowski 	}
61078ee8d1cSJulian Grajkowski 
61178ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
61278ee8d1cSJulian Grajkowski }
61378ee8d1cSJulian Grajkowski 
61478ee8d1cSJulian Grajkowski /**
61578ee8d1cSJulian Grajkowski  *****************************************************************************
61678ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
61778ee8d1cSJulian Grajkowski  *      Check the compression or decompression function parameters.
61878ee8d1cSJulian Grajkowski  *
61978ee8d1cSJulian Grajkowski  * @description
62078ee8d1cSJulian Grajkowski  *      Check that all the parameters used for a Batch and Pack compression
62178ee8d1cSJulian Grajkowski  *      request are valid. This function essentially checks the destination
62278ee8d1cSJulian Grajkowski  *      buffer parameters and intermediate buffer parameters.
62378ee8d1cSJulian Grajkowski  *
62478ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
62578ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle        Session handle
62678ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff             Pointer to buffer space allocated for
62778ee8d1cSJulian Grajkowski  *                                    output data
62878ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
62978ee8d1cSJulian Grajkowski  *
63078ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
63178ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
63278ee8d1cSJulian Grajkowski  *
63378ee8d1cSJulian Grajkowski  *****************************************************************************/
63478ee8d1cSJulian Grajkowski static CpaStatus
dcCheckDestinationData(sal_compression_service_t * pService,CpaDcSessionHandle pSessionHandle,CpaBufferList * pDestBuff,dc_request_dir_t compDecomp)63578ee8d1cSJulian Grajkowski dcCheckDestinationData(sal_compression_service_t *pService,
63678ee8d1cSJulian Grajkowski 		       CpaDcSessionHandle pSessionHandle,
63778ee8d1cSJulian Grajkowski 		       CpaBufferList *pDestBuff,
63878ee8d1cSJulian Grajkowski 		       dc_request_dir_t compDecomp)
63978ee8d1cSJulian Grajkowski {
64078ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
64178ee8d1cSJulian Grajkowski 	Cpa64U destBuffSize = 0;
64278ee8d1cSJulian Grajkowski 
64378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
64478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pDestBuff);
64578ee8d1cSJulian Grajkowski 
64678ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
64778ee8d1cSJulian Grajkowski 	if (NULL == pSessionDesc) {
64878ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Session handle not as expected");
64978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
65078ee8d1cSJulian Grajkowski 	}
65178ee8d1cSJulian Grajkowski 
65278ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerify(pDestBuff,
65378ee8d1cSJulian Grajkowski 					 &destBuffSize,
65478ee8d1cSJulian Grajkowski 					 LAC_NO_ALIGNMENT_SHIFT) !=
65578ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
65678ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
65778ee8d1cSJulian Grajkowski 		    "Invalid destination buffer list parameter");
65878ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
65978ee8d1cSJulian Grajkowski 	}
66078ee8d1cSJulian Grajkowski 
66178ee8d1cSJulian Grajkowski 	if (destBuffSize > DC_BUFFER_MAX_SIZE) {
66278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
66378ee8d1cSJulian Grajkowski 		    "The destination buffer size needs to be less "
66478ee8d1cSJulian Grajkowski 		    "than or equal to 2^32-1 bytes");
66578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
66678ee8d1cSJulian Grajkowski 	}
66778ee8d1cSJulian Grajkowski 
66878ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pSessionDesc->isDcDp) {
66978ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
67078ee8d1cSJulian Grajkowski 		    "The session type should not be data plane");
67178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
67278ee8d1cSJulian Grajkowski 	}
67378ee8d1cSJulian Grajkowski 
67478ee8d1cSJulian Grajkowski 	if (DC_COMPRESSION_REQUEST == compDecomp) {
67578ee8d1cSJulian Grajkowski 		if (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType) {
67678ee8d1cSJulian Grajkowski 
67778ee8d1cSJulian Grajkowski 			/* Check if intermediate buffers are supported */
678a977168cSMichal Gulbicki 			if ((isDcGen2x(pService)) &&
679a977168cSMichal Gulbicki 			    ((0 == pService->pInterBuffPtrsArrayPhyAddr) ||
680a977168cSMichal Gulbicki 			     (NULL == pService->pInterBuffPtrsArray))) {
68178ee8d1cSJulian Grajkowski 				LAC_LOG_ERROR(
68278ee8d1cSJulian Grajkowski 				    "No intermediate buffer defined for this instance "
68378ee8d1cSJulian Grajkowski 				    "- see cpaDcStartInstance");
68478ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
68578ee8d1cSJulian Grajkowski 			}
68678ee8d1cSJulian Grajkowski 
68778ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer size is greater or
68878ee8d1cSJulian Grajkowski 			 * equal to 128B */
68978ee8d1cSJulian Grajkowski 			if (destBuffSize < DC_DEST_BUFFER_DYN_MIN_SIZE) {
69078ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG(
69178ee8d1cSJulian Grajkowski 				    "Destination buffer size should be "
69278ee8d1cSJulian Grajkowski 				    "greater or equal to 128B");
69378ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
69478ee8d1cSJulian Grajkowski 			}
69578ee8d1cSJulian Grajkowski 		} else
69678ee8d1cSJulian Grajkowski 		{
69778ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer size is greater or
69878ee8d1cSJulian Grajkowski 			 * equal to devices min output buff size */
69978ee8d1cSJulian Grajkowski 			if (destBuffSize <
70078ee8d1cSJulian Grajkowski 			    pService->comp_device_data.minOutputBuffSize) {
70178ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG1(
70278ee8d1cSJulian Grajkowski 				    "Destination buffer size should be "
70378ee8d1cSJulian Grajkowski 				    "greater or equal to %d bytes",
70478ee8d1cSJulian Grajkowski 				    pService->comp_device_data
70578ee8d1cSJulian Grajkowski 					.minOutputBuffSize);
70678ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
70778ee8d1cSJulian Grajkowski 			}
70878ee8d1cSJulian Grajkowski 		}
70978ee8d1cSJulian Grajkowski 	} else {
71078ee8d1cSJulian Grajkowski 		/* Ensure that the destination buffer size is greater than
71178ee8d1cSJulian Grajkowski 		 * 0 bytes */
71278ee8d1cSJulian Grajkowski 		if (destBuffSize < DC_DEST_BUFFER_DEC_MIN_SIZE) {
71378ee8d1cSJulian Grajkowski 			LAC_INVALID_PARAM_LOG(
71478ee8d1cSJulian Grajkowski 			    "Destination buffer size should be "
71578ee8d1cSJulian Grajkowski 			    "greater than 0 bytes");
71678ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
71778ee8d1cSJulian Grajkowski 		}
71878ee8d1cSJulian Grajkowski 	}
71978ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
72078ee8d1cSJulian Grajkowski }
72178ee8d1cSJulian Grajkowski 
72278ee8d1cSJulian Grajkowski /**
72378ee8d1cSJulian Grajkowski  *****************************************************************************
72478ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
72578ee8d1cSJulian Grajkowski  *      Populate the compression request parameters
72678ee8d1cSJulian Grajkowski  *
72778ee8d1cSJulian Grajkowski  * @description
72878ee8d1cSJulian Grajkowski  *      This function will populate the compression request parameters
72978ee8d1cSJulian Grajkowski  *
73078ee8d1cSJulian Grajkowski  * @param[out]  pCompReqParams   Pointer to the compression request parameters
73178ee8d1cSJulian Grajkowski  * @param[in]   pCookie          Pointer to the compression cookie
73278ee8d1cSJulian Grajkowski  *
73378ee8d1cSJulian Grajkowski  *****************************************************************************/
73478ee8d1cSJulian Grajkowski static void
dcCompRequestParamsPopulate(icp_qat_fw_comp_req_params_t * pCompReqParams,dc_compression_cookie_t * pCookie)73578ee8d1cSJulian Grajkowski dcCompRequestParamsPopulate(icp_qat_fw_comp_req_params_t *pCompReqParams,
73678ee8d1cSJulian Grajkowski 			    dc_compression_cookie_t *pCookie)
73778ee8d1cSJulian Grajkowski {
73878ee8d1cSJulian Grajkowski 	pCompReqParams->comp_len = pCookie->srcTotalDataLenInBytes;
73978ee8d1cSJulian Grajkowski 	pCompReqParams->out_buffer_sz = pCookie->dstTotalDataLenInBytes;
74078ee8d1cSJulian Grajkowski }
74178ee8d1cSJulian Grajkowski 
74278ee8d1cSJulian Grajkowski /**
74378ee8d1cSJulian Grajkowski  *****************************************************************************
74478ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
74578ee8d1cSJulian Grajkowski  *      Create the requests for compression or decompression
74678ee8d1cSJulian Grajkowski  *
74778ee8d1cSJulian Grajkowski  * @description
74878ee8d1cSJulian Grajkowski  *      Create the requests for compression or decompression. This function
74978ee8d1cSJulian Grajkowski  *      will update the cookie will all required information.
75078ee8d1cSJulian Grajkowski  *
75178ee8d1cSJulian Grajkowski  * @param{out]  pCookie             Pointer to the compression cookie
75278ee8d1cSJulian Grajkowski  * @param[in]   pService            Pointer to the compression service
75378ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc        Pointer to the session descriptor
75478ee8d1cSJulian Grajkowski  * @param[in    pSessionHandle      Session handle
75578ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff            Pointer to data buffer for compression
75678ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff           Pointer to buffer space for data after
75778ee8d1cSJulian Grajkowski  *                                  compression
75878ee8d1cSJulian Grajkowski  * @param[in]   pResults            Pointer to results structure
75978ee8d1cSJulian Grajkowski  * @param[in]   flushFlag           Indicates the type of flush to be
76078ee8d1cSJulian Grajkowski  *                                  performed
76178ee8d1cSJulian Grajkowski  * @param[in]   pOpData             Pointer to request information structure
76278ee8d1cSJulian Grajkowski  *                                  holding parameters for cpaDcCompress2
76378ee8d1cSJulian Grajkowski  *                                  and CpaDcDecompressData2
76478ee8d1cSJulian Grajkowski  * @param[in]   callbackTag         Pointer to the callback tag
76578ee8d1cSJulian Grajkowski  * @param[in]   compDecomp          Direction of the operation
76678ee8d1cSJulian Grajkowski  * @param[in]   compressAndVerify   Compress and Verify
76778ee8d1cSJulian Grajkowski  *
76878ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS       Function executed successfully
76978ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in
77078ee8d1cSJulian Grajkowski  *
77178ee8d1cSJulian Grajkowski  *****************************************************************************/
77278ee8d1cSJulian Grajkowski static CpaStatus
dcCreateRequest(dc_compression_cookie_t * pCookie,sal_compression_service_t * pService,dc_session_desc_t * pSessionDesc,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,CpaDcOpData * pOpData,void * callbackTag,dc_request_dir_t compDecomp,dc_cnv_mode_t cnvMode)77378ee8d1cSJulian Grajkowski dcCreateRequest(dc_compression_cookie_t *pCookie,
77478ee8d1cSJulian Grajkowski 		sal_compression_service_t *pService,
77578ee8d1cSJulian Grajkowski 		dc_session_desc_t *pSessionDesc,
77678ee8d1cSJulian Grajkowski 		CpaDcSessionHandle pSessionHandle,
77778ee8d1cSJulian Grajkowski 		CpaBufferList *pSrcBuff,
77878ee8d1cSJulian Grajkowski 		CpaBufferList *pDestBuff,
77978ee8d1cSJulian Grajkowski 		CpaDcRqResults *pResults,
78078ee8d1cSJulian Grajkowski 		CpaDcFlush flushFlag,
78178ee8d1cSJulian Grajkowski 		CpaDcOpData *pOpData,
78278ee8d1cSJulian Grajkowski 		void *callbackTag,
78378ee8d1cSJulian Grajkowski 		dc_request_dir_t compDecomp,
78478ee8d1cSJulian Grajkowski 		dc_cnv_mode_t cnvMode)
78578ee8d1cSJulian Grajkowski {
78678ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pMsg = NULL;
78778ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_params_t *pCompReqParams = NULL;
78878ee8d1cSJulian Grajkowski 	Cpa64U srcAddrPhys = 0, dstAddrPhys = 0;
78978ee8d1cSJulian Grajkowski 	Cpa64U srcTotalDataLenInBytes = 0, dstTotalDataLenInBytes = 0;
79078ee8d1cSJulian Grajkowski 
79178ee8d1cSJulian Grajkowski 	Cpa32U rpCmdFlags = 0;
79278ee8d1cSJulian Grajkowski 	Cpa8U sop = ICP_QAT_FW_COMP_SOP;
79378ee8d1cSJulian Grajkowski 	Cpa8U eop = ICP_QAT_FW_COMP_EOP;
79478ee8d1cSJulian Grajkowski 	Cpa8U bFinal = ICP_QAT_FW_COMP_NOT_BFINAL;
79578ee8d1cSJulian Grajkowski 	Cpa8U crcMode = ICP_QAT_FW_COMP_CRC_MODE_LEGACY;
79678ee8d1cSJulian Grajkowski 	Cpa8U cnvDecompReq = ICP_QAT_FW_COMP_NO_CNV;
79778ee8d1cSJulian Grajkowski 	Cpa8U cnvRecovery = ICP_QAT_FW_COMP_NO_CNV_RECOVERY;
798a977168cSMichal Gulbicki 	CpaBoolean cnvErrorInjection = ICP_QAT_FW_COMP_NO_CNV_DFX;
79978ee8d1cSJulian Grajkowski 	CpaBoolean integrityCrcCheck = CPA_FALSE;
80078ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
80178ee8d1cSJulian Grajkowski 	CpaDcFlush flush = CPA_DC_FLUSH_NONE;
80278ee8d1cSJulian Grajkowski 	Cpa32U initial_adler = 1;
80378ee8d1cSJulian Grajkowski 	Cpa32U initial_crc32 = 0;
80478ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pReqCache = NULL;
80578ee8d1cSJulian Grajkowski 
80678ee8d1cSJulian Grajkowski 	/* Write the buffer descriptors */
80778ee8d1cSJulian Grajkowski 	status = LacBuffDesc_BufferListDescWriteAndGetSize(
80878ee8d1cSJulian Grajkowski 	    pSrcBuff,
80978ee8d1cSJulian Grajkowski 	    &srcAddrPhys,
81078ee8d1cSJulian Grajkowski 	    CPA_FALSE,
81178ee8d1cSJulian Grajkowski 	    &srcTotalDataLenInBytes,
81278ee8d1cSJulian Grajkowski 	    &(pService->generic_service_info));
81378ee8d1cSJulian Grajkowski 	if (status != CPA_STATUS_SUCCESS) {
81478ee8d1cSJulian Grajkowski 		return status;
81578ee8d1cSJulian Grajkowski 	}
81678ee8d1cSJulian Grajkowski 
81778ee8d1cSJulian Grajkowski 	status = LacBuffDesc_BufferListDescWriteAndGetSize(
81878ee8d1cSJulian Grajkowski 	    pDestBuff,
81978ee8d1cSJulian Grajkowski 	    &dstAddrPhys,
82078ee8d1cSJulian Grajkowski 	    CPA_FALSE,
82178ee8d1cSJulian Grajkowski 	    &dstTotalDataLenInBytes,
82278ee8d1cSJulian Grajkowski 	    &(pService->generic_service_info));
82378ee8d1cSJulian Grajkowski 	if (status != CPA_STATUS_SUCCESS) {
82478ee8d1cSJulian Grajkowski 		return status;
82578ee8d1cSJulian Grajkowski 	}
82678ee8d1cSJulian Grajkowski 
82778ee8d1cSJulian Grajkowski 	/* Populate the compression cookie */
82878ee8d1cSJulian Grajkowski 	pCookie->dcInstance = pService;
82978ee8d1cSJulian Grajkowski 	pCookie->pSessionHandle = pSessionHandle;
83078ee8d1cSJulian Grajkowski 	pCookie->callbackTag = callbackTag;
83178ee8d1cSJulian Grajkowski 	pCookie->pSessionDesc = pSessionDesc;
83278ee8d1cSJulian Grajkowski 	pCookie->pDcOpData = pOpData;
83378ee8d1cSJulian Grajkowski 	pCookie->pResults = pResults;
83478ee8d1cSJulian Grajkowski 	pCookie->compDecomp = compDecomp;
83578ee8d1cSJulian Grajkowski 	pCookie->pUserSrcBuff = NULL;
83678ee8d1cSJulian Grajkowski 	pCookie->pUserDestBuff = NULL;
83778ee8d1cSJulian Grajkowski 
83878ee8d1cSJulian Grajkowski 	/* Extract flush flag from either the opData or from the
83978ee8d1cSJulian Grajkowski 	 * parameter. Opdata have been introduce with APIs
84078ee8d1cSJulian Grajkowski 	 * cpaDcCompressData2 and cpaDcDecompressData2 */
84178ee8d1cSJulian Grajkowski 	if (NULL != pOpData) {
84278ee8d1cSJulian Grajkowski 		flush = pOpData->flushFlag;
84378ee8d1cSJulian Grajkowski 		integrityCrcCheck = pOpData->integrityCrcCheck;
84478ee8d1cSJulian Grajkowski 	} else {
84578ee8d1cSJulian Grajkowski 		flush = flushFlag;
84678ee8d1cSJulian Grajkowski 	}
84778ee8d1cSJulian Grajkowski 	pCookie->flushFlag = flush;
84878ee8d1cSJulian Grajkowski 
84978ee8d1cSJulian Grajkowski 	/* The firmware expects the length in bytes for source and destination
85078ee8d1cSJulian Grajkowski 	 * to be Cpa32U parameters. However the total data length could be
85178ee8d1cSJulian Grajkowski 	 * bigger as allocated by the user. We ensure that this is not the case
85278ee8d1cSJulian Grajkowski 	 * in dcCheckSourceData and cast the values to Cpa32U here */
85378ee8d1cSJulian Grajkowski 	pCookie->srcTotalDataLenInBytes = (Cpa32U)srcTotalDataLenInBytes;
854a977168cSMichal Gulbicki 	if ((isDcGen2x(pService)) && (DC_COMPRESSION_REQUEST == compDecomp) &&
85578ee8d1cSJulian Grajkowski 	    (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType)) {
85678ee8d1cSJulian Grajkowski 		if (pService->minInterBuffSizeInBytes <
85778ee8d1cSJulian Grajkowski 		    (Cpa32U)dstTotalDataLenInBytes) {
85878ee8d1cSJulian Grajkowski 			pCookie->dstTotalDataLenInBytes =
85978ee8d1cSJulian Grajkowski 			    (Cpa32U)(pService->minInterBuffSizeInBytes);
86078ee8d1cSJulian Grajkowski 		} else {
86178ee8d1cSJulian Grajkowski 			pCookie->dstTotalDataLenInBytes =
86278ee8d1cSJulian Grajkowski 			    (Cpa32U)dstTotalDataLenInBytes;
86378ee8d1cSJulian Grajkowski 		}
86478ee8d1cSJulian Grajkowski 	} else
86578ee8d1cSJulian Grajkowski 	{
86678ee8d1cSJulian Grajkowski 		pCookie->dstTotalDataLenInBytes =
86778ee8d1cSJulian Grajkowski 		    (Cpa32U)dstTotalDataLenInBytes;
86878ee8d1cSJulian Grajkowski 	}
86978ee8d1cSJulian Grajkowski 
87078ee8d1cSJulian Grajkowski 	/* Device can not decompress an odd byte decompression request
87178ee8d1cSJulian Grajkowski 	 * if bFinal is not set
87278ee8d1cSJulian Grajkowski 	 */
87378ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pService->comp_device_data.oddByteDecompNobFinal) {
87478ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
87578ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FINAL != flushFlag) &&
87678ee8d1cSJulian Grajkowski 		    (DC_DECOMPRESSION_REQUEST == compDecomp) &&
87778ee8d1cSJulian Grajkowski 		    (pCookie->srcTotalDataLenInBytes & 0x1)) {
87878ee8d1cSJulian Grajkowski 			pCookie->srcTotalDataLenInBytes--;
87978ee8d1cSJulian Grajkowski 		}
88078ee8d1cSJulian Grajkowski 	}
88178ee8d1cSJulian Grajkowski 	/* Device can not decompress odd byte interim requests */
88278ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pService->comp_device_data.oddByteDecompInterim) {
88378ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
88478ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FINAL != flushFlag) &&
88578ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FULL != flushFlag) &&
88678ee8d1cSJulian Grajkowski 		    (DC_DECOMPRESSION_REQUEST == compDecomp) &&
88778ee8d1cSJulian Grajkowski 		    (pCookie->srcTotalDataLenInBytes & 0x1)) {
88878ee8d1cSJulian Grajkowski 			pCookie->srcTotalDataLenInBytes--;
88978ee8d1cSJulian Grajkowski 		}
89078ee8d1cSJulian Grajkowski 	}
89178ee8d1cSJulian Grajkowski 
89278ee8d1cSJulian Grajkowski 	pMsg = (icp_qat_fw_comp_req_t *)&pCookie->request;
89378ee8d1cSJulian Grajkowski 
89478ee8d1cSJulian Grajkowski 	if (DC_COMPRESSION_REQUEST == compDecomp) {
89578ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheComp);
89678ee8d1cSJulian Grajkowski 	} else {
89778ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheDecomp);
89878ee8d1cSJulian Grajkowski 	}
89978ee8d1cSJulian Grajkowski 
90078ee8d1cSJulian Grajkowski 	/* Fills the msg from the template cached in the session descriptor */
90178ee8d1cSJulian Grajkowski 	memcpy((void *)pMsg,
90278ee8d1cSJulian Grajkowski 	       (void *)(pReqCache),
90378ee8d1cSJulian Grajkowski 	       LAC_QAT_DC_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES);
90478ee8d1cSJulian Grajkowski 
90578ee8d1cSJulian Grajkowski 	if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
90678ee8d1cSJulian Grajkowski 		initial_adler = 1;
90778ee8d1cSJulian Grajkowski 		initial_crc32 = 0;
90878ee8d1cSJulian Grajkowski 
90978ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
910a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum = initial_adler;
91178ee8d1cSJulian Grajkowski 		} else {
912a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum = initial_crc32;
91378ee8d1cSJulian Grajkowski 		}
91478ee8d1cSJulian Grajkowski 	} else if (CPA_DC_STATELESS == pSessionDesc->sessState) {
91578ee8d1cSJulian Grajkowski 		pSessionDesc->previousChecksum = pResults->checksum;
91678ee8d1cSJulian Grajkowski 
91778ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
91878ee8d1cSJulian Grajkowski 			initial_adler = pSessionDesc->previousChecksum;
91978ee8d1cSJulian Grajkowski 		} else {
92078ee8d1cSJulian Grajkowski 			initial_crc32 = pSessionDesc->previousChecksum;
92178ee8d1cSJulian Grajkowski 		}
92278ee8d1cSJulian Grajkowski 	}
92378ee8d1cSJulian Grajkowski 
92478ee8d1cSJulian Grajkowski 	/* Backup source and destination buffer addresses,
92578ee8d1cSJulian Grajkowski 	 * CRC calculations both for CNV and translator overflow
92678ee8d1cSJulian Grajkowski 	 * will be performed on them in the callback function.
92778ee8d1cSJulian Grajkowski 	 */
92878ee8d1cSJulian Grajkowski 	pCookie->pUserSrcBuff = pSrcBuff;
92978ee8d1cSJulian Grajkowski 	pCookie->pUserDestBuff = pDestBuff;
93078ee8d1cSJulian Grajkowski 
93178ee8d1cSJulian Grajkowski 	/*
93278ee8d1cSJulian Grajkowski 	 * Due to implementation of CNV support and need for backwards
93378ee8d1cSJulian Grajkowski 	 * compatibility certain fields in the request and response structs had
93478ee8d1cSJulian Grajkowski 	 * been changed, moved or placed in unions cnvMode flag signifies fields
93578ee8d1cSJulian Grajkowski 	 * to be selected from req/res
93678ee8d1cSJulian Grajkowski 	 *
93778ee8d1cSJulian Grajkowski 	 * Doing extended crc checks makes sense only when we want to do the
93878ee8d1cSJulian Grajkowski 	 * actual CNV
93978ee8d1cSJulian Grajkowski 	 */
94078ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pService->generic_service_info.integrityCrcCheck &&
94178ee8d1cSJulian Grajkowski 	    CPA_TRUE == integrityCrcCheck) {
94278ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.crc_data_addr =
94378ee8d1cSJulian Grajkowski 		    pSessionDesc->physDataIntegrityCrcs;
94478ee8d1cSJulian Grajkowski 		crcMode = ICP_QAT_FW_COMP_CRC_MODE_E2E;
94578ee8d1cSJulian Grajkowski 	} else {
94678ee8d1cSJulian Grajkowski 		/* Legacy request structure */
94778ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.legacy.initial_adler = initial_adler;
94878ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.legacy.initial_crc32 = initial_crc32;
94978ee8d1cSJulian Grajkowski 		crcMode = ICP_QAT_FW_COMP_CRC_MODE_LEGACY;
95078ee8d1cSJulian Grajkowski 	}
95178ee8d1cSJulian Grajkowski 
95278ee8d1cSJulian Grajkowski 	/* Populate the cmdFlags */
95378ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
95478ee8d1cSJulian Grajkowski 		pSessionDesc->previousRequestType = pSessionDesc->requestType;
95578ee8d1cSJulian Grajkowski 
95678ee8d1cSJulian Grajkowski 		if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
95778ee8d1cSJulian Grajkowski 			/* Update the request type for following requests */
95878ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_SUBSEQUENT;
95978ee8d1cSJulian Grajkowski 
96078ee8d1cSJulian Grajkowski 			/* Reinitialise the cumulative amount of consumed bytes
96178ee8d1cSJulian Grajkowski 			 */
96278ee8d1cSJulian Grajkowski 			pSessionDesc->cumulativeConsumedBytes = 0;
96378ee8d1cSJulian Grajkowski 
96478ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
96578ee8d1cSJulian Grajkowski 				pSessionDesc->isSopForCompressionProcessed =
96678ee8d1cSJulian Grajkowski 				    CPA_TRUE;
96778ee8d1cSJulian Grajkowski 			} else if (DC_DECOMPRESSION_REQUEST == compDecomp) {
96878ee8d1cSJulian Grajkowski 				pSessionDesc->isSopForDecompressionProcessed =
96978ee8d1cSJulian Grajkowski 				    CPA_TRUE;
97078ee8d1cSJulian Grajkowski 			}
97178ee8d1cSJulian Grajkowski 		} else {
97278ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
97378ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
97478ee8d1cSJulian Grajkowski 				    pSessionDesc
97578ee8d1cSJulian Grajkowski 					->isSopForCompressionProcessed) {
97678ee8d1cSJulian Grajkowski 					sop = ICP_QAT_FW_COMP_NOT_SOP;
97778ee8d1cSJulian Grajkowski 				} else {
97878ee8d1cSJulian Grajkowski 					pSessionDesc
97978ee8d1cSJulian Grajkowski 					    ->isSopForCompressionProcessed =
98078ee8d1cSJulian Grajkowski 					    CPA_TRUE;
98178ee8d1cSJulian Grajkowski 				}
98278ee8d1cSJulian Grajkowski 			} else if (DC_DECOMPRESSION_REQUEST == compDecomp) {
98378ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
98478ee8d1cSJulian Grajkowski 				    pSessionDesc
98578ee8d1cSJulian Grajkowski 					->isSopForDecompressionProcessed) {
98678ee8d1cSJulian Grajkowski 					sop = ICP_QAT_FW_COMP_NOT_SOP;
98778ee8d1cSJulian Grajkowski 				} else {
98878ee8d1cSJulian Grajkowski 					pSessionDesc
98978ee8d1cSJulian Grajkowski 					    ->isSopForDecompressionProcessed =
99078ee8d1cSJulian Grajkowski 					    CPA_TRUE;
99178ee8d1cSJulian Grajkowski 				}
99278ee8d1cSJulian Grajkowski 			}
99378ee8d1cSJulian Grajkowski 		}
99478ee8d1cSJulian Grajkowski 
99578ee8d1cSJulian Grajkowski 		if ((CPA_DC_FLUSH_FINAL == flush) ||
99678ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FULL == flush)) {
99778ee8d1cSJulian Grajkowski 			/* Update the request type for following requests */
99878ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_FIRST;
99978ee8d1cSJulian Grajkowski 		} else {
100078ee8d1cSJulian Grajkowski 			eop = ICP_QAT_FW_COMP_NOT_EOP;
100178ee8d1cSJulian Grajkowski 		}
100278ee8d1cSJulian Grajkowski 	} else {
100378ee8d1cSJulian Grajkowski 		if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
100478ee8d1cSJulian Grajkowski 			/* Reinitialise the cumulative amount of consumed bytes
100578ee8d1cSJulian Grajkowski 			 */
100678ee8d1cSJulian Grajkowski 			pSessionDesc->cumulativeConsumedBytes = 0;
100778ee8d1cSJulian Grajkowski 		}
100878ee8d1cSJulian Grajkowski 	}
100978ee8d1cSJulian Grajkowski 
101078ee8d1cSJulian Grajkowski 	/* (LW 14 - 15) */
101178ee8d1cSJulian Grajkowski 	pCompReqParams = &(pMsg->comp_pars);
101278ee8d1cSJulian Grajkowski 	dcCompRequestParamsPopulate(pCompReqParams, pCookie);
101378ee8d1cSJulian Grajkowski 	if (CPA_DC_FLUSH_FINAL == flush) {
101478ee8d1cSJulian Grajkowski 		bFinal = ICP_QAT_FW_COMP_BFINAL;
101578ee8d1cSJulian Grajkowski 	}
101678ee8d1cSJulian Grajkowski 
101778ee8d1cSJulian Grajkowski 	switch (cnvMode) {
101878ee8d1cSJulian Grajkowski 	case DC_CNVNR:
101978ee8d1cSJulian Grajkowski 		cnvRecovery = ICP_QAT_FW_COMP_CNV_RECOVERY;
102078ee8d1cSJulian Grajkowski 	/* Fall through is intended here, because for CNVNR
102178ee8d1cSJulian Grajkowski 	 * cnvDecompReq also needs to be set */
102278ee8d1cSJulian Grajkowski 	case DC_CNV:
102378ee8d1cSJulian Grajkowski 		cnvDecompReq = ICP_QAT_FW_COMP_CNV;
1024a977168cSMichal Gulbicki 		if (isDcGen4x(pService)) {
1025a977168cSMichal Gulbicki 			cnvErrorInjection = pSessionDesc->cnvErrorInjection;
1026a977168cSMichal Gulbicki 		}
102778ee8d1cSJulian Grajkowski 		break;
102878ee8d1cSJulian Grajkowski 	case DC_NO_CNV:
102978ee8d1cSJulian Grajkowski 		cnvDecompReq = ICP_QAT_FW_COMP_NO_CNV;
103078ee8d1cSJulian Grajkowski 		cnvRecovery = ICP_QAT_FW_COMP_NO_CNV_RECOVERY;
103178ee8d1cSJulian Grajkowski 		break;
103278ee8d1cSJulian Grajkowski 	}
103378ee8d1cSJulian Grajkowski 
103478ee8d1cSJulian Grajkowski 	/* LW 18 */
1035a977168cSMichal Gulbicki 	rpCmdFlags = ICP_QAT_FW_COMP_REQ_PARAM_FLAGS_BUILD(sop,
1036a977168cSMichal Gulbicki 							   eop,
1037a977168cSMichal Gulbicki 							   bFinal,
1038a977168cSMichal Gulbicki 							   cnvDecompReq,
1039a977168cSMichal Gulbicki 							   cnvRecovery,
1040a977168cSMichal Gulbicki 							   cnvErrorInjection,
1041a977168cSMichal Gulbicki 							   crcMode);
1042a977168cSMichal Gulbicki 
104378ee8d1cSJulian Grajkowski 	pMsg->comp_pars.req_par_flags = rpCmdFlags;
104478ee8d1cSJulian Grajkowski 
104578ee8d1cSJulian Grajkowski 	/* Populates the QAT common request middle part of the message
104678ee8d1cSJulian Grajkowski 	 * (LW 6 to 11) */
104778ee8d1cSJulian Grajkowski 	SalQatMsg_CmnMidWrite((icp_qat_fw_la_bulk_req_t *)pMsg,
104878ee8d1cSJulian Grajkowski 			      pCookie,
104978ee8d1cSJulian Grajkowski 			      DC_DEFAULT_QAT_PTR_TYPE,
105078ee8d1cSJulian Grajkowski 			      srcAddrPhys,
105178ee8d1cSJulian Grajkowski 			      dstAddrPhys,
105278ee8d1cSJulian Grajkowski 			      0,
105378ee8d1cSJulian Grajkowski 			      0);
105478ee8d1cSJulian Grajkowski 
105578ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
105678ee8d1cSJulian Grajkowski }
105778ee8d1cSJulian Grajkowski 
105878ee8d1cSJulian Grajkowski /**
105978ee8d1cSJulian Grajkowski  *****************************************************************************
106078ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
106178ee8d1cSJulian Grajkowski  *      Send a compression request to QAT
106278ee8d1cSJulian Grajkowski  *
106378ee8d1cSJulian Grajkowski  * @description
106478ee8d1cSJulian Grajkowski  *      Send the requests for compression or decompression to QAT
106578ee8d1cSJulian Grajkowski  *
106678ee8d1cSJulian Grajkowski  * @param{in]   pCookie               Pointer to the compression cookie
106778ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
106878ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc          Pointer to the session descriptor
106978ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
107078ee8d1cSJulian Grajkowski  *
107178ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
107278ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
107378ee8d1cSJulian Grajkowski  *
107478ee8d1cSJulian Grajkowski  *****************************************************************************/
107578ee8d1cSJulian Grajkowski static CpaStatus
dcSendRequest(dc_compression_cookie_t * pCookie,sal_compression_service_t * pService,dc_session_desc_t * pSessionDesc,dc_request_dir_t compDecomp)107678ee8d1cSJulian Grajkowski dcSendRequest(dc_compression_cookie_t *pCookie,
107778ee8d1cSJulian Grajkowski 	      sal_compression_service_t *pService,
107878ee8d1cSJulian Grajkowski 	      dc_session_desc_t *pSessionDesc,
107978ee8d1cSJulian Grajkowski 	      dc_request_dir_t compDecomp)
108078ee8d1cSJulian Grajkowski {
108178ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
108278ee8d1cSJulian Grajkowski 
108378ee8d1cSJulian Grajkowski 	/* Send to QAT */
108478ee8d1cSJulian Grajkowski 	status = icp_adf_transPutMsg(pService->trans_handle_compression_tx,
108578ee8d1cSJulian Grajkowski 				     (void *)&(pCookie->request),
108678ee8d1cSJulian Grajkowski 				     LAC_QAT_DC_REQ_SZ_LW);
108778ee8d1cSJulian Grajkowski 
108878ee8d1cSJulian Grajkowski 	if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
108978ee8d1cSJulian Grajkowski 	    (CPA_STATUS_RETRY == status)) {
109078ee8d1cSJulian Grajkowski 		/* reset requestType after receiving an retry on
109178ee8d1cSJulian Grajkowski 		 * the stateful request */
109278ee8d1cSJulian Grajkowski 		pSessionDesc->requestType = pSessionDesc->previousRequestType;
109378ee8d1cSJulian Grajkowski 	}
109478ee8d1cSJulian Grajkowski 
109578ee8d1cSJulian Grajkowski 	return status;
109678ee8d1cSJulian Grajkowski }
109778ee8d1cSJulian Grajkowski 
109878ee8d1cSJulian Grajkowski /**
109978ee8d1cSJulian Grajkowski  *****************************************************************************
110078ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
110178ee8d1cSJulian Grajkowski  *      Process the synchronous and asynchronous case for compression or
110278ee8d1cSJulian Grajkowski  *      decompression
110378ee8d1cSJulian Grajkowski  *
110478ee8d1cSJulian Grajkowski  * @description
110578ee8d1cSJulian Grajkowski  *      Process the synchronous and asynchronous case for compression or
110678ee8d1cSJulian Grajkowski  *      decompression. This function will then create and send the request to
110778ee8d1cSJulian Grajkowski  *      the firmware.
110878ee8d1cSJulian Grajkowski  *
110978ee8d1cSJulian Grajkowski  * @param[in]   pService            Pointer to the compression service
111078ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc        Pointer to the session descriptor
111178ee8d1cSJulian Grajkowski  * @param[in]   dcInstance          Instance handle derived from discovery
111278ee8d1cSJulian Grajkowski  *                                  functions
111378ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle      Session handle
111478ee8d1cSJulian Grajkowski  * @param[in]   numRequests         Number of operations in the batch request
111578ee8d1cSJulian Grajkowski  * @param[in]   pBatchOpData        Address of the list of jobs to be processed
111678ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff            Pointer to data buffer for compression
111778ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff           Pointer to buffer space for data after
111878ee8d1cSJulian Grajkowski  *                                  compression
111978ee8d1cSJulian Grajkowski  * @param[in]   pResults            Pointer to results structure
112078ee8d1cSJulian Grajkowski  * @param[in]   flushFlag           Indicates the type of flush to be
112178ee8d1cSJulian Grajkowski  *                                  performed
112278ee8d1cSJulian Grajkowski  * @param[in]   pOpData             Pointer to request information structure
112378ee8d1cSJulian Grajkowski  *                                  holding parameters for cpaDcCompress2 and
112478ee8d1cSJulian Grajkowski  *                                  CpaDcDecompressData2
112578ee8d1cSJulian Grajkowski  * @param[in]   callbackTag         Pointer to the callback tag
112678ee8d1cSJulian Grajkowski  * @param[in]   compDecomp          Direction of the operation
112778ee8d1cSJulian Grajkowski  * @param[in]   isAsyncMode         Used to know if synchronous or asynchronous
112878ee8d1cSJulian Grajkowski  *                                  mode
112978ee8d1cSJulian Grajkowski  * @param[in]   cnvMode             CNV Mode
113078ee8d1cSJulian Grajkowski  *
113178ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS       Function executed successfully
113278ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_RETRY         Retry operation
113378ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_FAIL          Function failed
113478ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_RESOURCE      Resource error
113578ee8d1cSJulian Grajkowski  *
113678ee8d1cSJulian Grajkowski  *****************************************************************************/
113778ee8d1cSJulian Grajkowski static CpaStatus
dcCompDecompData(sal_compression_service_t * pService,dc_session_desc_t * pSessionDesc,CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,CpaDcOpData * pOpData,void * callbackTag,dc_request_dir_t compDecomp,CpaBoolean isAsyncMode,dc_cnv_mode_t cnvMode)113878ee8d1cSJulian Grajkowski dcCompDecompData(sal_compression_service_t *pService,
113978ee8d1cSJulian Grajkowski 		 dc_session_desc_t *pSessionDesc,
114078ee8d1cSJulian Grajkowski 		 CpaInstanceHandle dcInstance,
114178ee8d1cSJulian Grajkowski 		 CpaDcSessionHandle pSessionHandle,
114278ee8d1cSJulian Grajkowski 		 CpaBufferList *pSrcBuff,
114378ee8d1cSJulian Grajkowski 		 CpaBufferList *pDestBuff,
114478ee8d1cSJulian Grajkowski 		 CpaDcRqResults *pResults,
114578ee8d1cSJulian Grajkowski 		 CpaDcFlush flushFlag,
114678ee8d1cSJulian Grajkowski 		 CpaDcOpData *pOpData,
114778ee8d1cSJulian Grajkowski 		 void *callbackTag,
114878ee8d1cSJulian Grajkowski 		 dc_request_dir_t compDecomp,
114978ee8d1cSJulian Grajkowski 		 CpaBoolean isAsyncMode,
115078ee8d1cSJulian Grajkowski 		 dc_cnv_mode_t cnvMode)
115178ee8d1cSJulian Grajkowski {
115278ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
115378ee8d1cSJulian Grajkowski 	dc_compression_cookie_t *pCookie = NULL;
115478ee8d1cSJulian Grajkowski 
115578ee8d1cSJulian Grajkowski 	if ((LacSync_GenWakeupSyncCaller == pSessionDesc->pCompressionCb) &&
115678ee8d1cSJulian Grajkowski 	    isAsyncMode == CPA_TRUE) {
115778ee8d1cSJulian Grajkowski 		lac_sync_op_data_t *pSyncCallbackData = NULL;
115878ee8d1cSJulian Grajkowski 
115978ee8d1cSJulian Grajkowski 		status = LacSync_CreateSyncCookie(&pSyncCallbackData);
116078ee8d1cSJulian Grajkowski 
116178ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
116278ee8d1cSJulian Grajkowski 			status = dcCompDecompData(pService,
116378ee8d1cSJulian Grajkowski 						  pSessionDesc,
116478ee8d1cSJulian Grajkowski 						  dcInstance,
116578ee8d1cSJulian Grajkowski 						  pSessionHandle,
116678ee8d1cSJulian Grajkowski 						  pSrcBuff,
116778ee8d1cSJulian Grajkowski 						  pDestBuff,
116878ee8d1cSJulian Grajkowski 						  pResults,
116978ee8d1cSJulian Grajkowski 						  flushFlag,
117078ee8d1cSJulian Grajkowski 						  pOpData,
117178ee8d1cSJulian Grajkowski 						  pSyncCallbackData,
117278ee8d1cSJulian Grajkowski 						  compDecomp,
117378ee8d1cSJulian Grajkowski 						  CPA_FALSE,
117478ee8d1cSJulian Grajkowski 						  cnvMode);
117578ee8d1cSJulian Grajkowski 		} else {
117678ee8d1cSJulian Grajkowski 			return status;
117778ee8d1cSJulian Grajkowski 		}
117878ee8d1cSJulian Grajkowski 
117978ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
118078ee8d1cSJulian Grajkowski 			CpaStatus syncStatus = CPA_STATUS_SUCCESS;
118178ee8d1cSJulian Grajkowski 
118278ee8d1cSJulian Grajkowski 			syncStatus =
118378ee8d1cSJulian Grajkowski 			    LacSync_WaitForCallback(pSyncCallbackData,
118478ee8d1cSJulian Grajkowski 						    DC_SYNC_CALLBACK_TIMEOUT,
118578ee8d1cSJulian Grajkowski 						    &status,
118678ee8d1cSJulian Grajkowski 						    NULL);
118778ee8d1cSJulian Grajkowski 
118878ee8d1cSJulian Grajkowski 			/* If callback doesn't come back */
118978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != syncStatus) {
119078ee8d1cSJulian Grajkowski 				if (DC_COMPRESSION_REQUEST == compDecomp) {
119178ee8d1cSJulian Grajkowski 					COMPRESSION_STAT_INC(
119278ee8d1cSJulian Grajkowski 					    numCompCompletedErrors, pService);
119378ee8d1cSJulian Grajkowski 				} else {
119478ee8d1cSJulian Grajkowski 					COMPRESSION_STAT_INC(
119578ee8d1cSJulian Grajkowski 					    numDecompCompletedErrors, pService);
119678ee8d1cSJulian Grajkowski 				}
119778ee8d1cSJulian Grajkowski 				LAC_LOG_ERROR("Callback timed out");
119878ee8d1cSJulian Grajkowski 				status = syncStatus;
119978ee8d1cSJulian Grajkowski 			}
120078ee8d1cSJulian Grajkowski 		} else {
120178ee8d1cSJulian Grajkowski 			/* As the Request was not sent the Callback will never
120278ee8d1cSJulian Grajkowski 			 * be called, so need to indicate that we're finished
120378ee8d1cSJulian Grajkowski 			 * with cookie so it can be destroyed. */
120478ee8d1cSJulian Grajkowski 			LacSync_SetSyncCookieComplete(pSyncCallbackData);
120578ee8d1cSJulian Grajkowski 		}
120678ee8d1cSJulian Grajkowski 
120778ee8d1cSJulian Grajkowski 		LacSync_DestroySyncCookie(&pSyncCallbackData);
120878ee8d1cSJulian Grajkowski 		return status;
120978ee8d1cSJulian Grajkowski 	}
121078ee8d1cSJulian Grajkowski 
121178ee8d1cSJulian Grajkowski 	/* Allocate the compression cookie
121278ee8d1cSJulian Grajkowski 	 * The memory is freed in callback or in sendRequest if an error occurs
121378ee8d1cSJulian Grajkowski 	 */
121478ee8d1cSJulian Grajkowski 	pCookie = (dc_compression_cookie_t *)Lac_MemPoolEntryAlloc(
121578ee8d1cSJulian Grajkowski 	    pService->compression_mem_pool);
121678ee8d1cSJulian Grajkowski 	if (NULL == pCookie) {
121778ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Cannot get mem pool entry for compression");
121878ee8d1cSJulian Grajkowski 		status = CPA_STATUS_RESOURCE;
121978ee8d1cSJulian Grajkowski 	} else if ((void *)CPA_STATUS_RETRY == pCookie) {
122078ee8d1cSJulian Grajkowski 		pCookie = NULL;
122178ee8d1cSJulian Grajkowski 		status = CPA_STATUS_RETRY;
122278ee8d1cSJulian Grajkowski 	}
122378ee8d1cSJulian Grajkowski 
122478ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
122578ee8d1cSJulian Grajkowski 		status = dcCreateRequest(pCookie,
122678ee8d1cSJulian Grajkowski 					 pService,
122778ee8d1cSJulian Grajkowski 					 pSessionDesc,
122878ee8d1cSJulian Grajkowski 					 pSessionHandle,
122978ee8d1cSJulian Grajkowski 					 pSrcBuff,
123078ee8d1cSJulian Grajkowski 					 pDestBuff,
123178ee8d1cSJulian Grajkowski 					 pResults,
123278ee8d1cSJulian Grajkowski 					 flushFlag,
123378ee8d1cSJulian Grajkowski 					 pOpData,
123478ee8d1cSJulian Grajkowski 					 callbackTag,
123578ee8d1cSJulian Grajkowski 					 compDecomp,
123678ee8d1cSJulian Grajkowski 					 cnvMode);
123778ee8d1cSJulian Grajkowski 	}
123878ee8d1cSJulian Grajkowski 
123978ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
124078ee8d1cSJulian Grajkowski 		/* Increment number of pending callbacks for session */
124178ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
124278ee8d1cSJulian Grajkowski 			qatUtilsAtomicInc(
124378ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatelessCbCount));
124478ee8d1cSJulian Grajkowski 		}
124578ee8d1cSJulian Grajkowski 		status =
124678ee8d1cSJulian Grajkowski 		    dcSendRequest(pCookie, pService, pSessionDesc, compDecomp);
124778ee8d1cSJulian Grajkowski 	}
124878ee8d1cSJulian Grajkowski 
124978ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
125078ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
125178ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequests, pService);
125278ee8d1cSJulian Grajkowski 		} else {
125378ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequests, pService);
125478ee8d1cSJulian Grajkowski 		}
125578ee8d1cSJulian Grajkowski 	} else {
125678ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
125778ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequestsErrors, pService);
125878ee8d1cSJulian Grajkowski 		} else {
125978ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequestsErrors, pService);
126078ee8d1cSJulian Grajkowski 		}
126178ee8d1cSJulian Grajkowski 
126278ee8d1cSJulian Grajkowski 		/* Decrement number of pending callbacks for session */
126378ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
126478ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
126578ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatelessCbCount));
126678ee8d1cSJulian Grajkowski 		} else {
126778ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
126878ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatefulCbCount));
126978ee8d1cSJulian Grajkowski 		}
127078ee8d1cSJulian Grajkowski 
127178ee8d1cSJulian Grajkowski 		/* Free the memory pool */
127278ee8d1cSJulian Grajkowski 		if (NULL != pCookie) {
127378ee8d1cSJulian Grajkowski 			if (status != CPA_STATUS_UNSUPPORTED) {
127478ee8d1cSJulian Grajkowski 				/* Free the memory pool */
127578ee8d1cSJulian Grajkowski 				Lac_MemPoolEntryFree(pCookie);
127678ee8d1cSJulian Grajkowski 				pCookie = NULL;
127778ee8d1cSJulian Grajkowski 			}
127878ee8d1cSJulian Grajkowski 		}
127978ee8d1cSJulian Grajkowski 	}
128078ee8d1cSJulian Grajkowski 
128178ee8d1cSJulian Grajkowski 	return status;
128278ee8d1cSJulian Grajkowski }
128378ee8d1cSJulian Grajkowski 
128478ee8d1cSJulian Grajkowski /**
128578ee8d1cSJulian Grajkowski  *****************************************************************************
128678ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
128778ee8d1cSJulian Grajkowski  *      Handle zero length compression or decompression requests
128878ee8d1cSJulian Grajkowski  *
128978ee8d1cSJulian Grajkowski  * @description
129078ee8d1cSJulian Grajkowski  *      Handle zero length compression or decompression requests
129178ee8d1cSJulian Grajkowski  *
129278ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
129378ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc          Pointer to the session descriptor
129478ee8d1cSJulian Grajkowski  * @param[in]   pResults              Pointer to results structure
129578ee8d1cSJulian Grajkowski  * @param[in]   flushFlag             Indicates the type of flush to be
129678ee8d1cSJulian Grajkowski  *                                    performed
129778ee8d1cSJulian Grajkowski  * @param[in]   callbackTag           User supplied value to help correlate
129878ee8d1cSJulian Grajkowski  *                                    the callback with its associated request
129978ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
130078ee8d1cSJulian Grajkowski  *
130178ee8d1cSJulian Grajkowski  * @retval CPA_TRUE                   Zero length SOP or MOP processed
130278ee8d1cSJulian Grajkowski  * @retval CPA_FALSE                  Zero length EOP
130378ee8d1cSJulian Grajkowski  *
130478ee8d1cSJulian Grajkowski  *****************************************************************************/
130578ee8d1cSJulian Grajkowski static CpaStatus
dcZeroLengthRequests(sal_compression_service_t * pService,dc_session_desc_t * pSessionDesc,CpaDcRqResults * pResults,CpaDcFlush flushFlag,void * callbackTag,dc_request_dir_t compDecomp)130678ee8d1cSJulian Grajkowski dcZeroLengthRequests(sal_compression_service_t *pService,
130778ee8d1cSJulian Grajkowski 		     dc_session_desc_t *pSessionDesc,
130878ee8d1cSJulian Grajkowski 		     CpaDcRqResults *pResults,
130978ee8d1cSJulian Grajkowski 		     CpaDcFlush flushFlag,
131078ee8d1cSJulian Grajkowski 		     void *callbackTag,
131178ee8d1cSJulian Grajkowski 		     dc_request_dir_t compDecomp)
131278ee8d1cSJulian Grajkowski {
131378ee8d1cSJulian Grajkowski 	CpaBoolean status = CPA_FALSE;
131478ee8d1cSJulian Grajkowski 	CpaDcCallbackFn pCbFunc = pSessionDesc->pCompressionCb;
131578ee8d1cSJulian Grajkowski 
131678ee8d1cSJulian Grajkowski 	if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
131778ee8d1cSJulian Grajkowski 		/* Reinitialise the cumulative amount of consumed bytes */
131878ee8d1cSJulian Grajkowski 		pSessionDesc->cumulativeConsumedBytes = 0;
131978ee8d1cSJulian Grajkowski 
132078ee8d1cSJulian Grajkowski 		/* Zero length SOP */
132178ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
132278ee8d1cSJulian Grajkowski 			pResults->checksum = 1;
132378ee8d1cSJulian Grajkowski 		} else {
132478ee8d1cSJulian Grajkowski 			pResults->checksum = 0;
132578ee8d1cSJulian Grajkowski 		}
132678ee8d1cSJulian Grajkowski 
132778ee8d1cSJulian Grajkowski 		status = CPA_TRUE;
132878ee8d1cSJulian Grajkowski 	} else if ((CPA_DC_FLUSH_NONE == flushFlag) ||
132978ee8d1cSJulian Grajkowski 		   (CPA_DC_FLUSH_SYNC == flushFlag)) {
133078ee8d1cSJulian Grajkowski 		/* Zero length MOP */
133178ee8d1cSJulian Grajkowski 		pResults->checksum = pSessionDesc->previousChecksum;
133278ee8d1cSJulian Grajkowski 		status = CPA_TRUE;
133378ee8d1cSJulian Grajkowski 	}
133478ee8d1cSJulian Grajkowski 
133578ee8d1cSJulian Grajkowski 	if (CPA_TRUE == status) {
133678ee8d1cSJulian Grajkowski 		pResults->status = CPA_DC_OK;
133778ee8d1cSJulian Grajkowski 		pResults->produced = 0;
133878ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
133978ee8d1cSJulian Grajkowski 
134078ee8d1cSJulian Grajkowski 		/* Increment statistics */
134178ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
134278ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequests, pService);
134378ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCompleted, pService);
134478ee8d1cSJulian Grajkowski 		} else {
134578ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequests, pService);
134678ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompCompleted, pService);
134778ee8d1cSJulian Grajkowski 		}
134878ee8d1cSJulian Grajkowski 
1349a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
135078ee8d1cSJulian Grajkowski 
135178ee8d1cSJulian Grajkowski 		if ((NULL != pCbFunc) &&
135278ee8d1cSJulian Grajkowski 		    (LacSync_GenWakeupSyncCaller != pCbFunc)) {
135378ee8d1cSJulian Grajkowski 			pCbFunc(callbackTag, CPA_STATUS_SUCCESS);
135478ee8d1cSJulian Grajkowski 		}
135578ee8d1cSJulian Grajkowski 
135678ee8d1cSJulian Grajkowski 		return CPA_TRUE;
135778ee8d1cSJulian Grajkowski 	}
135878ee8d1cSJulian Grajkowski 
135978ee8d1cSJulian Grajkowski 	return CPA_FALSE;
136078ee8d1cSJulian Grajkowski }
136178ee8d1cSJulian Grajkowski 
136278ee8d1cSJulian Grajkowski static CpaStatus
dcParamCheck(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,sal_compression_service_t * pService,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,dc_session_desc_t * pSessionDesc,CpaDcFlush flushFlag,Cpa64U srcBuffSize)136378ee8d1cSJulian Grajkowski dcParamCheck(CpaInstanceHandle dcInstance,
136478ee8d1cSJulian Grajkowski 	     CpaDcSessionHandle pSessionHandle,
136578ee8d1cSJulian Grajkowski 	     sal_compression_service_t *pService,
136678ee8d1cSJulian Grajkowski 	     CpaBufferList *pSrcBuff,
136778ee8d1cSJulian Grajkowski 	     CpaBufferList *pDestBuff,
136878ee8d1cSJulian Grajkowski 	     CpaDcRqResults *pResults,
136978ee8d1cSJulian Grajkowski 	     dc_session_desc_t *pSessionDesc,
137078ee8d1cSJulian Grajkowski 	     CpaDcFlush flushFlag,
137178ee8d1cSJulian Grajkowski 	     Cpa64U srcBuffSize)
137278ee8d1cSJulian Grajkowski {
137378ee8d1cSJulian Grajkowski 
137478ee8d1cSJulian Grajkowski 	if (dcCheckSourceData(pSessionHandle,
137578ee8d1cSJulian Grajkowski 			      pSrcBuff,
137678ee8d1cSJulian Grajkowski 			      pDestBuff,
137778ee8d1cSJulian Grajkowski 			      pResults,
137878ee8d1cSJulian Grajkowski 			      flushFlag,
137978ee8d1cSJulian Grajkowski 			      srcBuffSize,
138078ee8d1cSJulian Grajkowski 			      NULL) != CPA_STATUS_SUCCESS) {
138178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
138278ee8d1cSJulian Grajkowski 	}
138378ee8d1cSJulian Grajkowski 	if (dcCheckDestinationData(
138478ee8d1cSJulian Grajkowski 		pService, pSessionHandle, pDestBuff, DC_COMPRESSION_REQUEST) !=
138578ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
138678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
138778ee8d1cSJulian Grajkowski 	}
138878ee8d1cSJulian Grajkowski 	if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
138978ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid sessDirection value");
139078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
139178ee8d1cSJulian Grajkowski 	}
139278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
139378ee8d1cSJulian Grajkowski }
139478ee8d1cSJulian Grajkowski 
139578ee8d1cSJulian Grajkowski CpaStatus
cpaDcCompressData(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,void * callbackTag)139678ee8d1cSJulian Grajkowski cpaDcCompressData(CpaInstanceHandle dcInstance,
139778ee8d1cSJulian Grajkowski 		  CpaDcSessionHandle pSessionHandle,
139878ee8d1cSJulian Grajkowski 		  CpaBufferList *pSrcBuff,
139978ee8d1cSJulian Grajkowski 		  CpaBufferList *pDestBuff,
140078ee8d1cSJulian Grajkowski 		  CpaDcRqResults *pResults,
140178ee8d1cSJulian Grajkowski 		  CpaDcFlush flushFlag,
140278ee8d1cSJulian Grajkowski 		  void *callbackTag)
140378ee8d1cSJulian Grajkowski {
140478ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
140578ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
140678ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
140778ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
140878ee8d1cSJulian Grajkowski 
140978ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
141078ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
141178ee8d1cSJulian Grajkowski 	} else {
141278ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
141378ee8d1cSJulian Grajkowski 	}
141478ee8d1cSJulian Grajkowski 
141578ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
141678ee8d1cSJulian Grajkowski 
141778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
141878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
141978ee8d1cSJulian Grajkowski 
142078ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
142178ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
142278ee8d1cSJulian Grajkowski 
142378ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
142478ee8d1cSJulian Grajkowski 	 * manage zero length requests */
142578ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
142678ee8d1cSJulian Grajkowski 					     &srcBuffSize,
142778ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
142878ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
142978ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
143078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
143178ee8d1cSJulian Grajkowski 	}
143278ee8d1cSJulian Grajkowski 
143378ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
143478ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
143578ee8d1cSJulian Grajkowski 
143678ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
143778ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS !=
143878ee8d1cSJulian Grajkowski 	    dcParamCheck(insHandle,
143978ee8d1cSJulian Grajkowski 			 pSessionHandle,
144078ee8d1cSJulian Grajkowski 			 pService,
144178ee8d1cSJulian Grajkowski 			 pSrcBuff,
144278ee8d1cSJulian Grajkowski 			 pDestBuff,
144378ee8d1cSJulian Grajkowski 			 pResults,
144478ee8d1cSJulian Grajkowski 			 pSessionDesc,
144578ee8d1cSJulian Grajkowski 			 flushFlag,
144678ee8d1cSJulian Grajkowski 			 srcBuffSize)) {
144778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
144878ee8d1cSJulian Grajkowski 	}
144978ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
145078ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
145178ee8d1cSJulian Grajkowski 		    "Invalid session state, stateful sessions "
145278ee8d1cSJulian Grajkowski 		    "are not supported");
145378ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
145478ee8d1cSJulian Grajkowski 	}
145578ee8d1cSJulian Grajkowski 
145678ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
145778ee8d1cSJulian Grajkowski 	      DC_CNV_EXTENDED_CAPABILITY)) {
145878ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
145978ee8d1cSJulian Grajkowski 		    "CompressAndVerify feature not supported");
146078ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
146178ee8d1cSJulian Grajkowski 	}
146278ee8d1cSJulian Grajkowski 
146378ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
146478ee8d1cSJulian Grajkowski 	      DC_CNVNR_EXTENDED_CAPABILITY)) {
146578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
146678ee8d1cSJulian Grajkowski 		    "CompressAndVerifyAndRecovery feature not supported");
146778ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
146878ee8d1cSJulian Grajkowski 	}
146978ee8d1cSJulian Grajkowski 
147078ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
147178ee8d1cSJulian Grajkowski 				pSessionDesc,
1472a977168cSMichal Gulbicki 				insHandle,
147378ee8d1cSJulian Grajkowski 				pSessionHandle,
147478ee8d1cSJulian Grajkowski 				pSrcBuff,
147578ee8d1cSJulian Grajkowski 				pDestBuff,
147678ee8d1cSJulian Grajkowski 				pResults,
147778ee8d1cSJulian Grajkowski 				flushFlag,
147878ee8d1cSJulian Grajkowski 				NULL,
147978ee8d1cSJulian Grajkowski 				callbackTag,
148078ee8d1cSJulian Grajkowski 				DC_COMPRESSION_REQUEST,
148178ee8d1cSJulian Grajkowski 				CPA_TRUE,
148278ee8d1cSJulian Grajkowski 				DC_CNVNR);
148378ee8d1cSJulian Grajkowski }
148478ee8d1cSJulian Grajkowski 
148578ee8d1cSJulian Grajkowski CpaStatus
cpaDcCompressData2(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcOpData * pOpData,CpaDcRqResults * pResults,void * callbackTag)148678ee8d1cSJulian Grajkowski cpaDcCompressData2(CpaInstanceHandle dcInstance,
148778ee8d1cSJulian Grajkowski 		   CpaDcSessionHandle pSessionHandle,
148878ee8d1cSJulian Grajkowski 		   CpaBufferList *pSrcBuff,
148978ee8d1cSJulian Grajkowski 		   CpaBufferList *pDestBuff,
149078ee8d1cSJulian Grajkowski 		   CpaDcOpData *pOpData,
149178ee8d1cSJulian Grajkowski 		   CpaDcRqResults *pResults,
149278ee8d1cSJulian Grajkowski 		   void *callbackTag)
149378ee8d1cSJulian Grajkowski {
149478ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
149578ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
149678ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
149778ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
149878ee8d1cSJulian Grajkowski 	dc_cnv_mode_t cnvMode = DC_NO_CNV;
149978ee8d1cSJulian Grajkowski 
150078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
150178ee8d1cSJulian Grajkowski 
150278ee8d1cSJulian Grajkowski 	if (((CPA_TRUE != pOpData->compressAndVerify) &&
150378ee8d1cSJulian Grajkowski 	     (CPA_FALSE != pOpData->compressAndVerify)) ||
150478ee8d1cSJulian Grajkowski 	    ((CPA_FALSE != pOpData->compressAndVerifyAndRecover) &&
150578ee8d1cSJulian Grajkowski 	     (CPA_TRUE != pOpData->compressAndVerifyAndRecover))) {
150678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
150778ee8d1cSJulian Grajkowski 	}
150878ee8d1cSJulian Grajkowski 
150978ee8d1cSJulian Grajkowski 	if ((CPA_FALSE == pOpData->compressAndVerify) &&
151078ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerifyAndRecover)) {
151178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
151278ee8d1cSJulian Grajkowski 	}
151378ee8d1cSJulian Grajkowski 
151478ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == pOpData->compressAndVerify) &&
151578ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerifyAndRecover) &&
151678ee8d1cSJulian Grajkowski 	    (CPA_FALSE == pOpData->integrityCrcCheck)) {
151778ee8d1cSJulian Grajkowski 		return cpaDcCompressData(dcInstance,
151878ee8d1cSJulian Grajkowski 					 pSessionHandle,
151978ee8d1cSJulian Grajkowski 					 pSrcBuff,
152078ee8d1cSJulian Grajkowski 					 pDestBuff,
152178ee8d1cSJulian Grajkowski 					 pResults,
152278ee8d1cSJulian Grajkowski 					 pOpData->flushFlag,
152378ee8d1cSJulian Grajkowski 					 callbackTag);
152478ee8d1cSJulian Grajkowski 	}
152578ee8d1cSJulian Grajkowski 
152678ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pOpData->compressAndVerify) {
152778ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
152878ee8d1cSJulian Grajkowski 		    "Data compression without verification not allowed");
152978ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
153078ee8d1cSJulian Grajkowski 	}
153178ee8d1cSJulian Grajkowski 
153278ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
153378ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
153478ee8d1cSJulian Grajkowski 	} else {
153578ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
153678ee8d1cSJulian Grajkowski 	}
153778ee8d1cSJulian Grajkowski 
153878ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
153978ee8d1cSJulian Grajkowski 
154078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
154178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
154278ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
154378ee8d1cSJulian Grajkowski 
154478ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
154578ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
154678ee8d1cSJulian Grajkowski 
154778ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
154878ee8d1cSJulian Grajkowski 	 * manage zero length requests */
154978ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
155078ee8d1cSJulian Grajkowski 					     &srcBuffSize,
155178ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
155278ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
155378ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
155478ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
155578ee8d1cSJulian Grajkowski 	}
155678ee8d1cSJulian Grajkowski 
155778ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
155878ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
155978ee8d1cSJulian Grajkowski 
156078ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
156178ee8d1cSJulian Grajkowski 
156278ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->compressAndVerify &&
156378ee8d1cSJulian Grajkowski 	    CPA_DC_STATEFUL == pSessionDesc->sessState) {
156478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
156578ee8d1cSJulian Grajkowski 		    "Invalid session state, stateful sessions "
156678ee8d1cSJulian Grajkowski 		    "not supported with CNV");
156778ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
156878ee8d1cSJulian Grajkowski 	}
156978ee8d1cSJulian Grajkowski 
157078ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
157178ee8d1cSJulian Grajkowski 	      DC_CNV_EXTENDED_CAPABILITY) &&
157278ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerify)) {
157378ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
157478ee8d1cSJulian Grajkowski 		    "CompressAndVerify feature not supported");
157578ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
157678ee8d1cSJulian Grajkowski 	}
157778ee8d1cSJulian Grajkowski 
157878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS !=
157978ee8d1cSJulian Grajkowski 	    dcParamCheck(insHandle,
158078ee8d1cSJulian Grajkowski 			 pSessionHandle,
158178ee8d1cSJulian Grajkowski 			 pService,
158278ee8d1cSJulian Grajkowski 			 pSrcBuff,
158378ee8d1cSJulian Grajkowski 			 pDestBuff,
158478ee8d1cSJulian Grajkowski 			 pResults,
158578ee8d1cSJulian Grajkowski 			 pSessionDesc,
158678ee8d1cSJulian Grajkowski 			 pOpData->flushFlag,
158778ee8d1cSJulian Grajkowski 			 srcBuffSize)) {
158878ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
158978ee8d1cSJulian Grajkowski 	}
159078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != dcCheckOpData(pService, pOpData)) {
159178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
159278ee8d1cSJulian Grajkowski 	}
159378ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pOpData->compressAndVerify) {
159478ee8d1cSJulian Grajkowski 		if (srcBuffSize > DC_COMP_MAX_BUFF_SIZE) {
159578ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
159678ee8d1cSJulian Grajkowski 			    "Compression payload greater than 64KB is "
159778ee8d1cSJulian Grajkowski 			    "unsupported, when CnV is disabled\n");
159878ee8d1cSJulian Grajkowski 			return CPA_STATUS_UNSUPPORTED;
159978ee8d1cSJulian Grajkowski 		}
160078ee8d1cSJulian Grajkowski 	}
160178ee8d1cSJulian Grajkowski 
160278ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
160378ee8d1cSJulian Grajkowski 		/* Lock the session to check if there are in-flight stateful
160478ee8d1cSJulian Grajkowski 		 * requests */
1605a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
160678ee8d1cSJulian Grajkowski 
160778ee8d1cSJulian Grajkowski 		/* Check if there is already one in-flight stateful request */
160878ee8d1cSJulian Grajkowski 		if (0 !=
160978ee8d1cSJulian Grajkowski 		    qatUtilsAtomicGet(
161078ee8d1cSJulian Grajkowski 			&(pSessionDesc->pendingStatefulCbCount))) {
161178ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
161278ee8d1cSJulian Grajkowski 			    "Only one in-flight stateful request supported");
1613a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
161478ee8d1cSJulian Grajkowski 			return CPA_STATUS_RETRY;
161578ee8d1cSJulian Grajkowski 		}
161678ee8d1cSJulian Grajkowski 
161778ee8d1cSJulian Grajkowski 		if (0 == srcBuffSize) {
161878ee8d1cSJulian Grajkowski 			if (CPA_TRUE ==
161978ee8d1cSJulian Grajkowski 			    dcZeroLengthRequests(pService,
162078ee8d1cSJulian Grajkowski 						 pSessionDesc,
162178ee8d1cSJulian Grajkowski 						 pResults,
162278ee8d1cSJulian Grajkowski 						 pOpData->flushFlag,
162378ee8d1cSJulian Grajkowski 						 callbackTag,
162478ee8d1cSJulian Grajkowski 						 DC_COMPRESSION_REQUEST)) {
162578ee8d1cSJulian Grajkowski 				return CPA_STATUS_SUCCESS;
162678ee8d1cSJulian Grajkowski 			}
162778ee8d1cSJulian Grajkowski 		}
162878ee8d1cSJulian Grajkowski 
162978ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1630a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
163178ee8d1cSJulian Grajkowski 	}
163278ee8d1cSJulian Grajkowski 
163378ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->compressAndVerify) {
163478ee8d1cSJulian Grajkowski 		cnvMode = DC_CNV;
163578ee8d1cSJulian Grajkowski 	}
163678ee8d1cSJulian Grajkowski 
163778ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
163878ee8d1cSJulian Grajkowski 				pSessionDesc,
1639a977168cSMichal Gulbicki 				insHandle,
164078ee8d1cSJulian Grajkowski 				pSessionHandle,
164178ee8d1cSJulian Grajkowski 				pSrcBuff,
164278ee8d1cSJulian Grajkowski 				pDestBuff,
164378ee8d1cSJulian Grajkowski 				pResults,
164478ee8d1cSJulian Grajkowski 				pOpData->flushFlag,
164578ee8d1cSJulian Grajkowski 				pOpData,
164678ee8d1cSJulian Grajkowski 				callbackTag,
164778ee8d1cSJulian Grajkowski 				DC_COMPRESSION_REQUEST,
164878ee8d1cSJulian Grajkowski 				CPA_TRUE,
164978ee8d1cSJulian Grajkowski 				cnvMode);
165078ee8d1cSJulian Grajkowski }
165178ee8d1cSJulian Grajkowski 
165278ee8d1cSJulian Grajkowski static CpaStatus
dcDecompressDataCheck(CpaInstanceHandle insHandle,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,Cpa64U * srcBufferSize)165378ee8d1cSJulian Grajkowski dcDecompressDataCheck(CpaInstanceHandle insHandle,
165478ee8d1cSJulian Grajkowski 		      CpaDcSessionHandle pSessionHandle,
165578ee8d1cSJulian Grajkowski 		      CpaBufferList *pSrcBuff,
165678ee8d1cSJulian Grajkowski 		      CpaBufferList *pDestBuff,
165778ee8d1cSJulian Grajkowski 		      CpaDcRqResults *pResults,
165878ee8d1cSJulian Grajkowski 		      CpaDcFlush flushFlag,
165978ee8d1cSJulian Grajkowski 		      Cpa64U *srcBufferSize)
166078ee8d1cSJulian Grajkowski {
166178ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
166278ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
166378ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
166478ee8d1cSJulian Grajkowski 
166578ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
166678ee8d1cSJulian Grajkowski 
166778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
166878ee8d1cSJulian Grajkowski 
166978ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
167078ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
167178ee8d1cSJulian Grajkowski 
167278ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
167378ee8d1cSJulian Grajkowski 	 * manage zero length requests */
167478ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
167578ee8d1cSJulian Grajkowski 					     &srcBuffSize,
167678ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
167778ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
167878ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
167978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
168078ee8d1cSJulian Grajkowski 	}
168178ee8d1cSJulian Grajkowski 
168278ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
168378ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
168478ee8d1cSJulian Grajkowski 
168578ee8d1cSJulian Grajkowski 	if (dcCheckSourceData(pSessionHandle,
168678ee8d1cSJulian Grajkowski 			      pSrcBuff,
168778ee8d1cSJulian Grajkowski 			      pDestBuff,
168878ee8d1cSJulian Grajkowski 			      pResults,
168978ee8d1cSJulian Grajkowski 			      flushFlag,
169078ee8d1cSJulian Grajkowski 			      srcBuffSize,
169178ee8d1cSJulian Grajkowski 			      NULL) != CPA_STATUS_SUCCESS) {
169278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
169378ee8d1cSJulian Grajkowski 	}
169478ee8d1cSJulian Grajkowski 	if (dcCheckDestinationData(pService,
169578ee8d1cSJulian Grajkowski 				   pSessionHandle,
169678ee8d1cSJulian Grajkowski 				   pDestBuff,
169778ee8d1cSJulian Grajkowski 				   DC_DECOMPRESSION_REQUEST) !=
169878ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
169978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
170078ee8d1cSJulian Grajkowski 	}
170178ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
170278ee8d1cSJulian Grajkowski 
170378ee8d1cSJulian Grajkowski 	if (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) {
170478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid sessDirection value");
170578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
170678ee8d1cSJulian Grajkowski 	}
170778ee8d1cSJulian Grajkowski 
170878ee8d1cSJulian Grajkowski 	*srcBufferSize = srcBuffSize;
170978ee8d1cSJulian Grajkowski 
171078ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
171178ee8d1cSJulian Grajkowski }
171278ee8d1cSJulian Grajkowski 
171378ee8d1cSJulian Grajkowski CpaStatus
cpaDcDecompressData(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,void * callbackTag)171478ee8d1cSJulian Grajkowski cpaDcDecompressData(CpaInstanceHandle dcInstance,
171578ee8d1cSJulian Grajkowski 		    CpaDcSessionHandle pSessionHandle,
171678ee8d1cSJulian Grajkowski 		    CpaBufferList *pSrcBuff,
171778ee8d1cSJulian Grajkowski 		    CpaBufferList *pDestBuff,
171878ee8d1cSJulian Grajkowski 		    CpaDcRqResults *pResults,
171978ee8d1cSJulian Grajkowski 		    CpaDcFlush flushFlag,
172078ee8d1cSJulian Grajkowski 		    void *callbackTag)
172178ee8d1cSJulian Grajkowski {
172278ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
172378ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
172478ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
172578ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
172678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
172778ee8d1cSJulian Grajkowski 
172878ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
172978ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
173078ee8d1cSJulian Grajkowski 	} else {
173178ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
173278ee8d1cSJulian Grajkowski 	}
173378ee8d1cSJulian Grajkowski 
173478ee8d1cSJulian Grajkowski 	status = dcDecompressDataCheck(insHandle,
173578ee8d1cSJulian Grajkowski 				       pSessionHandle,
173678ee8d1cSJulian Grajkowski 				       pSrcBuff,
173778ee8d1cSJulian Grajkowski 				       pDestBuff,
173878ee8d1cSJulian Grajkowski 				       pResults,
173978ee8d1cSJulian Grajkowski 				       flushFlag,
174078ee8d1cSJulian Grajkowski 				       &srcBuffSize);
174178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
174278ee8d1cSJulian Grajkowski 		return status;
174378ee8d1cSJulian Grajkowski 	}
174478ee8d1cSJulian Grajkowski 
174578ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
174678ee8d1cSJulian Grajkowski 
1747a977168cSMichal Gulbicki 	/* Check if SAL is initialised otherwise return an error */
1748a977168cSMichal Gulbicki 	SAL_RUNNING_CHECK(insHandle);
1749a977168cSMichal Gulbicki 
1750a977168cSMichal Gulbicki 	/* This check is outside the parameter checking as it is needed to
1751a977168cSMichal Gulbicki 	 * manage zero length requests */
1752a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1753a977168cSMichal Gulbicki 	    LacBuffDesc_BufferListVerifyNull(pSrcBuff,
1754a977168cSMichal Gulbicki 					     &srcBuffSize,
1755a977168cSMichal Gulbicki 					     LAC_NO_ALIGNMENT_SHIFT)) {
1756a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid source buffer list parameter");
1757a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1758a977168cSMichal Gulbicki 	}
1759a977168cSMichal Gulbicki 
1760a977168cSMichal Gulbicki 	/* Ensure this is a compression instance */
1761a977168cSMichal Gulbicki 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
1762a977168cSMichal Gulbicki 
1763a977168cSMichal Gulbicki 	if (dcCheckSourceData(pSessionHandle,
1764a977168cSMichal Gulbicki 			      pSrcBuff,
1765a977168cSMichal Gulbicki 			      pDestBuff,
1766a977168cSMichal Gulbicki 			      pResults,
1767a977168cSMichal Gulbicki 			      flushFlag,
1768a977168cSMichal Gulbicki 			      srcBuffSize,
1769a977168cSMichal Gulbicki 			      NULL) != CPA_STATUS_SUCCESS) {
1770a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1771a977168cSMichal Gulbicki 	}
1772a977168cSMichal Gulbicki 	if (dcCheckDestinationData(pService,
1773a977168cSMichal Gulbicki 				   pSessionHandle,
1774a977168cSMichal Gulbicki 				   pDestBuff,
1775a977168cSMichal Gulbicki 				   DC_DECOMPRESSION_REQUEST) !=
1776a977168cSMichal Gulbicki 	    CPA_STATUS_SUCCESS) {
1777a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1778a977168cSMichal Gulbicki 	}
177978ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
178078ee8d1cSJulian Grajkowski 
1781a977168cSMichal Gulbicki 	if (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) {
1782a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid sessDirection value");
1783a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1784a977168cSMichal Gulbicki 	}
1785a977168cSMichal Gulbicki 
178678ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
178778ee8d1cSJulian Grajkowski 		/* Lock the session to check if there are in-flight stateful
178878ee8d1cSJulian Grajkowski 		 * requests */
1789a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
179078ee8d1cSJulian Grajkowski 
179178ee8d1cSJulian Grajkowski 		/* Check if there is already one in-flight stateful request */
179278ee8d1cSJulian Grajkowski 		if (0 !=
179378ee8d1cSJulian Grajkowski 		    qatUtilsAtomicGet(
179478ee8d1cSJulian Grajkowski 			&(pSessionDesc->pendingStatefulCbCount))) {
179578ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
179678ee8d1cSJulian Grajkowski 			    "Only one in-flight stateful request supported");
1797a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
179878ee8d1cSJulian Grajkowski 			return CPA_STATUS_RETRY;
179978ee8d1cSJulian Grajkowski 		}
180078ee8d1cSJulian Grajkowski 
1801a977168cSMichal Gulbicki 		/* Gen 4 handle 0 len requests in FW */
1802a977168cSMichal Gulbicki 		if (isDcGen2x(pService)) {
180378ee8d1cSJulian Grajkowski 			if ((0 == srcBuffSize) ||
1804a977168cSMichal Gulbicki 			    ((1 == srcBuffSize) &&
1805a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FINAL != flushFlag) &&
180678ee8d1cSJulian Grajkowski 			     (CPA_DC_FLUSH_FULL != flushFlag))) {
180778ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
1808a977168cSMichal Gulbicki 				    dcZeroLengthRequests(
1809a977168cSMichal Gulbicki 					pService,
181078ee8d1cSJulian Grajkowski 					pSessionDesc,
181178ee8d1cSJulian Grajkowski 					pResults,
181278ee8d1cSJulian Grajkowski 					flushFlag,
181378ee8d1cSJulian Grajkowski 					callbackTag,
181478ee8d1cSJulian Grajkowski 					DC_DECOMPRESSION_REQUEST)) {
181578ee8d1cSJulian Grajkowski 					return CPA_STATUS_SUCCESS;
181678ee8d1cSJulian Grajkowski 				}
181778ee8d1cSJulian Grajkowski 			}
1818a977168cSMichal Gulbicki 		}
181978ee8d1cSJulian Grajkowski 
182078ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1821a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
182278ee8d1cSJulian Grajkowski 	}
182378ee8d1cSJulian Grajkowski 
182478ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
182578ee8d1cSJulian Grajkowski 				pSessionDesc,
1826a977168cSMichal Gulbicki 				insHandle,
182778ee8d1cSJulian Grajkowski 				pSessionHandle,
182878ee8d1cSJulian Grajkowski 				pSrcBuff,
182978ee8d1cSJulian Grajkowski 				pDestBuff,
183078ee8d1cSJulian Grajkowski 				pResults,
183178ee8d1cSJulian Grajkowski 				flushFlag,
183278ee8d1cSJulian Grajkowski 				NULL,
183378ee8d1cSJulian Grajkowski 				callbackTag,
183478ee8d1cSJulian Grajkowski 				DC_DECOMPRESSION_REQUEST,
183578ee8d1cSJulian Grajkowski 				CPA_TRUE,
183678ee8d1cSJulian Grajkowski 				DC_NO_CNV);
183778ee8d1cSJulian Grajkowski }
183878ee8d1cSJulian Grajkowski 
183978ee8d1cSJulian Grajkowski CpaStatus
cpaDcDecompressData2(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcOpData * pOpData,CpaDcRqResults * pResults,void * callbackTag)184078ee8d1cSJulian Grajkowski cpaDcDecompressData2(CpaInstanceHandle dcInstance,
184178ee8d1cSJulian Grajkowski 		     CpaDcSessionHandle pSessionHandle,
184278ee8d1cSJulian Grajkowski 		     CpaBufferList *pSrcBuff,
184378ee8d1cSJulian Grajkowski 		     CpaBufferList *pDestBuff,
184478ee8d1cSJulian Grajkowski 		     CpaDcOpData *pOpData,
184578ee8d1cSJulian Grajkowski 		     CpaDcRqResults *pResults,
184678ee8d1cSJulian Grajkowski 		     void *callbackTag)
184778ee8d1cSJulian Grajkowski {
184878ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
184978ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
185078ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
185178ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
185278ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
185378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
185478ee8d1cSJulian Grajkowski 
185578ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pOpData->integrityCrcCheck) {
185678ee8d1cSJulian Grajkowski 
185778ee8d1cSJulian Grajkowski 		return cpaDcDecompressData(dcInstance,
185878ee8d1cSJulian Grajkowski 					   pSessionHandle,
185978ee8d1cSJulian Grajkowski 					   pSrcBuff,
186078ee8d1cSJulian Grajkowski 					   pDestBuff,
186178ee8d1cSJulian Grajkowski 					   pResults,
186278ee8d1cSJulian Grajkowski 					   pOpData->flushFlag,
186378ee8d1cSJulian Grajkowski 					   callbackTag);
186478ee8d1cSJulian Grajkowski 	}
186578ee8d1cSJulian Grajkowski 
186678ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
186778ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
186878ee8d1cSJulian Grajkowski 	} else {
186978ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
187078ee8d1cSJulian Grajkowski 	}
187178ee8d1cSJulian Grajkowski 
187278ee8d1cSJulian Grajkowski 	status = dcDecompressDataCheck(insHandle,
187378ee8d1cSJulian Grajkowski 				       pSessionHandle,
187478ee8d1cSJulian Grajkowski 				       pSrcBuff,
187578ee8d1cSJulian Grajkowski 				       pDestBuff,
187678ee8d1cSJulian Grajkowski 				       pResults,
187778ee8d1cSJulian Grajkowski 				       pOpData->flushFlag,
187878ee8d1cSJulian Grajkowski 				       &srcBuffSize);
187978ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
188078ee8d1cSJulian Grajkowski 		return status;
188178ee8d1cSJulian Grajkowski 	}
188278ee8d1cSJulian Grajkowski 
188378ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
188478ee8d1cSJulian Grajkowski 
188578ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
188678ee8d1cSJulian Grajkowski 
1887a977168cSMichal Gulbicki 	LAC_CHECK_NULL_PARAM(insHandle);
1888a977168cSMichal Gulbicki 
1889a977168cSMichal Gulbicki 	/* Check if SAL is initialised otherwise return an error */
1890a977168cSMichal Gulbicki 	SAL_RUNNING_CHECK(insHandle);
1891a977168cSMichal Gulbicki 
1892a977168cSMichal Gulbicki 	/* This check is outside the parameter checking as it is needed to
1893a977168cSMichal Gulbicki 	 * manage zero length requests */
1894a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1895a977168cSMichal Gulbicki 	    LacBuffDesc_BufferListVerifyNull(pSrcBuff,
1896a977168cSMichal Gulbicki 					     &srcBuffSize,
1897a977168cSMichal Gulbicki 					     LAC_NO_ALIGNMENT_SHIFT)) {
1898a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid source buffer list parameter");
189978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
190078ee8d1cSJulian Grajkowski 	}
190178ee8d1cSJulian Grajkowski 
1902a977168cSMichal Gulbicki 	/* Ensure this is a compression instance */
1903a977168cSMichal Gulbicki 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
1904a977168cSMichal Gulbicki 
1905a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1906a977168cSMichal Gulbicki 	    dcCheckSourceData(pSessionHandle,
1907a977168cSMichal Gulbicki 			      pSrcBuff,
1908a977168cSMichal Gulbicki 			      pDestBuff,
1909a977168cSMichal Gulbicki 			      pResults,
1910a977168cSMichal Gulbicki 			      CPA_DC_FLUSH_NONE,
1911a977168cSMichal Gulbicki 			      srcBuffSize,
1912a977168cSMichal Gulbicki 			      NULL)) {
1913a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1914a977168cSMichal Gulbicki 	}
1915a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1916a977168cSMichal Gulbicki 	    dcCheckDestinationData(pService,
1917a977168cSMichal Gulbicki 				   pSessionHandle,
1918a977168cSMichal Gulbicki 				   pDestBuff,
1919a977168cSMichal Gulbicki 				   DC_DECOMPRESSION_REQUEST)) {
1920a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1921a977168cSMichal Gulbicki 	}
1922a977168cSMichal Gulbicki 
1923a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS != dcCheckOpData(pService, pOpData)) {
1924a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1925a977168cSMichal Gulbicki 	}
1926a977168cSMichal Gulbicki 
1927a977168cSMichal Gulbicki 	if (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) {
1928a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid sessDirection value");
1929a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1930a977168cSMichal Gulbicki 	}
1931a977168cSMichal Gulbicki 
1932a977168cSMichal Gulbicki 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
1933a977168cSMichal Gulbicki 		/* Lock the session to check if there are in-flight stateful
1934a977168cSMichal Gulbicki 		 * requests */
1935a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
1936a977168cSMichal Gulbicki 
1937a977168cSMichal Gulbicki 		/* Check if there is already one in-flight stateful request */
1938a977168cSMichal Gulbicki 		if (0 !=
1939a977168cSMichal Gulbicki 		    qatUtilsAtomicGet(
1940a977168cSMichal Gulbicki 			&(pSessionDesc->pendingStatefulCbCount))) {
1941a977168cSMichal Gulbicki 			LAC_LOG_ERROR(
1942a977168cSMichal Gulbicki 			    "Only one in-flight stateful request supported");
1943a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
1944a977168cSMichal Gulbicki 			return CPA_STATUS_RETRY;
1945a977168cSMichal Gulbicki 		}
1946a977168cSMichal Gulbicki 
1947a977168cSMichal Gulbicki 		/* Gen 4 handle 0 len requests in FW */
1948a977168cSMichal Gulbicki 		if (isDcGen2x(pService)) {
1949a977168cSMichal Gulbicki 			if ((0 == srcBuffSize) ||
1950a977168cSMichal Gulbicki 			    ((1 == srcBuffSize) &&
1951a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FINAL != pOpData->flushFlag) &&
1952a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FULL != pOpData->flushFlag))) {
1953a977168cSMichal Gulbicki 				if (CPA_TRUE ==
1954a977168cSMichal Gulbicki 				    dcZeroLengthRequests(
1955a977168cSMichal Gulbicki 					pService,
1956a977168cSMichal Gulbicki 					pSessionDesc,
1957a977168cSMichal Gulbicki 					pResults,
1958a977168cSMichal Gulbicki 					pOpData->flushFlag,
1959a977168cSMichal Gulbicki 					callbackTag,
1960a977168cSMichal Gulbicki 					DC_DECOMPRESSION_REQUEST)) {
1961a977168cSMichal Gulbicki 					return CPA_STATUS_SUCCESS;
1962a977168cSMichal Gulbicki 				}
1963a977168cSMichal Gulbicki 			}
1964a977168cSMichal Gulbicki 		}
1965a977168cSMichal Gulbicki 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1966a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
1967a977168cSMichal Gulbicki 	}
1968a977168cSMichal Gulbicki 
196978ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
197078ee8d1cSJulian Grajkowski 				pSessionDesc,
197178ee8d1cSJulian Grajkowski 				insHandle,
197278ee8d1cSJulian Grajkowski 				pSessionHandle,
197378ee8d1cSJulian Grajkowski 				pSrcBuff,
197478ee8d1cSJulian Grajkowski 				pDestBuff,
197578ee8d1cSJulian Grajkowski 				pResults,
197678ee8d1cSJulian Grajkowski 				pOpData->flushFlag,
197778ee8d1cSJulian Grajkowski 				pOpData,
197878ee8d1cSJulian Grajkowski 				callbackTag,
197978ee8d1cSJulian Grajkowski 				DC_DECOMPRESSION_REQUEST,
198078ee8d1cSJulian Grajkowski 				CPA_TRUE,
198178ee8d1cSJulian Grajkowski 				DC_NO_CNV);
198278ee8d1cSJulian Grajkowski }
1983