xref: /freebsd/sys/dev/qat/qat_api/common/ctrl/sal_get_instances.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1  /* SPDX-License-Identifier: BSD-3-Clause */
2  /* Copyright(c) 2007-2022 Intel Corporation */
3  
4  /**
5   *****************************************************************************
6   * @file sal_get_instances.c
7   *
8   * @defgroup SalCtrl Service Access Layer Controller
9   *
10   * @ingroup SalCtrl
11   *
12   * @description
13   *      This file contains the main function to get SAL instances.
14   *
15   *****************************************************************************/
16  
17  /*
18  *******************************************************************************
19  * Include public/global header files
20  *******************************************************************************
21  */
22  
23  /* QAT-API includes */
24  #include "cpa.h"
25  #include "cpa_cy_common.h"
26  #include "cpa_cy_im.h"
27  #include "cpa_dc.h"
28  
29  /* ADF includes */
30  #include "icp_accel_devices.h"
31  #include "icp_adf_accel_mgr.h"
32  
33  /* SAL includes */
34  #include "lac_mem.h"
35  #include "lac_list.h"
36  #include "lac_sal_types.h"
37  
38  /**
39   ******************************************************************************
40   * @ingroup SalCtrl
41   * @description
42   *   Get either sym or asym instance number
43   *****************************************************************************/
44  static CpaStatus
Lac_GetSingleCyNumInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U * pNumInstances)45  Lac_GetSingleCyNumInstances(
46      const CpaAccelerationServiceType accelerationServiceType,
47      Cpa16U *pNumInstances)
48  {
49  	CpaStatus status = CPA_STATUS_SUCCESS;
50  	icp_accel_dev_t **pAdfInsts = NULL;
51  	icp_accel_dev_t *dev_addr = NULL;
52  	sal_t *base_addr = NULL;
53  	sal_list_t *list_temp = NULL;
54  	Cpa16U num_accel_dev = 0;
55  	Cpa16U num_inst = 0;
56  	Cpa16U i = 0;
57  	Cpa32U accel_capability = 0;
58  	char *service = NULL;
59  
60  	LAC_CHECK_NULL_PARAM(pNumInstances);
61  	*pNumInstances = 0;
62  
63  	switch (accelerationServiceType) {
64  	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
65  		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
66  		service = "asym";
67  		break;
68  
69  	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
70  		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
71  		service = "sym";
72  		break;
73  
74  	default:
75  		QAT_UTILS_LOG("Invalid service type\n");
76  		return CPA_STATUS_INVALID_PARAM;
77  	}
78  
79  	/* Get the number of accel_dev in the system */
80  	status = icp_amgr_getNumInstances(&num_accel_dev);
81  	LAC_CHECK_STATUS(status);
82  
83  	/* Allocate memory to store addr of accel_devs */
84  	pAdfInsts = malloc(num_accel_dev * sizeof(icp_accel_dev_t *),
85  			   M_QAT,
86  			   M_WAITOK | M_ZERO);
87  	if (NULL == pAdfInsts) {
88  		QAT_UTILS_LOG("Failed to allocate dev instance memory\n");
89  		return CPA_STATUS_RESOURCE;
90  	}
91  
92  	num_accel_dev = 0;
93  	status = icp_amgr_getAllAccelDevByCapabilities(accel_capability,
94  						       pAdfInsts,
95  						       &num_accel_dev);
96  	if (CPA_STATUS_SUCCESS != status) {
97  		QAT_UTILS_LOG("No support for service %s\n", service);
98  		free(pAdfInsts, M_QAT);
99  		return status;
100  	}
101  
102  	for (i = 0; i < num_accel_dev; i++) {
103  		dev_addr = pAdfInsts[i];
104  		if (NULL == dev_addr || NULL == dev_addr->pSalHandle) {
105  			continue;
106  		}
107  		base_addr = dev_addr->pSalHandle;
108  
109  		if (CPA_ACC_SVC_TYPE_CRYPTO_ASYM == accelerationServiceType) {
110  			list_temp = base_addr->asym_services;
111  		} else {
112  			list_temp = base_addr->sym_services;
113  		}
114  		while (NULL != list_temp) {
115  			num_inst++;
116  			list_temp = SalList_next(list_temp);
117  		}
118  	}
119  
120  	*pNumInstances = num_inst;
121  	free(pAdfInsts, M_QAT);
122  
123  	return status;
124  }
125  
126  /**
127   ******************************************************************************
128   * @ingroup SalCtrl
129   * @description
130   *   Get either sym or asym instance
131   *****************************************************************************/
132  static CpaStatus
Lac_GetSingleCyInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U numInstances,CpaInstanceHandle * pInstances)133  Lac_GetSingleCyInstances(
134      const CpaAccelerationServiceType accelerationServiceType,
135      Cpa16U numInstances,
136      CpaInstanceHandle *pInstances)
137  {
138  	CpaStatus status = CPA_STATUS_SUCCESS;
139  	icp_accel_dev_t **pAdfInsts = NULL;
140  	icp_accel_dev_t *dev_addr = NULL;
141  	sal_t *base_addr = NULL;
142  	sal_list_t *list_temp = NULL;
143  	Cpa16U num_accel_dev = 0;
144  	Cpa16U num_allocated_instances = 0;
145  	Cpa16U index = 0;
146  	Cpa16U i = 0;
147  	Cpa32U accel_capability = 0;
148  	char *service = NULL;
149  
150  	LAC_CHECK_NULL_PARAM(pInstances);
151  	if (0 == numInstances) {
152  		QAT_UTILS_LOG("NumInstances is 0\n");
153  		return CPA_STATUS_INVALID_PARAM;
154  	}
155  
156  	switch (accelerationServiceType) {
157  	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
158  		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
159  		service = "asym";
160  		break;
161  
162  	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
163  		accel_capability = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
164  		service = "sym";
165  		break;
166  	default:
167  		QAT_UTILS_LOG("Invalid service type\n");
168  		return CPA_STATUS_INVALID_PARAM;
169  	}
170  
171  	/* Get the number of instances */
172  	status = cpaGetNumInstances(accelerationServiceType,
173  				    &num_allocated_instances);
174  	if (CPA_STATUS_SUCCESS != status) {
175  		return status;
176  	}
177  
178  	if (numInstances > num_allocated_instances) {
179  		QAT_UTILS_LOG("Only %d instances available\n",
180  			      num_allocated_instances);
181  		return CPA_STATUS_RESOURCE;
182  	}
183  
184  	/* Get the number of accel devices in the system */
185  	status = icp_amgr_getNumInstances(&num_accel_dev);
186  	LAC_CHECK_STATUS(status);
187  
188  	/* Allocate memory to store addr of accel_devs */
189  	pAdfInsts = malloc(num_accel_dev * sizeof(icp_accel_dev_t *),
190  			   M_QAT,
191  			   M_WAITOK | M_ZERO);
192  	if (NULL == pAdfInsts) {
193  		QAT_UTILS_LOG("Failed to allocate dev instance memory\n");
194  		return CPA_STATUS_RESOURCE;
195  	}
196  
197  	num_accel_dev = 0;
198  	status = icp_amgr_getAllAccelDevByCapabilities(accel_capability,
199  						       pAdfInsts,
200  						       &num_accel_dev);
201  	if (CPA_STATUS_SUCCESS != status) {
202  		QAT_UTILS_LOG("No support for service %s\n", service);
203  		free(pAdfInsts, M_QAT);
204  		return status;
205  	}
206  
207  	for (i = 0; i < num_accel_dev; i++) {
208  		dev_addr = pAdfInsts[i];
209  		/* Note dev_addr cannot be NULL here as numInstances = 0
210  		 * is not valid and if dev_addr = NULL then index = 0 (which
211  		 * is less than numInstances and status is set to _RESOURCE
212  		 * above)
213  		 */
214  		base_addr = dev_addr->pSalHandle;
215  		if (NULL == base_addr) {
216  			continue;
217  		}
218  
219  		if (CPA_ACC_SVC_TYPE_CRYPTO_ASYM == accelerationServiceType)
220  			list_temp = base_addr->asym_services;
221  		else
222  			list_temp = base_addr->sym_services;
223  		while (NULL != list_temp) {
224  			if (index > (numInstances - 1))
225  				break;
226  
227  			pInstances[index] = SalList_getObject(list_temp);
228  			list_temp = SalList_next(list_temp);
229  			index++;
230  		}
231  	}
232  	free(pAdfInsts, M_QAT);
233  
234  	return status;
235  }
236  
237  /**
238   ******************************************************************************
239   * @ingroup SalCtrl
240   *****************************************************************************/
241  CpaStatus
cpaGetNumInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U * pNumInstances)242  cpaGetNumInstances(const CpaAccelerationServiceType accelerationServiceType,
243  		   Cpa16U *pNumInstances)
244  {
245  	switch (accelerationServiceType) {
246  	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
247  	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
248  		return Lac_GetSingleCyNumInstances(accelerationServiceType,
249  						   pNumInstances);
250  	case CPA_ACC_SVC_TYPE_CRYPTO:
251  		return cpaCyGetNumInstances(pNumInstances);
252  	case CPA_ACC_SVC_TYPE_DATA_COMPRESSION:
253  		return cpaDcGetNumInstances(pNumInstances);
254  
255  	default:
256  		QAT_UTILS_LOG("Invalid service type\n");
257  		*pNumInstances = 0;
258  		return CPA_STATUS_INVALID_PARAM;
259  	}
260  }
261  
262  /**
263   ******************************************************************************
264   * @ingroup SalCtrl
265   *****************************************************************************/
266  CpaStatus
cpaGetInstances(const CpaAccelerationServiceType accelerationServiceType,Cpa16U numInstances,CpaInstanceHandle * pInstances)267  cpaGetInstances(const CpaAccelerationServiceType accelerationServiceType,
268  		Cpa16U numInstances,
269  		CpaInstanceHandle *pInstances)
270  {
271  	switch (accelerationServiceType) {
272  	case CPA_ACC_SVC_TYPE_CRYPTO_ASYM:
273  	case CPA_ACC_SVC_TYPE_CRYPTO_SYM:
274  		return Lac_GetSingleCyInstances(accelerationServiceType,
275  						numInstances,
276  						pInstances);
277  
278  	case CPA_ACC_SVC_TYPE_CRYPTO:
279  		return cpaCyGetInstances(numInstances, pInstances);
280  	case CPA_ACC_SVC_TYPE_DATA_COMPRESSION:
281  		return cpaDcGetInstances(numInstances, pInstances);
282  
283  	default:
284  		QAT_UTILS_LOG("Invalid service type\n");
285  		return CPA_STATUS_INVALID_PARAM;
286  	}
287  }
288