178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski 
478ee8d1cSJulian Grajkowski /**
578ee8d1cSJulian Grajkowski  ***************************************************************************
678ee8d1cSJulian Grajkowski  * @file sal_crypto.c     Instance handling functions for crypto
778ee8d1cSJulian Grajkowski  *
878ee8d1cSJulian Grajkowski  * @ingroup SalCtrl
978ee8d1cSJulian Grajkowski  *
1078ee8d1cSJulian Grajkowski  ***************************************************************************/
1178ee8d1cSJulian Grajkowski 
1278ee8d1cSJulian Grajkowski /*
1378ee8d1cSJulian Grajkowski *******************************************************************************
1478ee8d1cSJulian Grajkowski * Include public/global header files
1578ee8d1cSJulian Grajkowski *******************************************************************************
1678ee8d1cSJulian Grajkowski */
1778ee8d1cSJulian Grajkowski 
1878ee8d1cSJulian Grajkowski /* QAT-API includes */
1978ee8d1cSJulian Grajkowski #include "cpa.h"
2078ee8d1cSJulian Grajkowski #include "cpa_types.h"
2178ee8d1cSJulian Grajkowski #include "cpa_cy_common.h"
2278ee8d1cSJulian Grajkowski #include "cpa_cy_im.h"
2378ee8d1cSJulian Grajkowski #include "cpa_cy_key.h"
2478ee8d1cSJulian Grajkowski #include "cpa_cy_sym.h"
2578ee8d1cSJulian Grajkowski 
2678ee8d1cSJulian Grajkowski #include "qat_utils.h"
2778ee8d1cSJulian Grajkowski 
2878ee8d1cSJulian Grajkowski /* ADF includes */
2978ee8d1cSJulian Grajkowski #include "icp_adf_init.h"
3078ee8d1cSJulian Grajkowski #include "icp_adf_transport.h"
3178ee8d1cSJulian Grajkowski #include "icp_accel_devices.h"
3278ee8d1cSJulian Grajkowski #include "icp_adf_cfg.h"
3378ee8d1cSJulian Grajkowski #include "icp_adf_accel_mgr.h"
3478ee8d1cSJulian Grajkowski #include "icp_adf_poll.h"
3578ee8d1cSJulian Grajkowski #include "icp_adf_debug.h"
3678ee8d1cSJulian Grajkowski 
3778ee8d1cSJulian Grajkowski /* SAL includes */
3878ee8d1cSJulian Grajkowski #include "lac_log.h"
3978ee8d1cSJulian Grajkowski #include "lac_mem.h"
4078ee8d1cSJulian Grajkowski #include "lac_mem_pools.h"
4178ee8d1cSJulian Grajkowski #include "sal_statistics.h"
4278ee8d1cSJulian Grajkowski #include "lac_common.h"
4378ee8d1cSJulian Grajkowski #include "lac_list.h"
4478ee8d1cSJulian Grajkowski #include "lac_hooks.h"
4578ee8d1cSJulian Grajkowski #include "lac_sym_qat_hash_defs_lookup.h"
4678ee8d1cSJulian Grajkowski #include "lac_sym.h"
4778ee8d1cSJulian Grajkowski #include "lac_sym_key.h"
4878ee8d1cSJulian Grajkowski #include "lac_sym_hash.h"
4978ee8d1cSJulian Grajkowski #include "lac_sym_cb.h"
5078ee8d1cSJulian Grajkowski #include "lac_sym_stats.h"
5178ee8d1cSJulian Grajkowski #include "lac_sal_types_crypto.h"
5278ee8d1cSJulian Grajkowski #include "lac_sal.h"
5378ee8d1cSJulian Grajkowski #include "lac_sal_ctrl.h"
5478ee8d1cSJulian Grajkowski #include "sal_string_parse.h"
5578ee8d1cSJulian Grajkowski #include "sal_service_state.h"
5678ee8d1cSJulian Grajkowski #include "icp_sal_poll.h"
5778ee8d1cSJulian Grajkowski #include "lac_sync.h"
5878ee8d1cSJulian Grajkowski #include "lac_sym_qat.h"
5978ee8d1cSJulian Grajkowski #include "icp_sal_versions.h"
6078ee8d1cSJulian Grajkowski #include "icp_sal_user.h"
61a977168cSMichal Gulbicki #include "sal_hw_gen.h"
6278ee8d1cSJulian Grajkowski 
63a977168cSMichal Gulbicki #define HMAC_MODE_1 1
64a977168cSMichal Gulbicki #define HMAC_MODE_2 2
6578ee8d1cSJulian Grajkowski #define TH_CY_RX_0 0
6678ee8d1cSJulian Grajkowski #define TH_CY_RX_1 1
6778ee8d1cSJulian Grajkowski #define MAX_CY_RX_RINGS 2
6878ee8d1cSJulian Grajkowski 
6978ee8d1cSJulian Grajkowski #define DOUBLE_INCR 2
7078ee8d1cSJulian Grajkowski 
7178ee8d1cSJulian Grajkowski #define TH_SINGLE_RX 0
7278ee8d1cSJulian Grajkowski #define NUM_CRYPTO_SYM_RX_RINGS 1
7378ee8d1cSJulian Grajkowski #define NUM_CRYPTO_ASYM_RX_RINGS 1
7478ee8d1cSJulian Grajkowski #define NUM_CRYPTO_NRBG_RX_RINGS 1
7578ee8d1cSJulian Grajkowski 
7678ee8d1cSJulian Grajkowski static CpaInstanceHandle
Lac_CryptoGetFirstHandle(void)7778ee8d1cSJulian Grajkowski Lac_CryptoGetFirstHandle(void)
7878ee8d1cSJulian Grajkowski {
7978ee8d1cSJulian Grajkowski 	CpaInstanceHandle instHandle;
8078ee8d1cSJulian Grajkowski 	instHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO);
8178ee8d1cSJulian Grajkowski 	if (!instHandle) {
8278ee8d1cSJulian Grajkowski 		instHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM);
8378ee8d1cSJulian Grajkowski 		if (!instHandle) {
8478ee8d1cSJulian Grajkowski 			instHandle =
8578ee8d1cSJulian Grajkowski 			    Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_ASYM);
8678ee8d1cSJulian Grajkowski 		}
8778ee8d1cSJulian Grajkowski 	}
8878ee8d1cSJulian Grajkowski 	return instHandle;
8978ee8d1cSJulian Grajkowski }
9078ee8d1cSJulian Grajkowski 
9178ee8d1cSJulian Grajkowski 
9278ee8d1cSJulian Grajkowski /* Function to release the sym handles. */
9378ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_SymReleaseTransHandle(sal_service_t * service)9478ee8d1cSJulian Grajkowski SalCtrl_SymReleaseTransHandle(sal_service_t *service)
9578ee8d1cSJulian Grajkowski {
9678ee8d1cSJulian Grajkowski 
9778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
9878ee8d1cSJulian Grajkowski 	CpaStatus ret_status = CPA_STATUS_SUCCESS;
9978ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
10078ee8d1cSJulian Grajkowski 
10178ee8d1cSJulian Grajkowski 	if (NULL != pCryptoService->trans_handle_sym_tx) {
10278ee8d1cSJulian Grajkowski 		status = icp_adf_transReleaseHandle(
10378ee8d1cSJulian Grajkowski 		    pCryptoService->trans_handle_sym_tx);
10478ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
10578ee8d1cSJulian Grajkowski 			ret_status = status;
10678ee8d1cSJulian Grajkowski 		}
10778ee8d1cSJulian Grajkowski 	}
10878ee8d1cSJulian Grajkowski 	if (NULL != pCryptoService->trans_handle_sym_rx) {
10978ee8d1cSJulian Grajkowski 		status = icp_adf_transReleaseHandle(
11078ee8d1cSJulian Grajkowski 		    pCryptoService->trans_handle_sym_rx);
11178ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
11278ee8d1cSJulian Grajkowski 			ret_status = status;
11378ee8d1cSJulian Grajkowski 		}
11478ee8d1cSJulian Grajkowski 	}
11578ee8d1cSJulian Grajkowski 
11678ee8d1cSJulian Grajkowski 	return ret_status;
11778ee8d1cSJulian Grajkowski }
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski 
12078ee8d1cSJulian Grajkowski /*
12178ee8d1cSJulian Grajkowski  * @ingroup sal_crypto
12278ee8d1cSJulian Grajkowski  *     Frees resources (memory and transhandles) if allocated
12378ee8d1cSJulian Grajkowski  *
12478ee8d1cSJulian Grajkowski  * @param[in]  pCryptoService       Pointer to sym service instance
12578ee8d1cSJulian Grajkowski  * @retval                          SUCCESS if transhandles released
12678ee8d1cSJulian Grajkowski  *                                  successfully.
12778ee8d1cSJulian Grajkowski */
12878ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_SymFreeResources(sal_crypto_service_t * pCryptoService)12978ee8d1cSJulian Grajkowski SalCtrl_SymFreeResources(sal_crypto_service_t *pCryptoService)
13078ee8d1cSJulian Grajkowski {
13178ee8d1cSJulian Grajkowski 
13278ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
13378ee8d1cSJulian Grajkowski 
13478ee8d1cSJulian Grajkowski 	/* Free memory pools if not NULL */
13578ee8d1cSJulian Grajkowski 	Lac_MemPoolDestroy(pCryptoService->lac_sym_cookie_pool);
13678ee8d1cSJulian Grajkowski 
13778ee8d1cSJulian Grajkowski 	/* Free misc memory if allocated */
13878ee8d1cSJulian Grajkowski 	/* Frees memory allocated for Hmac precomputes */
13978ee8d1cSJulian Grajkowski 	LacSymHash_HmacPrecompShutdown(pCryptoService);
14078ee8d1cSJulian Grajkowski 	/* Free memory allocated for key labels
14178ee8d1cSJulian Grajkowski 	   Also clears key stats  */
14278ee8d1cSJulian Grajkowski 	LacSymKey_Shutdown(pCryptoService);
14378ee8d1cSJulian Grajkowski 	/* Free hash lookup table if allocated */
14478ee8d1cSJulian Grajkowski 	if (NULL != pCryptoService->pLacHashLookupDefs) {
14578ee8d1cSJulian Grajkowski 		LAC_OS_FREE(pCryptoService->pLacHashLookupDefs);
14678ee8d1cSJulian Grajkowski 	}
14778ee8d1cSJulian Grajkowski 
14878ee8d1cSJulian Grajkowski 	/* Free statistics */
14978ee8d1cSJulian Grajkowski 	LacSym_StatsFree(pCryptoService);
15078ee8d1cSJulian Grajkowski 
15178ee8d1cSJulian Grajkowski 	/* Free transport handles */
15278ee8d1cSJulian Grajkowski 	status = SalCtrl_SymReleaseTransHandle((sal_service_t *)pCryptoService);
15378ee8d1cSJulian Grajkowski 	return status;
15478ee8d1cSJulian Grajkowski }
15578ee8d1cSJulian Grajkowski 
15678ee8d1cSJulian Grajkowski 
15778ee8d1cSJulian Grajkowski /**
15878ee8d1cSJulian Grajkowski  ***********************************************************************
15978ee8d1cSJulian Grajkowski  * @ingroup SalCtrl
16078ee8d1cSJulian Grajkowski  *   This macro verifies that the status is _SUCCESS
16178ee8d1cSJulian Grajkowski  *   If status is not _SUCCESS then Sym Instance resources are
16278ee8d1cSJulian Grajkowski  *   freed before the function returns the error
16378ee8d1cSJulian Grajkowski  *
16478ee8d1cSJulian Grajkowski  * @param[in] status    status we are checking
16578ee8d1cSJulian Grajkowski  *
16678ee8d1cSJulian Grajkowski  * @return void         status is ok (CPA_STATUS_SUCCESS)
16778ee8d1cSJulian Grajkowski  * @return status       The value in the status parameter is an error one
16878ee8d1cSJulian Grajkowski  *
16978ee8d1cSJulian Grajkowski  ****************************************************************************/
17078ee8d1cSJulian Grajkowski #define LAC_CHECK_STATUS_SYM_INIT(status)                                      \
17178ee8d1cSJulian Grajkowski 	do {                                                                   \
17278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {                            \
17378ee8d1cSJulian Grajkowski 			SalCtrl_SymFreeResources(pCryptoService);              \
17478ee8d1cSJulian Grajkowski 			return status;                                         \
17578ee8d1cSJulian Grajkowski 		}                                                              \
17678ee8d1cSJulian Grajkowski 	} while (0)
17778ee8d1cSJulian Grajkowski 
17878ee8d1cSJulian Grajkowski 
17978ee8d1cSJulian Grajkowski /* Function that creates the Sym Handles. */
18078ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_SymCreateTransHandle(icp_accel_dev_t * device,sal_service_t * service,Cpa32U numSymRequests,char * section)18178ee8d1cSJulian Grajkowski SalCtrl_SymCreateTransHandle(icp_accel_dev_t *device,
18278ee8d1cSJulian Grajkowski 			     sal_service_t *service,
18378ee8d1cSJulian Grajkowski 			     Cpa32U numSymRequests,
18478ee8d1cSJulian Grajkowski 			     char *section)
18578ee8d1cSJulian Grajkowski {
18678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
18778ee8d1cSJulian Grajkowski 	char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
18878ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
18978ee8d1cSJulian Grajkowski 	icp_resp_deliv_method rx_resp_type = ICP_RESP_TYPE_IRQ;
19078ee8d1cSJulian Grajkowski 	Cpa32U msgSize = 0;
19178ee8d1cSJulian Grajkowski 
19278ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE == pCryptoService->isPolled) {
19378ee8d1cSJulian Grajkowski 		rx_resp_type = ICP_RESP_TYPE_POLL;
19478ee8d1cSJulian Grajkowski 	}
19578ee8d1cSJulian Grajkowski 
19678ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) {
19778ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
19878ee8d1cSJulian Grajkowski 	}
19978ee8d1cSJulian Grajkowski 
20078ee8d1cSJulian Grajkowski 	/* Parse Sym ring details */
20178ee8d1cSJulian Grajkowski 	status =
20278ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
20378ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
20478ee8d1cSJulian Grajkowski 			      "RingSymTx",
20578ee8d1cSJulian Grajkowski 			      temp_string);
20678ee8d1cSJulian Grajkowski 
20778ee8d1cSJulian Grajkowski 	/* Need to free resources in case not _SUCCESS from here */
20878ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
20978ee8d1cSJulian Grajkowski 
21078ee8d1cSJulian Grajkowski 	msgSize = LAC_QAT_SYM_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES;
21178ee8d1cSJulian Grajkowski 	status =
21278ee8d1cSJulian Grajkowski 	    icp_adf_transCreateHandle(device,
21378ee8d1cSJulian Grajkowski 				      ICP_TRANS_TYPE_ETR,
21478ee8d1cSJulian Grajkowski 				      section,
21578ee8d1cSJulian Grajkowski 				      pCryptoService->acceleratorNum,
216a977168cSMichal Gulbicki 				      pCryptoService->bankNumSym,
21778ee8d1cSJulian Grajkowski 				      temp_string,
21878ee8d1cSJulian Grajkowski 				      lac_getRingType(SAL_RING_TYPE_A_SYM_HI),
21978ee8d1cSJulian Grajkowski 				      NULL,
22078ee8d1cSJulian Grajkowski 				      ICP_RESP_TYPE_NONE,
22178ee8d1cSJulian Grajkowski 				      numSymRequests,
22278ee8d1cSJulian Grajkowski 				      msgSize,
22378ee8d1cSJulian Grajkowski 				      (icp_comms_trans_handle *)&(
22478ee8d1cSJulian Grajkowski 					  pCryptoService->trans_handle_sym_tx));
22578ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
22678ee8d1cSJulian Grajkowski 
22778ee8d1cSJulian Grajkowski 	status =
22878ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
22978ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
23078ee8d1cSJulian Grajkowski 			      "RingSymRx",
23178ee8d1cSJulian Grajkowski 			      temp_string);
23278ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
23378ee8d1cSJulian Grajkowski 
23478ee8d1cSJulian Grajkowski 	msgSize = LAC_QAT_SYM_RESP_SZ_LW * LAC_LONG_WORD_IN_BYTES;
23578ee8d1cSJulian Grajkowski 	status = icp_adf_transCreateHandle(
23678ee8d1cSJulian Grajkowski 	    device,
23778ee8d1cSJulian Grajkowski 	    ICP_TRANS_TYPE_ETR,
23878ee8d1cSJulian Grajkowski 	    section,
23978ee8d1cSJulian Grajkowski 	    pCryptoService->acceleratorNum,
240a977168cSMichal Gulbicki 	    pCryptoService->bankNumSym,
24178ee8d1cSJulian Grajkowski 	    temp_string,
24278ee8d1cSJulian Grajkowski 	    lac_getRingType(SAL_RING_TYPE_NONE),
24378ee8d1cSJulian Grajkowski 	    (icp_trans_callback)LacSymQat_SymRespHandler,
24478ee8d1cSJulian Grajkowski 	    rx_resp_type,
24578ee8d1cSJulian Grajkowski 	    numSymRequests,
24678ee8d1cSJulian Grajkowski 	    msgSize,
24778ee8d1cSJulian Grajkowski 	    (icp_comms_trans_handle *)&(pCryptoService->trans_handle_sym_rx));
24878ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
24978ee8d1cSJulian Grajkowski 
25078ee8d1cSJulian Grajkowski 	return status;
25178ee8d1cSJulian Grajkowski }
25278ee8d1cSJulian Grajkowski 
25378ee8d1cSJulian Grajkowski static int
SalCtrl_CryptoDebug(void * private_data,char * data,int size,int offset)25478ee8d1cSJulian Grajkowski SalCtrl_CryptoDebug(void *private_data, char *data, int size, int offset)
25578ee8d1cSJulian Grajkowski {
25678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
25778ee8d1cSJulian Grajkowski 	Cpa32U len = 0;
25878ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService =
25978ee8d1cSJulian Grajkowski 	    (sal_crypto_service_t *)private_data;
26078ee8d1cSJulian Grajkowski 
26178ee8d1cSJulian Grajkowski 	switch (offset) {
26278ee8d1cSJulian Grajkowski 	case SAL_STATS_SYM: {
26378ee8d1cSJulian Grajkowski 		CpaCySymStats64 symStats = { 0 };
26478ee8d1cSJulian Grajkowski 		if (CPA_TRUE !=
26578ee8d1cSJulian Grajkowski 		    pCryptoService->generic_service_info.stats
26678ee8d1cSJulian Grajkowski 			->bSymStatsEnabled) {
26778ee8d1cSJulian Grajkowski 			break;
26878ee8d1cSJulian Grajkowski 		}
26978ee8d1cSJulian Grajkowski 		status = cpaCySymQueryStats64(pCryptoService, &symStats);
27078ee8d1cSJulian Grajkowski 		if (status != CPA_STATUS_SUCCESS) {
27178ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("cpaCySymQueryStats64 returned error\n");
27278ee8d1cSJulian Grajkowski 			return 0;
27378ee8d1cSJulian Grajkowski 		}
27478ee8d1cSJulian Grajkowski 
27578ee8d1cSJulian Grajkowski 		/* Engine Info */
27678ee8d1cSJulian Grajkowski 		len += snprintf(
27778ee8d1cSJulian Grajkowski 		    data + len,
27878ee8d1cSJulian Grajkowski 		    size - len,
27978ee8d1cSJulian Grajkowski 		    SEPARATOR BORDER
28078ee8d1cSJulian Grajkowski 		    " Statistics for Instance %24s |\n" BORDER
28178ee8d1cSJulian Grajkowski 		    " Symmetric Stats                                  " BORDER
28278ee8d1cSJulian Grajkowski 		    "\n" SEPARATOR,
28378ee8d1cSJulian Grajkowski 		    pCryptoService->debug_file->name);
28478ee8d1cSJulian Grajkowski 
28578ee8d1cSJulian Grajkowski 		/* Session Info */
28678ee8d1cSJulian Grajkowski 		len += snprintf(
28778ee8d1cSJulian Grajkowski 		    data + len,
28878ee8d1cSJulian Grajkowski 		    size - len,
28978ee8d1cSJulian Grajkowski 		    BORDER " Sessions Initialized:           %16llu " BORDER
29078ee8d1cSJulian Grajkowski 			   "\n" BORDER
29178ee8d1cSJulian Grajkowski 			   " Sessions Removed:               %16llu " BORDER
29278ee8d1cSJulian Grajkowski 			   "\n" BORDER
29378ee8d1cSJulian Grajkowski 			   " Session Errors:                 %16llu " BORDER
29478ee8d1cSJulian Grajkowski 			   "\n" SEPARATOR,
29578ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSessionsInitialized,
29678ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSessionsRemoved,
29778ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSessionErrors);
29878ee8d1cSJulian Grajkowski 
29978ee8d1cSJulian Grajkowski 		/* Session info */
30078ee8d1cSJulian Grajkowski 		len += snprintf(
30178ee8d1cSJulian Grajkowski 		    data + len,
30278ee8d1cSJulian Grajkowski 		    size - len,
30378ee8d1cSJulian Grajkowski 		    BORDER " Symmetric Requests:             %16llu " BORDER
30478ee8d1cSJulian Grajkowski 			   "\n" BORDER
30578ee8d1cSJulian Grajkowski 			   " Symmetric Request Errors:       %16llu " BORDER
30678ee8d1cSJulian Grajkowski 			   "\n" BORDER
30778ee8d1cSJulian Grajkowski 			   " Symmetric Completed:            %16llu " BORDER
30878ee8d1cSJulian Grajkowski 			   "\n" BORDER
30978ee8d1cSJulian Grajkowski 			   " Symmetric Completed Errors:     %16llu " BORDER
31078ee8d1cSJulian Grajkowski 			   "\n" BORDER
31178ee8d1cSJulian Grajkowski 			   " Symmetric Verify Failures:      %16llu " BORDER
31278ee8d1cSJulian Grajkowski 			   "\n",
31378ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSymOpRequests,
31478ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSymOpRequestErrors,
31578ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSymOpCompleted,
31678ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSymOpCompletedErrors,
31778ee8d1cSJulian Grajkowski 		    (long long unsigned int)symStats.numSymOpVerifyFailures);
31878ee8d1cSJulian Grajkowski 		break;
31978ee8d1cSJulian Grajkowski 	}
32078ee8d1cSJulian Grajkowski 	default: {
32178ee8d1cSJulian Grajkowski 		len += snprintf(data + len, size - len, SEPARATOR);
32278ee8d1cSJulian Grajkowski 		return 0;
32378ee8d1cSJulian Grajkowski 	}
32478ee8d1cSJulian Grajkowski 	}
32578ee8d1cSJulian Grajkowski 	return ++offset;
32678ee8d1cSJulian Grajkowski }
32778ee8d1cSJulian Grajkowski 
32878ee8d1cSJulian Grajkowski 
32978ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_SymInit(icp_accel_dev_t * device,sal_service_t * service)33078ee8d1cSJulian Grajkowski SalCtrl_SymInit(icp_accel_dev_t *device, sal_service_t *service)
33178ee8d1cSJulian Grajkowski {
33278ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
333a977168cSMichal Gulbicki 	Cpa32U qatHmacMode = 0;
33478ee8d1cSJulian Grajkowski 	Cpa32U numSymConcurrentReq = 0;
33578ee8d1cSJulian Grajkowski 	char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
33678ee8d1cSJulian Grajkowski 	char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
33778ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
33878ee8d1cSJulian Grajkowski 	char *section = DYN_SEC;
33978ee8d1cSJulian Grajkowski 
34078ee8d1cSJulian Grajkowski 	/*Instance may not in the DYN section*/
34178ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) {
34278ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
34378ee8d1cSJulian Grajkowski 	}
34478ee8d1cSJulian Grajkowski 
34578ee8d1cSJulian Grajkowski 
34678ee8d1cSJulian Grajkowski 	/* Register callbacks for the symmetric services
34778ee8d1cSJulian Grajkowski 	* (Hash, Cipher, Algorithm-Chaining) (returns void)*/
34878ee8d1cSJulian Grajkowski 	LacSymCb_CallbacksRegister();
34978ee8d1cSJulian Grajkowski 
350a977168cSMichal Gulbicki 	qatHmacMode = (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
351a977168cSMichal Gulbicki 	switch (qatHmacMode) {
352a977168cSMichal Gulbicki 	case HMAC_MODE_1:
353a977168cSMichal Gulbicki 		pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE1;
354a977168cSMichal Gulbicki 		break;
355a977168cSMichal Gulbicki 	case HMAC_MODE_2:
356a977168cSMichal Gulbicki 		pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE2;
357a977168cSMichal Gulbicki 		break;
358a977168cSMichal Gulbicki 	default:
359a977168cSMichal Gulbicki 		pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE1;
360a977168cSMichal Gulbicki 		break;
361a977168cSMichal Gulbicki 	}
362a977168cSMichal Gulbicki 
36378ee8d1cSJulian Grajkowski 	/* Get num concurrent requests from config file */
36478ee8d1cSJulian Grajkowski 	status =
36578ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
36678ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
36778ee8d1cSJulian Grajkowski 			      "NumConcurrentSymRequests",
36878ee8d1cSJulian Grajkowski 			      temp_string);
36978ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
37078ee8d1cSJulian Grajkowski 	status =
37178ee8d1cSJulian Grajkowski 	    icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
37278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
37378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
37478ee8d1cSJulian Grajkowski 			      temp_string);
37578ee8d1cSJulian Grajkowski 		return status;
37678ee8d1cSJulian Grajkowski 	}
37778ee8d1cSJulian Grajkowski 
37878ee8d1cSJulian Grajkowski 	numSymConcurrentReq =
37978ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
38078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_FAIL == validateConcurrRequest(numSymConcurrentReq)) {
38178ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Invalid NumConcurrentSymRequests, valid "
38278ee8d1cSJulian Grajkowski 			      "values {64, 128, 256, ... 32768, 65536}");
38378ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
38478ee8d1cSJulian Grajkowski 	}
38578ee8d1cSJulian Grajkowski 
38678ee8d1cSJulian Grajkowski 	/* ADF does not allow us to completely fill the ring for batch requests
38778ee8d1cSJulian Grajkowski 	 */
38878ee8d1cSJulian Grajkowski 	pCryptoService->maxNumSymReqBatch =
38978ee8d1cSJulian Grajkowski 	    (numSymConcurrentReq - SAL_BATCH_SUBMIT_FREE_SPACE);
39078ee8d1cSJulian Grajkowski 
39178ee8d1cSJulian Grajkowski 	/* Create transport handles */
39278ee8d1cSJulian Grajkowski 	status = SalCtrl_SymCreateTransHandle(device,
39378ee8d1cSJulian Grajkowski 					      service,
39478ee8d1cSJulian Grajkowski 					      numSymConcurrentReq,
39578ee8d1cSJulian Grajkowski 					      section);
39678ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
39778ee8d1cSJulian Grajkowski 
39878ee8d1cSJulian Grajkowski 	/* Allocates memory pools */
39978ee8d1cSJulian Grajkowski 
40078ee8d1cSJulian Grajkowski 	/* Create and initialise symmetric cookie memory pool */
40178ee8d1cSJulian Grajkowski 	pCryptoService->lac_sym_cookie_pool = LAC_MEM_POOL_INIT_POOL_ID;
40278ee8d1cSJulian Grajkowski 	status =
40378ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
40478ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
40578ee8d1cSJulian Grajkowski 			      "SymPool",
40678ee8d1cSJulian Grajkowski 			      temp_string);
40778ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
40878ee8d1cSJulian Grajkowski 	/* Note we need twice (i.e. <<1) the number of sym cookies to
40978ee8d1cSJulian Grajkowski 	   support sym ring pairs (and some, for partials) */
41078ee8d1cSJulian Grajkowski 	status =
41178ee8d1cSJulian Grajkowski 	    Lac_MemPoolCreate(&pCryptoService->lac_sym_cookie_pool,
41278ee8d1cSJulian Grajkowski 			      temp_string,
41378ee8d1cSJulian Grajkowski 			      ((numSymConcurrentReq + numSymConcurrentReq + 1)
41478ee8d1cSJulian Grajkowski 			       << 1),
41578ee8d1cSJulian Grajkowski 			      sizeof(lac_sym_cookie_t),
41678ee8d1cSJulian Grajkowski 			      LAC_64BYTE_ALIGNMENT,
41778ee8d1cSJulian Grajkowski 			      CPA_FALSE,
41878ee8d1cSJulian Grajkowski 			      pCryptoService->nodeAffinity);
41978ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
42078ee8d1cSJulian Grajkowski 	/* For all sym cookies fill out the physical address of data that
42178ee8d1cSJulian Grajkowski 	   will be set to QAT */
42278ee8d1cSJulian Grajkowski 	Lac_MemPoolInitSymCookiesPhyAddr(pCryptoService->lac_sym_cookie_pool);
42378ee8d1cSJulian Grajkowski 
42478ee8d1cSJulian Grajkowski 	/* Clear stats */
42578ee8d1cSJulian Grajkowski 	/* Clears Key stats and allocate memory of SSL and TLS labels
42678ee8d1cSJulian Grajkowski 	    These labels are initialised to standard values */
42778ee8d1cSJulian Grajkowski 	status = LacSymKey_Init(pCryptoService);
42878ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
42978ee8d1cSJulian Grajkowski 
43078ee8d1cSJulian Grajkowski 	/* Initialises the hash lookup table*/
43178ee8d1cSJulian Grajkowski 	status = LacSymQat_Init(pCryptoService);
43278ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
43378ee8d1cSJulian Grajkowski 
43478ee8d1cSJulian Grajkowski 	/* Fills out content descriptor for precomputes and registers the
43578ee8d1cSJulian Grajkowski 	   hash precompute callback */
43678ee8d1cSJulian Grajkowski 	status = LacSymHash_HmacPrecompInit(pCryptoService);
43778ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
43878ee8d1cSJulian Grajkowski 
43978ee8d1cSJulian Grajkowski 	/* Init the Sym stats */
44078ee8d1cSJulian Grajkowski 	status = LacSym_StatsInit(pCryptoService);
44178ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS_SYM_INIT(status);
44278ee8d1cSJulian Grajkowski 
44378ee8d1cSJulian Grajkowski 	return status;
44478ee8d1cSJulian Grajkowski }
44578ee8d1cSJulian Grajkowski 
44678ee8d1cSJulian Grajkowski static void
SalCtrl_DebugShutdown(icp_accel_dev_t * device,sal_service_t * service)44778ee8d1cSJulian Grajkowski SalCtrl_DebugShutdown(icp_accel_dev_t *device, sal_service_t *service)
44878ee8d1cSJulian Grajkowski {
44978ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
45078ee8d1cSJulian Grajkowski 	sal_statistics_collection_t *pStatsCollection =
45178ee8d1cSJulian Grajkowski 	    (sal_statistics_collection_t *)device->pQatStats;
45278ee8d1cSJulian Grajkowski 
45378ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pStatsCollection->bStatsEnabled) {
45478ee8d1cSJulian Grajkowski 		/* Clean stats */
45578ee8d1cSJulian Grajkowski 		if (NULL != pCryptoService->debug_file) {
45678ee8d1cSJulian Grajkowski 			icp_adf_debugRemoveFile(pCryptoService->debug_file);
45778ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCryptoService->debug_file->name);
45878ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCryptoService->debug_file);
45978ee8d1cSJulian Grajkowski 			pCryptoService->debug_file = NULL;
46078ee8d1cSJulian Grajkowski 		}
46178ee8d1cSJulian Grajkowski 	}
46278ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.stats = NULL;
46378ee8d1cSJulian Grajkowski }
46478ee8d1cSJulian Grajkowski 
46578ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_DebugInit(icp_accel_dev_t * device,sal_service_t * service)46678ee8d1cSJulian Grajkowski SalCtrl_DebugInit(icp_accel_dev_t *device, sal_service_t *service)
46778ee8d1cSJulian Grajkowski {
46878ee8d1cSJulian Grajkowski 	char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
46978ee8d1cSJulian Grajkowski 	char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
47078ee8d1cSJulian Grajkowski 	char *instance_name = NULL;
47178ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
47278ee8d1cSJulian Grajkowski 	sal_statistics_collection_t *pStatsCollection =
47378ee8d1cSJulian Grajkowski 	    (sal_statistics_collection_t *)device->pQatStats;
47478ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
47578ee8d1cSJulian Grajkowski 	char *section = DYN_SEC;
47678ee8d1cSJulian Grajkowski 
47778ee8d1cSJulian Grajkowski 	/*Instance may not in the DYN section*/
47878ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) {
47978ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
48078ee8d1cSJulian Grajkowski 	}
48178ee8d1cSJulian Grajkowski 
48278ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pStatsCollection->bStatsEnabled) {
48378ee8d1cSJulian Grajkowski 		/* Get instance name for stats */
48478ee8d1cSJulian Grajkowski 		instance_name = LAC_OS_MALLOC(ADF_CFG_MAX_VAL_LEN_IN_BYTES);
48578ee8d1cSJulian Grajkowski 		if (NULL == instance_name) {
48678ee8d1cSJulian Grajkowski 			return CPA_STATUS_RESOURCE;
48778ee8d1cSJulian Grajkowski 		}
48878ee8d1cSJulian Grajkowski 
48978ee8d1cSJulian Grajkowski 		status = Sal_StringParsing(
49078ee8d1cSJulian Grajkowski 		    "Cy",
49178ee8d1cSJulian Grajkowski 		    pCryptoService->generic_service_info.instance,
49278ee8d1cSJulian Grajkowski 		    "Name",
49378ee8d1cSJulian Grajkowski 		    temp_string);
49478ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
49578ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
49678ee8d1cSJulian Grajkowski 			return status;
49778ee8d1cSJulian Grajkowski 		}
49878ee8d1cSJulian Grajkowski 		status = icp_adf_cfgGetParamValue(device,
49978ee8d1cSJulian Grajkowski 						  section,
50078ee8d1cSJulian Grajkowski 						  temp_string,
50178ee8d1cSJulian Grajkowski 						  adfGetParam);
50278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
50378ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
50478ee8d1cSJulian Grajkowski 			    "Failed to get %s from configuration file\n",
50578ee8d1cSJulian Grajkowski 			    temp_string);
50678ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
50778ee8d1cSJulian Grajkowski 			return status;
50878ee8d1cSJulian Grajkowski 		}
50978ee8d1cSJulian Grajkowski 		snprintf(instance_name,
51078ee8d1cSJulian Grajkowski 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
51178ee8d1cSJulian Grajkowski 			 "%s",
51278ee8d1cSJulian Grajkowski 			 adfGetParam);
51378ee8d1cSJulian Grajkowski 
51478ee8d1cSJulian Grajkowski 		pCryptoService->debug_file =
51578ee8d1cSJulian Grajkowski 		    LAC_OS_MALLOC(sizeof(debug_file_info_t));
51678ee8d1cSJulian Grajkowski 		if (NULL == pCryptoService->debug_file) {
51778ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
51878ee8d1cSJulian Grajkowski 			return CPA_STATUS_RESOURCE;
51978ee8d1cSJulian Grajkowski 		}
52078ee8d1cSJulian Grajkowski 
52178ee8d1cSJulian Grajkowski 		memset(pCryptoService->debug_file,
52278ee8d1cSJulian Grajkowski 		       0,
52378ee8d1cSJulian Grajkowski 		       sizeof(debug_file_info_t));
52478ee8d1cSJulian Grajkowski 		pCryptoService->debug_file->name = instance_name;
52578ee8d1cSJulian Grajkowski 		pCryptoService->debug_file->seq_read = SalCtrl_CryptoDebug;
52678ee8d1cSJulian Grajkowski 		pCryptoService->debug_file->private_data = pCryptoService;
52778ee8d1cSJulian Grajkowski 		pCryptoService->debug_file->parent =
52878ee8d1cSJulian Grajkowski 		    pCryptoService->generic_service_info.debug_parent_dir;
52978ee8d1cSJulian Grajkowski 
53078ee8d1cSJulian Grajkowski 		status =
53178ee8d1cSJulian Grajkowski 		    icp_adf_debugAddFile(device, pCryptoService->debug_file);
53278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
53378ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
53478ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCryptoService->debug_file);
53578ee8d1cSJulian Grajkowski 			return status;
53678ee8d1cSJulian Grajkowski 		}
53778ee8d1cSJulian Grajkowski 	}
53878ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.stats = pStatsCollection;
53978ee8d1cSJulian Grajkowski 
54078ee8d1cSJulian Grajkowski 	return status;
54178ee8d1cSJulian Grajkowski }
54278ee8d1cSJulian Grajkowski 
54378ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_GetBankNum(icp_accel_dev_t * device,Cpa32U inst,char * section,char * bank_name,Cpa16U * bank)544a977168cSMichal Gulbicki SalCtrl_GetBankNum(icp_accel_dev_t *device,
545a977168cSMichal Gulbicki 		   Cpa32U inst,
546a977168cSMichal Gulbicki 		   char *section,
547a977168cSMichal Gulbicki 		   char *bank_name,
548a977168cSMichal Gulbicki 		   Cpa16U *bank)
549a977168cSMichal Gulbicki {
550a977168cSMichal Gulbicki 	char adfParamValue[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
551a977168cSMichal Gulbicki 	char adfParamName[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
552a977168cSMichal Gulbicki 	CpaStatus status = CPA_STATUS_SUCCESS;
553a977168cSMichal Gulbicki 
554a977168cSMichal Gulbicki 	status = Sal_StringParsing("Cy", inst, bank_name, adfParamName);
555a977168cSMichal Gulbicki 	LAC_CHECK_STATUS(status);
556a977168cSMichal Gulbicki 	status = icp_adf_cfgGetParamValue(device,
557a977168cSMichal Gulbicki 					  section,
558a977168cSMichal Gulbicki 					  adfParamName,
559a977168cSMichal Gulbicki 					  adfParamValue);
560a977168cSMichal Gulbicki 	if (CPA_STATUS_SUCCESS != status) {
561a977168cSMichal Gulbicki 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
562a977168cSMichal Gulbicki 			      adfParamName);
563a977168cSMichal Gulbicki 		return status;
564a977168cSMichal Gulbicki 	}
565a977168cSMichal Gulbicki 	*bank = (Cpa16U)Sal_Strtoul(adfParamValue, NULL, SAL_CFG_BASE_DEC);
566a977168cSMichal Gulbicki 	return status;
567a977168cSMichal Gulbicki }
568a977168cSMichal Gulbicki 
569a977168cSMichal Gulbicki static CpaStatus
SalCtr_InstInit(icp_accel_dev_t * device,sal_service_t * service)57078ee8d1cSJulian Grajkowski SalCtr_InstInit(icp_accel_dev_t *device, sal_service_t *service)
57178ee8d1cSJulian Grajkowski {
57278ee8d1cSJulian Grajkowski 	char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
57378ee8d1cSJulian Grajkowski 	char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
57478ee8d1cSJulian Grajkowski 	char temp_string2[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
57578ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
57678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
57778ee8d1cSJulian Grajkowski 	char *section = DYN_SEC;
57878ee8d1cSJulian Grajkowski 
57978ee8d1cSJulian Grajkowski 	/*Instance may not in the DYN section*/
58078ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) {
58178ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
58278ee8d1cSJulian Grajkowski 	}
58378ee8d1cSJulian Grajkowski 
58478ee8d1cSJulian Grajkowski 
58578ee8d1cSJulian Grajkowski 	/* Get Config Info: Accel Num, bank Num, packageID,
58678ee8d1cSJulian Grajkowski 				coreAffinity, nodeAffinity and response mode */
58778ee8d1cSJulian Grajkowski 
58878ee8d1cSJulian Grajkowski 	pCryptoService->acceleratorNum = 0;
58978ee8d1cSJulian Grajkowski 
590a977168cSMichal Gulbicki 	/* Gen4, a bank only has 2 rings (1 ring pair), only one type of service
591a977168cSMichal Gulbicki 	   can be assigned one time. asym and sym will be in different bank*/
592a977168cSMichal Gulbicki 	if (isCyGen4x(pCryptoService)) {
593a977168cSMichal Gulbicki 		switch (service->type) {
594a977168cSMichal Gulbicki 		case SAL_SERVICE_TYPE_CRYPTO_ASYM:
595a977168cSMichal Gulbicki 			status = SalCtrl_GetBankNum(
596a977168cSMichal Gulbicki 			    device,
59778ee8d1cSJulian Grajkowski 			    pCryptoService->generic_service_info.instance,
598a977168cSMichal Gulbicki 			    section,
599a977168cSMichal Gulbicki 			    "BankNumberAsym",
600a977168cSMichal Gulbicki 			    &pCryptoService->bankNumAsym);
601a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status)
60278ee8d1cSJulian Grajkowski 				return status;
603a977168cSMichal Gulbicki 			break;
604a977168cSMichal Gulbicki 		case SAL_SERVICE_TYPE_CRYPTO_SYM:
605a977168cSMichal Gulbicki 			status = SalCtrl_GetBankNum(
606a977168cSMichal Gulbicki 			    device,
607a977168cSMichal Gulbicki 			    pCryptoService->generic_service_info.instance,
608a977168cSMichal Gulbicki 			    section,
609a977168cSMichal Gulbicki 			    "BankNumberSym",
610a977168cSMichal Gulbicki 			    &pCryptoService->bankNumSym);
611a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status)
612a977168cSMichal Gulbicki 				return status;
613a977168cSMichal Gulbicki 			break;
614a977168cSMichal Gulbicki 		case SAL_SERVICE_TYPE_CRYPTO:
615a977168cSMichal Gulbicki 			status = SalCtrl_GetBankNum(
616a977168cSMichal Gulbicki 			    device,
617a977168cSMichal Gulbicki 			    pCryptoService->generic_service_info.instance,
618a977168cSMichal Gulbicki 			    section,
619a977168cSMichal Gulbicki 			    "BankNumberAsym",
620a977168cSMichal Gulbicki 			    &pCryptoService->bankNumAsym);
621a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status)
622a977168cSMichal Gulbicki 				return status;
623a977168cSMichal Gulbicki 			status = SalCtrl_GetBankNum(
624a977168cSMichal Gulbicki 			    device,
625a977168cSMichal Gulbicki 			    pCryptoService->generic_service_info.instance,
626a977168cSMichal Gulbicki 			    section,
627a977168cSMichal Gulbicki 			    "BankNumberSym",
628a977168cSMichal Gulbicki 			    &pCryptoService->bankNumSym);
629a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status)
630a977168cSMichal Gulbicki 				return status;
631a977168cSMichal Gulbicki 			break;
632a977168cSMichal Gulbicki 		default:
633a977168cSMichal Gulbicki 			return CPA_STATUS_FAIL;
63478ee8d1cSJulian Grajkowski 		}
635a977168cSMichal Gulbicki 	} else {
636a977168cSMichal Gulbicki 		status = SalCtrl_GetBankNum(
637a977168cSMichal Gulbicki 		    device,
638a977168cSMichal Gulbicki 		    pCryptoService->generic_service_info.instance,
639a977168cSMichal Gulbicki 		    section,
640a977168cSMichal Gulbicki 		    "BankNumber",
641a977168cSMichal Gulbicki 		    &pCryptoService->bankNumSym);
642a977168cSMichal Gulbicki 		if (CPA_STATUS_SUCCESS != status)
643a977168cSMichal Gulbicki 			return status;
644a977168cSMichal Gulbicki 		pCryptoService->bankNumAsym = pCryptoService->bankNumSym;
645a977168cSMichal Gulbicki 	}
64678ee8d1cSJulian Grajkowski 
64778ee8d1cSJulian Grajkowski 	status =
64878ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
64978ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
65078ee8d1cSJulian Grajkowski 			      "IsPolled",
65178ee8d1cSJulian Grajkowski 			      temp_string);
65278ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
65378ee8d1cSJulian Grajkowski 	status =
65478ee8d1cSJulian Grajkowski 	    icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
65578ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
65678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
65778ee8d1cSJulian Grajkowski 			      temp_string);
65878ee8d1cSJulian Grajkowski 		return status;
65978ee8d1cSJulian Grajkowski 	}
66078ee8d1cSJulian Grajkowski 	pCryptoService->isPolled =
66178ee8d1cSJulian Grajkowski 	    (Cpa8U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
66278ee8d1cSJulian Grajkowski 
66378ee8d1cSJulian Grajkowski 	/* Kernel instances do not support epoll mode */
66478ee8d1cSJulian Grajkowski 	if (SAL_RESP_EPOLL_CFG_FILE == pCryptoService->isPolled) {
66578ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
66678ee8d1cSJulian Grajkowski 		    "IsPolled %u is not supported for kernel instance %s",
66778ee8d1cSJulian Grajkowski 		    pCryptoService->isPolled,
66878ee8d1cSJulian Grajkowski 		    temp_string);
66978ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
67078ee8d1cSJulian Grajkowski 	}
67178ee8d1cSJulian Grajkowski 
67278ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
67378ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
67478ee8d1cSJulian Grajkowski 					  ADF_DEV_PKG_ID,
67578ee8d1cSJulian Grajkowski 					  adfGetParam);
67678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
67778ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
67878ee8d1cSJulian Grajkowski 			      ADF_DEV_PKG_ID);
67978ee8d1cSJulian Grajkowski 		return status;
68078ee8d1cSJulian Grajkowski 	}
68178ee8d1cSJulian Grajkowski 	pCryptoService->pkgID =
68278ee8d1cSJulian Grajkowski 	    (Cpa16U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
68378ee8d1cSJulian Grajkowski 
68478ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
68578ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
68678ee8d1cSJulian Grajkowski 					  ADF_DEV_NODE_ID,
68778ee8d1cSJulian Grajkowski 					  adfGetParam);
68878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
68978ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
69078ee8d1cSJulian Grajkowski 			      ADF_DEV_NODE_ID);
69178ee8d1cSJulian Grajkowski 		return status;
69278ee8d1cSJulian Grajkowski 	}
69378ee8d1cSJulian Grajkowski 	pCryptoService->nodeAffinity =
69478ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
69578ee8d1cSJulian Grajkowski 	/* In case of interrupt instance, use the bank affinity set by adf_ctl
69678ee8d1cSJulian Grajkowski 	 * Otherwise, use the instance affinity for backwards compatibility */
69778ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE != pCryptoService->isPolled) {
69878ee8d1cSJulian Grajkowski 		/* Next need to read the [AcceleratorX] section of the config
69978ee8d1cSJulian Grajkowski 		 * file */
70078ee8d1cSJulian Grajkowski 		status = Sal_StringParsing("Accelerator",
70178ee8d1cSJulian Grajkowski 					   pCryptoService->acceleratorNum,
70278ee8d1cSJulian Grajkowski 					   "",
70378ee8d1cSJulian Grajkowski 					   temp_string2);
70478ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
705a977168cSMichal Gulbicki 		if (service->type == SAL_SERVICE_TYPE_CRYPTO_ASYM)
70678ee8d1cSJulian Grajkowski 			status = Sal_StringParsing("Bank",
707a977168cSMichal Gulbicki 						   pCryptoService->bankNumAsym,
708a977168cSMichal Gulbicki 						   "CoreAffinity",
709a977168cSMichal Gulbicki 						   temp_string);
710a977168cSMichal Gulbicki 		else
711a977168cSMichal Gulbicki 			/* For cy service, asym bank and sym bank will set the
712a977168cSMichal Gulbicki 			   same core affinity. So Just read one*/
713a977168cSMichal Gulbicki 			status = Sal_StringParsing("Bank",
714a977168cSMichal Gulbicki 						   pCryptoService->bankNumSym,
71578ee8d1cSJulian Grajkowski 						   "CoreAffinity",
71678ee8d1cSJulian Grajkowski 						   temp_string);
71778ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
71878ee8d1cSJulian Grajkowski 	} else {
71978ee8d1cSJulian Grajkowski 		strncpy(temp_string2, section, (strlen(section) + 1));
72078ee8d1cSJulian Grajkowski 		status = Sal_StringParsing(
72178ee8d1cSJulian Grajkowski 		    "Cy",
72278ee8d1cSJulian Grajkowski 		    pCryptoService->generic_service_info.instance,
72378ee8d1cSJulian Grajkowski 		    "CoreAffinity",
72478ee8d1cSJulian Grajkowski 		    temp_string);
72578ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
72678ee8d1cSJulian Grajkowski 	}
72778ee8d1cSJulian Grajkowski 
72878ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
72978ee8d1cSJulian Grajkowski 					  temp_string2,
73078ee8d1cSJulian Grajkowski 					  temp_string,
73178ee8d1cSJulian Grajkowski 					  adfGetParam);
73278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
73378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration file\n",
73478ee8d1cSJulian Grajkowski 			      temp_string);
73578ee8d1cSJulian Grajkowski 		return status;
73678ee8d1cSJulian Grajkowski 	}
73778ee8d1cSJulian Grajkowski 	pCryptoService->coreAffinity =
73878ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
73978ee8d1cSJulian Grajkowski 
74078ee8d1cSJulian Grajkowski 	/*No Execution Engine in DH895xcc, so make sure it is zero*/
74178ee8d1cSJulian Grajkowski 	pCryptoService->executionEngine = 0;
74278ee8d1cSJulian Grajkowski 
74378ee8d1cSJulian Grajkowski 	return status;
74478ee8d1cSJulian Grajkowski }
74578ee8d1cSJulian Grajkowski 
74678ee8d1cSJulian Grajkowski /* This function:
74778ee8d1cSJulian Grajkowski  * 1. Creates sym and asym transport handles
74878ee8d1cSJulian Grajkowski  * 2. Allocates memory pools required by sym and asym services
74978ee8d1cSJulian Grajkowski .* 3. Clears the sym and asym stats counters
75078ee8d1cSJulian Grajkowski  * 4. In case service asym or sym is enabled then this function
75178ee8d1cSJulian Grajkowski  *    only allocates resources for these services. i.e if the
75278ee8d1cSJulian Grajkowski  *    service asym is enabled then only asym transport handles
75378ee8d1cSJulian Grajkowski  *    are created and vice versa.
75478ee8d1cSJulian Grajkowski  */
75578ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CryptoInit(icp_accel_dev_t * device,sal_service_t * service)75678ee8d1cSJulian Grajkowski SalCtrl_CryptoInit(icp_accel_dev_t *device, sal_service_t *service)
75778ee8d1cSJulian Grajkowski {
75878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
75978ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
76078ee8d1cSJulian Grajkowski 	sal_service_type_t svc_type = service->type;
76178ee8d1cSJulian Grajkowski 
76278ee8d1cSJulian Grajkowski 	SAL_SERVICE_GOOD_FOR_INIT(pCryptoService);
76378ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.state =
76478ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_INITIALIZING;
76578ee8d1cSJulian Grajkowski 
76678ee8d1cSJulian Grajkowski 	/* Set up the instance parameters such as bank number,
76778ee8d1cSJulian Grajkowski 	 * coreAffinity, pkgId and node affinity etc
76878ee8d1cSJulian Grajkowski 	 */
76978ee8d1cSJulian Grajkowski 	status = SalCtr_InstInit(device, service);
77078ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
77178ee8d1cSJulian Grajkowski 	/* Create debug directory for service */
77278ee8d1cSJulian Grajkowski 	status = SalCtrl_DebugInit(device, service);
77378ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
77478ee8d1cSJulian Grajkowski 
77578ee8d1cSJulian Grajkowski 	switch (svc_type) {
77678ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_ASYM:
77778ee8d1cSJulian Grajkowski 		break;
77878ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_SYM:
77978ee8d1cSJulian Grajkowski 		status = SalCtrl_SymInit(device, service);
78078ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
78178ee8d1cSJulian Grajkowski 			SalCtrl_DebugShutdown(device, service);
78278ee8d1cSJulian Grajkowski 			return status;
78378ee8d1cSJulian Grajkowski 		}
78478ee8d1cSJulian Grajkowski 		break;
78578ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO:
78678ee8d1cSJulian Grajkowski 		status = SalCtrl_SymInit(device, service);
78778ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
78878ee8d1cSJulian Grajkowski 			SalCtrl_DebugShutdown(device, service);
78978ee8d1cSJulian Grajkowski 			return status;
79078ee8d1cSJulian Grajkowski 		}
79178ee8d1cSJulian Grajkowski 		break;
79278ee8d1cSJulian Grajkowski 	default:
79378ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Invalid service type\n");
79478ee8d1cSJulian Grajkowski 		status = CPA_STATUS_FAIL;
79578ee8d1cSJulian Grajkowski 		break;
79678ee8d1cSJulian Grajkowski 	}
79778ee8d1cSJulian Grajkowski 
79878ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.state =
79978ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_INITIALIZED;
80078ee8d1cSJulian Grajkowski 
80178ee8d1cSJulian Grajkowski 	return status;
80278ee8d1cSJulian Grajkowski }
80378ee8d1cSJulian Grajkowski 
80478ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CryptoStart(icp_accel_dev_t * device,sal_service_t * service)80578ee8d1cSJulian Grajkowski SalCtrl_CryptoStart(icp_accel_dev_t *device, sal_service_t *service)
80678ee8d1cSJulian Grajkowski {
80778ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
80878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
80978ee8d1cSJulian Grajkowski 
81078ee8d1cSJulian Grajkowski 	if (pCryptoService->generic_service_info.state !=
81178ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_INITIALIZED) {
81278ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Not in the correct state to call start\n");
81378ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
81478ee8d1cSJulian Grajkowski 	}
81578ee8d1cSJulian Grajkowski 
81678ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.state = SAL_SERVICE_STATE_RUNNING;
81778ee8d1cSJulian Grajkowski 	return status;
81878ee8d1cSJulian Grajkowski }
81978ee8d1cSJulian Grajkowski 
82078ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CryptoStop(icp_accel_dev_t * device,sal_service_t * service)82178ee8d1cSJulian Grajkowski SalCtrl_CryptoStop(icp_accel_dev_t *device, sal_service_t *service)
82278ee8d1cSJulian Grajkowski {
82378ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
82478ee8d1cSJulian Grajkowski 
82578ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_STATE_RUNNING !=
82678ee8d1cSJulian Grajkowski 	    pCryptoService->generic_service_info.state) {
82778ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Not in the correct state to call stop");
82878ee8d1cSJulian Grajkowski 	}
82978ee8d1cSJulian Grajkowski 
83078ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.state =
83178ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_SHUTTING_DOWN;
83278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
83378ee8d1cSJulian Grajkowski }
83478ee8d1cSJulian Grajkowski 
83578ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CryptoShutdown(icp_accel_dev_t * device,sal_service_t * service)83678ee8d1cSJulian Grajkowski SalCtrl_CryptoShutdown(icp_accel_dev_t *device, sal_service_t *service)
83778ee8d1cSJulian Grajkowski {
83878ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service;
83978ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
84078ee8d1cSJulian Grajkowski 	sal_service_type_t svc_type = service->type;
84178ee8d1cSJulian Grajkowski 
84278ee8d1cSJulian Grajkowski 	if ((SAL_SERVICE_STATE_INITIALIZED !=
84378ee8d1cSJulian Grajkowski 	     pCryptoService->generic_service_info.state) &&
84478ee8d1cSJulian Grajkowski 	    (SAL_SERVICE_STATE_SHUTTING_DOWN !=
84578ee8d1cSJulian Grajkowski 	     pCryptoService->generic_service_info.state)) {
84678ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Not in the correct state to call shutdown \n");
84778ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
84878ee8d1cSJulian Grajkowski 	}
84978ee8d1cSJulian Grajkowski 
85078ee8d1cSJulian Grajkowski 
85178ee8d1cSJulian Grajkowski 	/* Free memory and transhandles */
85278ee8d1cSJulian Grajkowski 	switch (svc_type) {
85378ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_ASYM:
85478ee8d1cSJulian Grajkowski 		break;
85578ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_SYM:
85678ee8d1cSJulian Grajkowski 		if (SalCtrl_SymFreeResources(pCryptoService)) {
85778ee8d1cSJulian Grajkowski 			status = CPA_STATUS_FAIL;
85878ee8d1cSJulian Grajkowski 		}
85978ee8d1cSJulian Grajkowski 		break;
86078ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO:
86178ee8d1cSJulian Grajkowski 		if (SalCtrl_SymFreeResources(pCryptoService)) {
86278ee8d1cSJulian Grajkowski 			status = CPA_STATUS_FAIL;
86378ee8d1cSJulian Grajkowski 		}
86478ee8d1cSJulian Grajkowski 		break;
86578ee8d1cSJulian Grajkowski 	default:
86678ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Invalid service type\n");
86778ee8d1cSJulian Grajkowski 		status = CPA_STATUS_FAIL;
86878ee8d1cSJulian Grajkowski 		break;
86978ee8d1cSJulian Grajkowski 	}
87078ee8d1cSJulian Grajkowski 
87178ee8d1cSJulian Grajkowski 	SalCtrl_DebugShutdown(device, service);
87278ee8d1cSJulian Grajkowski 
87378ee8d1cSJulian Grajkowski 	pCryptoService->generic_service_info.state = SAL_SERVICE_STATE_SHUTDOWN;
87478ee8d1cSJulian Grajkowski 
87578ee8d1cSJulian Grajkowski 	return status;
87678ee8d1cSJulian Grajkowski }
87778ee8d1cSJulian Grajkowski 
87878ee8d1cSJulian Grajkowski /**
87978ee8d1cSJulian Grajkowski  ******************************************************************************
88078ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
88178ee8d1cSJulian Grajkowski  *****************************************************************************/
88278ee8d1cSJulian Grajkowski CpaStatus
cpaCyGetStatusText(const CpaInstanceHandle instanceHandle,CpaStatus errStatus,Cpa8S * pStatusText)88378ee8d1cSJulian Grajkowski cpaCyGetStatusText(const CpaInstanceHandle instanceHandle,
88478ee8d1cSJulian Grajkowski 		   CpaStatus errStatus,
88578ee8d1cSJulian Grajkowski 		   Cpa8S *pStatusText)
88678ee8d1cSJulian Grajkowski {
88778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
88878ee8d1cSJulian Grajkowski 
88978ee8d1cSJulian Grajkowski 
89078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pStatusText);
89178ee8d1cSJulian Grajkowski 
89278ee8d1cSJulian Grajkowski 	switch (errStatus) {
89378ee8d1cSJulian Grajkowski 	case CPA_STATUS_SUCCESS:
89478ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_SUCCESS);
89578ee8d1cSJulian Grajkowski 		break;
89678ee8d1cSJulian Grajkowski 	case CPA_STATUS_FAIL:
89778ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FAIL);
89878ee8d1cSJulian Grajkowski 		break;
89978ee8d1cSJulian Grajkowski 	case CPA_STATUS_RETRY:
90078ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RETRY);
90178ee8d1cSJulian Grajkowski 		break;
90278ee8d1cSJulian Grajkowski 	case CPA_STATUS_RESOURCE:
90378ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RESOURCE);
90478ee8d1cSJulian Grajkowski 		break;
90578ee8d1cSJulian Grajkowski 	case CPA_STATUS_INVALID_PARAM:
90678ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_INVALID_PARAM);
90778ee8d1cSJulian Grajkowski 		break;
90878ee8d1cSJulian Grajkowski 	case CPA_STATUS_FATAL:
90978ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FATAL);
91078ee8d1cSJulian Grajkowski 		break;
911a977168cSMichal Gulbicki 	case CPA_STATUS_UNSUPPORTED:
912a977168cSMichal Gulbicki 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_UNSUPPORTED);
913a977168cSMichal Gulbicki 		break;
91478ee8d1cSJulian Grajkowski 	default:
91578ee8d1cSJulian Grajkowski 		status = CPA_STATUS_INVALID_PARAM;
91678ee8d1cSJulian Grajkowski 		break;
91778ee8d1cSJulian Grajkowski 	}
91878ee8d1cSJulian Grajkowski 	return status;
91978ee8d1cSJulian Grajkowski }
92078ee8d1cSJulian Grajkowski 
92178ee8d1cSJulian Grajkowski void
SalCtrl_CyQueryCapabilities(sal_service_t * pGenericService,CpaCyCapabilitiesInfo * pCapInfo)92278ee8d1cSJulian Grajkowski SalCtrl_CyQueryCapabilities(sal_service_t *pGenericService,
92378ee8d1cSJulian Grajkowski 			    CpaCyCapabilitiesInfo *pCapInfo)
92478ee8d1cSJulian Grajkowski {
92578ee8d1cSJulian Grajkowski 	memset(pCapInfo, 0, sizeof(CpaCyCapabilitiesInfo));
92678ee8d1cSJulian Grajkowski 
92778ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_TYPE_CRYPTO == pGenericService->type ||
92878ee8d1cSJulian Grajkowski 	    SAL_SERVICE_TYPE_CRYPTO_SYM == pGenericService->type) {
92978ee8d1cSJulian Grajkowski 		pCapInfo->symSupported = CPA_TRUE;
93078ee8d1cSJulian Grajkowski 		if (pGenericService->capabilitiesMask &
93178ee8d1cSJulian Grajkowski 		    ICP_ACCEL_CAPABILITIES_EXT_ALGCHAIN) {
93278ee8d1cSJulian Grajkowski 			pCapInfo->extAlgchainSupported = CPA_TRUE;
93378ee8d1cSJulian Grajkowski 		}
93478ee8d1cSJulian Grajkowski 
93578ee8d1cSJulian Grajkowski 		if (pGenericService->capabilitiesMask &
93678ee8d1cSJulian Grajkowski 		    ICP_ACCEL_CAPABILITIES_HKDF) {
93778ee8d1cSJulian Grajkowski 			pCapInfo->hkdfSupported = CPA_TRUE;
93878ee8d1cSJulian Grajkowski 		}
93978ee8d1cSJulian Grajkowski 	}
94078ee8d1cSJulian Grajkowski 
94178ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask &
94278ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_ECEDMONT) {
94378ee8d1cSJulian Grajkowski 		pCapInfo->ecEdMontSupported = CPA_TRUE;
94478ee8d1cSJulian Grajkowski 	}
94578ee8d1cSJulian Grajkowski 
94678ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask &
94778ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_RANDOM_NUMBER) {
94878ee8d1cSJulian Grajkowski 		pCapInfo->nrbgSupported = CPA_TRUE;
94978ee8d1cSJulian Grajkowski 	}
95078ee8d1cSJulian Grajkowski 
95178ee8d1cSJulian Grajkowski 	pCapInfo->drbgSupported = CPA_FALSE;
95278ee8d1cSJulian Grajkowski 	pCapInfo->randSupported = CPA_FALSE;
95378ee8d1cSJulian Grajkowski 	pCapInfo->nrbgSupported = CPA_FALSE;
95478ee8d1cSJulian Grajkowski }
95578ee8d1cSJulian Grajkowski 
95678ee8d1cSJulian Grajkowski /**
95778ee8d1cSJulian Grajkowski  ******************************************************************************
95878ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
95978ee8d1cSJulian Grajkowski  *****************************************************************************/
96078ee8d1cSJulian Grajkowski CpaStatus
cpaCyStartInstance(CpaInstanceHandle instanceHandle_in)96178ee8d1cSJulian Grajkowski cpaCyStartInstance(CpaInstanceHandle instanceHandle_in)
96278ee8d1cSJulian Grajkowski {
96378ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
96478ee8d1cSJulian Grajkowski /* Structure initializer is supported by C99, but it is
96578ee8d1cSJulian Grajkowski  * not supported by some former Intel compilers.
96678ee8d1cSJulian Grajkowski  */
96778ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info = { 0 };
96878ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
96978ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
97078ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pService = NULL;
97178ee8d1cSJulian Grajkowski 
97278ee8d1cSJulian Grajkowski 
97378ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
97478ee8d1cSJulian Grajkowski 		instanceHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO);
97578ee8d1cSJulian Grajkowski 		if (!instanceHandle) {
97678ee8d1cSJulian Grajkowski 			instanceHandle =
97778ee8d1cSJulian Grajkowski 			    Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM);
97878ee8d1cSJulian Grajkowski 		}
97978ee8d1cSJulian Grajkowski 	} else {
98078ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
98178ee8d1cSJulian Grajkowski 	}
98278ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
983a977168cSMichal Gulbicki 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
984a977168cSMichal Gulbicki 				(SAL_SERVICE_TYPE_CRYPTO |
985a977168cSMichal Gulbicki 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
986a977168cSMichal Gulbicki 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
98778ee8d1cSJulian Grajkowski 
98878ee8d1cSJulian Grajkowski 	pService = (sal_crypto_service_t *)instanceHandle;
98978ee8d1cSJulian Grajkowski 
99078ee8d1cSJulian Grajkowski 	status = cpaCyInstanceGetInfo2(instanceHandle, &info);
99178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
99278ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Can not get instance info\n");
99378ee8d1cSJulian Grajkowski 		return status;
99478ee8d1cSJulian Grajkowski 	}
99578ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
99678ee8d1cSJulian Grajkowski 	if (NULL == dev) {
99778ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Can not find device for the instance\n");
99878ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
99978ee8d1cSJulian Grajkowski 	}
100078ee8d1cSJulian Grajkowski 
100178ee8d1cSJulian Grajkowski 	pService->generic_service_info.isInstanceStarted = CPA_TRUE;
100278ee8d1cSJulian Grajkowski 
100378ee8d1cSJulian Grajkowski 	/* Increment dev ref counter */
100478ee8d1cSJulian Grajkowski 	icp_qa_dev_get(dev);
100578ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
100678ee8d1cSJulian Grajkowski }
100778ee8d1cSJulian Grajkowski 
100878ee8d1cSJulian Grajkowski /**
100978ee8d1cSJulian Grajkowski  ******************************************************************************
101078ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
101178ee8d1cSJulian Grajkowski  *****************************************************************************/
101278ee8d1cSJulian Grajkowski CpaStatus
cpaCyStopInstance(CpaInstanceHandle instanceHandle_in)101378ee8d1cSJulian Grajkowski cpaCyStopInstance(CpaInstanceHandle instanceHandle_in)
101478ee8d1cSJulian Grajkowski {
101578ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
101678ee8d1cSJulian Grajkowski /* Structure initializer is supported by C99, but it is
101778ee8d1cSJulian Grajkowski  * not supported by some former Intel compilers.
101878ee8d1cSJulian Grajkowski  */
101978ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info = { 0 };
102078ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
102178ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
102278ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pService = NULL;
102378ee8d1cSJulian Grajkowski 
102478ee8d1cSJulian Grajkowski 
102578ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
102678ee8d1cSJulian Grajkowski 		instanceHandle = Lac_CryptoGetFirstHandle();
102778ee8d1cSJulian Grajkowski 	} else {
102878ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
102978ee8d1cSJulian Grajkowski 	}
103078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
1031a977168cSMichal Gulbicki 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
1032a977168cSMichal Gulbicki 				(SAL_SERVICE_TYPE_CRYPTO |
1033a977168cSMichal Gulbicki 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
1034a977168cSMichal Gulbicki 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
103578ee8d1cSJulian Grajkowski 
103678ee8d1cSJulian Grajkowski 	status = cpaCyInstanceGetInfo2(instanceHandle, &info);
103778ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
103878ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Can not get instance info\n");
103978ee8d1cSJulian Grajkowski 		return status;
104078ee8d1cSJulian Grajkowski 	}
104178ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
104278ee8d1cSJulian Grajkowski 	if (NULL == dev) {
104378ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Can not find device for the instance\n");
104478ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
104578ee8d1cSJulian Grajkowski 	}
104678ee8d1cSJulian Grajkowski 
104778ee8d1cSJulian Grajkowski 	pService = (sal_crypto_service_t *)instanceHandle;
104878ee8d1cSJulian Grajkowski 
104978ee8d1cSJulian Grajkowski 	pService->generic_service_info.isInstanceStarted = CPA_FALSE;
105078ee8d1cSJulian Grajkowski 
105178ee8d1cSJulian Grajkowski 	/* Decrement dev ref counter */
105278ee8d1cSJulian Grajkowski 	icp_qa_dev_put(dev);
105378ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
105478ee8d1cSJulian Grajkowski }
105578ee8d1cSJulian Grajkowski 
105678ee8d1cSJulian Grajkowski /**
105778ee8d1cSJulian Grajkowski  ******************************************************************************
105878ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
105978ee8d1cSJulian Grajkowski  *****************************************************************************/
106078ee8d1cSJulian Grajkowski CpaStatus
cpaCyInstanceSetNotificationCb(const CpaInstanceHandle instanceHandle,const CpaCyInstanceNotificationCbFunc pInstanceNotificationCb,void * pCallbackTag)106178ee8d1cSJulian Grajkowski cpaCyInstanceSetNotificationCb(
106278ee8d1cSJulian Grajkowski     const CpaInstanceHandle instanceHandle,
106378ee8d1cSJulian Grajkowski     const CpaCyInstanceNotificationCbFunc pInstanceNotificationCb,
106478ee8d1cSJulian Grajkowski     void *pCallbackTag)
106578ee8d1cSJulian Grajkowski {
106678ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
106778ee8d1cSJulian Grajkowski 	sal_service_t *gen_handle = instanceHandle;
106878ee8d1cSJulian Grajkowski 
106978ee8d1cSJulian Grajkowski 
107078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(gen_handle);
107178ee8d1cSJulian Grajkowski 	gen_handle->notification_cb = pInstanceNotificationCb;
107278ee8d1cSJulian Grajkowski 	gen_handle->cb_tag = pCallbackTag;
107378ee8d1cSJulian Grajkowski 	return status;
107478ee8d1cSJulian Grajkowski }
107578ee8d1cSJulian Grajkowski 
107678ee8d1cSJulian Grajkowski /**
107778ee8d1cSJulian Grajkowski  ******************************************************************************
107878ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
107978ee8d1cSJulian Grajkowski  *****************************************************************************/
108078ee8d1cSJulian Grajkowski CpaStatus
cpaCyGetNumInstances(Cpa16U * pNumInstances)108178ee8d1cSJulian Grajkowski cpaCyGetNumInstances(Cpa16U *pNumInstances)
108278ee8d1cSJulian Grajkowski {
108378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
108478ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInstanceHandle;
108578ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info;
108678ee8d1cSJulian Grajkowski 	icp_accel_dev_t **pAdfInsts = NULL;
108778ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
108878ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
108978ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
109078ee8d1cSJulian Grajkowski 	Cpa16U num_accel_dev = 0;
109178ee8d1cSJulian Grajkowski 	Cpa16U num_inst = 0;
109278ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
109378ee8d1cSJulian Grajkowski 
109478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pNumInstances);
109578ee8d1cSJulian Grajkowski 
109678ee8d1cSJulian Grajkowski 	/* Get the number of accel_dev in the system */
109778ee8d1cSJulian Grajkowski 	status = icp_amgr_getNumInstances(&num_accel_dev);
109878ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
109978ee8d1cSJulian Grajkowski 
110078ee8d1cSJulian Grajkowski 	/* Allocate memory to store addr of accel_devs */
110178ee8d1cSJulian Grajkowski 	pAdfInsts =
110278ee8d1cSJulian Grajkowski 	    malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
110378ee8d1cSJulian Grajkowski 	num_accel_dev = 0;
110478ee8d1cSJulian Grajkowski 	/* Get ADF to return all accel_devs that support either
110578ee8d1cSJulian Grajkowski 	 * symmetric or asymmetric crypto */
110678ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByCapabilities(
110778ee8d1cSJulian Grajkowski 	    (ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC |
110878ee8d1cSJulian Grajkowski 	     ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC),
110978ee8d1cSJulian Grajkowski 	    pAdfInsts,
111078ee8d1cSJulian Grajkowski 	    &num_accel_dev);
111178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
111278ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("No support for crypto\n");
111378ee8d1cSJulian Grajkowski 		*pNumInstances = 0;
111478ee8d1cSJulian Grajkowski 		free(pAdfInsts, M_QAT);
111578ee8d1cSJulian Grajkowski 		return status;
111678ee8d1cSJulian Grajkowski 	}
111778ee8d1cSJulian Grajkowski 
111878ee8d1cSJulian Grajkowski 	for (i = 0; i < num_accel_dev; i++) {
111978ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
112078ee8d1cSJulian Grajkowski 		if (NULL == dev_addr || NULL == dev_addr->pSalHandle) {
112178ee8d1cSJulian Grajkowski 			continue;
112278ee8d1cSJulian Grajkowski 		}
112378ee8d1cSJulian Grajkowski 
112478ee8d1cSJulian Grajkowski 		base_addr = dev_addr->pSalHandle;
112578ee8d1cSJulian Grajkowski 		list_temp = base_addr->crypto_services;
112678ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
112778ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
112878ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
112978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status &&
113078ee8d1cSJulian Grajkowski 			    CPA_TRUE == info.isPolled) {
113178ee8d1cSJulian Grajkowski 				num_inst++;
113278ee8d1cSJulian Grajkowski 			}
113378ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
113478ee8d1cSJulian Grajkowski 		}
113578ee8d1cSJulian Grajkowski 		list_temp = base_addr->asym_services;
113678ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
113778ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
113878ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
113978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status &&
114078ee8d1cSJulian Grajkowski 			    CPA_TRUE == info.isPolled) {
114178ee8d1cSJulian Grajkowski 				num_inst++;
114278ee8d1cSJulian Grajkowski 			}
114378ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
114478ee8d1cSJulian Grajkowski 		}
114578ee8d1cSJulian Grajkowski 		list_temp = base_addr->sym_services;
114678ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
114778ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
114878ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
114978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status &&
115078ee8d1cSJulian Grajkowski 			    CPA_TRUE == info.isPolled) {
115178ee8d1cSJulian Grajkowski 				num_inst++;
115278ee8d1cSJulian Grajkowski 			}
115378ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
115478ee8d1cSJulian Grajkowski 		}
115578ee8d1cSJulian Grajkowski 	}
115678ee8d1cSJulian Grajkowski 	*pNumInstances = num_inst;
115778ee8d1cSJulian Grajkowski 	free(pAdfInsts, M_QAT);
115878ee8d1cSJulian Grajkowski 
115978ee8d1cSJulian Grajkowski 
116078ee8d1cSJulian Grajkowski 	return status;
116178ee8d1cSJulian Grajkowski }
116278ee8d1cSJulian Grajkowski 
116378ee8d1cSJulian Grajkowski /**
116478ee8d1cSJulian Grajkowski  ******************************************************************************
116578ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
116678ee8d1cSJulian Grajkowski  *****************************************************************************/
116778ee8d1cSJulian Grajkowski CpaStatus
cpaCyGetInstances(Cpa16U numInstances,CpaInstanceHandle * pCyInstances)116878ee8d1cSJulian Grajkowski cpaCyGetInstances(Cpa16U numInstances, CpaInstanceHandle *pCyInstances)
116978ee8d1cSJulian Grajkowski {
117078ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
117178ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInstanceHandle;
117278ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info;
117378ee8d1cSJulian Grajkowski 	icp_accel_dev_t **pAdfInsts = NULL;
117478ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
117578ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
117678ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
117778ee8d1cSJulian Grajkowski 	Cpa16U num_accel_dev = 0;
117878ee8d1cSJulian Grajkowski 	Cpa16U num_allocated_instances = 0;
117978ee8d1cSJulian Grajkowski 	Cpa16U index = 0;
118078ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
118178ee8d1cSJulian Grajkowski 
118278ee8d1cSJulian Grajkowski 
118378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pCyInstances);
118478ee8d1cSJulian Grajkowski 	if (0 == numInstances) {
118578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("NumInstances is 0");
118678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
118778ee8d1cSJulian Grajkowski 	}
118878ee8d1cSJulian Grajkowski 
118978ee8d1cSJulian Grajkowski 	/* Get the number of crypto instances */
119078ee8d1cSJulian Grajkowski 	status = cpaCyGetNumInstances(&num_allocated_instances);
119178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
119278ee8d1cSJulian Grajkowski 		return status;
119378ee8d1cSJulian Grajkowski 	}
119478ee8d1cSJulian Grajkowski 
119578ee8d1cSJulian Grajkowski 	if (numInstances > num_allocated_instances) {
119678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Only %d crypto instances available\n",
119778ee8d1cSJulian Grajkowski 			      num_allocated_instances);
119878ee8d1cSJulian Grajkowski 		return CPA_STATUS_RESOURCE;
119978ee8d1cSJulian Grajkowski 	}
120078ee8d1cSJulian Grajkowski 
120178ee8d1cSJulian Grajkowski 	/* Get the number of accel devices in the system */
120278ee8d1cSJulian Grajkowski 	status = icp_amgr_getNumInstances(&num_accel_dev);
120378ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
120478ee8d1cSJulian Grajkowski 
120578ee8d1cSJulian Grajkowski 	/* Allocate memory to store addr of accel_devs */
120678ee8d1cSJulian Grajkowski 	pAdfInsts =
120778ee8d1cSJulian Grajkowski 	    malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
120878ee8d1cSJulian Grajkowski 
120978ee8d1cSJulian Grajkowski 	num_accel_dev = 0;
121078ee8d1cSJulian Grajkowski 	/* Get ADF to return all accel_devs that support either
121178ee8d1cSJulian Grajkowski 	 * symmetric or asymmetric crypto */
121278ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByCapabilities(
121378ee8d1cSJulian Grajkowski 	    (ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC |
121478ee8d1cSJulian Grajkowski 	     ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC),
121578ee8d1cSJulian Grajkowski 	    pAdfInsts,
121678ee8d1cSJulian Grajkowski 	    &num_accel_dev);
121778ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
121878ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("No support for crypto\n");
121978ee8d1cSJulian Grajkowski 		free(pAdfInsts, M_QAT);
122078ee8d1cSJulian Grajkowski 		return status;
122178ee8d1cSJulian Grajkowski 	}
122278ee8d1cSJulian Grajkowski 
122378ee8d1cSJulian Grajkowski 	for (i = 0; i < num_accel_dev; i++) {
122478ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
122578ee8d1cSJulian Grajkowski 		/* Note dev_addr cannot be NULL here as numInstances = 0
122678ee8d1cSJulian Grajkowski 		 * is not valid and if dev_addr = NULL then index = 0 (which
122778ee8d1cSJulian Grajkowski 		 * is less than numInstances and status is set to _RESOURCE
122878ee8d1cSJulian Grajkowski 		 * above
122978ee8d1cSJulian Grajkowski 		 */
123078ee8d1cSJulian Grajkowski 		base_addr = dev_addr->pSalHandle;
123178ee8d1cSJulian Grajkowski 		if (NULL == base_addr) {
123278ee8d1cSJulian Grajkowski 			continue;
123378ee8d1cSJulian Grajkowski 		}
123478ee8d1cSJulian Grajkowski 		list_temp = base_addr->crypto_services;
123578ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
123678ee8d1cSJulian Grajkowski 			if (index > (numInstances - 1)) {
123778ee8d1cSJulian Grajkowski 				break;
123878ee8d1cSJulian Grajkowski 			}
123978ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
124078ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
124178ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
124278ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status ||
124378ee8d1cSJulian Grajkowski 			    CPA_TRUE != info.isPolled) {
124478ee8d1cSJulian Grajkowski 				continue;
124578ee8d1cSJulian Grajkowski 			}
124678ee8d1cSJulian Grajkowski 			pCyInstances[index] = cyInstanceHandle;
124778ee8d1cSJulian Grajkowski 			index++;
124878ee8d1cSJulian Grajkowski 		}
124978ee8d1cSJulian Grajkowski 		list_temp = base_addr->asym_services;
125078ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
125178ee8d1cSJulian Grajkowski 			if (index > (numInstances - 1)) {
125278ee8d1cSJulian Grajkowski 				break;
125378ee8d1cSJulian Grajkowski 			}
125478ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
125578ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
125678ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
125778ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status ||
125878ee8d1cSJulian Grajkowski 			    CPA_TRUE != info.isPolled) {
125978ee8d1cSJulian Grajkowski 				continue;
126078ee8d1cSJulian Grajkowski 			}
126178ee8d1cSJulian Grajkowski 			pCyInstances[index] = cyInstanceHandle;
126278ee8d1cSJulian Grajkowski 			index++;
126378ee8d1cSJulian Grajkowski 		}
126478ee8d1cSJulian Grajkowski 		list_temp = base_addr->sym_services;
126578ee8d1cSJulian Grajkowski 		while (NULL != list_temp) {
126678ee8d1cSJulian Grajkowski 			if (index > (numInstances - 1)) {
126778ee8d1cSJulian Grajkowski 				break;
126878ee8d1cSJulian Grajkowski 			}
126978ee8d1cSJulian Grajkowski 			cyInstanceHandle = SalList_getObject(list_temp);
127078ee8d1cSJulian Grajkowski 			status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info);
127178ee8d1cSJulian Grajkowski 			list_temp = SalList_next(list_temp);
127278ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status ||
127378ee8d1cSJulian Grajkowski 			    CPA_TRUE != info.isPolled) {
127478ee8d1cSJulian Grajkowski 				continue;
127578ee8d1cSJulian Grajkowski 			}
127678ee8d1cSJulian Grajkowski 			pCyInstances[index] = cyInstanceHandle;
127778ee8d1cSJulian Grajkowski 			index++;
127878ee8d1cSJulian Grajkowski 		}
127978ee8d1cSJulian Grajkowski 	}
128078ee8d1cSJulian Grajkowski 	free(pAdfInsts, M_QAT);
128178ee8d1cSJulian Grajkowski 
128278ee8d1cSJulian Grajkowski 	return status;
128378ee8d1cSJulian Grajkowski }
128478ee8d1cSJulian Grajkowski 
128578ee8d1cSJulian Grajkowski /**
128678ee8d1cSJulian Grajkowski  ******************************************************************************
128778ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
128878ee8d1cSJulian Grajkowski  *****************************************************************************/
128978ee8d1cSJulian Grajkowski CpaStatus
cpaCyInstanceGetInfo(const CpaInstanceHandle instanceHandle_in,struct _CpaInstanceInfo * pInstanceInfo)129078ee8d1cSJulian Grajkowski cpaCyInstanceGetInfo(const CpaInstanceHandle instanceHandle_in,
129178ee8d1cSJulian Grajkowski 		     struct _CpaInstanceInfo *pInstanceInfo)
129278ee8d1cSJulian Grajkowski {
129378ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
129478ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = NULL;
129578ee8d1cSJulian Grajkowski 	sal_service_t *pGenericService = NULL;
129678ee8d1cSJulian Grajkowski 
129778ee8d1cSJulian Grajkowski 	Cpa8U name[CPA_INST_NAME_SIZE] =
129878ee8d1cSJulian Grajkowski 	    "Intel(R) DH89XXCC instance number: %02x, type: Crypto";
129978ee8d1cSJulian Grajkowski 
130078ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
130178ee8d1cSJulian Grajkowski 		instanceHandle = Lac_CryptoGetFirstHandle();
130278ee8d1cSJulian Grajkowski 	} else {
130378ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
130478ee8d1cSJulian Grajkowski 	}
130578ee8d1cSJulian Grajkowski 
130678ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
130778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pInstanceInfo);
130878ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
130978ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
131078ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
131178ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
131278ee8d1cSJulian Grajkowski 
131378ee8d1cSJulian Grajkowski 	pCryptoService = (sal_crypto_service_t *)instanceHandle;
131478ee8d1cSJulian Grajkowski 
131578ee8d1cSJulian Grajkowski 	pInstanceInfo->type = CPA_INSTANCE_TYPE_CRYPTO;
131678ee8d1cSJulian Grajkowski 
131778ee8d1cSJulian Grajkowski 	/* According to cpa.h instance state is initialized and ready for use
131878ee8d1cSJulian Grajkowski 	 * or shutdown. Therefore need to map our running state to initialised
131978ee8d1cSJulian Grajkowski 	 * or shutdown */
132078ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_STATE_RUNNING ==
132178ee8d1cSJulian Grajkowski 	    pCryptoService->generic_service_info.state) {
132278ee8d1cSJulian Grajkowski 		pInstanceInfo->state = CPA_INSTANCE_STATE_INITIALISED;
132378ee8d1cSJulian Grajkowski 	} else {
132478ee8d1cSJulian Grajkowski 		pInstanceInfo->state = CPA_INSTANCE_STATE_SHUTDOWN;
132578ee8d1cSJulian Grajkowski 	}
132678ee8d1cSJulian Grajkowski 
132778ee8d1cSJulian Grajkowski 	pGenericService = (sal_service_t *)instanceHandle;
132878ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo->name,
132978ee8d1cSJulian Grajkowski 		 CPA_INST_NAME_SIZE,
133078ee8d1cSJulian Grajkowski 		 (char *)name,
133178ee8d1cSJulian Grajkowski 		 pGenericService->instance);
133278ee8d1cSJulian Grajkowski 
133378ee8d1cSJulian Grajkowski 	pInstanceInfo->name[CPA_INST_NAME_SIZE - 1] = '\0';
133478ee8d1cSJulian Grajkowski 
133578ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo->version,
133678ee8d1cSJulian Grajkowski 		 CPA_INSTANCE_MAX_NAME_SIZE_IN_BYTES,
133778ee8d1cSJulian Grajkowski 		 "%d.%d",
133878ee8d1cSJulian Grajkowski 		 CPA_CY_API_VERSION_NUM_MAJOR,
133978ee8d1cSJulian Grajkowski 		 CPA_CY_API_VERSION_NUM_MINOR);
134078ee8d1cSJulian Grajkowski 
134178ee8d1cSJulian Grajkowski 	pInstanceInfo->version[CPA_INSTANCE_MAX_VERSION_SIZE_IN_BYTES - 1] =
134278ee8d1cSJulian Grajkowski 	    '\0';
134378ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
134478ee8d1cSJulian Grajkowski }
134578ee8d1cSJulian Grajkowski 
134678ee8d1cSJulian Grajkowski /**
134778ee8d1cSJulian Grajkowski  ******************************************************************************
134878ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
134978ee8d1cSJulian Grajkowski  *****************************************************************************/
135078ee8d1cSJulian Grajkowski CpaStatus
cpaCyInstanceGetInfo2(const CpaInstanceHandle instanceHandle_in,CpaInstanceInfo2 * pInstanceInfo2)135178ee8d1cSJulian Grajkowski cpaCyInstanceGetInfo2(const CpaInstanceHandle instanceHandle_in,
135278ee8d1cSJulian Grajkowski 		      CpaInstanceInfo2 *pInstanceInfo2)
135378ee8d1cSJulian Grajkowski {
135478ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
135578ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = NULL;
135678ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
135778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
135878ee8d1cSJulian Grajkowski 	char keyStr[ADF_CFG_MAX_KEY_LEN_IN_BYTES] = { 0 };
135978ee8d1cSJulian Grajkowski 	char valStr[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
136078ee8d1cSJulian Grajkowski 	char *section = DYN_SEC;
136178ee8d1cSJulian Grajkowski 
136278ee8d1cSJulian Grajkowski 
136378ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
136478ee8d1cSJulian Grajkowski 		instanceHandle = Lac_CryptoGetFirstHandle();
136578ee8d1cSJulian Grajkowski 	} else {
136678ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
136778ee8d1cSJulian Grajkowski 	}
136878ee8d1cSJulian Grajkowski 
136978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
137078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pInstanceInfo2);
137178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
137278ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
137378ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
137478ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
137578ee8d1cSJulian Grajkowski 
137678ee8d1cSJulian Grajkowski 	LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
137778ee8d1cSJulian Grajkowski 	pInstanceInfo2->accelerationServiceType = CPA_ACC_SVC_TYPE_CRYPTO;
137878ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->vendorName,
137978ee8d1cSJulian Grajkowski 		 CPA_INST_VENDOR_NAME_SIZE,
138078ee8d1cSJulian Grajkowski 		 "%s",
138178ee8d1cSJulian Grajkowski 		 SAL_INFO2_VENDOR_NAME);
138278ee8d1cSJulian Grajkowski 	pInstanceInfo2->vendorName[CPA_INST_VENDOR_NAME_SIZE - 1] = '\0';
138378ee8d1cSJulian Grajkowski 
138478ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->swVersion,
138578ee8d1cSJulian Grajkowski 		 CPA_INST_SW_VERSION_SIZE,
138678ee8d1cSJulian Grajkowski 		 "Version %d.%d",
138778ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER,
138878ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER);
138978ee8d1cSJulian Grajkowski 	pInstanceInfo2->swVersion[CPA_INST_SW_VERSION_SIZE - 1] = '\0';
139078ee8d1cSJulian Grajkowski 
139178ee8d1cSJulian Grajkowski 	/* Note we can safely read the contents of the crypto service instance
139278ee8d1cSJulian Grajkowski 	   here because icp_amgr_getAllAccelDevByCapabilities() only returns
139378ee8d1cSJulian Grajkowski 	   devs
139478ee8d1cSJulian Grajkowski 	   that have started */
139578ee8d1cSJulian Grajkowski 	pCryptoService = (sal_crypto_service_t *)instanceHandle;
139678ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.packageId = pCryptoService->pkgID;
139778ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.acceleratorId =
139878ee8d1cSJulian Grajkowski 	    pCryptoService->acceleratorNum;
139978ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.executionEngineId =
140078ee8d1cSJulian Grajkowski 	    pCryptoService->executionEngine;
140178ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.busAddress =
140278ee8d1cSJulian Grajkowski 	    icp_adf_get_busAddress(pInstanceInfo2->physInstId.packageId);
140378ee8d1cSJulian Grajkowski 
140478ee8d1cSJulian Grajkowski 	/*set coreAffinity to zero before use */
140578ee8d1cSJulian Grajkowski 	LAC_OS_BZERO(pInstanceInfo2->coreAffinity,
140678ee8d1cSJulian Grajkowski 		     sizeof(pInstanceInfo2->coreAffinity));
140778ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pInstanceInfo2->coreAffinity,
140878ee8d1cSJulian Grajkowski 			   pCryptoService->coreAffinity);
140978ee8d1cSJulian Grajkowski 	pInstanceInfo2->nodeAffinity = pCryptoService->nodeAffinity;
141078ee8d1cSJulian Grajkowski 
141178ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_STATE_RUNNING ==
141278ee8d1cSJulian Grajkowski 	    pCryptoService->generic_service_info.state) {
141378ee8d1cSJulian Grajkowski 		pInstanceInfo2->operState = CPA_OPER_STATE_UP;
141478ee8d1cSJulian Grajkowski 	} else {
141578ee8d1cSJulian Grajkowski 		pInstanceInfo2->operState = CPA_OPER_STATE_DOWN;
141678ee8d1cSJulian Grajkowski 	}
141778ee8d1cSJulian Grajkowski 
141878ee8d1cSJulian Grajkowski 	pInstanceInfo2->requiresPhysicallyContiguousMemory = CPA_TRUE;
141978ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE == pCryptoService->isPolled) {
142078ee8d1cSJulian Grajkowski 		pInstanceInfo2->isPolled = CPA_TRUE;
142178ee8d1cSJulian Grajkowski 	} else {
142278ee8d1cSJulian Grajkowski 		pInstanceInfo2->isPolled = CPA_FALSE;
142378ee8d1cSJulian Grajkowski 	}
142478ee8d1cSJulian Grajkowski 	pInstanceInfo2->isOffloaded = CPA_TRUE;
142578ee8d1cSJulian Grajkowski 
142678ee8d1cSJulian Grajkowski 	/* Get the instance name and part name*/
142778ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(pCryptoService->pkgID);
142878ee8d1cSJulian Grajkowski 	if (NULL == dev) {
142978ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Can not find device for the instance\n");
143078ee8d1cSJulian Grajkowski 		LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
143178ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
143278ee8d1cSJulian Grajkowski 	}
143378ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->partName,
143478ee8d1cSJulian Grajkowski 		 CPA_INST_PART_NAME_SIZE,
143578ee8d1cSJulian Grajkowski 		 SAL_INFO2_PART_NAME,
143678ee8d1cSJulian Grajkowski 		 dev->deviceName);
143778ee8d1cSJulian Grajkowski 	pInstanceInfo2->partName[CPA_INST_PART_NAME_SIZE - 1] = '\0';
143878ee8d1cSJulian Grajkowski 
143978ee8d1cSJulian Grajkowski 	status =
144078ee8d1cSJulian Grajkowski 	    Sal_StringParsing("Cy",
144178ee8d1cSJulian Grajkowski 			      pCryptoService->generic_service_info.instance,
144278ee8d1cSJulian Grajkowski 			      "Name",
144378ee8d1cSJulian Grajkowski 			      keyStr);
144478ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
144578ee8d1cSJulian Grajkowski 
144678ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) {
144778ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
144878ee8d1cSJulian Grajkowski 	}
144978ee8d1cSJulian Grajkowski 
145078ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(dev, section, keyStr, valStr);
145178ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
145278ee8d1cSJulian Grajkowski 
145378ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->instName,
145478ee8d1cSJulian Grajkowski 		 CPA_INST_NAME_SIZE,
145578ee8d1cSJulian Grajkowski 		 "%s",
145678ee8d1cSJulian Grajkowski 		 valStr);
145778ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->instID,
145878ee8d1cSJulian Grajkowski 		 CPA_INST_ID_SIZE,
145978ee8d1cSJulian Grajkowski 		 "%s_%s",
146078ee8d1cSJulian Grajkowski 		 section,
146178ee8d1cSJulian Grajkowski 		 valStr);
146278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
146378ee8d1cSJulian Grajkowski }
146478ee8d1cSJulian Grajkowski 
146578ee8d1cSJulian Grajkowski /**
146678ee8d1cSJulian Grajkowski  ******************************************************************************
146778ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
146878ee8d1cSJulian Grajkowski  *****************************************************************************/
146978ee8d1cSJulian Grajkowski 
147078ee8d1cSJulian Grajkowski CpaStatus
cpaCyQueryCapabilities(const CpaInstanceHandle instanceHandle_in,CpaCyCapabilitiesInfo * pCapInfo)147178ee8d1cSJulian Grajkowski cpaCyQueryCapabilities(const CpaInstanceHandle instanceHandle_in,
147278ee8d1cSJulian Grajkowski 		       CpaCyCapabilitiesInfo *pCapInfo)
147378ee8d1cSJulian Grajkowski {
147478ee8d1cSJulian Grajkowski 	/* Verify Instance exists */
147578ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
147678ee8d1cSJulian Grajkowski 
147778ee8d1cSJulian Grajkowski 
147878ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
147978ee8d1cSJulian Grajkowski 		instanceHandle = Lac_CryptoGetFirstHandle();
148078ee8d1cSJulian Grajkowski 	} else {
148178ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
148278ee8d1cSJulian Grajkowski 	}
148378ee8d1cSJulian Grajkowski 
148478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
148578ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
148678ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
148778ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
148878ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
148978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pCapInfo);
149078ee8d1cSJulian Grajkowski 
149178ee8d1cSJulian Grajkowski 	SalCtrl_CyQueryCapabilities((sal_service_t *)instanceHandle, pCapInfo);
149278ee8d1cSJulian Grajkowski 
149378ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
149478ee8d1cSJulian Grajkowski }
149578ee8d1cSJulian Grajkowski 
149678ee8d1cSJulian Grajkowski /**
149778ee8d1cSJulian Grajkowski  ******************************************************************************
149878ee8d1cSJulian Grajkowski  * @ingroup cpaCySym
149978ee8d1cSJulian Grajkowski  *****************************************************************************/
150078ee8d1cSJulian Grajkowski CpaStatus
cpaCySymQueryCapabilities(const CpaInstanceHandle instanceHandle_in,CpaCySymCapabilitiesInfo * pCapInfo)150178ee8d1cSJulian Grajkowski cpaCySymQueryCapabilities(const CpaInstanceHandle instanceHandle_in,
150278ee8d1cSJulian Grajkowski 			  CpaCySymCapabilitiesInfo *pCapInfo)
150378ee8d1cSJulian Grajkowski {
150478ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pCryptoService = NULL;
150578ee8d1cSJulian Grajkowski 	sal_service_t *pGenericService = NULL;
150678ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
150778ee8d1cSJulian Grajkowski 
150878ee8d1cSJulian Grajkowski 	/* Verify Instance exists */
150978ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
151078ee8d1cSJulian Grajkowski 		instanceHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO);
151178ee8d1cSJulian Grajkowski 		if (!instanceHandle) {
151278ee8d1cSJulian Grajkowski 			instanceHandle =
151378ee8d1cSJulian Grajkowski 			    Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM);
151478ee8d1cSJulian Grajkowski 		}
151578ee8d1cSJulian Grajkowski 	} else {
151678ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
151778ee8d1cSJulian Grajkowski 	}
151878ee8d1cSJulian Grajkowski 
151978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
152078ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
152178ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
152278ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
152378ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
152478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pCapInfo);
152578ee8d1cSJulian Grajkowski 
152678ee8d1cSJulian Grajkowski 	pCryptoService = (sal_crypto_service_t *)instanceHandle;
152778ee8d1cSJulian Grajkowski 	pGenericService = &(pCryptoService->generic_service_info);
152878ee8d1cSJulian Grajkowski 
152978ee8d1cSJulian Grajkowski 	memset(pCapInfo, '\0', sizeof(CpaCySymCapabilitiesInfo));
153078ee8d1cSJulian Grajkowski 	/* An asym crypto instance does not support sym service */
153178ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_TYPE_CRYPTO_ASYM == pGenericService->type) {
153278ee8d1cSJulian Grajkowski 		return CPA_STATUS_SUCCESS;
153378ee8d1cSJulian Grajkowski 	}
153478ee8d1cSJulian Grajkowski 
153578ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_NULL);
153678ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_ECB);
153778ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CBC);
153878ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CTR);
153978ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CCM);
154078ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_GCM);
154178ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_XTS);
1542a977168cSMichal Gulbicki 	if (isCyGen2x(pCryptoService)) {
1543a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_ARC4);
1544a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1545a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_DES_ECB);
1546a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1547a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_DES_CBC);
1548a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1549a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_3DES_ECB);
1550a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1551a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_3DES_CBC);
1552a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1553a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_3DES_CTR);
1554a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1555a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_KASUMI_F8);
1556a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
1557a977168cSMichal Gulbicki 				   CPA_CY_SYM_CIPHER_SNOW3G_UEA2);
1558a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_F8);
1559a977168cSMichal Gulbicki 	}
156078ee8d1cSJulian Grajkowski 
156178ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA1);
156278ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA224);
156378ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA256);
156478ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA384);
156578ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA512);
156678ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_XCBC);
156778ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CCM);
156878ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_GCM);
156978ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CMAC);
157078ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_GMAC);
157178ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CBC_MAC);
1572a977168cSMichal Gulbicki 	if (isCyGen2x(pCryptoService)) {
1573a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_MD5);
1574a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_KASUMI_F9);
1575a977168cSMichal Gulbicki 		CPA_BITMAP_BIT_SET(pCapInfo->hashes,
1576a977168cSMichal Gulbicki 				   CPA_CY_SYM_HASH_SNOW3G_UIA2);
1577a977168cSMichal Gulbicki 	}
157878ee8d1cSJulian Grajkowski 
157978ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask &
158078ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_CRYPTO_ZUC) {
158178ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
158278ee8d1cSJulian Grajkowski 				   CPA_CY_SYM_CIPHER_ZUC_EEA3);
158378ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_ZUC_EIA3);
158478ee8d1cSJulian Grajkowski 	}
158578ee8d1cSJulian Grajkowski 
158678ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask &
158778ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_CHACHA_POLY) {
158878ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_POLY);
158978ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_CHACHA);
159078ee8d1cSJulian Grajkowski 	}
159178ee8d1cSJulian Grajkowski 
159278ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SM3) {
159378ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SM3);
159478ee8d1cSJulian Grajkowski 	}
159578ee8d1cSJulian Grajkowski 
159678ee8d1cSJulian Grajkowski 	pCapInfo->partialPacketSupported = CPA_TRUE;
159778ee8d1cSJulian Grajkowski 
159878ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SHA3) {
159978ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_256);
160078ee8d1cSJulian Grajkowski 		pCapInfo->partialPacketSupported = CPA_FALSE;
160178ee8d1cSJulian Grajkowski 	}
160278ee8d1cSJulian Grajkowski 
160378ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask &
160478ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_SHA3_EXT) {
160578ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_224);
160678ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_256);
160778ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_384);
160878ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_512);
160978ee8d1cSJulian Grajkowski 		pCapInfo->partialPacketSupported = CPA_FALSE;
161078ee8d1cSJulian Grajkowski 	}
161178ee8d1cSJulian Grajkowski 
161278ee8d1cSJulian Grajkowski 	if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SM4) {
161378ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
161478ee8d1cSJulian Grajkowski 				   CPA_CY_SYM_CIPHER_SM4_ECB);
161578ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
161678ee8d1cSJulian Grajkowski 				   CPA_CY_SYM_CIPHER_SM4_CBC);
161778ee8d1cSJulian Grajkowski 		CPA_BITMAP_BIT_SET(pCapInfo->ciphers,
161878ee8d1cSJulian Grajkowski 				   CPA_CY_SYM_CIPHER_SM4_CTR);
161978ee8d1cSJulian Grajkowski 		pCapInfo->partialPacketSupported = CPA_FALSE;
162078ee8d1cSJulian Grajkowski 	}
162178ee8d1cSJulian Grajkowski 
162278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
162378ee8d1cSJulian Grajkowski }
162478ee8d1cSJulian Grajkowski 
162578ee8d1cSJulian Grajkowski /**
162678ee8d1cSJulian Grajkowski  ******************************************************************************
162778ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
162878ee8d1cSJulian Grajkowski  *****************************************************************************/
162978ee8d1cSJulian Grajkowski CpaStatus
cpaCySetAddressTranslation(const CpaInstanceHandle instanceHandle_in,CpaVirtualToPhysical virtual2physical)163078ee8d1cSJulian Grajkowski cpaCySetAddressTranslation(const CpaInstanceHandle instanceHandle_in,
163178ee8d1cSJulian Grajkowski 			   CpaVirtualToPhysical virtual2physical)
163278ee8d1cSJulian Grajkowski {
163378ee8d1cSJulian Grajkowski 
163478ee8d1cSJulian Grajkowski 	CpaInstanceHandle instanceHandle = NULL;
163578ee8d1cSJulian Grajkowski 	sal_service_t *pService = NULL;
163678ee8d1cSJulian Grajkowski 
163778ee8d1cSJulian Grajkowski 
163878ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
163978ee8d1cSJulian Grajkowski 		instanceHandle = Lac_CryptoGetFirstHandle();
164078ee8d1cSJulian Grajkowski 	} else {
164178ee8d1cSJulian Grajkowski 		instanceHandle = instanceHandle_in;
164278ee8d1cSJulian Grajkowski 	}
164378ee8d1cSJulian Grajkowski 
164478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(instanceHandle);
164578ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(instanceHandle,
164678ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
164778ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
164878ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
164978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(virtual2physical);
165078ee8d1cSJulian Grajkowski 
165178ee8d1cSJulian Grajkowski 	pService = (sal_service_t *)instanceHandle;
165278ee8d1cSJulian Grajkowski 
165378ee8d1cSJulian Grajkowski 	pService->virt2PhysClient = virtual2physical;
165478ee8d1cSJulian Grajkowski 
165578ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
165678ee8d1cSJulian Grajkowski }
165778ee8d1cSJulian Grajkowski 
165878ee8d1cSJulian Grajkowski /**
165978ee8d1cSJulian Grajkowski  ******************************************************************************
166078ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
166178ee8d1cSJulian Grajkowski  * Crypto specific polling function which polls a crypto instance.
166278ee8d1cSJulian Grajkowski  *****************************************************************************/
166378ee8d1cSJulian Grajkowski CpaStatus
icp_sal_CyPollInstance(CpaInstanceHandle instanceHandle_in,Cpa32U response_quota)166478ee8d1cSJulian Grajkowski icp_sal_CyPollInstance(CpaInstanceHandle instanceHandle_in,
166578ee8d1cSJulian Grajkowski 		       Cpa32U response_quota)
166678ee8d1cSJulian Grajkowski {
166778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
166878ee8d1cSJulian Grajkowski 	sal_crypto_service_t *crypto_handle = NULL;
166978ee8d1cSJulian Grajkowski 	sal_service_t *gen_handle = NULL;
167078ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_hndTable[MAX_CY_RX_RINGS] = { 0 };
167178ee8d1cSJulian Grajkowski 	Cpa32U num_rx_rings = 0;
167278ee8d1cSJulian Grajkowski 
167378ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
167478ee8d1cSJulian Grajkowski 		crypto_handle =
167578ee8d1cSJulian Grajkowski 		    (sal_crypto_service_t *)Lac_CryptoGetFirstHandle();
167678ee8d1cSJulian Grajkowski 	} else {
167778ee8d1cSJulian Grajkowski 		crypto_handle = (sal_crypto_service_t *)instanceHandle_in;
167878ee8d1cSJulian Grajkowski 	}
167978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(crypto_handle);
168078ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(crypto_handle);
168178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(crypto_handle,
168278ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
168378ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_ASYM |
168478ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
168578ee8d1cSJulian Grajkowski 
168678ee8d1cSJulian Grajkowski 	gen_handle = &(crypto_handle->generic_service_info);
168778ee8d1cSJulian Grajkowski 
168878ee8d1cSJulian Grajkowski 	/*
168978ee8d1cSJulian Grajkowski 	 * From the instanceHandle we must get the trans_handle and send
169078ee8d1cSJulian Grajkowski 	 * down to adf for polling.
169178ee8d1cSJulian Grajkowski 	 * Populate our trans handle table with the appropriate handles.
169278ee8d1cSJulian Grajkowski 	 */
169378ee8d1cSJulian Grajkowski 
169478ee8d1cSJulian Grajkowski 	switch (gen_handle->type) {
169578ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_ASYM:
169678ee8d1cSJulian Grajkowski 		trans_hndTable[TH_CY_RX_0] =
169778ee8d1cSJulian Grajkowski 		    crypto_handle->trans_handle_asym_rx;
169878ee8d1cSJulian Grajkowski 		num_rx_rings = 1;
169978ee8d1cSJulian Grajkowski 		break;
170078ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_SYM:
170178ee8d1cSJulian Grajkowski 		trans_hndTable[TH_CY_RX_0] = crypto_handle->trans_handle_sym_rx;
170278ee8d1cSJulian Grajkowski 		num_rx_rings = 1;
170378ee8d1cSJulian Grajkowski 		break;
170478ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO:
170578ee8d1cSJulian Grajkowski 		trans_hndTable[TH_CY_RX_0] = crypto_handle->trans_handle_sym_rx;
170678ee8d1cSJulian Grajkowski 		trans_hndTable[TH_CY_RX_1] =
170778ee8d1cSJulian Grajkowski 		    crypto_handle->trans_handle_asym_rx;
170878ee8d1cSJulian Grajkowski 		num_rx_rings = MAX_CY_RX_RINGS;
170978ee8d1cSJulian Grajkowski 		break;
171078ee8d1cSJulian Grajkowski 	default:
171178ee8d1cSJulian Grajkowski 		break;
171278ee8d1cSJulian Grajkowski 	}
171378ee8d1cSJulian Grajkowski 
171478ee8d1cSJulian Grajkowski 	/* Call adf to do the polling. */
171578ee8d1cSJulian Grajkowski 	status =
171678ee8d1cSJulian Grajkowski 	    icp_adf_pollInstance(trans_hndTable, num_rx_rings, response_quota);
171778ee8d1cSJulian Grajkowski 
171878ee8d1cSJulian Grajkowski 	return status;
171978ee8d1cSJulian Grajkowski }
172078ee8d1cSJulian Grajkowski 
172178ee8d1cSJulian Grajkowski /**
172278ee8d1cSJulian Grajkowski  ******************************************************************************
172378ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
172478ee8d1cSJulian Grajkowski  * Crypto specific polling function which polls sym crypto ring.
172578ee8d1cSJulian Grajkowski  *****************************************************************************/
172678ee8d1cSJulian Grajkowski CpaStatus
icp_sal_CyPollSymRing(CpaInstanceHandle instanceHandle_in,Cpa32U response_quota)172778ee8d1cSJulian Grajkowski icp_sal_CyPollSymRing(CpaInstanceHandle instanceHandle_in,
172878ee8d1cSJulian Grajkowski 		      Cpa32U response_quota)
172978ee8d1cSJulian Grajkowski {
173078ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
173178ee8d1cSJulian Grajkowski 	sal_crypto_service_t *crypto_handle = NULL;
173278ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_hndTable[NUM_CRYPTO_SYM_RX_RINGS] = { 0 };
173378ee8d1cSJulian Grajkowski 
173478ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
173578ee8d1cSJulian Grajkowski 		crypto_handle = (sal_crypto_service_t *)Lac_GetFirstHandle(
173678ee8d1cSJulian Grajkowski 		    SAL_SERVICE_TYPE_CRYPTO_SYM);
173778ee8d1cSJulian Grajkowski 	} else {
173878ee8d1cSJulian Grajkowski 		crypto_handle = (sal_crypto_service_t *)instanceHandle_in;
173978ee8d1cSJulian Grajkowski 	}
174078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(crypto_handle);
174178ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(crypto_handle,
174278ee8d1cSJulian Grajkowski 				(SAL_SERVICE_TYPE_CRYPTO |
174378ee8d1cSJulian Grajkowski 				 SAL_SERVICE_TYPE_CRYPTO_SYM));
174478ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(crypto_handle);
174578ee8d1cSJulian Grajkowski 
174678ee8d1cSJulian Grajkowski 	/*
174778ee8d1cSJulian Grajkowski 	 * From the instanceHandle we must get the trans_handle and send
174878ee8d1cSJulian Grajkowski 	 * down to adf for polling.
174978ee8d1cSJulian Grajkowski 	 * Populate our trans handle table with the appropriate handles.
175078ee8d1cSJulian Grajkowski 	 */
175178ee8d1cSJulian Grajkowski 	trans_hndTable[TH_SINGLE_RX] = crypto_handle->trans_handle_sym_rx;
175278ee8d1cSJulian Grajkowski 	/* Call adf to do the polling. */
175378ee8d1cSJulian Grajkowski 	status = icp_adf_pollInstance(trans_hndTable,
175478ee8d1cSJulian Grajkowski 				      NUM_CRYPTO_SYM_RX_RINGS,
175578ee8d1cSJulian Grajkowski 				      response_quota);
175678ee8d1cSJulian Grajkowski 	return status;
175778ee8d1cSJulian Grajkowski }
175878ee8d1cSJulian Grajkowski 
175978ee8d1cSJulian Grajkowski 
176078ee8d1cSJulian Grajkowski /**
176178ee8d1cSJulian Grajkowski  ******************************************************************************
176278ee8d1cSJulian Grajkowski  * @ingroup cpaCyCommon
176378ee8d1cSJulian Grajkowski  * Crypto specific polling function which polls an nrbg crypto ring.
176478ee8d1cSJulian Grajkowski  *****************************************************************************/
176578ee8d1cSJulian Grajkowski CpaStatus
icp_sal_CyPollNRBGRing(CpaInstanceHandle instanceHandle_in,Cpa32U response_quota)176678ee8d1cSJulian Grajkowski icp_sal_CyPollNRBGRing(CpaInstanceHandle instanceHandle_in,
176778ee8d1cSJulian Grajkowski 		       Cpa32U response_quota)
176878ee8d1cSJulian Grajkowski {
176978ee8d1cSJulian Grajkowski 	return CPA_STATUS_UNSUPPORTED;
177078ee8d1cSJulian Grajkowski }
177178ee8d1cSJulian Grajkowski 
177278ee8d1cSJulian Grajkowski /* Returns the handle to the first asym crypto instance */
177378ee8d1cSJulian Grajkowski static CpaInstanceHandle
Lac_GetFirstAsymHandle(icp_accel_dev_t * adfInsts[ADF_MAX_DEVICES],Cpa16U num_dev)177478ee8d1cSJulian Grajkowski Lac_GetFirstAsymHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES],
177578ee8d1cSJulian Grajkowski 		       Cpa16U num_dev)
177678ee8d1cSJulian Grajkowski {
1777a977168cSMichal Gulbicki 	CpaStatus status = CPA_STATUS_SUCCESS;
177878ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
177978ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
178078ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
178178ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInst = NULL;
1782a977168cSMichal Gulbicki 	CpaInstanceInfo2 info;
178378ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
178478ee8d1cSJulian Grajkowski 
178578ee8d1cSJulian Grajkowski 	for (i = 0; i < num_dev; i++) {
178678ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)adfInsts[i];
178778ee8d1cSJulian Grajkowski 		base_addr = dev_addr->pSalHandle;
1788a977168cSMichal Gulbicki 		if (NULL == base_addr) {
1789a977168cSMichal Gulbicki 			continue;
1790a977168cSMichal Gulbicki 		}
179178ee8d1cSJulian Grajkowski 		list_temp = base_addr->asym_services;
1792a977168cSMichal Gulbicki 		while (NULL != list_temp) {
179378ee8d1cSJulian Grajkowski 			cyInst = SalList_getObject(list_temp);
1794a977168cSMichal Gulbicki 			status = cpaCyInstanceGetInfo2(cyInst, &info);
1795a977168cSMichal Gulbicki 			list_temp = SalList_next(list_temp);
1796a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status ||
1797a977168cSMichal Gulbicki 			    CPA_TRUE != info.isPolled) {
1798a977168cSMichal Gulbicki 				cyInst = NULL;
1799a977168cSMichal Gulbicki 				continue;
1800a977168cSMichal Gulbicki 			}
1801a977168cSMichal Gulbicki 			break;
1802a977168cSMichal Gulbicki 		}
1803a977168cSMichal Gulbicki 		if (cyInst) {
180478ee8d1cSJulian Grajkowski 			break;
180578ee8d1cSJulian Grajkowski 		}
180678ee8d1cSJulian Grajkowski 	}
180778ee8d1cSJulian Grajkowski 
180878ee8d1cSJulian Grajkowski 	return cyInst;
180978ee8d1cSJulian Grajkowski }
181078ee8d1cSJulian Grajkowski 
181178ee8d1cSJulian Grajkowski /* Returns the handle to the first sym crypto instance */
181278ee8d1cSJulian Grajkowski static CpaInstanceHandle
Lac_GetFirstSymHandle(icp_accel_dev_t * adfInsts[ADF_MAX_DEVICES],Cpa16U num_dev)181378ee8d1cSJulian Grajkowski Lac_GetFirstSymHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES],
181478ee8d1cSJulian Grajkowski 		      Cpa16U num_dev)
181578ee8d1cSJulian Grajkowski {
1816a977168cSMichal Gulbicki 	CpaStatus status = CPA_STATUS_SUCCESS;
181778ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
181878ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
181978ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
182078ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInst = NULL;
1821a977168cSMichal Gulbicki 	CpaInstanceInfo2 info;
182278ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
182378ee8d1cSJulian Grajkowski 
182478ee8d1cSJulian Grajkowski 	for (i = 0; i < num_dev; i++) {
182578ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)adfInsts[i];
182678ee8d1cSJulian Grajkowski 		base_addr = dev_addr->pSalHandle;
1827a977168cSMichal Gulbicki 		if (NULL == base_addr) {
1828a977168cSMichal Gulbicki 			continue;
1829a977168cSMichal Gulbicki 		}
183078ee8d1cSJulian Grajkowski 		list_temp = base_addr->sym_services;
1831a977168cSMichal Gulbicki 		while (NULL != list_temp) {
183278ee8d1cSJulian Grajkowski 			cyInst = SalList_getObject(list_temp);
1833a977168cSMichal Gulbicki 			status = cpaCyInstanceGetInfo2(cyInst, &info);
1834a977168cSMichal Gulbicki 			list_temp = SalList_next(list_temp);
1835a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status ||
1836a977168cSMichal Gulbicki 			    CPA_TRUE != info.isPolled) {
1837a977168cSMichal Gulbicki 				cyInst = NULL;
1838a977168cSMichal Gulbicki 				continue;
1839a977168cSMichal Gulbicki 			}
1840a977168cSMichal Gulbicki 			break;
1841a977168cSMichal Gulbicki 		}
1842a977168cSMichal Gulbicki 		if (cyInst) {
184378ee8d1cSJulian Grajkowski 			break;
184478ee8d1cSJulian Grajkowski 		}
184578ee8d1cSJulian Grajkowski 	}
184678ee8d1cSJulian Grajkowski 
184778ee8d1cSJulian Grajkowski 	return cyInst;
184878ee8d1cSJulian Grajkowski }
184978ee8d1cSJulian Grajkowski 
185078ee8d1cSJulian Grajkowski /* Returns the handle to the first crypto instance
185178ee8d1cSJulian Grajkowski  * Note that the crypto instance in this case supports
185278ee8d1cSJulian Grajkowski  * both asym and sym services */
185378ee8d1cSJulian Grajkowski static CpaInstanceHandle
Lac_GetFirstCyHandle(icp_accel_dev_t * adfInsts[ADF_MAX_DEVICES],Cpa16U num_dev)185478ee8d1cSJulian Grajkowski Lac_GetFirstCyHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES], Cpa16U num_dev)
185578ee8d1cSJulian Grajkowski {
1856a977168cSMichal Gulbicki 	CpaStatus status = CPA_STATUS_SUCCESS;
185778ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
185878ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
185978ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
186078ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInst = NULL;
1861a977168cSMichal Gulbicki 	CpaInstanceInfo2 info;
186278ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
186378ee8d1cSJulian Grajkowski 
186478ee8d1cSJulian Grajkowski 	for (i = 0; i < num_dev; i++) {
186578ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)adfInsts[i];
186678ee8d1cSJulian Grajkowski 		base_addr = dev_addr->pSalHandle;
1867a977168cSMichal Gulbicki 		if (NULL == base_addr) {
1868a977168cSMichal Gulbicki 			continue;
1869a977168cSMichal Gulbicki 		}
187078ee8d1cSJulian Grajkowski 		list_temp = base_addr->crypto_services;
1871a977168cSMichal Gulbicki 		while (NULL != list_temp) {
187278ee8d1cSJulian Grajkowski 			cyInst = SalList_getObject(list_temp);
1873a977168cSMichal Gulbicki 			status = cpaCyInstanceGetInfo2(cyInst, &info);
1874a977168cSMichal Gulbicki 			list_temp = SalList_next(list_temp);
1875a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status ||
1876a977168cSMichal Gulbicki 			    CPA_TRUE != info.isPolled) {
1877a977168cSMichal Gulbicki 				cyInst = NULL;
1878a977168cSMichal Gulbicki 				continue;
1879a977168cSMichal Gulbicki 			}
1880a977168cSMichal Gulbicki 			break;
1881a977168cSMichal Gulbicki 		}
1882a977168cSMichal Gulbicki 		if (cyInst) {
188378ee8d1cSJulian Grajkowski 			break;
188478ee8d1cSJulian Grajkowski 		}
188578ee8d1cSJulian Grajkowski 	}
1886a977168cSMichal Gulbicki 
188778ee8d1cSJulian Grajkowski 	return cyInst;
188878ee8d1cSJulian Grajkowski }
188978ee8d1cSJulian Grajkowski 
189078ee8d1cSJulian Grajkowski CpaInstanceHandle
Lac_GetFirstHandle(sal_service_type_t svc_type)189178ee8d1cSJulian Grajkowski Lac_GetFirstHandle(sal_service_type_t svc_type)
189278ee8d1cSJulian Grajkowski {
189378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
189478ee8d1cSJulian Grajkowski 	static icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES] = { 0 };
189578ee8d1cSJulian Grajkowski 	CpaInstanceHandle cyInst = NULL;
189678ee8d1cSJulian Grajkowski 	Cpa16U num_cy_dev = 0;
189778ee8d1cSJulian Grajkowski 	Cpa32U capabilities = 0;
189878ee8d1cSJulian Grajkowski 
189978ee8d1cSJulian Grajkowski 	switch (svc_type) {
190078ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_ASYM:
190178ee8d1cSJulian Grajkowski 		capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
190278ee8d1cSJulian Grajkowski 		break;
190378ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_SYM:
190478ee8d1cSJulian Grajkowski 		capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
190578ee8d1cSJulian Grajkowski 		break;
190678ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO:
190778ee8d1cSJulian Grajkowski 		capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
190878ee8d1cSJulian Grajkowski 		capabilities |= ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
190978ee8d1cSJulian Grajkowski 		break;
191078ee8d1cSJulian Grajkowski 	default:
191178ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Invalid service type\n");
191278ee8d1cSJulian Grajkowski 		return NULL;
191378ee8d1cSJulian Grajkowski 		break;
191478ee8d1cSJulian Grajkowski 	}
191578ee8d1cSJulian Grajkowski 	/* Only need 1 dev with crypto enabled - so check all devices*/
191678ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByEachCapability(capabilities,
191778ee8d1cSJulian Grajkowski 							 adfInsts,
191878ee8d1cSJulian Grajkowski 							 &num_cy_dev);
191978ee8d1cSJulian Grajkowski 	if ((0 == num_cy_dev) || (CPA_STATUS_SUCCESS != status)) {
192078ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("No crypto devices enabled in the system\n");
192178ee8d1cSJulian Grajkowski 		return NULL;
192278ee8d1cSJulian Grajkowski 	}
192378ee8d1cSJulian Grajkowski 
192478ee8d1cSJulian Grajkowski 	switch (svc_type) {
192578ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_ASYM:
192678ee8d1cSJulian Grajkowski 		/* Try to find an asym only instance first */
192778ee8d1cSJulian Grajkowski 		cyInst = Lac_GetFirstAsymHandle(adfInsts, num_cy_dev);
192878ee8d1cSJulian Grajkowski 		/* Try to find a cy instance since it also supports asym */
192978ee8d1cSJulian Grajkowski 		if (NULL == cyInst) {
193078ee8d1cSJulian Grajkowski 			cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev);
193178ee8d1cSJulian Grajkowski 		}
193278ee8d1cSJulian Grajkowski 		break;
193378ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO_SYM:
193478ee8d1cSJulian Grajkowski 		/* Try to find a sym only instance first */
193578ee8d1cSJulian Grajkowski 		cyInst = Lac_GetFirstSymHandle(adfInsts, num_cy_dev);
193678ee8d1cSJulian Grajkowski 		/* Try to find a cy instance since it also supports sym */
193778ee8d1cSJulian Grajkowski 		if (NULL == cyInst) {
193878ee8d1cSJulian Grajkowski 			cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev);
193978ee8d1cSJulian Grajkowski 		}
194078ee8d1cSJulian Grajkowski 		break;
194178ee8d1cSJulian Grajkowski 	case SAL_SERVICE_TYPE_CRYPTO:
194278ee8d1cSJulian Grajkowski 		/* Try to find a cy instance */
194378ee8d1cSJulian Grajkowski 		cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev);
194478ee8d1cSJulian Grajkowski 		break;
194578ee8d1cSJulian Grajkowski 	default:
194678ee8d1cSJulian Grajkowski 		break;
194778ee8d1cSJulian Grajkowski 	}
194878ee8d1cSJulian Grajkowski 	if (NULL == cyInst) {
194978ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("No remaining crypto instances available\n");
195078ee8d1cSJulian Grajkowski 	}
195178ee8d1cSJulian Grajkowski 	return cyInst;
195278ee8d1cSJulian Grajkowski }
195378ee8d1cSJulian Grajkowski 
195478ee8d1cSJulian Grajkowski CpaStatus
icp_sal_NrbgGetInflightRequests(CpaInstanceHandle instanceHandle_in,Cpa32U * maxInflightRequests,Cpa32U * numInflightRequests)195578ee8d1cSJulian Grajkowski icp_sal_NrbgGetInflightRequests(CpaInstanceHandle instanceHandle_in,
195678ee8d1cSJulian Grajkowski 				Cpa32U *maxInflightRequests,
195778ee8d1cSJulian Grajkowski 				Cpa32U *numInflightRequests)
195878ee8d1cSJulian Grajkowski {
195978ee8d1cSJulian Grajkowski 	return CPA_STATUS_UNSUPPORTED;
196078ee8d1cSJulian Grajkowski }
196178ee8d1cSJulian Grajkowski 
196278ee8d1cSJulian Grajkowski CpaStatus
icp_sal_SymGetInflightRequests(CpaInstanceHandle instanceHandle,Cpa32U * maxInflightRequests,Cpa32U * numInflightRequests)196378ee8d1cSJulian Grajkowski icp_sal_SymGetInflightRequests(CpaInstanceHandle instanceHandle,
196478ee8d1cSJulian Grajkowski 			       Cpa32U *maxInflightRequests,
196578ee8d1cSJulian Grajkowski 			       Cpa32U *numInflightRequests)
196678ee8d1cSJulian Grajkowski {
196778ee8d1cSJulian Grajkowski 	sal_crypto_service_t *crypto_handle = NULL;
196878ee8d1cSJulian Grajkowski 
196978ee8d1cSJulian Grajkowski 	crypto_handle = (sal_crypto_service_t *)instanceHandle;
197078ee8d1cSJulian Grajkowski 
197178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(crypto_handle);
197278ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(maxInflightRequests);
197378ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(numInflightRequests);
197478ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(crypto_handle);
197578ee8d1cSJulian Grajkowski 
197678ee8d1cSJulian Grajkowski 	return icp_adf_getInflightRequests(crypto_handle->trans_handle_sym_tx,
197778ee8d1cSJulian Grajkowski 					   maxInflightRequests,
197878ee8d1cSJulian Grajkowski 					   numInflightRequests);
197978ee8d1cSJulian Grajkowski }
198078ee8d1cSJulian Grajkowski 
198178ee8d1cSJulian Grajkowski 
198278ee8d1cSJulian Grajkowski CpaStatus
icp_sal_dp_SymGetInflightRequests(CpaInstanceHandle instanceHandle,Cpa32U * maxInflightRequests,Cpa32U * numInflightRequests)198378ee8d1cSJulian Grajkowski icp_sal_dp_SymGetInflightRequests(CpaInstanceHandle instanceHandle,
198478ee8d1cSJulian Grajkowski 				  Cpa32U *maxInflightRequests,
198578ee8d1cSJulian Grajkowski 				  Cpa32U *numInflightRequests)
198678ee8d1cSJulian Grajkowski {
198778ee8d1cSJulian Grajkowski 	sal_crypto_service_t *crypto_handle = NULL;
198878ee8d1cSJulian Grajkowski 
198978ee8d1cSJulian Grajkowski 	crypto_handle = (sal_crypto_service_t *)instanceHandle;
199078ee8d1cSJulian Grajkowski 
199178ee8d1cSJulian Grajkowski 	return icp_adf_dp_getInflightRequests(
199278ee8d1cSJulian Grajkowski 	    crypto_handle->trans_handle_sym_tx,
199378ee8d1cSJulian Grajkowski 	    maxInflightRequests,
199478ee8d1cSJulian Grajkowski 	    numInflightRequests);
199578ee8d1cSJulian Grajkowski }
199678ee8d1cSJulian Grajkowski 
1997a977168cSMichal Gulbicki 
1998a977168cSMichal Gulbicki CpaStatus
icp_sal_setForceAEADMACVerify(CpaInstanceHandle instanceHandle,CpaBoolean forceAEADMacVerify)1999a977168cSMichal Gulbicki icp_sal_setForceAEADMACVerify(CpaInstanceHandle instanceHandle,
2000a977168cSMichal Gulbicki 			      CpaBoolean forceAEADMacVerify)
2001a977168cSMichal Gulbicki {
2002a977168cSMichal Gulbicki 	sal_crypto_service_t *crypto_handle = NULL;
2003a977168cSMichal Gulbicki 
2004a977168cSMichal Gulbicki 	crypto_handle = (sal_crypto_service_t *)instanceHandle;
2005a977168cSMichal Gulbicki 	LAC_CHECK_NULL_PARAM(crypto_handle);
2006a977168cSMichal Gulbicki 	crypto_handle->forceAEADMacVerify = forceAEADMacVerify;
2007a977168cSMichal Gulbicki 
2008a977168cSMichal Gulbicki 	return CPA_STATUS_SUCCESS;
2009a977168cSMichal Gulbicki }
2010