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