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