1266b0663SKrzysztof Zdziarski /* SPDX-License-Identifier: BSD-3-Clause */
2266b0663SKrzysztof Zdziarski /* Copyright(c) 2007-2022 Intel Corporation */
3266b0663SKrzysztof Zdziarski 
4266b0663SKrzysztof Zdziarski /**
5266b0663SKrzysztof Zdziarski  *****************************************************************************
6266b0663SKrzysztof Zdziarski  * @file sal_get_instances.c
7266b0663SKrzysztof Zdziarski  *
8266b0663SKrzysztof Zdziarski  * @defgroup SalCtrl Service Access Layer Controller
9266b0663SKrzysztof Zdziarski  *
10266b0663SKrzysztof Zdziarski  * @ingroup SalCtrl
11266b0663SKrzysztof Zdziarski  *
12266b0663SKrzysztof Zdziarski  * @description
13266b0663SKrzysztof Zdziarski  *      This file contains the main function to get SAL instances.
14266b0663SKrzysztof Zdziarski  *
15266b0663SKrzysztof Zdziarski  *****************************************************************************/
16266b0663SKrzysztof Zdziarski 
17266b0663SKrzysztof Zdziarski /*
18266b0663SKrzysztof Zdziarski *******************************************************************************
19266b0663SKrzysztof Zdziarski * Include public/global header files
20266b0663SKrzysztof Zdziarski *******************************************************************************
21266b0663SKrzysztof Zdziarski */
22266b0663SKrzysztof Zdziarski 
23266b0663SKrzysztof Zdziarski /* QAT-API includes */
24266b0663SKrzysztof Zdziarski #include "cpa.h"
25266b0663SKrzysztof Zdziarski #include "cpa_cy_common.h"
26266b0663SKrzysztof Zdziarski #include "cpa_cy_im.h"
27266b0663SKrzysztof Zdziarski #include "cpa_dc.h"
28266b0663SKrzysztof Zdziarski 
29266b0663SKrzysztof Zdziarski /* ADF includes */
30266b0663SKrzysztof Zdziarski #include "icp_accel_devices.h"
31266b0663SKrzysztof Zdziarski #include "icp_adf_accel_mgr.h"
32266b0663SKrzysztof Zdziarski 
33266b0663SKrzysztof Zdziarski /* SAL includes */
34266b0663SKrzysztof Zdziarski #include "lac_mem.h"
35266b0663SKrzysztof Zdziarski #include "lac_list.h"
36266b0663SKrzysztof Zdziarski #include "lac_sal_types.h"
37266b0663SKrzysztof Zdziarski 
38266b0663SKrzysztof Zdziarski /**
39266b0663SKrzysztof Zdziarski  ******************************************************************************
40266b0663SKrzysztof Zdziarski  * @ingroup SalCtrl
41266b0663SKrzysztof Zdziarski  * @description
42266b0663SKrzysztof Zdziarski  *   Get either sym or asym instance number
43266b0663SKrzysztof Zdziarski  *****************************************************************************/
44266b0663SKrzysztof Zdziarski static CpaStatus
Lac_GetSingleCyNumInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U * pNumInstances)45266b0663SKrzysztof Zdziarski Lac_GetSingleCyNumInstances(
46266b0663SKrzysztof Zdziarski     const CpaAccelerationServiceType accelerationServiceType,
47266b0663SKrzysztof Zdziarski     Cpa16U *pNumInstances)
48266b0663SKrzysztof Zdziarski {
49266b0663SKrzysztof Zdziarski 	CpaStatus status = CPA_STATUS_SUCCESS;
50266b0663SKrzysztof Zdziarski 	icp_accel_dev_t **pAdfInsts = NULL;
51266b0663SKrzysztof Zdziarski 	icp_accel_dev_t *dev_addr = NULL;
52266b0663SKrzysztof Zdziarski 	sal_t *base_addr = NULL;
53266b0663SKrzysztof Zdziarski 	sal_list_t *list_temp = NULL;
54266b0663SKrzysztof Zdziarski 	Cpa16U num_accel_dev = 0;
55266b0663SKrzysztof Zdziarski 	Cpa16U num_inst = 0;
56266b0663SKrzysztof Zdziarski 	Cpa16U i = 0;
57266b0663SKrzysztof Zdziarski 	Cpa32U accel_capability = 0;
58266b0663SKrzysztof Zdziarski 	char *service = NULL;
59266b0663SKrzysztof Zdziarski 
60266b0663SKrzysztof Zdziarski 	LAC_CHECK_NULL_PARAM(pNumInstances);
61266b0663SKrzysztof Zdziarski 	*pNumInstances = 0;
62266b0663SKrzysztof Zdziarski 
63266b0663SKrzysztof Zdziarski 	switch (accelerationServiceType) {
64266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
65266b0663SKrzysztof Zdziarski 		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
66266b0663SKrzysztof Zdziarski 		service = "asym";
67266b0663SKrzysztof Zdziarski 		break;
68266b0663SKrzysztof Zdziarski 
69266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
70266b0663SKrzysztof Zdziarski 		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
71266b0663SKrzysztof Zdziarski 		service = "sym";
72266b0663SKrzysztof Zdziarski 		break;
73266b0663SKrzysztof Zdziarski 
74266b0663SKrzysztof Zdziarski 	default:
75266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Invalid service type\n");
76266b0663SKrzysztof Zdziarski 		return CPA_STATUS_INVALID_PARAM;
77266b0663SKrzysztof Zdziarski 	}
78266b0663SKrzysztof Zdziarski 
79266b0663SKrzysztof Zdziarski 	/* Get the number of accel_dev in the system */
80266b0663SKrzysztof Zdziarski 	status = icp_amgr_getNumInstances(&num_accel_dev);
81266b0663SKrzysztof Zdziarski 	LAC_CHECK_STATUS(status);
82266b0663SKrzysztof Zdziarski 
83266b0663SKrzysztof Zdziarski 	/* Allocate memory to store addr of accel_devs */
84266b0663SKrzysztof Zdziarski 	pAdfInsts = malloc(num_accel_dev * sizeof(icp_accel_dev_t *),
85266b0663SKrzysztof Zdziarski 			   M_QAT,
86266b0663SKrzysztof Zdziarski 			   M_WAITOK | M_ZERO);
87266b0663SKrzysztof Zdziarski 	if (NULL == pAdfInsts) {
88266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Failed to allocate dev instance memory\n");
89266b0663SKrzysztof Zdziarski 		return CPA_STATUS_RESOURCE;
90266b0663SKrzysztof Zdziarski 	}
91266b0663SKrzysztof Zdziarski 
92266b0663SKrzysztof Zdziarski 	num_accel_dev = 0;
93266b0663SKrzysztof Zdziarski 	status = icp_amgr_getAllAccelDevByCapabilities(accel_capability,
94266b0663SKrzysztof Zdziarski 						       pAdfInsts,
95266b0663SKrzysztof Zdziarski 						       &num_accel_dev);
96266b0663SKrzysztof Zdziarski 	if (CPA_STATUS_SUCCESS != status) {
97266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("No support for service %s\n", service);
98266b0663SKrzysztof Zdziarski 		free(pAdfInsts, M_QAT);
99266b0663SKrzysztof Zdziarski 		return status;
100266b0663SKrzysztof Zdziarski 	}
101266b0663SKrzysztof Zdziarski 
102266b0663SKrzysztof Zdziarski 	for (i = 0; i < num_accel_dev; i++) {
103266b0663SKrzysztof Zdziarski 		dev_addr = pAdfInsts[i];
104266b0663SKrzysztof Zdziarski 		if (NULL == dev_addr || NULL == dev_addr->pSalHandle) {
105266b0663SKrzysztof Zdziarski 			continue;
106266b0663SKrzysztof Zdziarski 		}
107266b0663SKrzysztof Zdziarski 		base_addr = dev_addr->pSalHandle;
108266b0663SKrzysztof Zdziarski 
109266b0663SKrzysztof Zdziarski 		if (CPA_ACC_SVC_TYPE_CRYPTO_ASYM == accelerationServiceType) {
110266b0663SKrzysztof Zdziarski 			list_temp = base_addr->asym_services;
111266b0663SKrzysztof Zdziarski 		} else {
112266b0663SKrzysztof Zdziarski 			list_temp = base_addr->sym_services;
113266b0663SKrzysztof Zdziarski 		}
114266b0663SKrzysztof Zdziarski 		while (NULL != list_temp) {
115266b0663SKrzysztof Zdziarski 			num_inst++;
116266b0663SKrzysztof Zdziarski 			list_temp = SalList_next(list_temp);
117266b0663SKrzysztof Zdziarski 		}
118266b0663SKrzysztof Zdziarski 	}
119266b0663SKrzysztof Zdziarski 
120266b0663SKrzysztof Zdziarski 	*pNumInstances = num_inst;
121266b0663SKrzysztof Zdziarski 	free(pAdfInsts, M_QAT);
122266b0663SKrzysztof Zdziarski 
123266b0663SKrzysztof Zdziarski 	return status;
124266b0663SKrzysztof Zdziarski }
125266b0663SKrzysztof Zdziarski 
126266b0663SKrzysztof Zdziarski /**
127266b0663SKrzysztof Zdziarski  ******************************************************************************
128266b0663SKrzysztof Zdziarski  * @ingroup SalCtrl
129266b0663SKrzysztof Zdziarski  * @description
130266b0663SKrzysztof Zdziarski  *   Get either sym or asym instance
131266b0663SKrzysztof Zdziarski  *****************************************************************************/
132266b0663SKrzysztof Zdziarski static CpaStatus
Lac_GetSingleCyInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U numInstances,CpaInstanceHandle * pInstances)133266b0663SKrzysztof Zdziarski Lac_GetSingleCyInstances(
134266b0663SKrzysztof Zdziarski     const CpaAccelerationServiceType accelerationServiceType,
135266b0663SKrzysztof Zdziarski     Cpa16U numInstances,
136266b0663SKrzysztof Zdziarski     CpaInstanceHandle *pInstances)
137266b0663SKrzysztof Zdziarski {
138266b0663SKrzysztof Zdziarski 	CpaStatus status = CPA_STATUS_SUCCESS;
139266b0663SKrzysztof Zdziarski 	icp_accel_dev_t **pAdfInsts = NULL;
140266b0663SKrzysztof Zdziarski 	icp_accel_dev_t *dev_addr = NULL;
141266b0663SKrzysztof Zdziarski 	sal_t *base_addr = NULL;
142266b0663SKrzysztof Zdziarski 	sal_list_t *list_temp = NULL;
143266b0663SKrzysztof Zdziarski 	Cpa16U num_accel_dev = 0;
144266b0663SKrzysztof Zdziarski 	Cpa16U num_allocated_instances = 0;
145266b0663SKrzysztof Zdziarski 	Cpa16U index = 0;
146266b0663SKrzysztof Zdziarski 	Cpa16U i = 0;
147266b0663SKrzysztof Zdziarski 	Cpa32U accel_capability = 0;
148266b0663SKrzysztof Zdziarski 	char *service = NULL;
149266b0663SKrzysztof Zdziarski 
150266b0663SKrzysztof Zdziarski 	LAC_CHECK_NULL_PARAM(pInstances);
151266b0663SKrzysztof Zdziarski 	if (0 == numInstances) {
152266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("NumInstances is 0\n");
153266b0663SKrzysztof Zdziarski 		return CPA_STATUS_INVALID_PARAM;
154266b0663SKrzysztof Zdziarski 	}
155266b0663SKrzysztof Zdziarski 
156266b0663SKrzysztof Zdziarski 	switch (accelerationServiceType) {
157266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
158266b0663SKrzysztof Zdziarski 		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
159266b0663SKrzysztof Zdziarski 		service = "asym";
160266b0663SKrzysztof Zdziarski 		break;
161266b0663SKrzysztof Zdziarski 
162266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
163266b0663SKrzysztof Zdziarski 		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
164266b0663SKrzysztof Zdziarski 		service = "sym";
165266b0663SKrzysztof Zdziarski 		break;
166266b0663SKrzysztof Zdziarski 	default:
167266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Invalid service type\n");
168266b0663SKrzysztof Zdziarski 		return CPA_STATUS_INVALID_PARAM;
169266b0663SKrzysztof Zdziarski 	}
170266b0663SKrzysztof Zdziarski 
171266b0663SKrzysztof Zdziarski 	/* Get the number of instances */
172266b0663SKrzysztof Zdziarski 	status = cpaGetNumInstances(accelerationServiceType,
173266b0663SKrzysztof Zdziarski 				    &num_allocated_instances);
174266b0663SKrzysztof Zdziarski 	if (CPA_STATUS_SUCCESS != status) {
175266b0663SKrzysztof Zdziarski 		return status;
176266b0663SKrzysztof Zdziarski 	}
177266b0663SKrzysztof Zdziarski 
178266b0663SKrzysztof Zdziarski 	if (numInstances > num_allocated_instances) {
179266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Only %d instances available\n",
180266b0663SKrzysztof Zdziarski 			      num_allocated_instances);
181266b0663SKrzysztof Zdziarski 		return CPA_STATUS_RESOURCE;
182266b0663SKrzysztof Zdziarski 	}
183266b0663SKrzysztof Zdziarski 
184266b0663SKrzysztof Zdziarski 	/* Get the number of accel devices in the system */
185266b0663SKrzysztof Zdziarski 	status = icp_amgr_getNumInstances(&num_accel_dev);
186266b0663SKrzysztof Zdziarski 	LAC_CHECK_STATUS(status);
187266b0663SKrzysztof Zdziarski 
188266b0663SKrzysztof Zdziarski 	/* Allocate memory to store addr of accel_devs */
189266b0663SKrzysztof Zdziarski 	pAdfInsts = malloc(num_accel_dev * sizeof(icp_accel_dev_t *),
190266b0663SKrzysztof Zdziarski 			   M_QAT,
191266b0663SKrzysztof Zdziarski 			   M_WAITOK | M_ZERO);
192266b0663SKrzysztof Zdziarski 	if (NULL == pAdfInsts) {
193266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Failed to allocate dev instance memory\n");
194266b0663SKrzysztof Zdziarski 		return CPA_STATUS_RESOURCE;
195266b0663SKrzysztof Zdziarski 	}
196266b0663SKrzysztof Zdziarski 
197266b0663SKrzysztof Zdziarski 	num_accel_dev = 0;
198266b0663SKrzysztof Zdziarski 	status = icp_amgr_getAllAccelDevByCapabilities(accel_capability,
199266b0663SKrzysztof Zdziarski 						       pAdfInsts,
200266b0663SKrzysztof Zdziarski 						       &num_accel_dev);
201266b0663SKrzysztof Zdziarski 	if (CPA_STATUS_SUCCESS != status) {
202266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("No support for service %s\n", service);
203266b0663SKrzysztof Zdziarski 		free(pAdfInsts, M_QAT);
204266b0663SKrzysztof Zdziarski 		return status;
205266b0663SKrzysztof Zdziarski 	}
206266b0663SKrzysztof Zdziarski 
207266b0663SKrzysztof Zdziarski 	for (i = 0; i < num_accel_dev; i++) {
208266b0663SKrzysztof Zdziarski 		dev_addr = pAdfInsts[i];
209266b0663SKrzysztof Zdziarski 		/* Note dev_addr cannot be NULL here as numInstances = 0
210266b0663SKrzysztof Zdziarski 		 * is not valid and if dev_addr = NULL then index = 0 (which
211266b0663SKrzysztof Zdziarski 		 * is less than numInstances and status is set to _RESOURCE
212266b0663SKrzysztof Zdziarski 		 * above)
213266b0663SKrzysztof Zdziarski 		 */
214266b0663SKrzysztof Zdziarski 		base_addr = dev_addr->pSalHandle;
215266b0663SKrzysztof Zdziarski 		if (NULL == base_addr) {
216266b0663SKrzysztof Zdziarski 			continue;
217266b0663SKrzysztof Zdziarski 		}
218266b0663SKrzysztof Zdziarski 
219266b0663SKrzysztof Zdziarski 		if (CPA_ACC_SVC_TYPE_CRYPTO_ASYM == accelerationServiceType)
220266b0663SKrzysztof Zdziarski 			list_temp = base_addr->asym_services;
221266b0663SKrzysztof Zdziarski 		else
222266b0663SKrzysztof Zdziarski 			list_temp = base_addr->sym_services;
223266b0663SKrzysztof Zdziarski 		while (NULL != list_temp) {
224266b0663SKrzysztof Zdziarski 			if (index > (numInstances - 1))
225266b0663SKrzysztof Zdziarski 				break;
226266b0663SKrzysztof Zdziarski 
227266b0663SKrzysztof Zdziarski 			pInstances[index] = SalList_getObject(list_temp);
228266b0663SKrzysztof Zdziarski 			list_temp = SalList_next(list_temp);
229266b0663SKrzysztof Zdziarski 			index++;
230266b0663SKrzysztof Zdziarski 		}
231266b0663SKrzysztof Zdziarski 	}
232266b0663SKrzysztof Zdziarski 	free(pAdfInsts, M_QAT);
233266b0663SKrzysztof Zdziarski 
234266b0663SKrzysztof Zdziarski 	return status;
235266b0663SKrzysztof Zdziarski }
236266b0663SKrzysztof Zdziarski 
237266b0663SKrzysztof Zdziarski /**
238266b0663SKrzysztof Zdziarski  ******************************************************************************
239266b0663SKrzysztof Zdziarski  * @ingroup SalCtrl
240266b0663SKrzysztof Zdziarski  *****************************************************************************/
241266b0663SKrzysztof Zdziarski CpaStatus
cpaGetNumInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U * pNumInstances)242266b0663SKrzysztof Zdziarski cpaGetNumInstances(const CpaAccelerationServiceType accelerationServiceType,
243266b0663SKrzysztof Zdziarski 		   Cpa16U *pNumInstances)
244266b0663SKrzysztof Zdziarski {
245266b0663SKrzysztof Zdziarski 	switch (accelerationServiceType) {
246266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
247266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
248266b0663SKrzysztof Zdziarski 		return Lac_GetSingleCyNumInstances(accelerationServiceType,
249266b0663SKrzysztof Zdziarski 						   pNumInstances);
250266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO:
251266b0663SKrzysztof Zdziarski 		return cpaCyGetNumInstances(pNumInstances);
252266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_DATA_COMPRESSION:
253266b0663SKrzysztof Zdziarski 		return cpaDcGetNumInstances(pNumInstances);
254266b0663SKrzysztof Zdziarski 
255266b0663SKrzysztof Zdziarski 	default:
256266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Invalid service type\n");
257266b0663SKrzysztof Zdziarski 		*pNumInstances = 0;
258266b0663SKrzysztof Zdziarski 		return CPA_STATUS_INVALID_PARAM;
259266b0663SKrzysztof Zdziarski 	}
260266b0663SKrzysztof Zdziarski }
261266b0663SKrzysztof Zdziarski 
262266b0663SKrzysztof Zdziarski /**
263266b0663SKrzysztof Zdziarski  ******************************************************************************
264266b0663SKrzysztof Zdziarski  * @ingroup SalCtrl
265266b0663SKrzysztof Zdziarski  *****************************************************************************/
266266b0663SKrzysztof Zdziarski CpaStatus
cpaGetInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U numInstances,CpaInstanceHandle * pInstances)267266b0663SKrzysztof Zdziarski cpaGetInstances(const CpaAccelerationServiceType accelerationServiceType,
268266b0663SKrzysztof Zdziarski 		Cpa16U numInstances,
269266b0663SKrzysztof Zdziarski 		CpaInstanceHandle *pInstances)
270266b0663SKrzysztof Zdziarski {
271266b0663SKrzysztof Zdziarski 	switch (accelerationServiceType) {
272266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
273266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
274266b0663SKrzysztof Zdziarski 		return Lac_GetSingleCyInstances(accelerationServiceType,
275266b0663SKrzysztof Zdziarski 						numInstances,
276266b0663SKrzysztof Zdziarski 						pInstances);
277266b0663SKrzysztof Zdziarski 
278266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_CRYPTO:
279266b0663SKrzysztof Zdziarski 		return cpaCyGetInstances(numInstances, pInstances);
280266b0663SKrzysztof Zdziarski 	case CPA_ACC_SVC_TYPE_DATA_COMPRESSION:
281266b0663SKrzysztof Zdziarski 		return cpaDcGetInstances(numInstances, pInstances);
282266b0663SKrzysztof Zdziarski 
283266b0663SKrzysztof Zdziarski 	default:
284266b0663SKrzysztof Zdziarski 		QAT_UTILS_LOG("Invalid service type\n");
285266b0663SKrzysztof Zdziarski 		return CPA_STATUS_INVALID_PARAM;
286266b0663SKrzysztof Zdziarski 	}
287266b0663SKrzysztof Zdziarski }
288