xref: /freebsd/sys/dev/qat/qat_api/common/compression/dc_dp.c (revision 22cf89c938886d14f5796fc49f9f020c23ea8eaf)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski /**
478ee8d1cSJulian Grajkowski  *****************************************************************************
578ee8d1cSJulian Grajkowski  * @file dc_dp.c
678ee8d1cSJulian Grajkowski  *
778ee8d1cSJulian Grajkowski  * @defgroup cpaDcDp Data Compression Data Plane API
878ee8d1cSJulian Grajkowski  *
978ee8d1cSJulian Grajkowski  * @ingroup cpaDcDp
1078ee8d1cSJulian Grajkowski  *
1178ee8d1cSJulian Grajkowski  * @description
1278ee8d1cSJulian Grajkowski  *      Implementation of the Data Compression DP 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 #include "icp_qat_fw_comp.h"
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski /*
2878ee8d1cSJulian Grajkowski *******************************************************************************
2978ee8d1cSJulian Grajkowski * Include private header files
3078ee8d1cSJulian Grajkowski *******************************************************************************
3178ee8d1cSJulian Grajkowski */
3278ee8d1cSJulian Grajkowski #include "dc_session.h"
3378ee8d1cSJulian Grajkowski #include "dc_datapath.h"
3478ee8d1cSJulian Grajkowski #include "lac_common.h"
3578ee8d1cSJulian Grajkowski #include "lac_mem.h"
3678ee8d1cSJulian Grajkowski #include "lac_mem_pools.h"
3778ee8d1cSJulian Grajkowski #include "sal_types_compression.h"
3878ee8d1cSJulian Grajkowski #include "lac_sal.h"
3978ee8d1cSJulian Grajkowski #include "lac_sync.h"
4078ee8d1cSJulian Grajkowski #include "sal_service_state.h"
4178ee8d1cSJulian Grajkowski #include "sal_qat_cmn_msg.h"
4278ee8d1cSJulian Grajkowski #include "icp_sal_poll.h"
43a977168cSMichal Gulbicki #include "sal_hw_gen.h"
4478ee8d1cSJulian Grajkowski 
4578ee8d1cSJulian Grajkowski /**
4678ee8d1cSJulian Grajkowski  *****************************************************************************
4778ee8d1cSJulian Grajkowski  * @ingroup cpaDcDp
4878ee8d1cSJulian Grajkowski  *      Check that pOpData is valid
4978ee8d1cSJulian Grajkowski  *
5078ee8d1cSJulian Grajkowski  * @description
5178ee8d1cSJulian Grajkowski  *      Check that all the parameters defined in the pOpData are valid
5278ee8d1cSJulian Grajkowski  *
5378ee8d1cSJulian Grajkowski  * @param[in]       pOpData          Pointer to a structure containing the
5478ee8d1cSJulian Grajkowski  *                                   request parameters
5578ee8d1cSJulian Grajkowski  *
5678ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS        Function executed successfully
5778ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter passed in
5878ee8d1cSJulian Grajkowski  *
5978ee8d1cSJulian Grajkowski  *****************************************************************************/
6078ee8d1cSJulian Grajkowski static CpaStatus
dcDataPlaneParamCheck(const CpaDcDpOpData * pOpData)6178ee8d1cSJulian Grajkowski dcDataPlaneParamCheck(const CpaDcDpOpData *pOpData)
6278ee8d1cSJulian Grajkowski {
6378ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
6478ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
6578ee8d1cSJulian Grajkowski 
6678ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
6778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData->dcInstance);
6878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData->pSessionHandle);
6978ee8d1cSJulian Grajkowski 
7078ee8d1cSJulian Grajkowski 	/* Ensure this is a compression instance */
7178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(pOpData->dcInstance,
7278ee8d1cSJulian Grajkowski 				SAL_SERVICE_TYPE_COMPRESSION);
7378ee8d1cSJulian Grajkowski 
7478ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)(pOpData->dcInstance);
7578ee8d1cSJulian Grajkowski 
7678ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pOpData->pSessionHandle);
7778ee8d1cSJulian Grajkowski 	if (NULL == pSessionDesc) {
7878ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Session handle not as expected.\n");
7978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
8078ee8d1cSJulian Grajkowski 	}
8178ee8d1cSJulian Grajkowski 
8278ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pSessionDesc->isDcDp) {
8378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("The session type should be data plane.\n");
8478ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
8578ee8d1cSJulian Grajkowski 	}
8678ee8d1cSJulian Grajkowski 
8778ee8d1cSJulian Grajkowski 	/* Compressing zero byte is not supported */
8878ee8d1cSJulian Grajkowski 	if ((CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) &&
8978ee8d1cSJulian Grajkowski 	    (0 == pOpData->bufferLenToCompress)) {
90a977168cSMichal Gulbicki 		QAT_UTILS_LOG("The source buffer length to compress needs to "
91a977168cSMichal Gulbicki 			      "be greater than zero byte.\n");
9278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
9378ee8d1cSJulian Grajkowski 	}
9478ee8d1cSJulian Grajkowski 
9578ee8d1cSJulian Grajkowski 	if (pOpData->sessDirection > CPA_DC_DIR_DECOMPRESS) {
9678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid direction of operation.\n");
9778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
9878ee8d1cSJulian Grajkowski 	}
9978ee8d1cSJulian Grajkowski 
10078ee8d1cSJulian Grajkowski 	if (0 == pOpData->srcBuffer) {
10178ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid srcBuffer\n");
10278ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
10378ee8d1cSJulian Grajkowski 	}
10478ee8d1cSJulian Grajkowski 	if (0 == pOpData->destBuffer) {
10578ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid destBuffer\n");
10678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
10778ee8d1cSJulian Grajkowski 	}
10878ee8d1cSJulian Grajkowski 	if (pOpData->srcBuffer == pOpData->destBuffer) {
10978ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("In place operation is not supported.\n");
11078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
11178ee8d1cSJulian Grajkowski 	}
11278ee8d1cSJulian Grajkowski 	if (0 == pOpData->thisPhys) {
11378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid thisPhys\n");
11478ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
11578ee8d1cSJulian Grajkowski 	}
11678ee8d1cSJulian Grajkowski 
11778ee8d1cSJulian Grajkowski 	if ((CPA_TRUE != pOpData->compressAndVerify) &&
11878ee8d1cSJulian Grajkowski 	    (CPA_FALSE != pOpData->compressAndVerify)) {
11978ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid compressAndVerify\n");
12078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
12178ee8d1cSJulian Grajkowski 	}
12278ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == pOpData->compressAndVerify) &&
12378ee8d1cSJulian Grajkowski 	    !(pService->generic_service_info.dcExtendedFeatures &
12478ee8d1cSJulian Grajkowski 	      DC_CNV_EXTENDED_CAPABILITY)) {
12578ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid compressAndVerify, no CNV capability\n");
12678ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
12778ee8d1cSJulian Grajkowski 	}
12878ee8d1cSJulian Grajkowski 	if ((CPA_TRUE != pOpData->compressAndVerifyAndRecover) &&
12978ee8d1cSJulian Grajkowski 	    (CPA_FALSE != pOpData->compressAndVerifyAndRecover)) {
13078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid compressAndVerifyAndRecover\n");
13178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
13278ee8d1cSJulian Grajkowski 	}
13378ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == pOpData->compressAndVerifyAndRecover) &&
13478ee8d1cSJulian Grajkowski 	    (CPA_FALSE == pOpData->compressAndVerify)) {
13578ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("CnVnR option set without setting CnV\n");
13678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
13778ee8d1cSJulian Grajkowski 	}
13878ee8d1cSJulian Grajkowski 	if ((CPA_TRUE == pOpData->compressAndVerifyAndRecover) &&
13978ee8d1cSJulian Grajkowski 	    !(pService->generic_service_info.dcExtendedFeatures &
14078ee8d1cSJulian Grajkowski 	      DC_CNVNR_EXTENDED_CAPABILITY)) {
14178ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
14278ee8d1cSJulian Grajkowski 		    "Invalid CnVnR option set and no CnVnR capability.\n");
14378ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
14478ee8d1cSJulian Grajkowski 	}
14578ee8d1cSJulian Grajkowski 
14678ee8d1cSJulian Grajkowski 	if ((CPA_DP_BUFLIST == pOpData->srcBufferLen) &&
14778ee8d1cSJulian Grajkowski 	    (CPA_DP_BUFLIST != pOpData->destBufferLen)) {
14878ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
14978ee8d1cSJulian Grajkowski 		    "The source and destination buffers need to be of the same type (both flat buffers or buffer lists).\n");
15078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
15178ee8d1cSJulian Grajkowski 	}
15278ee8d1cSJulian Grajkowski 	if ((CPA_DP_BUFLIST != pOpData->srcBufferLen) &&
15378ee8d1cSJulian Grajkowski 	    (CPA_DP_BUFLIST == pOpData->destBufferLen)) {
15478ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
15578ee8d1cSJulian Grajkowski 		    "The source and destination buffers need to be of the same type (both flat buffers or buffer lists).\n");
15678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
15778ee8d1cSJulian Grajkowski 	}
15878ee8d1cSJulian Grajkowski 
15978ee8d1cSJulian Grajkowski 	if (CPA_DP_BUFLIST != pOpData->srcBufferLen) {
16078ee8d1cSJulian Grajkowski 		if (pOpData->srcBufferLen < pOpData->bufferLenToCompress) {
16178ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
16278ee8d1cSJulian Grajkowski 			    "srcBufferLen is smaller than bufferLenToCompress.\n");
16378ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
16478ee8d1cSJulian Grajkowski 		}
16578ee8d1cSJulian Grajkowski 
16678ee8d1cSJulian Grajkowski 		if (pOpData->destBufferLen < pOpData->bufferLenForData) {
16778ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
16878ee8d1cSJulian Grajkowski 			    "destBufferLen is smaller than bufferLenForData.\n");
16978ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
17078ee8d1cSJulian Grajkowski 		}
17178ee8d1cSJulian Grajkowski 	} else {
17278ee8d1cSJulian Grajkowski 		/* We are assuming that there is enough memory in the source and
17378ee8d1cSJulian Grajkowski 		 * destination buffer lists. We only receive physical addresses
174a977168cSMichal Gulbicki 		 * of the buffers so we are unable to test it here */
17578ee8d1cSJulian Grajkowski 		LAC_CHECK_8_BYTE_ALIGNMENT(pOpData->srcBuffer);
17678ee8d1cSJulian Grajkowski 		LAC_CHECK_8_BYTE_ALIGNMENT(pOpData->destBuffer);
17778ee8d1cSJulian Grajkowski 	}
17878ee8d1cSJulian Grajkowski 
17978ee8d1cSJulian Grajkowski 	LAC_CHECK_8_BYTE_ALIGNMENT(pOpData->thisPhys);
18078ee8d1cSJulian Grajkowski 
18178ee8d1cSJulian Grajkowski 	if ((CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection) ||
18278ee8d1cSJulian Grajkowski 	    (CPA_DC_DIR_COMBINED == pSessionDesc->sessDirection)) {
18378ee8d1cSJulian Grajkowski 		if (CPA_DC_HT_FULL_DYNAMIC == pSessionDesc->huffType) {
18478ee8d1cSJulian Grajkowski 			/* Check if Intermediate Buffer Array pointer is NULL */
185a977168cSMichal Gulbicki 			if (isDcGen2x(pService) &&
186a977168cSMichal Gulbicki 			    ((0 == pService->pInterBuffPtrsArrayPhyAddr) ||
187a977168cSMichal Gulbicki 			     (NULL == pService->pInterBuffPtrsArray))) {
18878ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
18978ee8d1cSJulian Grajkowski 				    "No intermediate buffer defined for this instance - see cpaDcStartInstance.\n");
19078ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
19178ee8d1cSJulian Grajkowski 			}
19278ee8d1cSJulian Grajkowski 
19378ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer length for data is
19478ee8d1cSJulian Grajkowski 			 * greater
19578ee8d1cSJulian Grajkowski 			 * or equal to 128B */
19678ee8d1cSJulian Grajkowski 			if (pOpData->bufferLenForData <
19778ee8d1cSJulian Grajkowski 			    DC_DEST_BUFFER_DYN_MIN_SIZE) {
19878ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
19978ee8d1cSJulian Grajkowski 				    "Destination buffer length for data should be greater or equal to 128B.\n");
20078ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
20178ee8d1cSJulian Grajkowski 			}
20278ee8d1cSJulian Grajkowski 		} else {
20378ee8d1cSJulian Grajkowski 			/* Ensure that the destination buffer length for data is
20478ee8d1cSJulian Grajkowski 			 * greater
20578ee8d1cSJulian Grajkowski 			 * or equal to min output buffsize */
20678ee8d1cSJulian Grajkowski 			if (pOpData->bufferLenForData <
20778ee8d1cSJulian Grajkowski 			    pService->comp_device_data.minOutputBuffSize) {
20878ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
20978ee8d1cSJulian Grajkowski 				    "Destination buffer size should be greater or equal to %d bytes.\n",
21078ee8d1cSJulian Grajkowski 				    pService->comp_device_data
21178ee8d1cSJulian Grajkowski 					.minOutputBuffSize);
21278ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
21378ee8d1cSJulian Grajkowski 			}
21478ee8d1cSJulian Grajkowski 		}
21578ee8d1cSJulian Grajkowski 	}
21678ee8d1cSJulian Grajkowski 
21778ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
21878ee8d1cSJulian Grajkowski }
21978ee8d1cSJulian Grajkowski 
220*22cf89c9SPiotr Kasierski /**
221*22cf89c9SPiotr Kasierski  *****************************************************************************
222*22cf89c9SPiotr Kasierski  * @ingroup cpaDcDp
223*22cf89c9SPiotr Kasierski  *      Partial-read parameters validation utility.
224*22cf89c9SPiotr Kasierski  *
225*22cf89c9SPiotr Kasierski  * @description
226*22cf89c9SPiotr Kasierski  *      Basic check that all partial-read related parameters provided by
227*22cf89c9SPiotr Kasierski  *      caller are valid.
228*22cf89c9SPiotr Kasierski  *
229*22cf89c9SPiotr Kasierski  * @param[in]       pOpData          Pointer to a structure containing the
230*22cf89c9SPiotr Kasierski  *                                   request parameters
231*22cf89c9SPiotr Kasierski  * @param[in]       pPartReadData    Pointer to a structure containing the
232*22cf89c9SPiotr Kasierski  *                                   partial-read request parameters.
233*22cf89c9SPiotr Kasierski  *
234*22cf89c9SPiotr Kasierski  * @retval CPA_STATUS_SUCCESS        Function executed successfully
235*22cf89c9SPiotr Kasierski  * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter passed in
236*22cf89c9SPiotr Kasierski  *
237*22cf89c9SPiotr Kasierski  *****************************************************************************/
238*22cf89c9SPiotr Kasierski static CpaStatus
dcDataPlanePartReadCheck(CpaDcDpOpData * pOpData,CpaDcDpPartialReadData * pPartReadData)239*22cf89c9SPiotr Kasierski dcDataPlanePartReadCheck(CpaDcDpOpData *pOpData,
240*22cf89c9SPiotr Kasierski 			 CpaDcDpPartialReadData *pPartReadData)
241*22cf89c9SPiotr Kasierski {
242*22cf89c9SPiotr Kasierski 	sal_compression_service_t *pService = NULL;
243*22cf89c9SPiotr Kasierski 
244*22cf89c9SPiotr Kasierski 	LAC_CHECK_NULL_PARAM(pPartReadData);
245*22cf89c9SPiotr Kasierski 
246*22cf89c9SPiotr Kasierski 	pService = (sal_compression_service_t *)(pOpData->dcInstance);
247*22cf89c9SPiotr Kasierski 
248*22cf89c9SPiotr Kasierski 	if (!isDcGen4x(pService)) {
249*22cf89c9SPiotr Kasierski 		/* Extended features are not supported prior Gen4 */
250*22cf89c9SPiotr Kasierski 		return CPA_STATUS_UNSUPPORTED;
251*22cf89c9SPiotr Kasierski 	}
252*22cf89c9SPiotr Kasierski 
253*22cf89c9SPiotr Kasierski 	if (pOpData->sessDirection == CPA_DC_DIR_COMPRESS) {
254*22cf89c9SPiotr Kasierski 		/* Decompression specific feature */
255*22cf89c9SPiotr Kasierski 		return CPA_STATUS_INVALID_PARAM;
256*22cf89c9SPiotr Kasierski 	}
257*22cf89c9SPiotr Kasierski 
258*22cf89c9SPiotr Kasierski 	if (pPartReadData->length > pOpData->bufferLenForData) {
259*22cf89c9SPiotr Kasierski 		QAT_UTILS_LOG(
260*22cf89c9SPiotr Kasierski 		    "Partial read data length can not be greater than the destination buffer size\n");
261*22cf89c9SPiotr Kasierski 		return CPA_STATUS_INVALID_PARAM;
262*22cf89c9SPiotr Kasierski 	}
263*22cf89c9SPiotr Kasierski 
264*22cf89c9SPiotr Kasierski 	return CPA_STATUS_SUCCESS;
265*22cf89c9SPiotr Kasierski }
266*22cf89c9SPiotr Kasierski 
267*22cf89c9SPiotr Kasierski /**
268*22cf89c9SPiotr Kasierski  *****************************************************************************
269*22cf89c9SPiotr Kasierski  * @ingroup cpaDcDp
270*22cf89c9SPiotr Kasierski  *      Zero-padding parameters validation utility.
271*22cf89c9SPiotr Kasierski  *
272*22cf89c9SPiotr Kasierski  * @description
273*22cf89c9SPiotr Kasierski  *      Basic check that all zero-padding related parameters provided by
274*22cf89c9SPiotr Kasierski  *      caller are valid.
275*22cf89c9SPiotr Kasierski  *
276*22cf89c9SPiotr Kasierski  * @param[in]       pOpData          Pointer to a structure containing the
277*22cf89c9SPiotr Kasierski  *                                   request parameters.
278*22cf89c9SPiotr Kasierski  *
279*22cf89c9SPiotr Kasierski  * @retval CPA_STATUS_SUCCESS        Function executed successfully
280*22cf89c9SPiotr Kasierski  * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter passed in
281*22cf89c9SPiotr Kasierski  * @retval CPA_STATUS_NOT_SUPPORTED  Feature not supported
282*22cf89c9SPiotr Kasierski  *
283*22cf89c9SPiotr Kasierski  *****************************************************************************/
284*22cf89c9SPiotr Kasierski static CpaStatus
dcDataPlaneZeroPadCheck(CpaDcDpOpData * pOpData)285*22cf89c9SPiotr Kasierski dcDataPlaneZeroPadCheck(CpaDcDpOpData *pOpData)
286*22cf89c9SPiotr Kasierski {
287*22cf89c9SPiotr Kasierski 	sal_compression_service_t *pService = NULL;
288*22cf89c9SPiotr Kasierski 
289*22cf89c9SPiotr Kasierski 	pService = (sal_compression_service_t *)(pOpData->dcInstance);
290*22cf89c9SPiotr Kasierski 
291*22cf89c9SPiotr Kasierski 	if (!isDcGen4x(pService)) {
292*22cf89c9SPiotr Kasierski 		/* Extended features are not supported prior Gen4 */
293*22cf89c9SPiotr Kasierski 		return CPA_STATUS_UNSUPPORTED;
294*22cf89c9SPiotr Kasierski 	}
295*22cf89c9SPiotr Kasierski 
296*22cf89c9SPiotr Kasierski 	if (pOpData->sessDirection == CPA_DC_DIR_DECOMPRESS) {
297*22cf89c9SPiotr Kasierski 		/* Compression specific feature */
298*22cf89c9SPiotr Kasierski 		return CPA_STATUS_INVALID_PARAM;
299*22cf89c9SPiotr Kasierski 	}
300*22cf89c9SPiotr Kasierski 
301*22cf89c9SPiotr Kasierski 	return CPA_STATUS_SUCCESS;
302*22cf89c9SPiotr Kasierski }
30378ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpGetSessionSize(CpaInstanceHandle dcInstance,CpaDcSessionSetupData * pSessionData,Cpa32U * pSessionSize)30478ee8d1cSJulian Grajkowski cpaDcDpGetSessionSize(CpaInstanceHandle dcInstance,
30578ee8d1cSJulian Grajkowski 		      CpaDcSessionSetupData *pSessionData,
30678ee8d1cSJulian Grajkowski 		      Cpa32U *pSessionSize)
30778ee8d1cSJulian Grajkowski {
30878ee8d1cSJulian Grajkowski 	return dcGetSessionSize(dcInstance, pSessionData, pSessionSize, NULL);
30978ee8d1cSJulian Grajkowski }
31078ee8d1cSJulian Grajkowski 
31178ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpInitSession(CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaDcSessionSetupData * pSessionData)31278ee8d1cSJulian Grajkowski cpaDcDpInitSession(CpaInstanceHandle dcInstance,
31378ee8d1cSJulian Grajkowski 		   CpaDcSessionHandle pSessionHandle,
31478ee8d1cSJulian Grajkowski 		   CpaDcSessionSetupData *pSessionData)
31578ee8d1cSJulian Grajkowski {
31678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
31778ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
31878ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
31978ee8d1cSJulian Grajkowski 
32078ee8d1cSJulian Grajkowski 	LAC_CHECK_INSTANCE_HANDLE(dcInstance);
32178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(dcInstance, SAL_SERVICE_TYPE_COMPRESSION);
32278ee8d1cSJulian Grajkowski 
32378ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)dcInstance;
32478ee8d1cSJulian Grajkowski 
32578ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
32678ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(pService);
32778ee8d1cSJulian Grajkowski 
32878ee8d1cSJulian Grajkowski 	/* Stateful is not supported */
32978ee8d1cSJulian Grajkowski 	if (CPA_DC_STATELESS != pSessionData->sessState) {
33078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid sessState value\n");
33178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
33278ee8d1cSJulian Grajkowski 	}
33378ee8d1cSJulian Grajkowski 
33478ee8d1cSJulian Grajkowski 	status =
33578ee8d1cSJulian Grajkowski 	    dcInitSession(dcInstance, pSessionHandle, pSessionData, NULL, NULL);
33678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
33778ee8d1cSJulian Grajkowski 		pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pSessionHandle);
33878ee8d1cSJulian Grajkowski 		pSessionDesc->isDcDp = CPA_TRUE;
33978ee8d1cSJulian Grajkowski 
34078ee8d1cSJulian Grajkowski 		ICP_QAT_FW_COMN_PTR_TYPE_SET(
34178ee8d1cSJulian Grajkowski 		    pSessionDesc->reqCacheDecomp.comn_hdr.comn_req_flags,
34278ee8d1cSJulian Grajkowski 		    DC_DP_QAT_PTR_TYPE);
34378ee8d1cSJulian Grajkowski 		ICP_QAT_FW_COMN_PTR_TYPE_SET(
34478ee8d1cSJulian Grajkowski 		    pSessionDesc->reqCacheComp.comn_hdr.comn_req_flags,
34578ee8d1cSJulian Grajkowski 		    DC_DP_QAT_PTR_TYPE);
34678ee8d1cSJulian Grajkowski 	}
34778ee8d1cSJulian Grajkowski 
34878ee8d1cSJulian Grajkowski 	return status;
34978ee8d1cSJulian Grajkowski }
35078ee8d1cSJulian Grajkowski 
35178ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpRemoveSession(const CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle)35278ee8d1cSJulian Grajkowski cpaDcDpRemoveSession(const CpaInstanceHandle dcInstance,
35378ee8d1cSJulian Grajkowski 		     CpaDcSessionHandle pSessionHandle)
35478ee8d1cSJulian Grajkowski {
35578ee8d1cSJulian Grajkowski 	return cpaDcRemoveSession(dcInstance, pSessionHandle);
35678ee8d1cSJulian Grajkowski }
35778ee8d1cSJulian Grajkowski 
35878ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpUpdateSession(const CpaInstanceHandle dcInstance,CpaDcSessionHandle pSessionHandle,CpaDcSessionUpdateData * pUpdateSessionData)359266b0663SKrzysztof Zdziarski cpaDcDpUpdateSession(const CpaInstanceHandle dcInstance,
360266b0663SKrzysztof Zdziarski 		     CpaDcSessionHandle pSessionHandle,
361266b0663SKrzysztof Zdziarski 		     CpaDcSessionUpdateData *pUpdateSessionData)
362266b0663SKrzysztof Zdziarski {
363266b0663SKrzysztof Zdziarski 	return CPA_STATUS_UNSUPPORTED;
364266b0663SKrzysztof Zdziarski }
365266b0663SKrzysztof Zdziarski 
366266b0663SKrzysztof Zdziarski CpaStatus
cpaDcDpRegCbFunc(const CpaInstanceHandle dcInstance,const CpaDcDpCallbackFn pNewCb)36778ee8d1cSJulian Grajkowski cpaDcDpRegCbFunc(const CpaInstanceHandle dcInstance,
36878ee8d1cSJulian Grajkowski 		 const CpaDcDpCallbackFn pNewCb)
36978ee8d1cSJulian Grajkowski {
37078ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
37178ee8d1cSJulian Grajkowski 
37278ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(dcInstance);
37378ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(dcInstance, SAL_SERVICE_TYPE_COMPRESSION);
37478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pNewCb);
37578ee8d1cSJulian Grajkowski 
37678ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
37778ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(dcInstance);
37878ee8d1cSJulian Grajkowski 
37978ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)dcInstance;
38078ee8d1cSJulian Grajkowski 	pService->pDcDpCb = pNewCb;
38178ee8d1cSJulian Grajkowski 
38278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
38378ee8d1cSJulian Grajkowski }
38478ee8d1cSJulian Grajkowski 
38578ee8d1cSJulian Grajkowski /**
38678ee8d1cSJulian Grajkowski  *****************************************************************************
38778ee8d1cSJulian Grajkowski  * @ingroup cpaDcDp
38878ee8d1cSJulian Grajkowski  *
38978ee8d1cSJulian Grajkowski  * @description
39078ee8d1cSJulian Grajkowski  *      Writes the message to the ring
39178ee8d1cSJulian Grajkowski  *
39278ee8d1cSJulian Grajkowski  * @param[in]       pOpData          Pointer to a structure containing the
39378ee8d1cSJulian Grajkowski  *                                   request parameters
39478ee8d1cSJulian Grajkowski  * @param[in]       pCurrentQatMsg   Pointer to current QAT message on the ring
39578ee8d1cSJulian Grajkowski  *
39678ee8d1cSJulian Grajkowski  *****************************************************************************/
39778ee8d1cSJulian Grajkowski static void
dcDpWriteRingMsg(CpaDcDpOpData * pOpData,icp_qat_fw_comp_req_t * pCurrentQatMsg)39878ee8d1cSJulian Grajkowski dcDpWriteRingMsg(CpaDcDpOpData *pOpData, icp_qat_fw_comp_req_t *pCurrentQatMsg)
39978ee8d1cSJulian Grajkowski {
40078ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pReqCache = NULL;
40178ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
40278ee8d1cSJulian Grajkowski 	Cpa8U bufferFormat;
40378ee8d1cSJulian Grajkowski 
40478ee8d1cSJulian Grajkowski 	Cpa8U cnvDecompReq = ICP_QAT_FW_COMP_NO_CNV;
40578ee8d1cSJulian Grajkowski 	Cpa8U cnvnrCompReq = ICP_QAT_FW_COMP_NO_CNV_RECOVERY;
406a977168cSMichal Gulbicki 	CpaBoolean cnvErrorInjection = ICP_QAT_FW_COMP_NO_CNV_DFX;
407a977168cSMichal Gulbicki 	sal_compression_service_t *pService = NULL;
40878ee8d1cSJulian Grajkowski 
409a977168cSMichal Gulbicki 	pService = (sal_compression_service_t *)(pOpData->dcInstance);
41078ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pOpData->pSessionHandle);
41178ee8d1cSJulian Grajkowski 
41278ee8d1cSJulian Grajkowski 	if (CPA_DC_DIR_COMPRESS == pOpData->sessDirection) {
41378ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheComp);
41478ee8d1cSJulian Grajkowski 		/* CNV check */
41578ee8d1cSJulian Grajkowski 		if (CPA_TRUE == pOpData->compressAndVerify) {
41678ee8d1cSJulian Grajkowski 			cnvDecompReq = ICP_QAT_FW_COMP_CNV;
417a977168cSMichal Gulbicki 			if (isDcGen4x(pService)) {
418a977168cSMichal Gulbicki 				cnvErrorInjection =
419a977168cSMichal Gulbicki 				    pSessionDesc->cnvErrorInjection;
420a977168cSMichal Gulbicki 			}
421a977168cSMichal Gulbicki 
42278ee8d1cSJulian Grajkowski 			/* CNVNR check */
42378ee8d1cSJulian Grajkowski 			if (CPA_TRUE == pOpData->compressAndVerifyAndRecover) {
42478ee8d1cSJulian Grajkowski 				cnvnrCompReq = ICP_QAT_FW_COMP_CNV_RECOVERY;
42578ee8d1cSJulian Grajkowski 			}
42678ee8d1cSJulian Grajkowski 		}
42778ee8d1cSJulian Grajkowski 	} else {
42878ee8d1cSJulian Grajkowski 		pReqCache = &(pSessionDesc->reqCacheDecomp);
42978ee8d1cSJulian Grajkowski 	}
43078ee8d1cSJulian Grajkowski 
43178ee8d1cSJulian Grajkowski 	/* Fills in the template DC ET ring message - cached from the
43278ee8d1cSJulian Grajkowski 	 * session descriptor */
43378ee8d1cSJulian Grajkowski 	memcpy((void *)pCurrentQatMsg,
43478ee8d1cSJulian Grajkowski 	       (void *)(pReqCache),
43578ee8d1cSJulian Grajkowski 	       (LAC_QAT_DC_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES));
43678ee8d1cSJulian Grajkowski 
43778ee8d1cSJulian Grajkowski 	if (CPA_DP_BUFLIST == pOpData->srcBufferLen) {
43878ee8d1cSJulian Grajkowski 		bufferFormat = QAT_COMN_PTR_TYPE_SGL;
43978ee8d1cSJulian Grajkowski 	} else {
44078ee8d1cSJulian Grajkowski 		bufferFormat = QAT_COMN_PTR_TYPE_FLAT;
44178ee8d1cSJulian Grajkowski 	}
44278ee8d1cSJulian Grajkowski 
44378ee8d1cSJulian Grajkowski 	pCurrentQatMsg->comp_pars.req_par_flags |=
44478ee8d1cSJulian Grajkowski 	    ICP_QAT_FW_COMP_REQ_PARAM_FLAGS_BUILD(
445a977168cSMichal Gulbicki 		ICP_QAT_FW_COMP_NOT_SOP,
446a977168cSMichal Gulbicki 		ICP_QAT_FW_COMP_NOT_EOP,
447a977168cSMichal Gulbicki 		ICP_QAT_FW_COMP_NOT_BFINAL,
448a977168cSMichal Gulbicki 		cnvDecompReq,
449a977168cSMichal Gulbicki 		cnvnrCompReq,
450a977168cSMichal Gulbicki 		cnvErrorInjection,
451a977168cSMichal Gulbicki 		ICP_QAT_FW_COMP_CRC_MODE_LEGACY);
45278ee8d1cSJulian Grajkowski 
45378ee8d1cSJulian Grajkowski 	SalQatMsg_CmnMidWrite((icp_qat_fw_la_bulk_req_t *)pCurrentQatMsg,
45478ee8d1cSJulian Grajkowski 			      pOpData,
45578ee8d1cSJulian Grajkowski 			      bufferFormat,
45678ee8d1cSJulian Grajkowski 			      pOpData->srcBuffer,
45778ee8d1cSJulian Grajkowski 			      pOpData->destBuffer,
45878ee8d1cSJulian Grajkowski 			      pOpData->srcBufferLen,
45978ee8d1cSJulian Grajkowski 			      pOpData->destBufferLen);
46078ee8d1cSJulian Grajkowski 
46178ee8d1cSJulian Grajkowski 	pCurrentQatMsg->comp_pars.comp_len = pOpData->bufferLenToCompress;
46278ee8d1cSJulian Grajkowski 	pCurrentQatMsg->comp_pars.out_buffer_sz = pOpData->bufferLenForData;
46378ee8d1cSJulian Grajkowski }
46478ee8d1cSJulian Grajkowski 
465*22cf89c9SPiotr Kasierski /**
466*22cf89c9SPiotr Kasierski  *****************************************************************************
467*22cf89c9SPiotr Kasierski  * @ingroup cpaDcDp
468*22cf89c9SPiotr Kasierski  *
469*22cf89c9SPiotr Kasierski  * @description
470*22cf89c9SPiotr Kasierski  *      Updates the request decryptor with optional parameters:
471*22cf89c9SPiotr Kasierski  *      - partial read specific fields
472*22cf89c9SPiotr Kasierski  *      - zero-padding specific field
473*22cf89c9SPiotr Kasierski  *
474*22cf89c9SPiotr Kasierski  * @param[in]       pOpData          Pointer to a structure containing the
475*22cf89c9SPiotr Kasierski  *                                   request parameters.
476*22cf89c9SPiotr Kasierski  * @param[in]       pPartReadData    Pointer to a structure containing the
477*22cf89c9SPiotr Kasierski  *                                   partial-read request parameters.
478*22cf89c9SPiotr Kasierski  * @param[in]       zeroPadFlag      Boolean indicator containing the
479*22cf89c9SPiotr Kasierski  *                                   zero-padding enablement flag.
480*22cf89c9SPiotr Kasierski  * @param[in]       pCurrentQatMsg   Pointer to current QAT message on the ring.
481*22cf89c9SPiotr Kasierski  *
482*22cf89c9SPiotr Kasierski  *****************************************************************************/
483*22cf89c9SPiotr Kasierski static void
dcDpUpdateRingMsg(CpaDcDpOpData * pOpData,CpaDcDpPartialReadData * pPartReadData,CpaBoolean zeroPadFlag,icp_qat_fw_comp_req_t * pCurrentQatMsg)484*22cf89c9SPiotr Kasierski dcDpUpdateRingMsg(CpaDcDpOpData *pOpData,
485*22cf89c9SPiotr Kasierski 		  CpaDcDpPartialReadData *pPartReadData,
486*22cf89c9SPiotr Kasierski 		  CpaBoolean zeroPadFlag,
487*22cf89c9SPiotr Kasierski 		  icp_qat_fw_comp_req_t *pCurrentQatMsg)
488*22cf89c9SPiotr Kasierski {
489*22cf89c9SPiotr Kasierski 	sal_compression_service_t *pService = NULL;
490*22cf89c9SPiotr Kasierski 
491*22cf89c9SPiotr Kasierski 	pService = (sal_compression_service_t *)(pOpData->dcInstance);
492*22cf89c9SPiotr Kasierski 	if (!isDcGen4x(pService)) {
493*22cf89c9SPiotr Kasierski 		return;
494*22cf89c9SPiotr Kasierski 	}
495*22cf89c9SPiotr Kasierski 
496*22cf89c9SPiotr Kasierski 	/* Partial read settings */
497*22cf89c9SPiotr Kasierski 	if (NULL != pPartReadData) {
498*22cf89c9SPiotr Kasierski 		pCurrentQatMsg->u1.partial_decompress
499*22cf89c9SPiotr Kasierski 		    .partial_decompress_offset = pPartReadData->dataOffset;
500*22cf89c9SPiotr Kasierski 		pCurrentQatMsg->u1.partial_decompress
501*22cf89c9SPiotr Kasierski 		    .partial_decompress_length = pPartReadData->length;
502*22cf89c9SPiotr Kasierski 		ICP_QAT_FW_COMP_PART_DECOMP_SET(
503*22cf89c9SPiotr Kasierski 		    pCurrentQatMsg->comp_pars.req_par_flags,
504*22cf89c9SPiotr Kasierski 		    ICP_QAT_FW_COMP_PART_DECOMP);
505*22cf89c9SPiotr Kasierski 	}
506*22cf89c9SPiotr Kasierski 	/* Zero padding settings */
507*22cf89c9SPiotr Kasierski 	if (CPA_TRUE == zeroPadFlag) {
508*22cf89c9SPiotr Kasierski 		ICP_QAT_FW_COMP_ZEROPAD_SET(
509*22cf89c9SPiotr Kasierski 		    pCurrentQatMsg->comp_pars.req_par_flags,
510*22cf89c9SPiotr Kasierski 		    ICP_QAT_FW_COMP_ZEROPAD);
511*22cf89c9SPiotr Kasierski 	}
512*22cf89c9SPiotr Kasierski }
513*22cf89c9SPiotr Kasierski 
514*22cf89c9SPiotr Kasierski static CpaStatus
dcDpEnqueueOpBase(CpaDcDpOpData * pOpData,CpaDcDpPartialReadData * pPartReadData,CpaBoolean zeroPadFlag,const CpaBoolean performOpNow)515*22cf89c9SPiotr Kasierski dcDpEnqueueOpBase(CpaDcDpOpData *pOpData,
516*22cf89c9SPiotr Kasierski 		  CpaDcDpPartialReadData *pPartReadData,
517*22cf89c9SPiotr Kasierski 		  CpaBoolean zeroPadFlag,
518*22cf89c9SPiotr Kasierski 		  const CpaBoolean performOpNow)
51978ee8d1cSJulian Grajkowski {
52078ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pCurrentQatMsg = NULL;
52178ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_handle = NULL;
52278ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
52378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
52478ee8d1cSJulian Grajkowski 
52578ee8d1cSJulian Grajkowski 	status = dcDataPlaneParamCheck(pOpData);
52678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
52778ee8d1cSJulian Grajkowski 		return status;
52878ee8d1cSJulian Grajkowski 	}
52978ee8d1cSJulian Grajkowski 
530*22cf89c9SPiotr Kasierski 	if (NULL != pPartReadData) {
531*22cf89c9SPiotr Kasierski 		status = dcDataPlanePartReadCheck(pOpData, pPartReadData);
532*22cf89c9SPiotr Kasierski 		if (CPA_STATUS_SUCCESS != status) {
533*22cf89c9SPiotr Kasierski 			return status;
534*22cf89c9SPiotr Kasierski 		}
535*22cf89c9SPiotr Kasierski 	}
536*22cf89c9SPiotr Kasierski 
537*22cf89c9SPiotr Kasierski 	if (CPA_TRUE == zeroPadFlag) {
538*22cf89c9SPiotr Kasierski 		status = dcDataPlaneZeroPadCheck(pOpData);
539*22cf89c9SPiotr Kasierski 		if (CPA_STATUS_SUCCESS != status) {
540*22cf89c9SPiotr Kasierski 			return status;
541*22cf89c9SPiotr Kasierski 		}
542*22cf89c9SPiotr Kasierski 	}
543*22cf89c9SPiotr Kasierski 
54478ee8d1cSJulian Grajkowski 	if ((CPA_FALSE == pOpData->compressAndVerify) &&
54578ee8d1cSJulian Grajkowski 	    (CPA_DC_DIR_COMPRESS == pOpData->sessDirection)) {
54678ee8d1cSJulian Grajkowski 		return CPA_STATUS_UNSUPPORTED;
54778ee8d1cSJulian Grajkowski 	}
54878ee8d1cSJulian Grajkowski 
54978ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
55078ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(pOpData->dcInstance);
55178ee8d1cSJulian Grajkowski 
55278ee8d1cSJulian Grajkowski 	trans_handle = ((sal_compression_service_t *)pOpData->dcInstance)
55378ee8d1cSJulian Grajkowski 			   ->trans_handle_compression_tx;
55478ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pOpData->pSessionHandle);
55578ee8d1cSJulian Grajkowski 
55678ee8d1cSJulian Grajkowski 	if ((CPA_DC_DIR_COMPRESS == pOpData->sessDirection) &&
55778ee8d1cSJulian Grajkowski 	    (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection)) {
55878ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
55978ee8d1cSJulian Grajkowski 		    "The session does not support this direction of operation.\n");
56078ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
56178ee8d1cSJulian Grajkowski 	} else if ((CPA_DC_DIR_DECOMPRESS == pOpData->sessDirection) &&
56278ee8d1cSJulian Grajkowski 		   (CPA_DC_DIR_COMPRESS == pSessionDesc->sessDirection)) {
56378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
56478ee8d1cSJulian Grajkowski 		    "The session does not support this direction of operation.\n");
56578ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
56678ee8d1cSJulian Grajkowski 	}
56778ee8d1cSJulian Grajkowski 
56878ee8d1cSJulian Grajkowski 	icp_adf_getSingleQueueAddr(trans_handle, (void **)&pCurrentQatMsg);
56978ee8d1cSJulian Grajkowski 	if (NULL == pCurrentQatMsg) {
57078ee8d1cSJulian Grajkowski 		return CPA_STATUS_RETRY;
57178ee8d1cSJulian Grajkowski 	}
57278ee8d1cSJulian Grajkowski 
57378ee8d1cSJulian Grajkowski 	dcDpWriteRingMsg(pOpData, pCurrentQatMsg);
574*22cf89c9SPiotr Kasierski 	if (NULL != pPartReadData || CPA_TRUE == zeroPadFlag) {
575*22cf89c9SPiotr Kasierski 		dcDpUpdateRingMsg(pOpData,
576*22cf89c9SPiotr Kasierski 				  pPartReadData,
577*22cf89c9SPiotr Kasierski 				  zeroPadFlag,
578*22cf89c9SPiotr Kasierski 				  pCurrentQatMsg);
579*22cf89c9SPiotr Kasierski 	}
580*22cf89c9SPiotr Kasierski 
58178ee8d1cSJulian Grajkowski 	pSessionDesc->pendingDpStatelessCbCount++;
58278ee8d1cSJulian Grajkowski 
58378ee8d1cSJulian Grajkowski 	if (CPA_TRUE == performOpNow) {
58478ee8d1cSJulian Grajkowski 		SalQatMsg_updateQueueTail(trans_handle);
58578ee8d1cSJulian Grajkowski 	}
58678ee8d1cSJulian Grajkowski 
58778ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
58878ee8d1cSJulian Grajkowski }
58978ee8d1cSJulian Grajkowski 
59078ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpEnqueueOp(CpaDcDpOpData * pOpData,const CpaBoolean performOpNow)591*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOp(CpaDcDpOpData *pOpData, const CpaBoolean performOpNow)
592*22cf89c9SPiotr Kasierski {
593*22cf89c9SPiotr Kasierski 
594*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBase(pOpData, NULL, CPA_FALSE, performOpNow);
595*22cf89c9SPiotr Kasierski }
596*22cf89c9SPiotr Kasierski 
597*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpEnqueueOpWithPartRead(CpaDcDpOpData * pOpData,CpaDcDpPartialReadData * pPartReadData,const CpaBoolean performOpNow)598*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOpWithPartRead(CpaDcDpOpData *pOpData,
599*22cf89c9SPiotr Kasierski 			     CpaDcDpPartialReadData *pPartReadData,
600*22cf89c9SPiotr Kasierski 			     const CpaBoolean performOpNow)
601*22cf89c9SPiotr Kasierski {
602*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBase(pOpData,
603*22cf89c9SPiotr Kasierski 				 pPartReadData,
604*22cf89c9SPiotr Kasierski 				 CPA_FALSE,
605*22cf89c9SPiotr Kasierski 				 performOpNow);
606*22cf89c9SPiotr Kasierski }
607*22cf89c9SPiotr Kasierski 
608*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpEnqueueOpWithZeroPad(CpaDcDpOpData * pOpData,const CpaBoolean performOpNow)609*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOpWithZeroPad(CpaDcDpOpData *pOpData,
610*22cf89c9SPiotr Kasierski 			    const CpaBoolean performOpNow)
611*22cf89c9SPiotr Kasierski {
612*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBase(pOpData, NULL, CPA_TRUE, performOpNow);
613*22cf89c9SPiotr Kasierski }
614*22cf89c9SPiotr Kasierski 
615*22cf89c9SPiotr Kasierski static CpaStatus
dcDpEnqueueOpBatchBase(const Cpa32U numberRequests,CpaDcDpOpData * pOpData[],CpaDcDpPartialReadData * pPartData[],CpaBoolean zeroPadFlag,const CpaBoolean performOpNow)616*22cf89c9SPiotr Kasierski dcDpEnqueueOpBatchBase(const Cpa32U numberRequests,
61778ee8d1cSJulian Grajkowski 		       CpaDcDpOpData *pOpData[],
618*22cf89c9SPiotr Kasierski 		       CpaDcDpPartialReadData *pPartData[],
619*22cf89c9SPiotr Kasierski 		       CpaBoolean zeroPadFlag,
62078ee8d1cSJulian Grajkowski 		       const CpaBoolean performOpNow)
62178ee8d1cSJulian Grajkowski {
62278ee8d1cSJulian Grajkowski 	icp_qat_fw_comp_req_t *pCurrentQatMsg = NULL;
62378ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_handle = NULL;
62478ee8d1cSJulian Grajkowski 	dc_session_desc_t *pSessionDesc = NULL;
62578ee8d1cSJulian Grajkowski 	Cpa32U i = 0;
62678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
62778ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
62878ee8d1cSJulian Grajkowski 
62978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData);
63078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData[0]);
63178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pOpData[0]->dcInstance);
63278ee8d1cSJulian Grajkowski 
63378ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)(pOpData[0]->dcInstance);
63478ee8d1cSJulian Grajkowski 	if ((numberRequests == 0) ||
63578ee8d1cSJulian Grajkowski 	    (numberRequests > pService->maxNumCompConcurrentReq)) {
63678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
63778ee8d1cSJulian Grajkowski 		    "The number of requests needs to be between 1 and %d.\n",
63878ee8d1cSJulian Grajkowski 		    pService->maxNumCompConcurrentReq);
63978ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
64078ee8d1cSJulian Grajkowski 	}
64178ee8d1cSJulian Grajkowski 
64278ee8d1cSJulian Grajkowski 	for (i = 0; i < numberRequests; i++) {
64378ee8d1cSJulian Grajkowski 		status = dcDataPlaneParamCheck(pOpData[i]);
64478ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
64578ee8d1cSJulian Grajkowski 			return status;
64678ee8d1cSJulian Grajkowski 		}
64778ee8d1cSJulian Grajkowski 
648*22cf89c9SPiotr Kasierski 		if (NULL != pPartData) {
649*22cf89c9SPiotr Kasierski 			status =
650*22cf89c9SPiotr Kasierski 			    dcDataPlanePartReadCheck(pOpData[i], pPartData[i]);
651*22cf89c9SPiotr Kasierski 			if (CPA_STATUS_SUCCESS != status) {
652*22cf89c9SPiotr Kasierski 				return status;
653*22cf89c9SPiotr Kasierski 			}
654*22cf89c9SPiotr Kasierski 		}
655*22cf89c9SPiotr Kasierski 
656*22cf89c9SPiotr Kasierski 		if (CPA_TRUE == zeroPadFlag) {
657*22cf89c9SPiotr Kasierski 			status = dcDataPlaneZeroPadCheck(pOpData[i]);
658*22cf89c9SPiotr Kasierski 			if (CPA_STATUS_SUCCESS != status) {
659*22cf89c9SPiotr Kasierski 				return status;
660*22cf89c9SPiotr Kasierski 			}
661*22cf89c9SPiotr Kasierski 		}
662*22cf89c9SPiotr Kasierski 
66378ee8d1cSJulian Grajkowski 		/* Check that all instance handles and session handles are the
66478ee8d1cSJulian Grajkowski 		 * same */
66578ee8d1cSJulian Grajkowski 		if (pOpData[i]->dcInstance != pOpData[0]->dcInstance) {
66678ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
66778ee8d1cSJulian Grajkowski 			    "All instance handles should be the same in the pOpData.\n");
66878ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
66978ee8d1cSJulian Grajkowski 		}
67078ee8d1cSJulian Grajkowski 
67178ee8d1cSJulian Grajkowski 		if (pOpData[i]->pSessionHandle != pOpData[0]->pSessionHandle) {
67278ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
67378ee8d1cSJulian Grajkowski 			    "All session handles should be the same in the pOpData.\n");
67478ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
67578ee8d1cSJulian Grajkowski 		}
67678ee8d1cSJulian Grajkowski 	}
67778ee8d1cSJulian Grajkowski 
67878ee8d1cSJulian Grajkowski 	for (i = 0; i < numberRequests; i++) {
67978ee8d1cSJulian Grajkowski 		if ((CPA_FALSE == pOpData[i]->compressAndVerify) &&
68078ee8d1cSJulian Grajkowski 		    (CPA_DC_DIR_COMPRESS == pOpData[i]->sessDirection)) {
68178ee8d1cSJulian Grajkowski 			return CPA_STATUS_UNSUPPORTED;
68278ee8d1cSJulian Grajkowski 		}
68378ee8d1cSJulian Grajkowski 	}
68478ee8d1cSJulian Grajkowski 
68578ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
68678ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(pOpData[0]->dcInstance);
68778ee8d1cSJulian Grajkowski 
68878ee8d1cSJulian Grajkowski 	trans_handle = ((sal_compression_service_t *)pOpData[0]->dcInstance)
68978ee8d1cSJulian Grajkowski 			   ->trans_handle_compression_tx;
69078ee8d1cSJulian Grajkowski 	pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pOpData[0]->pSessionHandle);
69178ee8d1cSJulian Grajkowski 
69278ee8d1cSJulian Grajkowski 	for (i = 0; i < numberRequests; i++) {
69378ee8d1cSJulian Grajkowski 		if ((CPA_DC_DIR_COMPRESS == pOpData[i]->sessDirection) &&
69478ee8d1cSJulian Grajkowski 		    (CPA_DC_DIR_DECOMPRESS == pSessionDesc->sessDirection)) {
69578ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
69678ee8d1cSJulian Grajkowski 			    "The session does not support this direction of operation.\n");
69778ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
69878ee8d1cSJulian Grajkowski 		} else if ((CPA_DC_DIR_DECOMPRESS ==
69978ee8d1cSJulian Grajkowski 			    pOpData[i]->sessDirection) &&
70078ee8d1cSJulian Grajkowski 			   (CPA_DC_DIR_COMPRESS ==
70178ee8d1cSJulian Grajkowski 			    pSessionDesc->sessDirection)) {
70278ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
70378ee8d1cSJulian Grajkowski 			    "The session does not support this direction of operation.\n");
70478ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
70578ee8d1cSJulian Grajkowski 		}
70678ee8d1cSJulian Grajkowski 	}
70778ee8d1cSJulian Grajkowski 
70878ee8d1cSJulian Grajkowski 	icp_adf_getQueueMemory(trans_handle,
70978ee8d1cSJulian Grajkowski 			       numberRequests,
71078ee8d1cSJulian Grajkowski 			       (void **)&pCurrentQatMsg);
71178ee8d1cSJulian Grajkowski 	if (NULL == pCurrentQatMsg) {
71278ee8d1cSJulian Grajkowski 		return CPA_STATUS_RETRY;
71378ee8d1cSJulian Grajkowski 	}
71478ee8d1cSJulian Grajkowski 
71578ee8d1cSJulian Grajkowski 	for (i = 0; i < numberRequests; i++) {
71678ee8d1cSJulian Grajkowski 		dcDpWriteRingMsg(pOpData[i], pCurrentQatMsg);
717*22cf89c9SPiotr Kasierski 		if (pPartData) {
718*22cf89c9SPiotr Kasierski 			dcDpUpdateRingMsg(pOpData[i],
719*22cf89c9SPiotr Kasierski 					  pPartData[i],
720*22cf89c9SPiotr Kasierski 					  CPA_FALSE,
721*22cf89c9SPiotr Kasierski 					  pCurrentQatMsg);
722*22cf89c9SPiotr Kasierski 		}
723*22cf89c9SPiotr Kasierski 		if (CPA_TRUE == zeroPadFlag) {
724*22cf89c9SPiotr Kasierski 			dcDpUpdateRingMsg(pOpData[i],
725*22cf89c9SPiotr Kasierski 					  NULL,
726*22cf89c9SPiotr Kasierski 					  CPA_TRUE,
727*22cf89c9SPiotr Kasierski 					  pCurrentQatMsg);
728*22cf89c9SPiotr Kasierski 		}
72978ee8d1cSJulian Grajkowski 		icp_adf_getQueueNext(trans_handle, (void **)&pCurrentQatMsg);
73078ee8d1cSJulian Grajkowski 	}
73178ee8d1cSJulian Grajkowski 
73278ee8d1cSJulian Grajkowski 	pSessionDesc->pendingDpStatelessCbCount += numberRequests;
73378ee8d1cSJulian Grajkowski 
73478ee8d1cSJulian Grajkowski 	if (CPA_TRUE == performOpNow) {
73578ee8d1cSJulian Grajkowski 		SalQatMsg_updateQueueTail(trans_handle);
73678ee8d1cSJulian Grajkowski 	}
73778ee8d1cSJulian Grajkowski 
73878ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
73978ee8d1cSJulian Grajkowski }
74078ee8d1cSJulian Grajkowski 
74178ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpEnqueueOpBatch(const Cpa32U numberRequests,CpaDcDpOpData * pOpData[],const CpaBoolean performOpNow)742*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOpBatch(const Cpa32U numberRequests,
743*22cf89c9SPiotr Kasierski 		      CpaDcDpOpData *pOpData[],
744*22cf89c9SPiotr Kasierski 		      const CpaBoolean performOpNow)
745*22cf89c9SPiotr Kasierski {
746*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBatchBase(
747*22cf89c9SPiotr Kasierski 	    numberRequests, pOpData, NULL, CPA_FALSE, performOpNow);
748*22cf89c9SPiotr Kasierski }
749*22cf89c9SPiotr Kasierski 
750*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpEnqueueOpWithPartReadBatch(const Cpa32U numberRequests,CpaDcDpOpData * pOpData[],CpaDcDpPartialReadData * pPartReadData[],const CpaBoolean performOpNow)751*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOpWithPartReadBatch(const Cpa32U numberRequests,
752*22cf89c9SPiotr Kasierski 				  CpaDcDpOpData *pOpData[],
753*22cf89c9SPiotr Kasierski 				  CpaDcDpPartialReadData *pPartReadData[],
754*22cf89c9SPiotr Kasierski 				  const CpaBoolean performOpNow)
755*22cf89c9SPiotr Kasierski {
756*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBatchBase(
757*22cf89c9SPiotr Kasierski 	    numberRequests, pOpData, pPartReadData, CPA_FALSE, performOpNow);
758*22cf89c9SPiotr Kasierski }
759*22cf89c9SPiotr Kasierski 
760*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpEnqueueOpWithZeroPadBatch(const Cpa32U numberRequests,CpaDcDpOpData * pOpData[],const CpaBoolean performOpNow)761*22cf89c9SPiotr Kasierski cpaDcDpEnqueueOpWithZeroPadBatch(const Cpa32U numberRequests,
762*22cf89c9SPiotr Kasierski 				 CpaDcDpOpData *pOpData[],
763*22cf89c9SPiotr Kasierski 				 const CpaBoolean performOpNow)
764*22cf89c9SPiotr Kasierski {
765*22cf89c9SPiotr Kasierski 	return dcDpEnqueueOpBatchBase(
766*22cf89c9SPiotr Kasierski 	    numberRequests, pOpData, NULL, CPA_TRUE, performOpNow);
767*22cf89c9SPiotr Kasierski }
768*22cf89c9SPiotr Kasierski 
769*22cf89c9SPiotr Kasierski CpaStatus
icp_sal_DcPollDpInstance(CpaInstanceHandle dcInstance,Cpa32U responseQuota)77078ee8d1cSJulian Grajkowski icp_sal_DcPollDpInstance(CpaInstanceHandle dcInstance, Cpa32U responseQuota)
77178ee8d1cSJulian Grajkowski {
77278ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_handle = NULL;
77378ee8d1cSJulian Grajkowski 
77478ee8d1cSJulian Grajkowski 	LAC_CHECK_INSTANCE_HANDLE(dcInstance);
77578ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(dcInstance, SAL_SERVICE_TYPE_COMPRESSION);
77678ee8d1cSJulian Grajkowski 
77778ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
77878ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(dcInstance);
77978ee8d1cSJulian Grajkowski 
78078ee8d1cSJulian Grajkowski 	trans_handle = ((sal_compression_service_t *)dcInstance)
78178ee8d1cSJulian Grajkowski 			   ->trans_handle_compression_rx;
78278ee8d1cSJulian Grajkowski 
78378ee8d1cSJulian Grajkowski 	return icp_adf_pollQueue(trans_handle, responseQuota);
78478ee8d1cSJulian Grajkowski }
78578ee8d1cSJulian Grajkowski 
78678ee8d1cSJulian Grajkowski CpaStatus
cpaDcDpPerformOpNow(CpaInstanceHandle dcInstance)78778ee8d1cSJulian Grajkowski cpaDcDpPerformOpNow(CpaInstanceHandle dcInstance)
78878ee8d1cSJulian Grajkowski {
78978ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_handle = NULL;
79078ee8d1cSJulian Grajkowski 
79178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(dcInstance);
79278ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(dcInstance, SAL_SERVICE_TYPE_COMPRESSION);
79378ee8d1cSJulian Grajkowski 
79478ee8d1cSJulian Grajkowski 	/* Check if SAL is initialised otherwise return an error */
79578ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(dcInstance);
79678ee8d1cSJulian Grajkowski 
79778ee8d1cSJulian Grajkowski 	trans_handle = ((sal_compression_service_t *)dcInstance)
79878ee8d1cSJulian Grajkowski 			   ->trans_handle_compression_tx;
79978ee8d1cSJulian Grajkowski 
80078ee8d1cSJulian Grajkowski 	if (CPA_TRUE == icp_adf_queueDataToSend(trans_handle)) {
80178ee8d1cSJulian Grajkowski 		SalQatMsg_updateQueueTail(trans_handle);
80278ee8d1cSJulian Grajkowski 	}
80378ee8d1cSJulian Grajkowski 
80478ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
80578ee8d1cSJulian Grajkowski }
806*22cf89c9SPiotr Kasierski 
807*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpIsPartReadSupported(const CpaInstanceHandle instanceHandle,CpaBoolean * flag)808*22cf89c9SPiotr Kasierski cpaDcDpIsPartReadSupported(const CpaInstanceHandle instanceHandle,
809*22cf89c9SPiotr Kasierski 			   CpaBoolean *flag)
810*22cf89c9SPiotr Kasierski {
811*22cf89c9SPiotr Kasierski 	sal_compression_service_t *pService = NULL;
812*22cf89c9SPiotr Kasierski 	dc_extd_ftrs_t *pExtendedFtrs = NULL;
813*22cf89c9SPiotr Kasierski 
814*22cf89c9SPiotr Kasierski 	LAC_CHECK_NULL_PARAM(instanceHandle);
815*22cf89c9SPiotr Kasierski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle, SAL_SERVICE_TYPE_COMPRESSION);
816*22cf89c9SPiotr Kasierski 
817*22cf89c9SPiotr Kasierski 	pService = (sal_compression_service_t *)instanceHandle;
818*22cf89c9SPiotr Kasierski 	if (!isDcGen4x(pService)) {
819*22cf89c9SPiotr Kasierski 		*flag = CPA_FALSE;
820*22cf89c9SPiotr Kasierski 		return CPA_STATUS_SUCCESS;
821*22cf89c9SPiotr Kasierski 	}
822*22cf89c9SPiotr Kasierski 
823*22cf89c9SPiotr Kasierski 	pExtendedFtrs = (dc_extd_ftrs_t *)&(
824*22cf89c9SPiotr Kasierski 	    ((sal_service_t *)instanceHandle)->dcExtendedFeatures);
825*22cf89c9SPiotr Kasierski 
826*22cf89c9SPiotr Kasierski 	*flag = (CpaBoolean)pExtendedFtrs->is_part_read;
827*22cf89c9SPiotr Kasierski 
828*22cf89c9SPiotr Kasierski 	return CPA_STATUS_SUCCESS;
829*22cf89c9SPiotr Kasierski }
830*22cf89c9SPiotr Kasierski 
831*22cf89c9SPiotr Kasierski CpaStatus
cpaDcDpIsZeroPadSupported(const CpaInstanceHandle instanceHandle,CpaBoolean * flag)832*22cf89c9SPiotr Kasierski cpaDcDpIsZeroPadSupported(const CpaInstanceHandle instanceHandle,
833*22cf89c9SPiotr Kasierski 			  CpaBoolean *flag)
834*22cf89c9SPiotr Kasierski {
835*22cf89c9SPiotr Kasierski 	sal_compression_service_t *pService = NULL;
836*22cf89c9SPiotr Kasierski 	dc_extd_ftrs_t *pExtendedFtrs = NULL;
837*22cf89c9SPiotr Kasierski 
838*22cf89c9SPiotr Kasierski 	LAC_CHECK_NULL_PARAM(instanceHandle);
839*22cf89c9SPiotr Kasierski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle, SAL_SERVICE_TYPE_COMPRESSION);
840*22cf89c9SPiotr Kasierski 
841*22cf89c9SPiotr Kasierski 	pService = (sal_compression_service_t *)instanceHandle;
842*22cf89c9SPiotr Kasierski 	if (!isDcGen4x(pService)) {
843*22cf89c9SPiotr Kasierski 		*flag = CPA_FALSE;
844*22cf89c9SPiotr Kasierski 		return CPA_STATUS_SUCCESS;
845*22cf89c9SPiotr Kasierski 	}
846*22cf89c9SPiotr Kasierski 
847*22cf89c9SPiotr Kasierski 	pExtendedFtrs = (dc_extd_ftrs_t *)&(
848*22cf89c9SPiotr Kasierski 	    ((sal_service_t *)instanceHandle)->dcExtendedFeatures);
849*22cf89c9SPiotr Kasierski 
850*22cf89c9SPiotr Kasierski 	*flag = (CpaBoolean)pExtendedFtrs->is_zero_pad;
851*22cf89c9SPiotr Kasierski 
852*22cf89c9SPiotr Kasierski 	return CPA_STATUS_SUCCESS;
853*22cf89c9SPiotr Kasierski }
854