xref: /freebsd-src/sys/dev/qat/qat_api/common/compression/dc_datapath.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 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;
12178ee8d1cSJulian Grajkowski 
12278ee8d1cSJulian Grajkowski 	/* Extract request data pointer from the opaque data */
12378ee8d1cSJulian Grajkowski 	LAC_MEM_SHARED_READ_TO_PTR(pCompRespMsg->opaque_data, pReqData);
12478ee8d1cSJulian Grajkowski 
12578ee8d1cSJulian Grajkowski 	/* Extract fields from the request data structure */
12678ee8d1cSJulian Grajkowski 	pCookie = (dc_compression_cookie_t *)pReqData;
12778ee8d1cSJulian Grajkowski 	if (!pCookie)
12878ee8d1cSJulian Grajkowski 		return;
12978ee8d1cSJulian Grajkowski 
130a977168cSMichal Gulbicki 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pCookie->pSessionHandle);
131a977168cSMichal Gulbicki 	pService = (sal_compression_service_t *)(pCookie->dcInstance);
132a977168cSMichal Gulbicki 
133a977168cSMichal Gulbicki 	isDcDp = pSessionDesc->isDcDp;
134a977168cSMichal Gulbicki 	if (CPA_TRUE == isDcDp) {
13578ee8d1cSJulian Grajkowski 		pResponse = (CpaDcDpOpData *)pReqData;
13678ee8d1cSJulian Grajkowski 		pResults = &(pResponse->results);
13778ee8d1cSJulian Grajkowski 
13878ee8d1cSJulian Grajkowski 		if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
13978ee8d1cSJulian Grajkowski 			compDecomp = DC_DECOMPRESSION_REQUEST;
14078ee8d1cSJulian Grajkowski 		}
141a977168cSMichal Gulbicki 		pCookie = NULL;
14278ee8d1cSJulian Grajkowski 	} else {
14378ee8d1cSJulian Grajkowski 		pResults = pCookie->pResults;
14478ee8d1cSJulian Grajkowski 		callbackTag = pCookie->callbackTag;
14578ee8d1cSJulian Grajkowski 		pCbFunc = pCookie->pSessionDesc->pCompressionCb;
14678ee8d1cSJulian Grajkowski 		compDecomp = pCookie->compDecomp;
14778ee8d1cSJulian Grajkowski 		pOpData = pCookie->pDcOpData;
14878ee8d1cSJulian Grajkowski 	}
14978ee8d1cSJulian Grajkowski 
15078ee8d1cSJulian Grajkowski 	opStatus = pCompRespMsg->comn_resp.comn_status;
15178ee8d1cSJulian Grajkowski 
15278ee8d1cSJulian Grajkowski 	if (NULL != pOpData) {
15378ee8d1cSJulian Grajkowski 		verifyHwIntegrityCrcs = pOpData->verifyHwIntegrityCrcs;
154c0a4a7bbSKrzysztof Zdziarski 		integrityCrcCheck = pOpData->integrityCrcCheck;
15578ee8d1cSJulian Grajkowski 	}
15678ee8d1cSJulian Grajkowski 
15778ee8d1cSJulian Grajkowski 	hdrFlags = pCompRespMsg->comn_resp.hdr_flags;
15878ee8d1cSJulian Grajkowski 
15978ee8d1cSJulian Grajkowski 	/* Get the cmp error code */
16078ee8d1cSJulian Grajkowski 	cmpErr = pCompRespMsg->comn_resp.comn_error.s1.cmp_err_code;
16178ee8d1cSJulian Grajkowski 	if (ICP_QAT_FW_COMN_RESP_UNSUPPORTED_REQUEST_STAT_GET(opStatus)) {
16278ee8d1cSJulian Grajkowski 		/* Compression not supported by firmware, set produced/consumed
16378ee8d1cSJulian Grajkowski 		   to zero
16478ee8d1cSJulian Grajkowski 		   and call the cb function with status CPA_STATUS_UNSUPPORTED
16578ee8d1cSJulian Grajkowski 		   */
16678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Compression feature not supported\n");
16778ee8d1cSJulian Grajkowski 		status = CPA_STATUS_UNSUPPORTED;
16878ee8d1cSJulian Grajkowski 		pResults->status = (Cpa8S)cmpErr;
16978ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
17078ee8d1cSJulian Grajkowski 		pResults->produced = 0;
171a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
17278ee8d1cSJulian Grajkowski 			if (pResponse)
17378ee8d1cSJulian Grajkowski 				pResponse->responseStatus =
17478ee8d1cSJulian Grajkowski 				    CPA_STATUS_UNSUPPORTED;
17578ee8d1cSJulian Grajkowski 			(pService->pDcDpCb)(pResponse);
17678ee8d1cSJulian Grajkowski 		} else {
17778ee8d1cSJulian Grajkowski 			/* Free the memory pool */
17878ee8d1cSJulian Grajkowski 			Lac_MemPoolEntryFree(pCookie);
17978ee8d1cSJulian Grajkowski 			pCookie = NULL;
180c0a4a7bbSKrzysztof Zdziarski 
18178ee8d1cSJulian Grajkowski 			if (NULL != pCbFunc) {
18278ee8d1cSJulian Grajkowski 				pCbFunc(callbackTag, status);
18378ee8d1cSJulian Grajkowski 			}
18478ee8d1cSJulian Grajkowski 		}
18578ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
18678ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCompletedErrors, pService);
18778ee8d1cSJulian Grajkowski 		} else {
18878ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompCompletedErrors,
18978ee8d1cSJulian Grajkowski 					     pService);
19078ee8d1cSJulian Grajkowski 		}
19178ee8d1cSJulian Grajkowski 		return;
19278ee8d1cSJulian Grajkowski 	} else {
19378ee8d1cSJulian Grajkowski 		/* Check compression response status */
19478ee8d1cSJulian Grajkowski 		cmpPass =
19578ee8d1cSJulian Grajkowski 		    (CpaBoolean)(ICP_QAT_FW_COMN_STATUS_FLAG_OK ==
19678ee8d1cSJulian Grajkowski 				 ICP_QAT_FW_COMN_RESP_CMP_STAT_GET(opStatus));
19778ee8d1cSJulian Grajkowski 	}
19878ee8d1cSJulian Grajkowski 
199a977168cSMichal Gulbicki 	if (isDcGen2x(pService)) {
200a977168cSMichal Gulbicki 		/* QAT1.7 and QAT 1.8 hardware */
20178ee8d1cSJulian Grajkowski 		if (CPA_DC_INCOMPLETE_FILE_ERR == (Cpa8S)cmpErr) {
20278ee8d1cSJulian Grajkowski 			cmpPass = CPA_TRUE;
20378ee8d1cSJulian Grajkowski 			cmpErr = ERR_CODE_NO_ERROR;
20478ee8d1cSJulian Grajkowski 		}
205a977168cSMichal Gulbicki 	} else {
206a977168cSMichal Gulbicki 		/* QAT2.0 hardware cancels the incomplete file errors
207a977168cSMichal Gulbicki 		 * only for DEFLATE algorithm.
208a977168cSMichal Gulbicki 		 * Decompression direction is not tested in the callback as
209a977168cSMichal Gulbicki 		 * the request does not allow it.
210a977168cSMichal Gulbicki 		 */
211a977168cSMichal Gulbicki 		if ((pSessionDesc->compType == CPA_DC_DEFLATE) &&
212a977168cSMichal Gulbicki 		    (CPA_DC_INCOMPLETE_FILE_ERR == (Cpa8S)cmpErr)) {
213a977168cSMichal Gulbicki 			cmpPass = CPA_TRUE;
214a977168cSMichal Gulbicki 			cmpErr = ERR_CODE_NO_ERROR;
215a977168cSMichal Gulbicki 		}
216a977168cSMichal Gulbicki 	}
21778ee8d1cSJulian Grajkowski 	/* log the slice hang and endpoint push/pull error inside the response
21878ee8d1cSJulian Grajkowski 	 */
21978ee8d1cSJulian Grajkowski 	if (ERR_CODE_SSM_ERROR == (Cpa8S)cmpErr) {
22078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
22178ee8d1cSJulian Grajkowski 		    "Slice hang detected on the compression slice.\n");
22278ee8d1cSJulian Grajkowski 	} else if (ERR_CODE_ENDPOINT_ERROR == (Cpa8S)cmpErr) {
22378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
22478ee8d1cSJulian Grajkowski 		    "PCIe End Point Push/Pull or TI/RI Parity error detected.\n");
22578ee8d1cSJulian Grajkowski 	}
22678ee8d1cSJulian Grajkowski 
22778ee8d1cSJulian Grajkowski 	/* We return the compression error code for now. We would need to update
22878ee8d1cSJulian Grajkowski 	 * the API if we decide to return both error codes */
22978ee8d1cSJulian Grajkowski 	pResults->status = (Cpa8S)cmpErr;
23078ee8d1cSJulian Grajkowski 
23178ee8d1cSJulian Grajkowski 	/* Check the translator status */
23278ee8d1cSJulian Grajkowski 	if ((DC_COMPRESSION_REQUEST == compDecomp) &&
23378ee8d1cSJulian Grajkowski 	    (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType)) {
23478ee8d1cSJulian Grajkowski 		/* Check translator response status */
23578ee8d1cSJulian Grajkowski 		xlatPass =
23678ee8d1cSJulian Grajkowski 		    (CpaBoolean)(ICP_QAT_FW_COMN_STATUS_FLAG_OK ==
23778ee8d1cSJulian Grajkowski 				 ICP_QAT_FW_COMN_RESP_XLAT_STAT_GET(opStatus));
23878ee8d1cSJulian Grajkowski 
23978ee8d1cSJulian Grajkowski 		/* Get the translator error code */
24078ee8d1cSJulian Grajkowski 		xlatErr = pCompRespMsg->comn_resp.comn_error.s1.xlat_err_code;
24178ee8d1cSJulian Grajkowski 
24278ee8d1cSJulian Grajkowski 		/* Return a fatal error or a potential error in the translator
243a977168cSMichal Gulbicki 		 * slice if the compression slice did not return any error */
24478ee8d1cSJulian Grajkowski 		if ((CPA_DC_OK == pResults->status) ||
24578ee8d1cSJulian Grajkowski 		    (CPA_DC_FATALERR == (Cpa8S)xlatErr)) {
24678ee8d1cSJulian Grajkowski 			pResults->status = (Cpa8S)xlatErr;
24778ee8d1cSJulian Grajkowski 		}
24878ee8d1cSJulian Grajkowski 	}
24978ee8d1cSJulian Grajkowski 	/* Update dc error counter */
25078ee8d1cSJulian Grajkowski 	dcErrorLog(pResults->status);
25178ee8d1cSJulian Grajkowski 
252a977168cSMichal Gulbicki 	if (CPA_FALSE == isDcDp) {
25378ee8d1cSJulian Grajkowski 		/* In case of any error for an end of packet request, we need to
25478ee8d1cSJulian Grajkowski 		 * update
25578ee8d1cSJulian Grajkowski 		 * the request type for the following request */
25678ee8d1cSJulian Grajkowski 		if (CPA_DC_FLUSH_FINAL == pCookie->flushFlag && cmpPass &&
25778ee8d1cSJulian Grajkowski 		    xlatPass) {
25878ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_FIRST;
25978ee8d1cSJulian Grajkowski 		} else {
26078ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_SUBSEQUENT;
26178ee8d1cSJulian Grajkowski 		}
26278ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) ||
26378ee8d1cSJulian Grajkowski 		    ((CPA_DC_STATELESS == pSessionDesc->sessState) &&
26478ee8d1cSJulian Grajkowski 		     (DC_COMPRESSION_REQUEST == compDecomp))) {
26578ee8d1cSJulian Grajkowski 			/* Overflow is a valid use case for Traditional API
266a977168cSMichal Gulbicki 			 * only. Stateful Overflow is supported in both
267a977168cSMichal Gulbicki 			 * compression and decompression direction. Stateless
268a977168cSMichal Gulbicki 			 * Overflow is supported only in compression direction.
26978ee8d1cSJulian Grajkowski 			 */
27078ee8d1cSJulian Grajkowski 			if (CPA_DC_OVERFLOW == (Cpa8S)cmpErr)
27178ee8d1cSJulian Grajkowski 				cmpPass = CPA_TRUE;
27278ee8d1cSJulian Grajkowski 
27378ee8d1cSJulian Grajkowski 			if (CPA_DC_OVERFLOW == (Cpa8S)xlatErr) {
274a977168cSMichal Gulbicki 				if (isDcGen4x(pService) &&
275a977168cSMichal Gulbicki 				    (CPA_TRUE ==
276a977168cSMichal Gulbicki 				     pService->comp_device_data
277a977168cSMichal Gulbicki 					 .translatorOverflow)) {
278a977168cSMichal Gulbicki 					pResults->consumed =
279a977168cSMichal Gulbicki 					    pCompRespMsg->comp_resp_pars
280a977168cSMichal Gulbicki 						.input_byte_counter;
281a977168cSMichal Gulbicki 
282a977168cSMichal Gulbicki 					dcUpdateXltOverflowChecksumsGen4(
283a977168cSMichal Gulbicki 					    pCookie,
284a977168cSMichal Gulbicki 					    &pCompRespMsg->comp_resp_pars,
285a977168cSMichal Gulbicki 					    pResults);
286a977168cSMichal Gulbicki 				}
28778ee8d1cSJulian Grajkowski 				xlatPass = CPA_TRUE;
28878ee8d1cSJulian Grajkowski 			}
28978ee8d1cSJulian Grajkowski 		}
29078ee8d1cSJulian Grajkowski 	} else {
29178ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == (Cpa8S)cmpErr) {
29278ee8d1cSJulian Grajkowski 			cmpPass = CPA_FALSE;
29378ee8d1cSJulian Grajkowski 		}
29478ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == (Cpa8S)xlatErr) {
295a977168cSMichal Gulbicki 			/* XLT overflow is not valid for Data Plane requests */
29678ee8d1cSJulian Grajkowski 			xlatPass = CPA_FALSE;
29778ee8d1cSJulian Grajkowski 		}
29878ee8d1cSJulian Grajkowski 	}
29978ee8d1cSJulian Grajkowski 
30078ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == cmpPass) && (CPA_TRUE == xlatPass)) {
30178ee8d1cSJulian Grajkowski 		/* Extract the response from the firmware */
30278ee8d1cSJulian Grajkowski 		pResults->consumed =
30378ee8d1cSJulian Grajkowski 		    pCompRespMsg->comp_resp_pars.input_byte_counter;
30478ee8d1cSJulian Grajkowski 		pResults->produced =
30578ee8d1cSJulian Grajkowski 		    pCompRespMsg->comp_resp_pars.output_byte_counter;
30678ee8d1cSJulian Grajkowski 		pSessionDesc->cumulativeConsumedBytes += pResults->consumed;
30778ee8d1cSJulian Grajkowski 
308a977168cSMichal Gulbicki 		/* Handle Checksum for end to end data integrity. */
309a977168cSMichal Gulbicki 		if (CPA_TRUE ==
310a977168cSMichal Gulbicki 			pService->generic_service_info.integrityCrcCheck &&
311a977168cSMichal Gulbicki 		    CPA_TRUE == integrityCrcCheck) {
312a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum =
313a977168cSMichal Gulbicki 			    pSessionDesc->seedSwCrc.swCrc32I;
314a977168cSMichal Gulbicki 		} else if (CPA_DC_OVERFLOW != (Cpa8S)xlatErr) {
31578ee8d1cSJulian Grajkowski 			if (CPA_DC_CRC32 == pSessionDesc->checksumType) {
31678ee8d1cSJulian Grajkowski 				pResults->checksum =
31778ee8d1cSJulian Grajkowski 				    pCompRespMsg->comp_resp_pars.crc.legacy
31878ee8d1cSJulian Grajkowski 					.curr_crc32;
31978ee8d1cSJulian Grajkowski 			} else if (CPA_DC_ADLER32 ==
32078ee8d1cSJulian Grajkowski 				   pSessionDesc->checksumType) {
32178ee8d1cSJulian Grajkowski 				pResults->checksum =
32278ee8d1cSJulian Grajkowski 				    pCompRespMsg->comp_resp_pars.crc.legacy
32378ee8d1cSJulian Grajkowski 					.curr_adler_32;
32478ee8d1cSJulian Grajkowski 			}
32578ee8d1cSJulian Grajkowski 			pSessionDesc->previousChecksum = pResults->checksum;
32678ee8d1cSJulian Grajkowski 		}
32778ee8d1cSJulian Grajkowski 
32878ee8d1cSJulian Grajkowski 		if (DC_DECOMPRESSION_REQUEST == compDecomp) {
32978ee8d1cSJulian Grajkowski 			pResults->endOfLastBlock =
33078ee8d1cSJulian Grajkowski 			    (ICP_QAT_FW_COMN_STATUS_CMP_END_OF_LAST_BLK_FLAG_SET ==
33178ee8d1cSJulian Grajkowski 			     ICP_QAT_FW_COMN_RESP_CMP_END_OF_LAST_BLK_FLAG_GET(
33278ee8d1cSJulian Grajkowski 				 opStatus));
333*266b0663SKrzysztof Zdziarski 		} else {
334*266b0663SKrzysztof Zdziarski 			/* Check if returned data is a stored block
335*266b0663SKrzysztof Zdziarski 			 * in compression direction
336*266b0663SKrzysztof Zdziarski 			 */
337*266b0663SKrzysztof Zdziarski 			pResults->dataUncompressed =
338*266b0663SKrzysztof Zdziarski 			    ICP_QAT_FW_COMN_HDR_ST_BLK_FLAG_GET(hdrFlags);
33978ee8d1cSJulian Grajkowski 		}
34078ee8d1cSJulian Grajkowski 
34178ee8d1cSJulian Grajkowski 		/* Save the checksum for the next request */
34278ee8d1cSJulian Grajkowski 		if ((CPA_DC_OVERFLOW != (Cpa8S)xlatErr) &&
34378ee8d1cSJulian Grajkowski 		    (CPA_TRUE == verifyHwIntegrityCrcs)) {
34478ee8d1cSJulian Grajkowski 			pSessionDesc->previousChecksum =
345a977168cSMichal Gulbicki 			    pSessionDesc->seedSwCrc.swCrc32I;
34678ee8d1cSJulian Grajkowski 		}
34778ee8d1cSJulian Grajkowski 
34878ee8d1cSJulian Grajkowski 		/* Check if a CNV recovery happened and
34978ee8d1cSJulian Grajkowski 		 * increase stats counter
35078ee8d1cSJulian Grajkowski 		 */
35178ee8d1cSJulian Grajkowski 		if ((DC_COMPRESSION_REQUEST == compDecomp) &&
35278ee8d1cSJulian Grajkowski 		    ICP_QAT_FW_COMN_HDR_CNV_FLAG_GET(hdrFlags) &&
35378ee8d1cSJulian Grajkowski 		    ICP_QAT_FW_COMN_HDR_CNVNR_FLAG_GET(hdrFlags)) {
35478ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCnvErrorsRecovered,
35578ee8d1cSJulian Grajkowski 					     pService);
35678ee8d1cSJulian Grajkowski 		}
35778ee8d1cSJulian Grajkowski 
358a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
35978ee8d1cSJulian Grajkowski 			if (pResponse)
36078ee8d1cSJulian Grajkowski 				pResponse->responseStatus = CPA_STATUS_SUCCESS;
36178ee8d1cSJulian Grajkowski 		} else {
36278ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
36378ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numCompCompleted,
36478ee8d1cSJulian Grajkowski 						     pService);
36578ee8d1cSJulian Grajkowski 			} else {
36678ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numDecompCompleted,
36778ee8d1cSJulian Grajkowski 						     pService);
36878ee8d1cSJulian Grajkowski 			}
36978ee8d1cSJulian Grajkowski 		}
37078ee8d1cSJulian Grajkowski 	} else {
371a977168cSMichal Gulbicki #ifdef ICP_DC_RETURN_COUNTERS_ON_ERROR
372a977168cSMichal Gulbicki 		/* Extract the response from the firmware */
373a977168cSMichal Gulbicki 		pResults->consumed =
374a977168cSMichal Gulbicki 		    pCompRespMsg->comp_resp_pars.input_byte_counter;
375a977168cSMichal Gulbicki 		pResults->produced =
376a977168cSMichal Gulbicki 		    pCompRespMsg->comp_resp_pars.output_byte_counter;
377a977168cSMichal Gulbicki 
378a977168cSMichal Gulbicki 		if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
379a977168cSMichal Gulbicki 			pSessionDesc->cumulativeConsumedBytes +=
380a977168cSMichal Gulbicki 			    pResults->consumed;
381a977168cSMichal Gulbicki 		} else {
382a977168cSMichal Gulbicki 			/* In the stateless case all requests have both SOP and
383a977168cSMichal Gulbicki 			 * EOP set */
384a977168cSMichal Gulbicki 			pSessionDesc->cumulativeConsumedBytes =
385a977168cSMichal Gulbicki 			    pResults->consumed;
386a977168cSMichal Gulbicki 		}
387a977168cSMichal Gulbicki #else
38878ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
38978ee8d1cSJulian Grajkowski 		pResults->produced = 0;
390a977168cSMichal Gulbicki #endif
39178ee8d1cSJulian Grajkowski 		if (CPA_DC_OVERFLOW == pResults->status &&
39278ee8d1cSJulian Grajkowski 		    CPA_DC_STATELESS == pSessionDesc->sessState) {
39378ee8d1cSJulian Grajkowski 			/* This error message will be returned by Data Plane API
39478ee8d1cSJulian Grajkowski 			 * in both
39578ee8d1cSJulian Grajkowski 			 * compression and decompression direction. With
39678ee8d1cSJulian Grajkowski 			 * Traditional API
39778ee8d1cSJulian Grajkowski 			 * this error message will be returned only in stateless
39878ee8d1cSJulian Grajkowski 			 * decompression direction */
39978ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
40078ee8d1cSJulian Grajkowski 			    "Unrecoverable error: stateless overflow. You may need to increase the size of your destination buffer.\n");
40178ee8d1cSJulian Grajkowski 		}
40278ee8d1cSJulian Grajkowski 
403a977168cSMichal Gulbicki 		if (CPA_TRUE == isDcDp) {
40478ee8d1cSJulian Grajkowski 			if (pResponse)
40578ee8d1cSJulian Grajkowski 				pResponse->responseStatus = CPA_STATUS_FAIL;
40678ee8d1cSJulian Grajkowski 		} else {
40778ee8d1cSJulian Grajkowski 			if (CPA_DC_OK != pResults->status &&
40878ee8d1cSJulian Grajkowski 			    CPA_DC_INCOMPLETE_FILE_ERR != pResults->status) {
40978ee8d1cSJulian Grajkowski 				status = CPA_STATUS_FAIL;
41078ee8d1cSJulian Grajkowski 			}
41178ee8d1cSJulian Grajkowski 
41278ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
41378ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numCompCompletedErrors,
41478ee8d1cSJulian Grajkowski 						     pService);
41578ee8d1cSJulian Grajkowski 			} else {
41678ee8d1cSJulian Grajkowski 				COMPRESSION_STAT_INC(numDecompCompletedErrors,
41778ee8d1cSJulian Grajkowski 						     pService);
41878ee8d1cSJulian Grajkowski 			}
41978ee8d1cSJulian Grajkowski 		}
42078ee8d1cSJulian Grajkowski 	}
42178ee8d1cSJulian Grajkowski 
422a977168cSMichal Gulbicki 	if (CPA_TRUE == isDcDp) {
42378ee8d1cSJulian Grajkowski 		/* Decrement number of stateless pending callbacks for session
42478ee8d1cSJulian Grajkowski 		 */
42578ee8d1cSJulian Grajkowski 		pSessionDesc->pendingDpStatelessCbCount--;
42678ee8d1cSJulian Grajkowski 		(pService->pDcDpCb)(pResponse);
42778ee8d1cSJulian Grajkowski 	} else {
42878ee8d1cSJulian Grajkowski 		/* Decrement number of pending callbacks for session */
42978ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
43078ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
43178ee8d1cSJulian Grajkowski 			    &(pCookie->pSessionDesc->pendingStatelessCbCount));
43278ee8d1cSJulian Grajkowski 		} else if (0 !=
43378ee8d1cSJulian Grajkowski 			   qatUtilsAtomicGet(&pCookie->pSessionDesc
43478ee8d1cSJulian Grajkowski 						  ->pendingStatefulCbCount)) {
43578ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
43678ee8d1cSJulian Grajkowski 			    &(pCookie->pSessionDesc->pendingStatefulCbCount));
43778ee8d1cSJulian Grajkowski 		}
43878ee8d1cSJulian Grajkowski 
43978ee8d1cSJulian Grajkowski 		/* Free the memory pool */
44078ee8d1cSJulian Grajkowski 		Lac_MemPoolEntryFree(pCookie);
44178ee8d1cSJulian Grajkowski 		pCookie = NULL;
44278ee8d1cSJulian Grajkowski 
44378ee8d1cSJulian Grajkowski 		if (NULL != pCbFunc) {
44478ee8d1cSJulian Grajkowski 			pCbFunc(callbackTag, status);
44578ee8d1cSJulian Grajkowski 		}
44678ee8d1cSJulian Grajkowski 	}
44778ee8d1cSJulian Grajkowski }
44878ee8d1cSJulian Grajkowski 
44978ee8d1cSJulian Grajkowski /**
45078ee8d1cSJulian Grajkowski  *****************************************************************************
45178ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
45278ee8d1cSJulian Grajkowski  *      Check that all the parameters in the pOpData structure are valid
45378ee8d1cSJulian Grajkowski  *
45478ee8d1cSJulian Grajkowski  * @description
45578ee8d1cSJulian Grajkowski  *      Check that all the parameters in the pOpData structure are valid
45678ee8d1cSJulian Grajkowski  *
45778ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
45878ee8d1cSJulian Grajkowski  * @param[in]   pOpData               Pointer to request information structure
45978ee8d1cSJulian Grajkowski  *                                    holding parameters for cpaDcCompress2 and
46078ee8d1cSJulian Grajkowski  *                                    CpaDcDecompressData2
46178ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
46278ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
46378ee8d1cSJulian Grajkowski  *
46478ee8d1cSJulian Grajkowski  *****************************************************************************/
465a977168cSMichal Gulbicki CpaStatus
dcCheckOpData(sal_compression_service_t * pService,CpaDcOpData * pOpData)46678ee8d1cSJulian Grajkowski dcCheckOpData(sal_compression_service_t *pService, CpaDcOpData *pOpData)
46778ee8d1cSJulian Grajkowski {
46878ee8d1cSJulian Grajkowski 	CpaDcSkipMode skipMode = 0;
46978ee8d1cSJulian Grajkowski 
47078ee8d1cSJulian Grajkowski 	if ((pOpData->flushFlag < CPA_DC_FLUSH_NONE) ||
47178ee8d1cSJulian Grajkowski 	    (pOpData->flushFlag > CPA_DC_FLUSH_FULL)) {
47278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid flushFlag value");
47378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
47478ee8d1cSJulian Grajkowski 	}
47578ee8d1cSJulian Grajkowski 
47678ee8d1cSJulian Grajkowski 	skipMode = pOpData->inputSkipData.skipMode;
47778ee8d1cSJulian Grajkowski 	if ((skipMode < CPA_DC_SKIP_DISABLED) ||
47878ee8d1cSJulian Grajkowski 	    (skipMode > CPA_DC_SKIP_STRIDE)) {
47978ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid input skip mode value");
48078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
48178ee8d1cSJulian Grajkowski 	}
48278ee8d1cSJulian Grajkowski 
48378ee8d1cSJulian Grajkowski 	skipMode = pOpData->outputSkipData.skipMode;
48478ee8d1cSJulian Grajkowski 	if ((skipMode < CPA_DC_SKIP_DISABLED) ||
48578ee8d1cSJulian Grajkowski 	    (skipMode > CPA_DC_SKIP_STRIDE)) {
48678ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid output skip mode value");
48778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
48878ee8d1cSJulian Grajkowski 	}
48978ee8d1cSJulian Grajkowski 
49078ee8d1cSJulian Grajkowski 	if (pOpData->integrityCrcCheck == CPA_FALSE &&
49178ee8d1cSJulian Grajkowski 	    pOpData->verifyHwIntegrityCrcs == CPA_TRUE) {
49278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
49378ee8d1cSJulian Grajkowski 		    "integrityCrcCheck must be set to true"
49478ee8d1cSJulian Grajkowski 		    "in order to enable verifyHwIntegrityCrcs");
49578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
49678ee8d1cSJulian Grajkowski 	}
49778ee8d1cSJulian Grajkowski 
49878ee8d1cSJulian Grajkowski 	if (pOpData->integrityCrcCheck != CPA_TRUE &&
49978ee8d1cSJulian Grajkowski 	    pOpData->integrityCrcCheck != CPA_FALSE) {
50078ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid integrityCrcCheck value");
50178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
50278ee8d1cSJulian Grajkowski 	}
50378ee8d1cSJulian Grajkowski 
50478ee8d1cSJulian Grajkowski 	if (pOpData->verifyHwIntegrityCrcs != CPA_TRUE &&
50578ee8d1cSJulian Grajkowski 	    pOpData->verifyHwIntegrityCrcs != CPA_FALSE) {
50678ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid verifyHwIntegrityCrcs value");
50778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
50878ee8d1cSJulian Grajkowski 	}
50978ee8d1cSJulian Grajkowski 
51078ee8d1cSJulian Grajkowski 	if (pOpData->compressAndVerify != CPA_TRUE &&
51178ee8d1cSJulian Grajkowski 	    pOpData->compressAndVerify != CPA_FALSE) {
51278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid cnv decompress check value");
51378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
51478ee8d1cSJulian Grajkowski 	}
51578ee8d1cSJulian Grajkowski 
51678ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->integrityCrcCheck &&
51778ee8d1cSJulian Grajkowski 	    CPA_FALSE == pService->generic_service_info.integrityCrcCheck) {
51878ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Integrity CRC check is not "
51978ee8d1cSJulian Grajkowski 				      "supported on this device");
52078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
52178ee8d1cSJulian Grajkowski 	}
522a977168cSMichal Gulbicki 
523a977168cSMichal Gulbicki 	if (CPA_TRUE == pOpData->integrityCrcCheck &&
524a977168cSMichal Gulbicki 	    NULL == pOpData->pCrcData) {
525a977168cSMichal Gulbicki 		LAC_INVALID_PARAM_LOG("Integrity CRC data structure "
526a977168cSMichal Gulbicki 				      "not intialized in CpaDcOpData");
527a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
528a977168cSMichal Gulbicki 	}
529a977168cSMichal Gulbicki 
53078ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
53178ee8d1cSJulian Grajkowski }
53278ee8d1cSJulian Grajkowski 
53378ee8d1cSJulian Grajkowski /**
53478ee8d1cSJulian Grajkowski  *****************************************************************************
53578ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
53678ee8d1cSJulian Grajkowski  *      Check the compression source buffer for Batch and Pack API.
53778ee8d1cSJulian Grajkowski  *
53878ee8d1cSJulian Grajkowski  * @description
53978ee8d1cSJulian Grajkowski  *      Check that all the parameters used for Pack compression
54078ee8d1cSJulian Grajkowski  *      request are valid. This function essentially checks the source buffer
54178ee8d1cSJulian Grajkowski  *      parameters and results structure parameters.
54278ee8d1cSJulian Grajkowski  *
54378ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle        Session handle
54478ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff              Pointer to data buffer for compression
54578ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff             Pointer to buffer space allocated for
54678ee8d1cSJulian Grajkowski  *                                    output data
54778ee8d1cSJulian Grajkowski  * @param[in]   pResults              Pointer to results structure
54878ee8d1cSJulian Grajkowski  * @param[in]   flushFlag             Indicates the type of flush to be
54978ee8d1cSJulian Grajkowski  *                                    performed
55078ee8d1cSJulian Grajkowski  * @param[in]   srcBuffSize           Size of the source buffer
55178ee8d1cSJulian Grajkowski  *
55278ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
55378ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
55478ee8d1cSJulian Grajkowski  *
55578ee8d1cSJulian Grajkowski  *****************************************************************************/
55678ee8d1cSJulian Grajkowski static CpaStatus
dcCheckSourceData(CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,Cpa64U srcBuffSize,CpaDcSkipData * skipData)55778ee8d1cSJulian Grajkowski dcCheckSourceData(CpaDcSessionHandle pSessionHandle,
55878ee8d1cSJulian Grajkowski 		  CpaBufferList *pSrcBuff,
55978ee8d1cSJulian Grajkowski 		  CpaBufferList *pDestBuff,
56078ee8d1cSJulian Grajkowski 		  CpaDcRqResults *pResults,
56178ee8d1cSJulian Grajkowski 		  CpaDcFlush flushFlag,
56278ee8d1cSJulian Grajkowski 		  Cpa64U srcBuffSize,
56378ee8d1cSJulian Grajkowski 		  CpaDcSkipData *skipData)
56478ee8d1cSJulian Grajkowski {
56578ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
56678ee8d1cSJulian Grajkowski 
56778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
56878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSrcBuff);
56978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pDestBuff);
57078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pResults);
57178ee8d1cSJulian Grajkowski 
57278ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
57378ee8d1cSJulian Grajkowski 	if (NULL == pSessionDesc) {
57478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Session handle not as expected");
57578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
57678ee8d1cSJulian Grajkowski 	}
57778ee8d1cSJulian Grajkowski 
57878ee8d1cSJulian Grajkowski 	if ((flushFlag < CPA_DC_FLUSH_NONE) ||
57978ee8d1cSJulian Grajkowski 	    (flushFlag > CPA_DC_FLUSH_FULL)) {
58078ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid flushFlag value");
58178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
58278ee8d1cSJulian Grajkowski 	}
58378ee8d1cSJulian Grajkowski 
58478ee8d1cSJulian Grajkowski 	if (pSrcBuff == pDestBuff) {
58578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("In place operation not supported");
58678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
58778ee8d1cSJulian Grajkowski 	}
58878ee8d1cSJulian Grajkowski 
58978ee8d1cSJulian Grajkowski 	/* Compressing zero bytes is not supported for stateless sessions
59078ee8d1cSJulian Grajkowski 	 * for non Batch and Pack requests */
59178ee8d1cSJulian Grajkowski 	if ((CPA_DC_STATELESS == pSessionDesc->sessState) &&
59278ee8d1cSJulian Grajkowski 	    (0 == srcBuffSize) && (NULL == skipData)) {
59378ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
59478ee8d1cSJulian Grajkowski 		    "The source buffer size needs to be greater than "
59578ee8d1cSJulian Grajkowski 		    "zero bytes for stateless sessions");
59678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
59778ee8d1cSJulian Grajkowski 	}
59878ee8d1cSJulian Grajkowski 
59978ee8d1cSJulian Grajkowski 	if (srcBuffSize > DC_BUFFER_MAX_SIZE) {
60078ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
60178ee8d1cSJulian Grajkowski 		    "The source buffer size needs to be less than or "
60278ee8d1cSJulian Grajkowski 		    "equal to 2^32-1 bytes");
60378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
60478ee8d1cSJulian Grajkowski 	}
60578ee8d1cSJulian Grajkowski 
60678ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
60778ee8d1cSJulian Grajkowski }
60878ee8d1cSJulian Grajkowski 
60978ee8d1cSJulian Grajkowski /**
61078ee8d1cSJulian Grajkowski  *****************************************************************************
61178ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
61278ee8d1cSJulian Grajkowski  *      Check the compression or decompression function parameters.
61378ee8d1cSJulian Grajkowski  *
61478ee8d1cSJulian Grajkowski  * @description
61578ee8d1cSJulian Grajkowski  *      Check that all the parameters used for a Batch and Pack compression
61678ee8d1cSJulian Grajkowski  *      request are valid. This function essentially checks the destination
61778ee8d1cSJulian Grajkowski  *      buffer parameters and intermediate buffer parameters.
61878ee8d1cSJulian Grajkowski  *
61978ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
62078ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle        Session handle
62178ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff             Pointer to buffer space allocated for
62278ee8d1cSJulian Grajkowski  *                                    output data
62378ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
62478ee8d1cSJulian Grajkowski  *
62578ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
62678ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
62778ee8d1cSJulian Grajkowski  *
62878ee8d1cSJulian Grajkowski  *****************************************************************************/
62978ee8d1cSJulian Grajkowski static CpaStatus
dcCheckDestinationData(sal_compression_service_t * pService,CpaDcSessionHandle pSessionHandle,CpaBufferList * pDestBuff,dc_request_dir_t compDecomp)63078ee8d1cSJulian Grajkowski dcCheckDestinationData(sal_compression_service_t *pService,
63178ee8d1cSJulian Grajkowski 		       CpaDcSessionHandle pSessionHandle,
63278ee8d1cSJulian Grajkowski 		       CpaBufferList *pDestBuff,
63378ee8d1cSJulian Grajkowski 		       dc_request_dir_t compDecomp)
63478ee8d1cSJulian Grajkowski {
63578ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
63678ee8d1cSJulian Grajkowski 	Cpa64U destBuffSize = 0;
63778ee8d1cSJulian Grajkowski 
63878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
63978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pDestBuff);
64078ee8d1cSJulian Grajkowski 
64178ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
64278ee8d1cSJulian Grajkowski 	if (NULL == pSessionDesc) {
64378ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Session handle not as expected");
64478ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
64578ee8d1cSJulian Grajkowski 	}
64678ee8d1cSJulian Grajkowski 
64778ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerify(pDestBuff,
64878ee8d1cSJulian Grajkowski 					 &destBuffSize,
64978ee8d1cSJulian Grajkowski 					 LAC_NO_ALIGNMENT_SHIFT) !=
65078ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
65178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
65278ee8d1cSJulian Grajkowski 		    "Invalid destination buffer list parameter");
65378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
65478ee8d1cSJulian Grajkowski 	}
65578ee8d1cSJulian Grajkowski 
65678ee8d1cSJulian Grajkowski 	if (destBuffSize > DC_BUFFER_MAX_SIZE) {
65778ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
65878ee8d1cSJulian Grajkowski 		    "The destination buffer size needs to be less "
65978ee8d1cSJulian Grajkowski 		    "than or equal to 2^32-1 bytes");
66078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
66178ee8d1cSJulian Grajkowski 	}
66278ee8d1cSJulian Grajkowski 
66378ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pSessionDesc->isDcDp) {
66478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
66578ee8d1cSJulian Grajkowski 		    "The session type should not be data plane");
66678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
66778ee8d1cSJulian Grajkowski 	}
66878ee8d1cSJulian Grajkowski 
66978ee8d1cSJulian Grajkowski 	if (DC_COMPRESSION_REQUEST == compDecomp) {
67078ee8d1cSJulian Grajkowski 		if (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType) {
67178ee8d1cSJulian Grajkowski 
67278ee8d1cSJulian Grajkowski 			/* Check if intermediate buffers are supported */
673a977168cSMichal Gulbicki 			if ((isDcGen2x(pService)) &&
674a977168cSMichal Gulbicki 			    ((0 == pService->pInterBuffPtrsArrayPhyAddr) ||
675a977168cSMichal Gulbicki 			     (NULL == pService->pInterBuffPtrsArray))) {
67678ee8d1cSJulian Grajkowski 				LAC_LOG_ERROR(
67778ee8d1cSJulian Grajkowski 				    "No intermediate buffer defined for this instance "
67878ee8d1cSJulian Grajkowski 				    "- see cpaDcStartInstance");
67978ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
68078ee8d1cSJulian Grajkowski 			}
68178ee8d1cSJulian Grajkowski 
68278ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer size is greater or
68378ee8d1cSJulian Grajkowski 			 * equal to 128B */
68478ee8d1cSJulian Grajkowski 			if (destBuffSize < DC_DEST_BUFFER_DYN_MIN_SIZE) {
68578ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG(
68678ee8d1cSJulian Grajkowski 				    "Destination buffer size should be "
68778ee8d1cSJulian Grajkowski 				    "greater or equal to 128B");
68878ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
68978ee8d1cSJulian Grajkowski 			}
69078ee8d1cSJulian Grajkowski 		} else
69178ee8d1cSJulian Grajkowski 		{
69278ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer size is greater or
69378ee8d1cSJulian Grajkowski 			 * equal to devices min output buff size */
69478ee8d1cSJulian Grajkowski 			if (destBuffSize <
69578ee8d1cSJulian Grajkowski 			    pService->comp_device_data.minOutputBuffSize) {
69678ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG1(
69778ee8d1cSJulian Grajkowski 				    "Destination buffer size should be "
69878ee8d1cSJulian Grajkowski 				    "greater or equal to %d bytes",
69978ee8d1cSJulian Grajkowski 				    pService->comp_device_data
70078ee8d1cSJulian Grajkowski 					.minOutputBuffSize);
70178ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
70278ee8d1cSJulian Grajkowski 			}
70378ee8d1cSJulian Grajkowski 		}
70478ee8d1cSJulian Grajkowski 	} else {
70578ee8d1cSJulian Grajkowski 		/* Ensure that the destination buffer size is greater than
70678ee8d1cSJulian Grajkowski 		 * 0 bytes */
70778ee8d1cSJulian Grajkowski 		if (destBuffSize < DC_DEST_BUFFER_DEC_MIN_SIZE) {
70878ee8d1cSJulian Grajkowski 			LAC_INVALID_PARAM_LOG(
70978ee8d1cSJulian Grajkowski 			    "Destination buffer size should be "
71078ee8d1cSJulian Grajkowski 			    "greater than 0 bytes");
71178ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
71278ee8d1cSJulian Grajkowski 		}
71378ee8d1cSJulian Grajkowski 	}
71478ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
71578ee8d1cSJulian Grajkowski }
71678ee8d1cSJulian Grajkowski 
71778ee8d1cSJulian Grajkowski /**
71878ee8d1cSJulian Grajkowski  *****************************************************************************
71978ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
72078ee8d1cSJulian Grajkowski  *      Populate the compression request parameters
72178ee8d1cSJulian Grajkowski  *
72278ee8d1cSJulian Grajkowski  * @description
72378ee8d1cSJulian Grajkowski  *      This function will populate the compression request parameters
72478ee8d1cSJulian Grajkowski  *
72578ee8d1cSJulian Grajkowski  * @param[out]  pCompReqParams   Pointer to the compression request parameters
72678ee8d1cSJulian Grajkowski  * @param[in]   pCookie          Pointer to the compression cookie
72778ee8d1cSJulian Grajkowski  *
72878ee8d1cSJulian Grajkowski  *****************************************************************************/
72978ee8d1cSJulian Grajkowski static void
dcCompRequestParamsPopulate(icp_qat_fw_comp_req_params_t * pCompReqParams,dc_compression_cookie_t * pCookie)73078ee8d1cSJulian Grajkowski dcCompRequestParamsPopulate(icp_qat_fw_comp_req_params_t *pCompReqParams,
73178ee8d1cSJulian Grajkowski 			    dc_compression_cookie_t *pCookie)
73278ee8d1cSJulian Grajkowski {
73378ee8d1cSJulian Grajkowski 	pCompReqParams->comp_len = pCookie->srcTotalDataLenInBytes;
73478ee8d1cSJulian Grajkowski 	pCompReqParams->out_buffer_sz = pCookie->dstTotalDataLenInBytes;
73578ee8d1cSJulian Grajkowski }
73678ee8d1cSJulian Grajkowski 
73778ee8d1cSJulian Grajkowski /**
73878ee8d1cSJulian Grajkowski  *****************************************************************************
73978ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
74078ee8d1cSJulian Grajkowski  *      Create the requests for compression or decompression
74178ee8d1cSJulian Grajkowski  *
74278ee8d1cSJulian Grajkowski  * @description
74378ee8d1cSJulian Grajkowski  *      Create the requests for compression or decompression. This function
74478ee8d1cSJulian Grajkowski  *      will update the cookie will all required information.
74578ee8d1cSJulian Grajkowski  *
74678ee8d1cSJulian Grajkowski  * @param{out]  pCookie             Pointer to the compression cookie
74778ee8d1cSJulian Grajkowski  * @param[in]   pService            Pointer to the compression service
74878ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc        Pointer to the session descriptor
74978ee8d1cSJulian Grajkowski  * @param[in    pSessionHandle      Session handle
75078ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff            Pointer to data buffer for compression
75178ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff           Pointer to buffer space for data after
75278ee8d1cSJulian Grajkowski  *                                  compression
75378ee8d1cSJulian Grajkowski  * @param[in]   pResults            Pointer to results structure
75478ee8d1cSJulian Grajkowski  * @param[in]   flushFlag           Indicates the type of flush to be
75578ee8d1cSJulian Grajkowski  *                                  performed
75678ee8d1cSJulian Grajkowski  * @param[in]   pOpData             Pointer to request information structure
75778ee8d1cSJulian Grajkowski  *                                  holding parameters for cpaDcCompress2
75878ee8d1cSJulian Grajkowski  *                                  and CpaDcDecompressData2
75978ee8d1cSJulian Grajkowski  * @param[in]   callbackTag         Pointer to the callback tag
76078ee8d1cSJulian Grajkowski  * @param[in]   compDecomp          Direction of the operation
76178ee8d1cSJulian Grajkowski  * @param[in]   compressAndVerify   Compress and Verify
76278ee8d1cSJulian Grajkowski  *
76378ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS       Function executed successfully
76478ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in
76578ee8d1cSJulian Grajkowski  *
76678ee8d1cSJulian Grajkowski  *****************************************************************************/
76778ee8d1cSJulian 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)76878ee8d1cSJulian Grajkowski dcCreateRequest(dc_compression_cookie_t *pCookie,
76978ee8d1cSJulian Grajkowski 		sal_compression_service_t *pService,
77078ee8d1cSJulian Grajkowski 		dc_session_desc_t *pSessionDesc,
77178ee8d1cSJulian Grajkowski 		CpaDcSessionHandle pSessionHandle,
77278ee8d1cSJulian Grajkowski 		CpaBufferList *pSrcBuff,
77378ee8d1cSJulian Grajkowski 		CpaBufferList *pDestBuff,
77478ee8d1cSJulian Grajkowski 		CpaDcRqResults *pResults,
77578ee8d1cSJulian Grajkowski 		CpaDcFlush flushFlag,
77678ee8d1cSJulian Grajkowski 		CpaDcOpData *pOpData,
77778ee8d1cSJulian Grajkowski 		void *callbackTag,
77878ee8d1cSJulian Grajkowski 		dc_request_dir_t compDecomp,
77978ee8d1cSJulian Grajkowski 		dc_cnv_mode_t cnvMode)
78078ee8d1cSJulian Grajkowski {
78178ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pMsg = NULL;
78278ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_params_t *pCompReqParams = NULL;
78378ee8d1cSJulian Grajkowski 	Cpa64U srcAddrPhys = 0, dstAddrPhys = 0;
78478ee8d1cSJulian Grajkowski 	Cpa64U srcTotalDataLenInBytes = 0, dstTotalDataLenInBytes = 0;
78578ee8d1cSJulian Grajkowski 
78678ee8d1cSJulian Grajkowski 	Cpa32U rpCmdFlags = 0;
78778ee8d1cSJulian Grajkowski 	Cpa8U sop = ICP_QAT_FW_COMP_SOP;
78878ee8d1cSJulian Grajkowski 	Cpa8U eop = ICP_QAT_FW_COMP_EOP;
78978ee8d1cSJulian Grajkowski 	Cpa8U bFinal = ICP_QAT_FW_COMP_NOT_BFINAL;
79078ee8d1cSJulian Grajkowski 	Cpa8U crcMode = ICP_QAT_FW_COMP_CRC_MODE_LEGACY;
79178ee8d1cSJulian Grajkowski 	Cpa8U cnvDecompReq = ICP_QAT_FW_COMP_NO_CNV;
79278ee8d1cSJulian Grajkowski 	Cpa8U cnvRecovery = ICP_QAT_FW_COMP_NO_CNV_RECOVERY;
793a977168cSMichal Gulbicki 	CpaBoolean cnvErrorInjection = ICP_QAT_FW_COMP_NO_CNV_DFX;
79478ee8d1cSJulian Grajkowski 	CpaBoolean integrityCrcCheck = CPA_FALSE;
79578ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
79678ee8d1cSJulian Grajkowski 	CpaDcFlush flush = CPA_DC_FLUSH_NONE;
79778ee8d1cSJulian Grajkowski 	Cpa32U initial_adler = 1;
79878ee8d1cSJulian Grajkowski 	Cpa32U initial_crc32 = 0;
79978ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pReqCache = NULL;
80078ee8d1cSJulian Grajkowski 
80178ee8d1cSJulian Grajkowski 	/* Write the buffer descriptors */
80278ee8d1cSJulian Grajkowski 	status = LacBuffDesc_BufferListDescWriteAndGetSize(
80378ee8d1cSJulian Grajkowski 	    pSrcBuff,
80478ee8d1cSJulian Grajkowski 	    &srcAddrPhys,
80578ee8d1cSJulian Grajkowski 	    CPA_FALSE,
80678ee8d1cSJulian Grajkowski 	    &srcTotalDataLenInBytes,
80778ee8d1cSJulian Grajkowski 	    &(pService->generic_service_info));
80878ee8d1cSJulian Grajkowski 	if (status != CPA_STATUS_SUCCESS) {
80978ee8d1cSJulian Grajkowski 		return status;
81078ee8d1cSJulian Grajkowski 	}
81178ee8d1cSJulian Grajkowski 
81278ee8d1cSJulian Grajkowski 	status = LacBuffDesc_BufferListDescWriteAndGetSize(
81378ee8d1cSJulian Grajkowski 	    pDestBuff,
81478ee8d1cSJulian Grajkowski 	    &dstAddrPhys,
81578ee8d1cSJulian Grajkowski 	    CPA_FALSE,
81678ee8d1cSJulian Grajkowski 	    &dstTotalDataLenInBytes,
81778ee8d1cSJulian Grajkowski 	    &(pService->generic_service_info));
81878ee8d1cSJulian Grajkowski 	if (status != CPA_STATUS_SUCCESS) {
81978ee8d1cSJulian Grajkowski 		return status;
82078ee8d1cSJulian Grajkowski 	}
82178ee8d1cSJulian Grajkowski 
82278ee8d1cSJulian Grajkowski 	/* Populate the compression cookie */
82378ee8d1cSJulian Grajkowski 	pCookie->dcInstance = pService;
82478ee8d1cSJulian Grajkowski 	pCookie->pSessionHandle = pSessionHandle;
82578ee8d1cSJulian Grajkowski 	pCookie->callbackTag = callbackTag;
82678ee8d1cSJulian Grajkowski 	pCookie->pSessionDesc = pSessionDesc;
82778ee8d1cSJulian Grajkowski 	pCookie->pDcOpData = pOpData;
82878ee8d1cSJulian Grajkowski 	pCookie->pResults = pResults;
82978ee8d1cSJulian Grajkowski 	pCookie->compDecomp = compDecomp;
83078ee8d1cSJulian Grajkowski 	pCookie->pUserSrcBuff = NULL;
83178ee8d1cSJulian Grajkowski 	pCookie->pUserDestBuff = NULL;
83278ee8d1cSJulian Grajkowski 
83378ee8d1cSJulian Grajkowski 	/* Extract flush flag from either the opData or from the
83478ee8d1cSJulian Grajkowski 	 * parameter. Opdata have been introduce with APIs
83578ee8d1cSJulian Grajkowski 	 * cpaDcCompressData2 and cpaDcDecompressData2 */
83678ee8d1cSJulian Grajkowski 	if (NULL != pOpData) {
83778ee8d1cSJulian Grajkowski 		flush = pOpData->flushFlag;
83878ee8d1cSJulian Grajkowski 		integrityCrcCheck = pOpData->integrityCrcCheck;
83978ee8d1cSJulian Grajkowski 	} else {
84078ee8d1cSJulian Grajkowski 		flush = flushFlag;
84178ee8d1cSJulian Grajkowski 	}
84278ee8d1cSJulian Grajkowski 	pCookie->flushFlag = flush;
84378ee8d1cSJulian Grajkowski 
84478ee8d1cSJulian Grajkowski 	/* The firmware expects the length in bytes for source and destination
84578ee8d1cSJulian Grajkowski 	 * to be Cpa32U parameters. However the total data length could be
84678ee8d1cSJulian Grajkowski 	 * bigger as allocated by the user. We ensure that this is not the case
84778ee8d1cSJulian Grajkowski 	 * in dcCheckSourceData and cast the values to Cpa32U here */
84878ee8d1cSJulian Grajkowski 	pCookie->srcTotalDataLenInBytes = (Cpa32U)srcTotalDataLenInBytes;
849a977168cSMichal Gulbicki 	if ((isDcGen2x(pService)) && (DC_COMPRESSION_REQUEST == compDecomp) &&
85078ee8d1cSJulian Grajkowski 	    (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType)) {
85178ee8d1cSJulian Grajkowski 		if (pService->minInterBuffSizeInBytes <
85278ee8d1cSJulian Grajkowski 		    (Cpa32U)dstTotalDataLenInBytes) {
85378ee8d1cSJulian Grajkowski 			pCookie->dstTotalDataLenInBytes =
85478ee8d1cSJulian Grajkowski 			    (Cpa32U)(pService->minInterBuffSizeInBytes);
85578ee8d1cSJulian Grajkowski 		} else {
85678ee8d1cSJulian Grajkowski 			pCookie->dstTotalDataLenInBytes =
85778ee8d1cSJulian Grajkowski 			    (Cpa32U)dstTotalDataLenInBytes;
85878ee8d1cSJulian Grajkowski 		}
85978ee8d1cSJulian Grajkowski 	} else
86078ee8d1cSJulian Grajkowski 	{
86178ee8d1cSJulian Grajkowski 		pCookie->dstTotalDataLenInBytes =
86278ee8d1cSJulian Grajkowski 		    (Cpa32U)dstTotalDataLenInBytes;
86378ee8d1cSJulian Grajkowski 	}
86478ee8d1cSJulian Grajkowski 
86578ee8d1cSJulian Grajkowski 	/* Device can not decompress an odd byte decompression request
86678ee8d1cSJulian Grajkowski 	 * if bFinal is not set
86778ee8d1cSJulian Grajkowski 	 */
86878ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pService->comp_device_data.oddByteDecompNobFinal) {
86978ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
87078ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FINAL != flushFlag) &&
87178ee8d1cSJulian Grajkowski 		    (DC_DECOMPRESSION_REQUEST == compDecomp) &&
87278ee8d1cSJulian Grajkowski 		    (pCookie->srcTotalDataLenInBytes & 0x1)) {
87378ee8d1cSJulian Grajkowski 			pCookie->srcTotalDataLenInBytes--;
87478ee8d1cSJulian Grajkowski 		}
87578ee8d1cSJulian Grajkowski 	}
87678ee8d1cSJulian Grajkowski 	/* Device can not decompress odd byte interim requests */
87778ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pService->comp_device_data.oddByteDecompInterim) {
87878ee8d1cSJulian Grajkowski 		if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
87978ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FINAL != flushFlag) &&
88078ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FULL != flushFlag) &&
88178ee8d1cSJulian Grajkowski 		    (DC_DECOMPRESSION_REQUEST == compDecomp) &&
88278ee8d1cSJulian Grajkowski 		    (pCookie->srcTotalDataLenInBytes & 0x1)) {
88378ee8d1cSJulian Grajkowski 			pCookie->srcTotalDataLenInBytes--;
88478ee8d1cSJulian Grajkowski 		}
88578ee8d1cSJulian Grajkowski 	}
88678ee8d1cSJulian Grajkowski 
88778ee8d1cSJulian Grajkowski 	pMsg = (icp_qat_fw_comp_req_t *)&pCookie->request;
88878ee8d1cSJulian Grajkowski 
88978ee8d1cSJulian Grajkowski 	if (DC_COMPRESSION_REQUEST == compDecomp) {
89078ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheComp);
89178ee8d1cSJulian Grajkowski 	} else {
89278ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheDecomp);
89378ee8d1cSJulian Grajkowski 	}
89478ee8d1cSJulian Grajkowski 
89578ee8d1cSJulian Grajkowski 	/* Fills the msg from the template cached in the session descriptor */
89678ee8d1cSJulian Grajkowski 	memcpy((void *)pMsg,
89778ee8d1cSJulian Grajkowski 	       (void *)(pReqCache),
89878ee8d1cSJulian Grajkowski 	       LAC_QAT_DC_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES);
89978ee8d1cSJulian Grajkowski 
90078ee8d1cSJulian Grajkowski 	if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
90178ee8d1cSJulian Grajkowski 		initial_adler = 1;
90278ee8d1cSJulian Grajkowski 		initial_crc32 = 0;
90378ee8d1cSJulian Grajkowski 
90478ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
905a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum = initial_adler;
90678ee8d1cSJulian Grajkowski 		} else {
907a977168cSMichal Gulbicki 			pSessionDesc->previousChecksum = initial_crc32;
90878ee8d1cSJulian Grajkowski 		}
90978ee8d1cSJulian Grajkowski 	} else if (CPA_DC_STATELESS == pSessionDesc->sessState) {
91078ee8d1cSJulian Grajkowski 		pSessionDesc->previousChecksum = pResults->checksum;
91178ee8d1cSJulian Grajkowski 
91278ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
91378ee8d1cSJulian Grajkowski 			initial_adler = pSessionDesc->previousChecksum;
91478ee8d1cSJulian Grajkowski 		} else {
91578ee8d1cSJulian Grajkowski 			initial_crc32 = pSessionDesc->previousChecksum;
91678ee8d1cSJulian Grajkowski 		}
91778ee8d1cSJulian Grajkowski 	}
91878ee8d1cSJulian Grajkowski 
91978ee8d1cSJulian Grajkowski 	/* Backup source and destination buffer addresses,
92078ee8d1cSJulian Grajkowski 	 * CRC calculations both for CNV and translator overflow
92178ee8d1cSJulian Grajkowski 	 * will be performed on them in the callback function.
92278ee8d1cSJulian Grajkowski 	 */
92378ee8d1cSJulian Grajkowski 	pCookie->pUserSrcBuff = pSrcBuff;
92478ee8d1cSJulian Grajkowski 	pCookie->pUserDestBuff = pDestBuff;
92578ee8d1cSJulian Grajkowski 
92678ee8d1cSJulian Grajkowski 	/*
92778ee8d1cSJulian Grajkowski 	 * Due to implementation of CNV support and need for backwards
92878ee8d1cSJulian Grajkowski 	 * compatibility certain fields in the request and response structs had
92978ee8d1cSJulian Grajkowski 	 * been changed, moved or placed in unions cnvMode flag signifies fields
93078ee8d1cSJulian Grajkowski 	 * to be selected from req/res
93178ee8d1cSJulian Grajkowski 	 *
93278ee8d1cSJulian Grajkowski 	 * Doing extended crc checks makes sense only when we want to do the
93378ee8d1cSJulian Grajkowski 	 * actual CNV
93478ee8d1cSJulian Grajkowski 	 */
93578ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pService->generic_service_info.integrityCrcCheck &&
93678ee8d1cSJulian Grajkowski 	    CPA_TRUE == integrityCrcCheck) {
93778ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.crc_data_addr =
93878ee8d1cSJulian Grajkowski 		    pSessionDesc->physDataIntegrityCrcs;
93978ee8d1cSJulian Grajkowski 		crcMode = ICP_QAT_FW_COMP_CRC_MODE_E2E;
94078ee8d1cSJulian Grajkowski 	} else {
94178ee8d1cSJulian Grajkowski 		/* Legacy request structure */
94278ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.legacy.initial_adler = initial_adler;
94378ee8d1cSJulian Grajkowski 		pMsg->comp_pars.crc.legacy.initial_crc32 = initial_crc32;
94478ee8d1cSJulian Grajkowski 		crcMode = ICP_QAT_FW_COMP_CRC_MODE_LEGACY;
94578ee8d1cSJulian Grajkowski 	}
94678ee8d1cSJulian Grajkowski 
94778ee8d1cSJulian Grajkowski 	/* Populate the cmdFlags */
94878ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
94978ee8d1cSJulian Grajkowski 		pSessionDesc->previousRequestType = pSessionDesc->requestType;
95078ee8d1cSJulian Grajkowski 
95178ee8d1cSJulian Grajkowski 		if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
95278ee8d1cSJulian Grajkowski 			/* Update the request type for following requests */
95378ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_SUBSEQUENT;
95478ee8d1cSJulian Grajkowski 
95578ee8d1cSJulian Grajkowski 			/* Reinitialise the cumulative amount of consumed bytes
95678ee8d1cSJulian Grajkowski 			 */
95778ee8d1cSJulian Grajkowski 			pSessionDesc->cumulativeConsumedBytes = 0;
95878ee8d1cSJulian Grajkowski 
95978ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
96078ee8d1cSJulian Grajkowski 				pSessionDesc->isSopForCompressionProcessed =
96178ee8d1cSJulian Grajkowski 				    CPA_TRUE;
96278ee8d1cSJulian Grajkowski 			} else if (DC_DECOMPRESSION_REQUEST == compDecomp) {
96378ee8d1cSJulian Grajkowski 				pSessionDesc->isSopForDecompressionProcessed =
96478ee8d1cSJulian Grajkowski 				    CPA_TRUE;
96578ee8d1cSJulian Grajkowski 			}
96678ee8d1cSJulian Grajkowski 		} else {
96778ee8d1cSJulian Grajkowski 			if (DC_COMPRESSION_REQUEST == compDecomp) {
96878ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
96978ee8d1cSJulian Grajkowski 				    pSessionDesc
97078ee8d1cSJulian Grajkowski 					->isSopForCompressionProcessed) {
97178ee8d1cSJulian Grajkowski 					sop = ICP_QAT_FW_COMP_NOT_SOP;
97278ee8d1cSJulian Grajkowski 				} else {
97378ee8d1cSJulian Grajkowski 					pSessionDesc
97478ee8d1cSJulian Grajkowski 					    ->isSopForCompressionProcessed =
97578ee8d1cSJulian Grajkowski 					    CPA_TRUE;
97678ee8d1cSJulian Grajkowski 				}
97778ee8d1cSJulian Grajkowski 			} else if (DC_DECOMPRESSION_REQUEST == compDecomp) {
97878ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
97978ee8d1cSJulian Grajkowski 				    pSessionDesc
98078ee8d1cSJulian Grajkowski 					->isSopForDecompressionProcessed) {
98178ee8d1cSJulian Grajkowski 					sop = ICP_QAT_FW_COMP_NOT_SOP;
98278ee8d1cSJulian Grajkowski 				} else {
98378ee8d1cSJulian Grajkowski 					pSessionDesc
98478ee8d1cSJulian Grajkowski 					    ->isSopForDecompressionProcessed =
98578ee8d1cSJulian Grajkowski 					    CPA_TRUE;
98678ee8d1cSJulian Grajkowski 				}
98778ee8d1cSJulian Grajkowski 			}
98878ee8d1cSJulian Grajkowski 		}
98978ee8d1cSJulian Grajkowski 
99078ee8d1cSJulian Grajkowski 		if ((CPA_DC_FLUSH_FINAL == flush) ||
99178ee8d1cSJulian Grajkowski 		    (CPA_DC_FLUSH_FULL == flush)) {
99278ee8d1cSJulian Grajkowski 			/* Update the request type for following requests */
99378ee8d1cSJulian Grajkowski 			pSessionDesc->requestType = DC_REQUEST_FIRST;
99478ee8d1cSJulian Grajkowski 		} else {
99578ee8d1cSJulian Grajkowski 			eop = ICP_QAT_FW_COMP_NOT_EOP;
99678ee8d1cSJulian Grajkowski 		}
99778ee8d1cSJulian Grajkowski 	} else {
99878ee8d1cSJulian Grajkowski 		if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
99978ee8d1cSJulian Grajkowski 			/* Reinitialise the cumulative amount of consumed bytes
100078ee8d1cSJulian Grajkowski 			 */
100178ee8d1cSJulian Grajkowski 			pSessionDesc->cumulativeConsumedBytes = 0;
100278ee8d1cSJulian Grajkowski 		}
100378ee8d1cSJulian Grajkowski 	}
100478ee8d1cSJulian Grajkowski 
100578ee8d1cSJulian Grajkowski 	/* (LW 14 - 15) */
100678ee8d1cSJulian Grajkowski 	pCompReqParams = &(pMsg->comp_pars);
100778ee8d1cSJulian Grajkowski 	dcCompRequestParamsPopulate(pCompReqParams, pCookie);
100878ee8d1cSJulian Grajkowski 	if (CPA_DC_FLUSH_FINAL == flush) {
100978ee8d1cSJulian Grajkowski 		bFinal = ICP_QAT_FW_COMP_BFINAL;
101078ee8d1cSJulian Grajkowski 	}
101178ee8d1cSJulian Grajkowski 
101278ee8d1cSJulian Grajkowski 	switch (cnvMode) {
101378ee8d1cSJulian Grajkowski 	case DC_CNVNR:
101478ee8d1cSJulian Grajkowski 		cnvRecovery = ICP_QAT_FW_COMP_CNV_RECOVERY;
101578ee8d1cSJulian Grajkowski 	/* Fall through is intended here, because for CNVNR
101678ee8d1cSJulian Grajkowski 	 * cnvDecompReq also needs to be set */
101778ee8d1cSJulian Grajkowski 	case DC_CNV:
101878ee8d1cSJulian Grajkowski 		cnvDecompReq = ICP_QAT_FW_COMP_CNV;
1019a977168cSMichal Gulbicki 		if (isDcGen4x(pService)) {
1020a977168cSMichal Gulbicki 			cnvErrorInjection = pSessionDesc->cnvErrorInjection;
1021a977168cSMichal Gulbicki 		}
102278ee8d1cSJulian Grajkowski 		break;
102378ee8d1cSJulian Grajkowski 	case DC_NO_CNV:
102478ee8d1cSJulian Grajkowski 		cnvDecompReq = ICP_QAT_FW_COMP_NO_CNV;
102578ee8d1cSJulian Grajkowski 		cnvRecovery = ICP_QAT_FW_COMP_NO_CNV_RECOVERY;
102678ee8d1cSJulian Grajkowski 		break;
102778ee8d1cSJulian Grajkowski 	}
102878ee8d1cSJulian Grajkowski 
102978ee8d1cSJulian Grajkowski 	/* LW 18 */
1030a977168cSMichal Gulbicki 	rpCmdFlags = ICP_QAT_FW_COMP_REQ_PARAM_FLAGS_BUILD(sop,
1031a977168cSMichal Gulbicki 							   eop,
1032a977168cSMichal Gulbicki 							   bFinal,
1033a977168cSMichal Gulbicki 							   cnvDecompReq,
1034a977168cSMichal Gulbicki 							   cnvRecovery,
1035a977168cSMichal Gulbicki 							   cnvErrorInjection,
1036a977168cSMichal Gulbicki 							   crcMode);
1037a977168cSMichal Gulbicki 
103878ee8d1cSJulian Grajkowski 	pMsg->comp_pars.req_par_flags = rpCmdFlags;
103978ee8d1cSJulian Grajkowski 
104078ee8d1cSJulian Grajkowski 	/* Populates the QAT common request middle part of the message
104178ee8d1cSJulian Grajkowski 	 * (LW 6 to 11) */
104278ee8d1cSJulian Grajkowski 	SalQatMsg_CmnMidWrite((icp_qat_fw_la_bulk_req_t *)pMsg,
104378ee8d1cSJulian Grajkowski 			      pCookie,
104478ee8d1cSJulian Grajkowski 			      DC_DEFAULT_QAT_PTR_TYPE,
104578ee8d1cSJulian Grajkowski 			      srcAddrPhys,
104678ee8d1cSJulian Grajkowski 			      dstAddrPhys,
104778ee8d1cSJulian Grajkowski 			      0,
104878ee8d1cSJulian Grajkowski 			      0);
104978ee8d1cSJulian Grajkowski 
105078ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
105178ee8d1cSJulian Grajkowski }
105278ee8d1cSJulian Grajkowski 
105378ee8d1cSJulian Grajkowski /**
105478ee8d1cSJulian Grajkowski  *****************************************************************************
105578ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
105678ee8d1cSJulian Grajkowski  *      Send a compression request to QAT
105778ee8d1cSJulian Grajkowski  *
105878ee8d1cSJulian Grajkowski  * @description
105978ee8d1cSJulian Grajkowski  *      Send the requests for compression or decompression to QAT
106078ee8d1cSJulian Grajkowski  *
106178ee8d1cSJulian Grajkowski  * @param{in]   pCookie               Pointer to the compression cookie
106278ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
106378ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc          Pointer to the session descriptor
106478ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
106578ee8d1cSJulian Grajkowski  *
106678ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS         Function executed successfully
106778ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM   Invalid parameter passed in
106878ee8d1cSJulian Grajkowski  *
106978ee8d1cSJulian Grajkowski  *****************************************************************************/
107078ee8d1cSJulian Grajkowski static CpaStatus
dcSendRequest(dc_compression_cookie_t * pCookie,sal_compression_service_t * pService,dc_session_desc_t * pSessionDesc,dc_request_dir_t compDecomp)107178ee8d1cSJulian Grajkowski dcSendRequest(dc_compression_cookie_t *pCookie,
107278ee8d1cSJulian Grajkowski 	      sal_compression_service_t *pService,
107378ee8d1cSJulian Grajkowski 	      dc_session_desc_t *pSessionDesc,
107478ee8d1cSJulian Grajkowski 	      dc_request_dir_t compDecomp)
107578ee8d1cSJulian Grajkowski {
107678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
107778ee8d1cSJulian Grajkowski 
107878ee8d1cSJulian Grajkowski 	/* Send to QAT */
107978ee8d1cSJulian Grajkowski 	status = icp_adf_transPutMsg(pService->trans_handle_compression_tx,
108078ee8d1cSJulian Grajkowski 				     (void *)&(pCookie->request),
108178ee8d1cSJulian Grajkowski 				     LAC_QAT_DC_REQ_SZ_LW);
108278ee8d1cSJulian Grajkowski 
108378ee8d1cSJulian Grajkowski 	if ((CPA_DC_STATEFUL == pSessionDesc->sessState) &&
108478ee8d1cSJulian Grajkowski 	    (CPA_STATUS_RETRY == status)) {
108578ee8d1cSJulian Grajkowski 		/* reset requestType after receiving an retry on
108678ee8d1cSJulian Grajkowski 		 * the stateful request */
108778ee8d1cSJulian Grajkowski 		pSessionDesc->requestType = pSessionDesc->previousRequestType;
108878ee8d1cSJulian Grajkowski 	}
108978ee8d1cSJulian Grajkowski 
109078ee8d1cSJulian Grajkowski 	return status;
109178ee8d1cSJulian Grajkowski }
109278ee8d1cSJulian Grajkowski 
109378ee8d1cSJulian Grajkowski /**
109478ee8d1cSJulian Grajkowski  *****************************************************************************
109578ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
109678ee8d1cSJulian Grajkowski  *      Process the synchronous and asynchronous case for compression or
109778ee8d1cSJulian Grajkowski  *      decompression
109878ee8d1cSJulian Grajkowski  *
109978ee8d1cSJulian Grajkowski  * @description
110078ee8d1cSJulian Grajkowski  *      Process the synchronous and asynchronous case for compression or
110178ee8d1cSJulian Grajkowski  *      decompression. This function will then create and send the request to
110278ee8d1cSJulian Grajkowski  *      the firmware.
110378ee8d1cSJulian Grajkowski  *
110478ee8d1cSJulian Grajkowski  * @param[in]   pService            Pointer to the compression service
110578ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc        Pointer to the session descriptor
110678ee8d1cSJulian Grajkowski  * @param[in]   dcInstance          Instance handle derived from discovery
110778ee8d1cSJulian Grajkowski  *                                  functions
110878ee8d1cSJulian Grajkowski  * @param[in]   pSessionHandle      Session handle
110978ee8d1cSJulian Grajkowski  * @param[in]   numRequests         Number of operations in the batch request
111078ee8d1cSJulian Grajkowski  * @param[in]   pBatchOpData        Address of the list of jobs to be processed
111178ee8d1cSJulian Grajkowski  * @param[in]   pSrcBuff            Pointer to data buffer for compression
111278ee8d1cSJulian Grajkowski  * @param[in]   pDestBuff           Pointer to buffer space for data after
111378ee8d1cSJulian Grajkowski  *                                  compression
111478ee8d1cSJulian Grajkowski  * @param[in]   pResults            Pointer to results structure
111578ee8d1cSJulian Grajkowski  * @param[in]   flushFlag           Indicates the type of flush to be
111678ee8d1cSJulian Grajkowski  *                                  performed
111778ee8d1cSJulian Grajkowski  * @param[in]   pOpData             Pointer to request information structure
111878ee8d1cSJulian Grajkowski  *                                  holding parameters for cpaDcCompress2 and
111978ee8d1cSJulian Grajkowski  *                                  CpaDcDecompressData2
112078ee8d1cSJulian Grajkowski  * @param[in]   callbackTag         Pointer to the callback tag
112178ee8d1cSJulian Grajkowski  * @param[in]   compDecomp          Direction of the operation
112278ee8d1cSJulian Grajkowski  * @param[in]   isAsyncMode         Used to know if synchronous or asynchronous
112378ee8d1cSJulian Grajkowski  *                                  mode
112478ee8d1cSJulian Grajkowski  * @param[in]   cnvMode             CNV Mode
112578ee8d1cSJulian Grajkowski  *
112678ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS       Function executed successfully
112778ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_RETRY         Retry operation
112878ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_FAIL          Function failed
112978ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_RESOURCE      Resource error
113078ee8d1cSJulian Grajkowski  *
113178ee8d1cSJulian Grajkowski  *****************************************************************************/
113278ee8d1cSJulian 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)113378ee8d1cSJulian Grajkowski dcCompDecompData(sal_compression_service_t *pService,
113478ee8d1cSJulian Grajkowski 		 dc_session_desc_t *pSessionDesc,
113578ee8d1cSJulian Grajkowski 		 CpaInstanceHandle dcInstance,
113678ee8d1cSJulian Grajkowski 		 CpaDcSessionHandle pSessionHandle,
113778ee8d1cSJulian Grajkowski 		 CpaBufferList *pSrcBuff,
113878ee8d1cSJulian Grajkowski 		 CpaBufferList *pDestBuff,
113978ee8d1cSJulian Grajkowski 		 CpaDcRqResults *pResults,
114078ee8d1cSJulian Grajkowski 		 CpaDcFlush flushFlag,
114178ee8d1cSJulian Grajkowski 		 CpaDcOpData *pOpData,
114278ee8d1cSJulian Grajkowski 		 void *callbackTag,
114378ee8d1cSJulian Grajkowski 		 dc_request_dir_t compDecomp,
114478ee8d1cSJulian Grajkowski 		 CpaBoolean isAsyncMode,
114578ee8d1cSJulian Grajkowski 		 dc_cnv_mode_t cnvMode)
114678ee8d1cSJulian Grajkowski {
114778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
114878ee8d1cSJulian Grajkowski 	dc_compression_cookie_t *pCookie = NULL;
114978ee8d1cSJulian Grajkowski 
115078ee8d1cSJulian Grajkowski 	if ((LacSync_GenWakeupSyncCaller == pSessionDesc->pCompressionCb) &&
115178ee8d1cSJulian Grajkowski 	    isAsyncMode == CPA_TRUE) {
115278ee8d1cSJulian Grajkowski 		lac_sync_op_data_t *pSyncCallbackData = NULL;
115378ee8d1cSJulian Grajkowski 
115478ee8d1cSJulian Grajkowski 		status = LacSync_CreateSyncCookie(&pSyncCallbackData);
115578ee8d1cSJulian Grajkowski 
115678ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
115778ee8d1cSJulian Grajkowski 			status = dcCompDecompData(pService,
115878ee8d1cSJulian Grajkowski 						  pSessionDesc,
115978ee8d1cSJulian Grajkowski 						  dcInstance,
116078ee8d1cSJulian Grajkowski 						  pSessionHandle,
116178ee8d1cSJulian Grajkowski 						  pSrcBuff,
116278ee8d1cSJulian Grajkowski 						  pDestBuff,
116378ee8d1cSJulian Grajkowski 						  pResults,
116478ee8d1cSJulian Grajkowski 						  flushFlag,
116578ee8d1cSJulian Grajkowski 						  pOpData,
116678ee8d1cSJulian Grajkowski 						  pSyncCallbackData,
116778ee8d1cSJulian Grajkowski 						  compDecomp,
116878ee8d1cSJulian Grajkowski 						  CPA_FALSE,
116978ee8d1cSJulian Grajkowski 						  cnvMode);
117078ee8d1cSJulian Grajkowski 		} else {
117178ee8d1cSJulian Grajkowski 			return status;
117278ee8d1cSJulian Grajkowski 		}
117378ee8d1cSJulian Grajkowski 
117478ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
117578ee8d1cSJulian Grajkowski 			CpaStatus syncStatus = CPA_STATUS_SUCCESS;
117678ee8d1cSJulian Grajkowski 
117778ee8d1cSJulian Grajkowski 			syncStatus =
117878ee8d1cSJulian Grajkowski 			    LacSync_WaitForCallback(pSyncCallbackData,
117978ee8d1cSJulian Grajkowski 						    DC_SYNC_CALLBACK_TIMEOUT,
118078ee8d1cSJulian Grajkowski 						    &status,
118178ee8d1cSJulian Grajkowski 						    NULL);
118278ee8d1cSJulian Grajkowski 
118378ee8d1cSJulian Grajkowski 			/* If callback doesn't come back */
118478ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != syncStatus) {
118578ee8d1cSJulian Grajkowski 				if (DC_COMPRESSION_REQUEST == compDecomp) {
118678ee8d1cSJulian Grajkowski 					COMPRESSION_STAT_INC(
118778ee8d1cSJulian Grajkowski 					    numCompCompletedErrors, pService);
118878ee8d1cSJulian Grajkowski 				} else {
118978ee8d1cSJulian Grajkowski 					COMPRESSION_STAT_INC(
119078ee8d1cSJulian Grajkowski 					    numDecompCompletedErrors, pService);
119178ee8d1cSJulian Grajkowski 				}
119278ee8d1cSJulian Grajkowski 				LAC_LOG_ERROR("Callback timed out");
119378ee8d1cSJulian Grajkowski 				status = syncStatus;
119478ee8d1cSJulian Grajkowski 			}
119578ee8d1cSJulian Grajkowski 		} else {
119678ee8d1cSJulian Grajkowski 			/* As the Request was not sent the Callback will never
119778ee8d1cSJulian Grajkowski 			 * be called, so need to indicate that we're finished
119878ee8d1cSJulian Grajkowski 			 * with cookie so it can be destroyed. */
119978ee8d1cSJulian Grajkowski 			LacSync_SetSyncCookieComplete(pSyncCallbackData);
120078ee8d1cSJulian Grajkowski 		}
120178ee8d1cSJulian Grajkowski 
120278ee8d1cSJulian Grajkowski 		LacSync_DestroySyncCookie(&pSyncCallbackData);
120378ee8d1cSJulian Grajkowski 		return status;
120478ee8d1cSJulian Grajkowski 	}
120578ee8d1cSJulian Grajkowski 
120678ee8d1cSJulian Grajkowski 	/* Allocate the compression cookie
120778ee8d1cSJulian Grajkowski 	 * The memory is freed in callback or in sendRequest if an error occurs
120878ee8d1cSJulian Grajkowski 	 */
120978ee8d1cSJulian Grajkowski 	pCookie = (dc_compression_cookie_t *)Lac_MemPoolEntryAlloc(
121078ee8d1cSJulian Grajkowski 	    pService->compression_mem_pool);
121178ee8d1cSJulian Grajkowski 	if (NULL == pCookie) {
121278ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Cannot get mem pool entry for compression");
121378ee8d1cSJulian Grajkowski 		status = CPA_STATUS_RESOURCE;
121478ee8d1cSJulian Grajkowski 	} else if ((void *)CPA_STATUS_RETRY == pCookie) {
121578ee8d1cSJulian Grajkowski 		pCookie = NULL;
121678ee8d1cSJulian Grajkowski 		status = CPA_STATUS_RETRY;
121778ee8d1cSJulian Grajkowski 	}
121878ee8d1cSJulian Grajkowski 
121978ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
122078ee8d1cSJulian Grajkowski 		status = dcCreateRequest(pCookie,
122178ee8d1cSJulian Grajkowski 					 pService,
122278ee8d1cSJulian Grajkowski 					 pSessionDesc,
122378ee8d1cSJulian Grajkowski 					 pSessionHandle,
122478ee8d1cSJulian Grajkowski 					 pSrcBuff,
122578ee8d1cSJulian Grajkowski 					 pDestBuff,
122678ee8d1cSJulian Grajkowski 					 pResults,
122778ee8d1cSJulian Grajkowski 					 flushFlag,
122878ee8d1cSJulian Grajkowski 					 pOpData,
122978ee8d1cSJulian Grajkowski 					 callbackTag,
123078ee8d1cSJulian Grajkowski 					 compDecomp,
123178ee8d1cSJulian Grajkowski 					 cnvMode);
123278ee8d1cSJulian Grajkowski 	}
123378ee8d1cSJulian Grajkowski 
123478ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
123578ee8d1cSJulian Grajkowski 		/* Increment number of pending callbacks for session */
123678ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
123778ee8d1cSJulian Grajkowski 			qatUtilsAtomicInc(
123878ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatelessCbCount));
123978ee8d1cSJulian Grajkowski 		}
124078ee8d1cSJulian Grajkowski 		status =
124178ee8d1cSJulian Grajkowski 		    dcSendRequest(pCookie, pService, pSessionDesc, compDecomp);
124278ee8d1cSJulian Grajkowski 	}
124378ee8d1cSJulian Grajkowski 
124478ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
124578ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
124678ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequests, pService);
124778ee8d1cSJulian Grajkowski 		} else {
124878ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequests, pService);
124978ee8d1cSJulian Grajkowski 		}
125078ee8d1cSJulian Grajkowski 	} else {
125178ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
125278ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequestsErrors, pService);
125378ee8d1cSJulian Grajkowski 		} else {
125478ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequestsErrors, pService);
125578ee8d1cSJulian Grajkowski 		}
125678ee8d1cSJulian Grajkowski 
125778ee8d1cSJulian Grajkowski 		/* Decrement number of pending callbacks for session */
125878ee8d1cSJulian Grajkowski 		if (CPA_DC_STATELESS == pSessionDesc->sessState) {
125978ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
126078ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatelessCbCount));
126178ee8d1cSJulian Grajkowski 		} else {
126278ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(
126378ee8d1cSJulian Grajkowski 			    &(pSessionDesc->pendingStatefulCbCount));
126478ee8d1cSJulian Grajkowski 		}
126578ee8d1cSJulian Grajkowski 
126678ee8d1cSJulian Grajkowski 		/* Free the memory pool */
126778ee8d1cSJulian Grajkowski 		if (NULL != pCookie) {
126878ee8d1cSJulian Grajkowski 			if (status != CPA_STATUS_UNSUPPORTED) {
126978ee8d1cSJulian Grajkowski 				/* Free the memory pool */
127078ee8d1cSJulian Grajkowski 				Lac_MemPoolEntryFree(pCookie);
127178ee8d1cSJulian Grajkowski 				pCookie = NULL;
127278ee8d1cSJulian Grajkowski 			}
127378ee8d1cSJulian Grajkowski 		}
127478ee8d1cSJulian Grajkowski 	}
127578ee8d1cSJulian Grajkowski 
127678ee8d1cSJulian Grajkowski 	return status;
127778ee8d1cSJulian Grajkowski }
127878ee8d1cSJulian Grajkowski 
127978ee8d1cSJulian Grajkowski /**
128078ee8d1cSJulian Grajkowski  *****************************************************************************
128178ee8d1cSJulian Grajkowski  * @ingroup Dc_DataCompression
128278ee8d1cSJulian Grajkowski  *      Handle zero length compression or decompression requests
128378ee8d1cSJulian Grajkowski  *
128478ee8d1cSJulian Grajkowski  * @description
128578ee8d1cSJulian Grajkowski  *      Handle zero length compression or decompression requests
128678ee8d1cSJulian Grajkowski  *
128778ee8d1cSJulian Grajkowski  * @param[in]   pService              Pointer to the compression service
128878ee8d1cSJulian Grajkowski  * @param[in]   pSessionDesc          Pointer to the session descriptor
128978ee8d1cSJulian Grajkowski  * @param[in]   pResults              Pointer to results structure
129078ee8d1cSJulian Grajkowski  * @param[in]   flushFlag             Indicates the type of flush to be
129178ee8d1cSJulian Grajkowski  *                                    performed
129278ee8d1cSJulian Grajkowski  * @param[in]   callbackTag           User supplied value to help correlate
129378ee8d1cSJulian Grajkowski  *                                    the callback with its associated request
129478ee8d1cSJulian Grajkowski  * @param[in]   compDecomp            Direction of the operation
129578ee8d1cSJulian Grajkowski  *
129678ee8d1cSJulian Grajkowski  * @retval CPA_TRUE                   Zero length SOP or MOP processed
129778ee8d1cSJulian Grajkowski  * @retval CPA_FALSE                  Zero length EOP
129878ee8d1cSJulian Grajkowski  *
129978ee8d1cSJulian Grajkowski  *****************************************************************************/
130078ee8d1cSJulian 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)130178ee8d1cSJulian Grajkowski dcZeroLengthRequests(sal_compression_service_t *pService,
130278ee8d1cSJulian Grajkowski 		     dc_session_desc_t *pSessionDesc,
130378ee8d1cSJulian Grajkowski 		     CpaDcRqResults *pResults,
130478ee8d1cSJulian Grajkowski 		     CpaDcFlush flushFlag,
130578ee8d1cSJulian Grajkowski 		     void *callbackTag,
130678ee8d1cSJulian Grajkowski 		     dc_request_dir_t compDecomp)
130778ee8d1cSJulian Grajkowski {
130878ee8d1cSJulian Grajkowski 	CpaBoolean status = CPA_FALSE;
130978ee8d1cSJulian Grajkowski 	CpaDcCallbackFn pCbFunc = pSessionDesc->pCompressionCb;
131078ee8d1cSJulian Grajkowski 
131178ee8d1cSJulian Grajkowski 	if (DC_REQUEST_FIRST == pSessionDesc->requestType) {
131278ee8d1cSJulian Grajkowski 		/* Reinitialise the cumulative amount of consumed bytes */
131378ee8d1cSJulian Grajkowski 		pSessionDesc->cumulativeConsumedBytes = 0;
131478ee8d1cSJulian Grajkowski 
131578ee8d1cSJulian Grajkowski 		/* Zero length SOP */
131678ee8d1cSJulian Grajkowski 		if (CPA_DC_ADLER32 == pSessionDesc->checksumType) {
131778ee8d1cSJulian Grajkowski 			pResults->checksum = 1;
131878ee8d1cSJulian Grajkowski 		} else {
131978ee8d1cSJulian Grajkowski 			pResults->checksum = 0;
132078ee8d1cSJulian Grajkowski 		}
132178ee8d1cSJulian Grajkowski 
132278ee8d1cSJulian Grajkowski 		status = CPA_TRUE;
132378ee8d1cSJulian Grajkowski 	} else if ((CPA_DC_FLUSH_NONE == flushFlag) ||
132478ee8d1cSJulian Grajkowski 		   (CPA_DC_FLUSH_SYNC == flushFlag)) {
132578ee8d1cSJulian Grajkowski 		/* Zero length MOP */
132678ee8d1cSJulian Grajkowski 		pResults->checksum = pSessionDesc->previousChecksum;
132778ee8d1cSJulian Grajkowski 		status = CPA_TRUE;
132878ee8d1cSJulian Grajkowski 	}
132978ee8d1cSJulian Grajkowski 
133078ee8d1cSJulian Grajkowski 	if (CPA_TRUE == status) {
133178ee8d1cSJulian Grajkowski 		pResults->status = CPA_DC_OK;
133278ee8d1cSJulian Grajkowski 		pResults->produced = 0;
133378ee8d1cSJulian Grajkowski 		pResults->consumed = 0;
133478ee8d1cSJulian Grajkowski 
133578ee8d1cSJulian Grajkowski 		/* Increment statistics */
133678ee8d1cSJulian Grajkowski 		if (DC_COMPRESSION_REQUEST == compDecomp) {
133778ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompRequests, pService);
133878ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numCompCompleted, pService);
133978ee8d1cSJulian Grajkowski 		} else {
134078ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompRequests, pService);
134178ee8d1cSJulian Grajkowski 			COMPRESSION_STAT_INC(numDecompCompleted, pService);
134278ee8d1cSJulian Grajkowski 		}
134378ee8d1cSJulian Grajkowski 
1344a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
134578ee8d1cSJulian Grajkowski 
134678ee8d1cSJulian Grajkowski 		if ((NULL != pCbFunc) &&
134778ee8d1cSJulian Grajkowski 		    (LacSync_GenWakeupSyncCaller != pCbFunc)) {
134878ee8d1cSJulian Grajkowski 			pCbFunc(callbackTag, CPA_STATUS_SUCCESS);
134978ee8d1cSJulian Grajkowski 		}
135078ee8d1cSJulian Grajkowski 
135178ee8d1cSJulian Grajkowski 		return CPA_TRUE;
135278ee8d1cSJulian Grajkowski 	}
135378ee8d1cSJulian Grajkowski 
135478ee8d1cSJulian Grajkowski 	return CPA_FALSE;
135578ee8d1cSJulian Grajkowski }
135678ee8d1cSJulian Grajkowski 
135778ee8d1cSJulian 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)135878ee8d1cSJulian Grajkowski dcParamCheck(CpaInstanceHandle dcInstance,
135978ee8d1cSJulian Grajkowski 	     CpaDcSessionHandle pSessionHandle,
136078ee8d1cSJulian Grajkowski 	     sal_compression_service_t *pService,
136178ee8d1cSJulian Grajkowski 	     CpaBufferList *pSrcBuff,
136278ee8d1cSJulian Grajkowski 	     CpaBufferList *pDestBuff,
136378ee8d1cSJulian Grajkowski 	     CpaDcRqResults *pResults,
136478ee8d1cSJulian Grajkowski 	     dc_session_desc_t *pSessionDesc,
136578ee8d1cSJulian Grajkowski 	     CpaDcFlush flushFlag,
136678ee8d1cSJulian Grajkowski 	     Cpa64U srcBuffSize)
136778ee8d1cSJulian Grajkowski {
136878ee8d1cSJulian Grajkowski 
136978ee8d1cSJulian Grajkowski 	if (dcCheckSourceData(pSessionHandle,
137078ee8d1cSJulian Grajkowski 			      pSrcBuff,
137178ee8d1cSJulian Grajkowski 			      pDestBuff,
137278ee8d1cSJulian Grajkowski 			      pResults,
137378ee8d1cSJulian Grajkowski 			      flushFlag,
137478ee8d1cSJulian Grajkowski 			      srcBuffSize,
137578ee8d1cSJulian Grajkowski 			      NULL) != CPA_STATUS_SUCCESS) {
137678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
137778ee8d1cSJulian Grajkowski 	}
137878ee8d1cSJulian Grajkowski 	if (dcCheckDestinationData(
137978ee8d1cSJulian Grajkowski 		pService, pSessionHandle, pDestBuff, DC_COMPRESSION_REQUEST) !=
138078ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
138178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
138278ee8d1cSJulian Grajkowski 	}
138378ee8d1cSJulian Grajkowski 	if (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection) {
138478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid sessDirection value");
138578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
138678ee8d1cSJulian Grajkowski 	}
138778ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
138878ee8d1cSJulian Grajkowski }
138978ee8d1cSJulian Grajkowski 
139078ee8d1cSJulian Grajkowski CpaStatus
cpaDcCompressData(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,void * callbackTag)139178ee8d1cSJulian Grajkowski cpaDcCompressData(CpaInstanceHandle dcInstance,
139278ee8d1cSJulian Grajkowski 		  CpaDcSessionHandle pSessionHandle,
139378ee8d1cSJulian Grajkowski 		  CpaBufferList *pSrcBuff,
139478ee8d1cSJulian Grajkowski 		  CpaBufferList *pDestBuff,
139578ee8d1cSJulian Grajkowski 		  CpaDcRqResults *pResults,
139678ee8d1cSJulian Grajkowski 		  CpaDcFlush flushFlag,
139778ee8d1cSJulian Grajkowski 		  void *callbackTag)
139878ee8d1cSJulian Grajkowski {
139978ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
140078ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
140178ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
140278ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
140378ee8d1cSJulian Grajkowski 
140478ee8d1cSJulian Grajkowski 
140578ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
140678ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
140778ee8d1cSJulian Grajkowski 	} else {
140878ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
140978ee8d1cSJulian Grajkowski 	}
141078ee8d1cSJulian Grajkowski 
141178ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
141278ee8d1cSJulian Grajkowski 
141378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
141478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
141578ee8d1cSJulian Grajkowski 
141678ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
141778ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
141878ee8d1cSJulian Grajkowski 
141978ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
142078ee8d1cSJulian Grajkowski 	 * manage zero length requests */
142178ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
142278ee8d1cSJulian Grajkowski 					     &srcBuffSize,
142378ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
142478ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
142578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
142678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
142778ee8d1cSJulian Grajkowski 	}
142878ee8d1cSJulian Grajkowski 
142978ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
143078ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
143178ee8d1cSJulian Grajkowski 
143278ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
143378ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS !=
143478ee8d1cSJulian Grajkowski 	    dcParamCheck(insHandle,
143578ee8d1cSJulian Grajkowski 			 pSessionHandle,
143678ee8d1cSJulian Grajkowski 			 pService,
143778ee8d1cSJulian Grajkowski 			 pSrcBuff,
143878ee8d1cSJulian Grajkowski 			 pDestBuff,
143978ee8d1cSJulian Grajkowski 			 pResults,
144078ee8d1cSJulian Grajkowski 			 pSessionDesc,
144178ee8d1cSJulian Grajkowski 			 flushFlag,
144278ee8d1cSJulian Grajkowski 			 srcBuffSize)) {
144378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
144478ee8d1cSJulian Grajkowski 	}
144578ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
144678ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
144778ee8d1cSJulian Grajkowski 		    "Invalid session state, stateful sessions "
144878ee8d1cSJulian Grajkowski 		    "are not supported");
144978ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
145078ee8d1cSJulian Grajkowski 	}
145178ee8d1cSJulian Grajkowski 
145278ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
145378ee8d1cSJulian Grajkowski 	      DC_CNV_EXTENDED_CAPABILITY)) {
145478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
145578ee8d1cSJulian Grajkowski 		    "CompressAndVerify feature not supported");
145678ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
145778ee8d1cSJulian Grajkowski 	}
145878ee8d1cSJulian Grajkowski 
145978ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
146078ee8d1cSJulian Grajkowski 	      DC_CNVNR_EXTENDED_CAPABILITY)) {
146178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
146278ee8d1cSJulian Grajkowski 		    "CompressAndVerifyAndRecovery feature not supported");
146378ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
146478ee8d1cSJulian Grajkowski 	}
146578ee8d1cSJulian Grajkowski 
146678ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
146778ee8d1cSJulian Grajkowski 				pSessionDesc,
1468a977168cSMichal Gulbicki 				insHandle,
146978ee8d1cSJulian Grajkowski 				pSessionHandle,
147078ee8d1cSJulian Grajkowski 				pSrcBuff,
147178ee8d1cSJulian Grajkowski 				pDestBuff,
147278ee8d1cSJulian Grajkowski 				pResults,
147378ee8d1cSJulian Grajkowski 				flushFlag,
147478ee8d1cSJulian Grajkowski 				NULL,
147578ee8d1cSJulian Grajkowski 				callbackTag,
147678ee8d1cSJulian Grajkowski 				DC_COMPRESSION_REQUEST,
147778ee8d1cSJulian Grajkowski 				CPA_TRUE,
147878ee8d1cSJulian Grajkowski 				DC_CNVNR);
147978ee8d1cSJulian Grajkowski }
148078ee8d1cSJulian Grajkowski 
148178ee8d1cSJulian Grajkowski CpaStatus
cpaDcCompressData2(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcOpData * pOpData,CpaDcRqResults * pResults,void * callbackTag)148278ee8d1cSJulian Grajkowski cpaDcCompressData2(CpaInstanceHandle dcInstance,
148378ee8d1cSJulian Grajkowski 		   CpaDcSessionHandle pSessionHandle,
148478ee8d1cSJulian Grajkowski 		   CpaBufferList *pSrcBuff,
148578ee8d1cSJulian Grajkowski 		   CpaBufferList *pDestBuff,
148678ee8d1cSJulian Grajkowski 		   CpaDcOpData *pOpData,
148778ee8d1cSJulian Grajkowski 		   CpaDcRqResults *pResults,
148878ee8d1cSJulian Grajkowski 		   void *callbackTag)
148978ee8d1cSJulian Grajkowski {
149078ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
149178ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
149278ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
149378ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
149478ee8d1cSJulian Grajkowski 	dc_cnv_mode_t cnvMode = DC_NO_CNV;
149578ee8d1cSJulian Grajkowski 
149678ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
149778ee8d1cSJulian Grajkowski 
149878ee8d1cSJulian Grajkowski 	if (((CPA_TRUE != pOpData->compressAndVerify) &&
149978ee8d1cSJulian Grajkowski 	     (CPA_FALSE != pOpData->compressAndVerify)) ||
150078ee8d1cSJulian Grajkowski 	    ((CPA_FALSE != pOpData->compressAndVerifyAndRecover) &&
150178ee8d1cSJulian Grajkowski 	     (CPA_TRUE != pOpData->compressAndVerifyAndRecover))) {
150278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
150378ee8d1cSJulian Grajkowski 	}
150478ee8d1cSJulian Grajkowski 
150578ee8d1cSJulian Grajkowski 	if ((CPA_FALSE == pOpData->compressAndVerify) &&
150678ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerifyAndRecover)) {
150778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
150878ee8d1cSJulian Grajkowski 	}
150978ee8d1cSJulian Grajkowski 
151078ee8d1cSJulian Grajkowski 
151178ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == pOpData->compressAndVerify) &&
151278ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerifyAndRecover) &&
151378ee8d1cSJulian Grajkowski 	    (CPA_FALSE == pOpData->integrityCrcCheck)) {
151478ee8d1cSJulian Grajkowski 		return cpaDcCompressData(dcInstance,
151578ee8d1cSJulian Grajkowski 					 pSessionHandle,
151678ee8d1cSJulian Grajkowski 					 pSrcBuff,
151778ee8d1cSJulian Grajkowski 					 pDestBuff,
151878ee8d1cSJulian Grajkowski 					 pResults,
151978ee8d1cSJulian Grajkowski 					 pOpData->flushFlag,
152078ee8d1cSJulian Grajkowski 					 callbackTag);
152178ee8d1cSJulian Grajkowski 	}
152278ee8d1cSJulian Grajkowski 
152378ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pOpData->compressAndVerify) {
152478ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
152578ee8d1cSJulian Grajkowski 		    "Data compression without verification not allowed");
152678ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
152778ee8d1cSJulian Grajkowski 	}
152878ee8d1cSJulian Grajkowski 
152978ee8d1cSJulian Grajkowski 
153078ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
153178ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
153278ee8d1cSJulian Grajkowski 	} else {
153378ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
153478ee8d1cSJulian Grajkowski 	}
153578ee8d1cSJulian Grajkowski 
153678ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
153778ee8d1cSJulian Grajkowski 
153878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
153978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pSessionHandle);
154078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
154178ee8d1cSJulian Grajkowski 
154278ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
154378ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
154478ee8d1cSJulian Grajkowski 
154578ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
154678ee8d1cSJulian Grajkowski 	 * manage zero length requests */
154778ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
154878ee8d1cSJulian Grajkowski 					     &srcBuffSize,
154978ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
155078ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
155178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
155278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
155378ee8d1cSJulian Grajkowski 	}
155478ee8d1cSJulian Grajkowski 
155578ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
155678ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
155778ee8d1cSJulian Grajkowski 
155878ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
155978ee8d1cSJulian Grajkowski 
156078ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->compressAndVerify &&
156178ee8d1cSJulian Grajkowski 	    CPA_DC_STATEFUL == pSessionDesc->sessState) {
156278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
156378ee8d1cSJulian Grajkowski 		    "Invalid session state, stateful sessions "
156478ee8d1cSJulian Grajkowski 		    "not supported with CNV");
156578ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
156678ee8d1cSJulian Grajkowski 	}
156778ee8d1cSJulian Grajkowski 
156878ee8d1cSJulian Grajkowski 	if (!(pService->generic_service_info.dcExtendedFeatures &
156978ee8d1cSJulian Grajkowski 	      DC_CNV_EXTENDED_CAPABILITY) &&
157078ee8d1cSJulian Grajkowski 	    (CPA_TRUE == pOpData->compressAndVerify)) {
157178ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG(
157278ee8d1cSJulian Grajkowski 		    "CompressAndVerify feature not supported");
157378ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
157478ee8d1cSJulian Grajkowski 	}
157578ee8d1cSJulian Grajkowski 
157678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS !=
157778ee8d1cSJulian Grajkowski 	    dcParamCheck(insHandle,
157878ee8d1cSJulian Grajkowski 			 pSessionHandle,
157978ee8d1cSJulian Grajkowski 			 pService,
158078ee8d1cSJulian Grajkowski 			 pSrcBuff,
158178ee8d1cSJulian Grajkowski 			 pDestBuff,
158278ee8d1cSJulian Grajkowski 			 pResults,
158378ee8d1cSJulian Grajkowski 			 pSessionDesc,
158478ee8d1cSJulian Grajkowski 			 pOpData->flushFlag,
158578ee8d1cSJulian Grajkowski 			 srcBuffSize)) {
158678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
158778ee8d1cSJulian Grajkowski 	}
158878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != dcCheckOpData(pService, pOpData)) {
158978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
159078ee8d1cSJulian Grajkowski 	}
159178ee8d1cSJulian Grajkowski 	if (CPA_TRUE != pOpData->compressAndVerify) {
159278ee8d1cSJulian Grajkowski 		if (srcBuffSize > DC_COMP_MAX_BUFF_SIZE) {
159378ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
159478ee8d1cSJulian Grajkowski 			    "Compression payload greater than 64KB is "
159578ee8d1cSJulian Grajkowski 			    "unsupported, when CnV is disabled\n");
159678ee8d1cSJulian Grajkowski 			return CPA_STATUS_UNSUPPORTED;
159778ee8d1cSJulian Grajkowski 		}
159878ee8d1cSJulian Grajkowski 	}
159978ee8d1cSJulian Grajkowski 
160078ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
160178ee8d1cSJulian Grajkowski 		/* Lock the session to check if there are in-flight stateful
160278ee8d1cSJulian Grajkowski 		 * requests */
1603a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
160478ee8d1cSJulian Grajkowski 
160578ee8d1cSJulian Grajkowski 		/* Check if there is already one in-flight stateful request */
160678ee8d1cSJulian Grajkowski 		if (0 !=
160778ee8d1cSJulian Grajkowski 		    qatUtilsAtomicGet(
160878ee8d1cSJulian Grajkowski 			&(pSessionDesc->pendingStatefulCbCount))) {
160978ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
161078ee8d1cSJulian Grajkowski 			    "Only one in-flight stateful request supported");
1611a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
161278ee8d1cSJulian Grajkowski 			return CPA_STATUS_RETRY;
161378ee8d1cSJulian Grajkowski 		}
161478ee8d1cSJulian Grajkowski 
161578ee8d1cSJulian Grajkowski 		if (0 == srcBuffSize) {
161678ee8d1cSJulian Grajkowski 			if (CPA_TRUE ==
161778ee8d1cSJulian Grajkowski 			    dcZeroLengthRequests(pService,
161878ee8d1cSJulian Grajkowski 						 pSessionDesc,
161978ee8d1cSJulian Grajkowski 						 pResults,
162078ee8d1cSJulian Grajkowski 						 pOpData->flushFlag,
162178ee8d1cSJulian Grajkowski 						 callbackTag,
162278ee8d1cSJulian Grajkowski 						 DC_COMPRESSION_REQUEST)) {
162378ee8d1cSJulian Grajkowski 				return CPA_STATUS_SUCCESS;
162478ee8d1cSJulian Grajkowski 			}
162578ee8d1cSJulian Grajkowski 		}
162678ee8d1cSJulian Grajkowski 
162778ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1628a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
162978ee8d1cSJulian Grajkowski 	}
163078ee8d1cSJulian Grajkowski 
163178ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pOpData->compressAndVerify) {
163278ee8d1cSJulian Grajkowski 		cnvMode = DC_CNV;
163378ee8d1cSJulian Grajkowski 	}
163478ee8d1cSJulian Grajkowski 
163578ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
163678ee8d1cSJulian Grajkowski 				pSessionDesc,
1637a977168cSMichal Gulbicki 				insHandle,
163878ee8d1cSJulian Grajkowski 				pSessionHandle,
163978ee8d1cSJulian Grajkowski 				pSrcBuff,
164078ee8d1cSJulian Grajkowski 				pDestBuff,
164178ee8d1cSJulian Grajkowski 				pResults,
164278ee8d1cSJulian Grajkowski 				pOpData->flushFlag,
164378ee8d1cSJulian Grajkowski 				pOpData,
164478ee8d1cSJulian Grajkowski 				callbackTag,
164578ee8d1cSJulian Grajkowski 				DC_COMPRESSION_REQUEST,
164678ee8d1cSJulian Grajkowski 				CPA_TRUE,
164778ee8d1cSJulian Grajkowski 				cnvMode);
164878ee8d1cSJulian Grajkowski }
164978ee8d1cSJulian Grajkowski 
165078ee8d1cSJulian Grajkowski static CpaStatus
dcDecompressDataCheck(CpaInstanceHandle insHandle,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,Cpa64U * srcBufferSize)165178ee8d1cSJulian Grajkowski dcDecompressDataCheck(CpaInstanceHandle insHandle,
165278ee8d1cSJulian Grajkowski 		      CpaDcSessionHandle pSessionHandle,
165378ee8d1cSJulian Grajkowski 		      CpaBufferList *pSrcBuff,
165478ee8d1cSJulian Grajkowski 		      CpaBufferList *pDestBuff,
165578ee8d1cSJulian Grajkowski 		      CpaDcRqResults *pResults,
165678ee8d1cSJulian Grajkowski 		      CpaDcFlush flushFlag,
165778ee8d1cSJulian Grajkowski 		      Cpa64U *srcBufferSize)
165878ee8d1cSJulian Grajkowski {
165978ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
166078ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
166178ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
166278ee8d1cSJulian Grajkowski 
166378ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
166478ee8d1cSJulian Grajkowski 
166578ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
166678ee8d1cSJulian Grajkowski 
166778ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
166878ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(insHandle);
166978ee8d1cSJulian Grajkowski 
167078ee8d1cSJulian Grajkowski 	/* This check is outside the parameter checking as it is needed to
167178ee8d1cSJulian Grajkowski 	 * manage zero length requests */
167278ee8d1cSJulian Grajkowski 	if (LacBuffDesc_BufferListVerifyNull(pSrcBuff,
167378ee8d1cSJulian Grajkowski 					     &srcBuffSize,
167478ee8d1cSJulian Grajkowski 					     LAC_NO_ALIGNMENT_SHIFT) !=
167578ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
167678ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid source buffer list parameter");
167778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
167878ee8d1cSJulian Grajkowski 	}
167978ee8d1cSJulian Grajkowski 
168078ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
168178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
168278ee8d1cSJulian Grajkowski 
168378ee8d1cSJulian Grajkowski 	if (dcCheckSourceData(pSessionHandle,
168478ee8d1cSJulian Grajkowski 			      pSrcBuff,
168578ee8d1cSJulian Grajkowski 			      pDestBuff,
168678ee8d1cSJulian Grajkowski 			      pResults,
168778ee8d1cSJulian Grajkowski 			      flushFlag,
168878ee8d1cSJulian Grajkowski 			      srcBuffSize,
168978ee8d1cSJulian Grajkowski 			      NULL) != CPA_STATUS_SUCCESS) {
169078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
169178ee8d1cSJulian Grajkowski 	}
169278ee8d1cSJulian Grajkowski 	if (dcCheckDestinationData(pService,
169378ee8d1cSJulian Grajkowski 				   pSessionHandle,
169478ee8d1cSJulian Grajkowski 				   pDestBuff,
169578ee8d1cSJulian Grajkowski 				   DC_DECOMPRESSION_REQUEST) !=
169678ee8d1cSJulian Grajkowski 	    CPA_STATUS_SUCCESS) {
169778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
169878ee8d1cSJulian Grajkowski 	}
169978ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
170078ee8d1cSJulian Grajkowski 
170178ee8d1cSJulian Grajkowski 	if (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) {
170278ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("Invalid sessDirection value");
170378ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
170478ee8d1cSJulian Grajkowski 	}
170578ee8d1cSJulian Grajkowski 
170678ee8d1cSJulian Grajkowski 
170778ee8d1cSJulian Grajkowski 	*srcBufferSize = srcBuffSize;
170878ee8d1cSJulian Grajkowski 
170978ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
171078ee8d1cSJulian Grajkowski }
171178ee8d1cSJulian Grajkowski 
171278ee8d1cSJulian Grajkowski CpaStatus
cpaDcDecompressData(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcRqResults * pResults,CpaDcFlush flushFlag,void * callbackTag)171378ee8d1cSJulian Grajkowski cpaDcDecompressData(CpaInstanceHandle dcInstance,
171478ee8d1cSJulian Grajkowski 		    CpaDcSessionHandle pSessionHandle,
171578ee8d1cSJulian Grajkowski 		    CpaBufferList *pSrcBuff,
171678ee8d1cSJulian Grajkowski 		    CpaBufferList *pDestBuff,
171778ee8d1cSJulian Grajkowski 		    CpaDcRqResults *pResults,
171878ee8d1cSJulian Grajkowski 		    CpaDcFlush flushFlag,
171978ee8d1cSJulian Grajkowski 		    void *callbackTag)
172078ee8d1cSJulian Grajkowski {
172178ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
172278ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
172378ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
172478ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
172578ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
172678ee8d1cSJulian Grajkowski 
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 
1786a977168cSMichal Gulbicki 
178778ee8d1cSJulian Grajkowski 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
178878ee8d1cSJulian Grajkowski 		/* Lock the session to check if there are in-flight stateful
178978ee8d1cSJulian Grajkowski 		 * requests */
1790a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
179178ee8d1cSJulian Grajkowski 
179278ee8d1cSJulian Grajkowski 		/* Check if there is already one in-flight stateful request */
179378ee8d1cSJulian Grajkowski 		if (0 !=
179478ee8d1cSJulian Grajkowski 		    qatUtilsAtomicGet(
179578ee8d1cSJulian Grajkowski 			&(pSessionDesc->pendingStatefulCbCount))) {
179678ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR(
179778ee8d1cSJulian Grajkowski 			    "Only one in-flight stateful request supported");
1798a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
179978ee8d1cSJulian Grajkowski 			return CPA_STATUS_RETRY;
180078ee8d1cSJulian Grajkowski 		}
180178ee8d1cSJulian Grajkowski 
1802a977168cSMichal Gulbicki 		/* Gen 4 handle 0 len requests in FW */
1803a977168cSMichal Gulbicki 		if (isDcGen2x(pService)) {
180478ee8d1cSJulian Grajkowski 			if ((0 == srcBuffSize) ||
1805a977168cSMichal Gulbicki 			    ((1 == srcBuffSize) &&
1806a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FINAL != flushFlag) &&
180778ee8d1cSJulian Grajkowski 			     (CPA_DC_FLUSH_FULL != flushFlag))) {
180878ee8d1cSJulian Grajkowski 				if (CPA_TRUE ==
1809a977168cSMichal Gulbicki 				    dcZeroLengthRequests(
1810a977168cSMichal Gulbicki 					pService,
181178ee8d1cSJulian Grajkowski 					pSessionDesc,
181278ee8d1cSJulian Grajkowski 					pResults,
181378ee8d1cSJulian Grajkowski 					flushFlag,
181478ee8d1cSJulian Grajkowski 					callbackTag,
181578ee8d1cSJulian Grajkowski 					DC_DECOMPRESSION_REQUEST)) {
181678ee8d1cSJulian Grajkowski 					return CPA_STATUS_SUCCESS;
181778ee8d1cSJulian Grajkowski 				}
181878ee8d1cSJulian Grajkowski 			}
1819a977168cSMichal Gulbicki 		}
182078ee8d1cSJulian Grajkowski 
182178ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1822a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
182378ee8d1cSJulian Grajkowski 	}
182478ee8d1cSJulian Grajkowski 
182578ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
182678ee8d1cSJulian Grajkowski 				pSessionDesc,
1827a977168cSMichal Gulbicki 				insHandle,
182878ee8d1cSJulian Grajkowski 				pSessionHandle,
182978ee8d1cSJulian Grajkowski 				pSrcBuff,
183078ee8d1cSJulian Grajkowski 				pDestBuff,
183178ee8d1cSJulian Grajkowski 				pResults,
183278ee8d1cSJulian Grajkowski 				flushFlag,
183378ee8d1cSJulian Grajkowski 				NULL,
183478ee8d1cSJulian Grajkowski 				callbackTag,
183578ee8d1cSJulian Grajkowski 				DC_DECOMPRESSION_REQUEST,
183678ee8d1cSJulian Grajkowski 				CPA_TRUE,
183778ee8d1cSJulian Grajkowski 				DC_NO_CNV);
183878ee8d1cSJulian Grajkowski }
183978ee8d1cSJulian Grajkowski 
184078ee8d1cSJulian Grajkowski CpaStatus
cpaDcDecompressData2(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaBufferList * pSrcBuff,CpaBufferList * pDestBuff,CpaDcOpData * pOpData,CpaDcRqResults * pResults,void * callbackTag)184178ee8d1cSJulian Grajkowski cpaDcDecompressData2(CpaInstanceHandle dcInstance,
184278ee8d1cSJulian Grajkowski 		     CpaDcSessionHandle pSessionHandle,
184378ee8d1cSJulian Grajkowski 		     CpaBufferList *pSrcBuff,
184478ee8d1cSJulian Grajkowski 		     CpaBufferList *pDestBuff,
184578ee8d1cSJulian Grajkowski 		     CpaDcOpData *pOpData,
184678ee8d1cSJulian Grajkowski 		     CpaDcRqResults *pResults,
184778ee8d1cSJulian Grajkowski 		     void *callbackTag)
184878ee8d1cSJulian Grajkowski {
184978ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
185078ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
185178ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
185278ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
185378ee8d1cSJulian Grajkowski 	Cpa64U srcBuffSize = 0;
185478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
185578ee8d1cSJulian Grajkowski 
185678ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pOpData->integrityCrcCheck) {
185778ee8d1cSJulian Grajkowski 
185878ee8d1cSJulian Grajkowski 		return cpaDcDecompressData(dcInstance,
185978ee8d1cSJulian Grajkowski 					   pSessionHandle,
186078ee8d1cSJulian Grajkowski 					   pSrcBuff,
186178ee8d1cSJulian Grajkowski 					   pDestBuff,
186278ee8d1cSJulian Grajkowski 					   pResults,
186378ee8d1cSJulian Grajkowski 					   pOpData->flushFlag,
186478ee8d1cSJulian Grajkowski 					   callbackTag);
186578ee8d1cSJulian Grajkowski 	}
186678ee8d1cSJulian Grajkowski 
186778ee8d1cSJulian Grajkowski 
186878ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
186978ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
187078ee8d1cSJulian Grajkowski 	} else {
187178ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
187278ee8d1cSJulian Grajkowski 	}
187378ee8d1cSJulian Grajkowski 
187478ee8d1cSJulian Grajkowski 	status = dcDecompressDataCheck(insHandle,
187578ee8d1cSJulian Grajkowski 				       pSessionHandle,
187678ee8d1cSJulian Grajkowski 				       pSrcBuff,
187778ee8d1cSJulian Grajkowski 				       pDestBuff,
187878ee8d1cSJulian Grajkowski 				       pResults,
187978ee8d1cSJulian Grajkowski 				       pOpData->flushFlag,
188078ee8d1cSJulian Grajkowski 				       &srcBuffSize);
188178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
188278ee8d1cSJulian Grajkowski 		return status;
188378ee8d1cSJulian Grajkowski 	}
188478ee8d1cSJulian Grajkowski 
188578ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
188678ee8d1cSJulian Grajkowski 
188778ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
188878ee8d1cSJulian Grajkowski 
1889a977168cSMichal Gulbicki 	LAC_CHECK_NULL_PARAM(insHandle);
1890a977168cSMichal Gulbicki 
1891a977168cSMichal Gulbicki 	/* Check if SAL is initialised otherwise return an error */
1892a977168cSMichal Gulbicki 	SAL_RUNNING_CHECK(insHandle);
1893a977168cSMichal Gulbicki 
1894a977168cSMichal Gulbicki 	/* This check is outside the parameter checking as it is needed to
1895a977168cSMichal Gulbicki 	 * manage zero length requests */
1896a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1897a977168cSMichal Gulbicki 	    LacBuffDesc_BufferListVerifyNull(pSrcBuff,
1898a977168cSMichal Gulbicki 					     &srcBuffSize,
1899a977168cSMichal Gulbicki 					     LAC_NO_ALIGNMENT_SHIFT)) {
1900a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid source buffer list parameter");
190178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
190278ee8d1cSJulian Grajkowski 	}
190378ee8d1cSJulian Grajkowski 
1904a977168cSMichal Gulbicki 	/* Ensure this is a compression instance */
1905a977168cSMichal Gulbicki 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
1906a977168cSMichal Gulbicki 
1907a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1908a977168cSMichal Gulbicki 	    dcCheckSourceData(pSessionHandle,
1909a977168cSMichal Gulbicki 			      pSrcBuff,
1910a977168cSMichal Gulbicki 			      pDestBuff,
1911a977168cSMichal Gulbicki 			      pResults,
1912a977168cSMichal Gulbicki 			      CPA_DC_FLUSH_NONE,
1913a977168cSMichal Gulbicki 			      srcBuffSize,
1914a977168cSMichal Gulbicki 			      NULL)) {
1915a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1916a977168cSMichal Gulbicki 	}
1917a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS !=
1918a977168cSMichal Gulbicki 	    dcCheckDestinationData(pService,
1919a977168cSMichal Gulbicki 				   pSessionHandle,
1920a977168cSMichal Gulbicki 				   pDestBuff,
1921a977168cSMichal Gulbicki 				   DC_DECOMPRESSION_REQUEST)) {
1922a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1923a977168cSMichal Gulbicki 	}
1924a977168cSMichal Gulbicki 
1925a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS != dcCheckOpData(pService, pOpData)) {
1926a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1927a977168cSMichal Gulbicki 	}
1928a977168cSMichal Gulbicki 
1929a977168cSMichal Gulbicki 	if (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) {
1930a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Invalid sessDirection value");
1931a977168cSMichal Gulbicki 		return CPA_STATUS_INVALID_PARAM;
1932a977168cSMichal Gulbicki 	}
1933a977168cSMichal Gulbicki 
1934a977168cSMichal Gulbicki 
1935a977168cSMichal Gulbicki 	if (CPA_DC_STATEFUL == pSessionDesc->sessState) {
1936a977168cSMichal Gulbicki 		/* Lock the session to check if there are in-flight stateful
1937a977168cSMichal Gulbicki 		 * requests */
1938a977168cSMichal Gulbicki 		LAC_SPINLOCK(&(pSessionDesc->sessionLock));
1939a977168cSMichal Gulbicki 
1940a977168cSMichal Gulbicki 		/* Check if there is already one in-flight stateful request */
1941a977168cSMichal Gulbicki 		if (0 !=
1942a977168cSMichal Gulbicki 		    qatUtilsAtomicGet(
1943a977168cSMichal Gulbicki 			&(pSessionDesc->pendingStatefulCbCount))) {
1944a977168cSMichal Gulbicki 			LAC_LOG_ERROR(
1945a977168cSMichal Gulbicki 			    "Only one in-flight stateful request supported");
1946a977168cSMichal Gulbicki 			LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
1947a977168cSMichal Gulbicki 			return CPA_STATUS_RETRY;
1948a977168cSMichal Gulbicki 		}
1949a977168cSMichal Gulbicki 
1950a977168cSMichal Gulbicki 		/* Gen 4 handle 0 len requests in FW */
1951a977168cSMichal Gulbicki 		if (isDcGen2x(pService)) {
1952a977168cSMichal Gulbicki 			if ((0 == srcBuffSize) ||
1953a977168cSMichal Gulbicki 			    ((1 == srcBuffSize) &&
1954a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FINAL != pOpData->flushFlag) &&
1955a977168cSMichal Gulbicki 			     (CPA_DC_FLUSH_FULL != pOpData->flushFlag))) {
1956a977168cSMichal Gulbicki 				if (CPA_TRUE ==
1957a977168cSMichal Gulbicki 				    dcZeroLengthRequests(
1958a977168cSMichal Gulbicki 					pService,
1959a977168cSMichal Gulbicki 					pSessionDesc,
1960a977168cSMichal Gulbicki 					pResults,
1961a977168cSMichal Gulbicki 					pOpData->flushFlag,
1962a977168cSMichal Gulbicki 					callbackTag,
1963a977168cSMichal Gulbicki 					DC_DECOMPRESSION_REQUEST)) {
1964a977168cSMichal Gulbicki 					return CPA_STATUS_SUCCESS;
1965a977168cSMichal Gulbicki 				}
1966a977168cSMichal Gulbicki 			}
1967a977168cSMichal Gulbicki 		}
1968a977168cSMichal Gulbicki 		qatUtilsAtomicInc(&(pSessionDesc->pendingStatefulCbCount));
1969a977168cSMichal Gulbicki 		LAC_SPINUNLOCK(&(pSessionDesc->sessionLock));
1970a977168cSMichal Gulbicki 	}
1971a977168cSMichal Gulbicki 
197278ee8d1cSJulian Grajkowski 	return dcCompDecompData(pService,
197378ee8d1cSJulian Grajkowski 				pSessionDesc,
197478ee8d1cSJulian Grajkowski 				insHandle,
197578ee8d1cSJulian Grajkowski 				pSessionHandle,
197678ee8d1cSJulian Grajkowski 				pSrcBuff,
197778ee8d1cSJulian Grajkowski 				pDestBuff,
197878ee8d1cSJulian Grajkowski 				pResults,
197978ee8d1cSJulian Grajkowski 				pOpData->flushFlag,
198078ee8d1cSJulian Grajkowski 				pOpData,
198178ee8d1cSJulian Grajkowski 				callbackTag,
198278ee8d1cSJulian Grajkowski 				DC_DECOMPRESSION_REQUEST,
198378ee8d1cSJulian Grajkowski 				CPA_TRUE,
198478ee8d1cSJulian Grajkowski 				DC_NO_CNV);
198578ee8d1cSJulian Grajkowski }
1986