xref: /freebsd/sys/dev/qat/qat_api/common/utils/sal_versions.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1*78ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
2*78ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
3*78ee8d1cSJulian Grajkowski /**
4*78ee8d1cSJulian Grajkowski  *****************************************************************************
5*78ee8d1cSJulian Grajkowski  * @file sal_versions.c
6*78ee8d1cSJulian Grajkowski  *
7*78ee8d1cSJulian Grajkowski  * @ingroup SalVersions
8*78ee8d1cSJulian Grajkowski  *
9*78ee8d1cSJulian Grajkowski  * @description
10*78ee8d1cSJulian Grajkowski  *    This file contains implementation of functions used to obtain version
11*78ee8d1cSJulian Grajkowski  *    information
12*78ee8d1cSJulian Grajkowski  *
13*78ee8d1cSJulian Grajkowski  *****************************************************************************/
14*78ee8d1cSJulian Grajkowski 
15*78ee8d1cSJulian Grajkowski #include "cpa.h"
16*78ee8d1cSJulian Grajkowski #include "qat_utils.h"
17*78ee8d1cSJulian Grajkowski 
18*78ee8d1cSJulian Grajkowski #include "icp_accel_devices.h"
19*78ee8d1cSJulian Grajkowski #include "icp_adf_accel_mgr.h"
20*78ee8d1cSJulian Grajkowski #include "icp_adf_cfg.h"
21*78ee8d1cSJulian Grajkowski 
22*78ee8d1cSJulian Grajkowski #include "lac_common.h"
23*78ee8d1cSJulian Grajkowski 
24*78ee8d1cSJulian Grajkowski #include "icp_sal_versions.h"
25*78ee8d1cSJulian Grajkowski 
26*78ee8d1cSJulian Grajkowski #define ICP_SAL_VERSIONS_ALL_CAP_MASK 0xFFFFFFFF
27*78ee8d1cSJulian Grajkowski /**< Mask used to get all devices from ADF */
28*78ee8d1cSJulian Grajkowski 
29*78ee8d1cSJulian Grajkowski /**
30*78ee8d1cSJulian Grajkowski *******************************************************************************
31*78ee8d1cSJulian Grajkowski  * @ingroup SalVersions
32*78ee8d1cSJulian Grajkowski  *      Fills in the version info structure
33*78ee8d1cSJulian Grajkowski  * @description
34*78ee8d1cSJulian Grajkowski  *      This function obtains hardware and software information associated with
35*78ee8d1cSJulian Grajkowski  *      a given device and fills in the version info structure
36*78ee8d1cSJulian Grajkowski  *
37*78ee8d1cSJulian Grajkowski  * @param[in]   device      Pointer to the device for which version information
38*78ee8d1cSJulian Grajkowski  *                          is to be obtained.
39*78ee8d1cSJulian Grajkowski  * @param[out]  pVerInfo    Pointer to a structure that will hold version
40*78ee8d1cSJulian Grajkowski  *                          information
41*78ee8d1cSJulian Grajkowski  *
42*78ee8d1cSJulian Grajkowski  * @context
43*78ee8d1cSJulian Grajkowski  *      This function might sleep. It cannot be executed in a context that
44*78ee8d1cSJulian Grajkowski  *      does not permit sleeping.
45*78ee8d1cSJulian Grajkowski  * @assumptions
46*78ee8d1cSJulian Grajkowski  *      The system has been started
47*78ee8d1cSJulian Grajkowski  * @sideEffects
48*78ee8d1cSJulian Grajkowski  *      None
49*78ee8d1cSJulian Grajkowski  * @blocking
50*78ee8d1cSJulian Grajkowski  *      No
51*78ee8d1cSJulian Grajkowski  * @reentrant
52*78ee8d1cSJulian Grajkowski  *      No
53*78ee8d1cSJulian Grajkowski  * @threadSafe
54*78ee8d1cSJulian Grajkowski  *      Yes
55*78ee8d1cSJulian Grajkowski  *
56*78ee8d1cSJulian Grajkowski  * @return CPA_STATUS_SUCCESS       Operation finished successfully
57*78ee8d1cSJulian Grajkowski  * @return CPA_STATUS_FAIL          Operation failed
58*78ee8d1cSJulian Grajkowski  *
59*78ee8d1cSJulian Grajkowski  *****************************************************************************/
60*78ee8d1cSJulian Grajkowski static CpaStatus
SalVersions_FillVersionInfo(icp_accel_dev_t * device,icp_sal_dev_version_info_t * pVerInfo)61*78ee8d1cSJulian Grajkowski SalVersions_FillVersionInfo(icp_accel_dev_t *device,
62*78ee8d1cSJulian Grajkowski 			    icp_sal_dev_version_info_t *pVerInfo)
63*78ee8d1cSJulian Grajkowski {
64*78ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
65*78ee8d1cSJulian Grajkowski 	char param_value[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
66*78ee8d1cSJulian Grajkowski 	Cpa32S strSize = 0;
67*78ee8d1cSJulian Grajkowski 
68*78ee8d1cSJulian Grajkowski 	memset(pVerInfo, 0, sizeof(icp_sal_dev_version_info_t));
69*78ee8d1cSJulian Grajkowski 	pVerInfo->devId = device->accelId;
70*78ee8d1cSJulian Grajkowski 
71*78ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
72*78ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
73*78ee8d1cSJulian Grajkowski 					  ICP_CFG_HW_REV_ID_KEY,
74*78ee8d1cSJulian Grajkowski 					  param_value);
75*78ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
76*78ee8d1cSJulian Grajkowski 
77*78ee8d1cSJulian Grajkowski 	strSize = snprintf((char *)pVerInfo->hardwareVersion,
78*78ee8d1cSJulian Grajkowski 			   ICP_SAL_VERSIONS_HW_VERSION_SIZE,
79*78ee8d1cSJulian Grajkowski 			   "%s",
80*78ee8d1cSJulian Grajkowski 			   param_value);
81*78ee8d1cSJulian Grajkowski 	LAC_CHECK_PARAM_RANGE(strSize, 1, ICP_SAL_VERSIONS_HW_VERSION_SIZE);
82*78ee8d1cSJulian Grajkowski 
83*78ee8d1cSJulian Grajkowski 	memset(param_value, 0, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
84*78ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
85*78ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
86*78ee8d1cSJulian Grajkowski 					  ICP_CFG_UOF_VER_KEY,
87*78ee8d1cSJulian Grajkowski 					  param_value);
88*78ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
89*78ee8d1cSJulian Grajkowski 
90*78ee8d1cSJulian Grajkowski 	strSize = snprintf((char *)pVerInfo->firmwareVersion,
91*78ee8d1cSJulian Grajkowski 			   ICP_SAL_VERSIONS_FW_VERSION_SIZE,
92*78ee8d1cSJulian Grajkowski 			   "%s",
93*78ee8d1cSJulian Grajkowski 			   param_value);
94*78ee8d1cSJulian Grajkowski 	LAC_CHECK_PARAM_RANGE(strSize, 1, ICP_SAL_VERSIONS_FW_VERSION_SIZE);
95*78ee8d1cSJulian Grajkowski 
96*78ee8d1cSJulian Grajkowski 	memset(param_value, 0, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
97*78ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
98*78ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
99*78ee8d1cSJulian Grajkowski 					  ICP_CFG_MMP_VER_KEY,
100*78ee8d1cSJulian Grajkowski 					  param_value);
101*78ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
102*78ee8d1cSJulian Grajkowski 
103*78ee8d1cSJulian Grajkowski 	strSize = snprintf((char *)pVerInfo->mmpVersion,
104*78ee8d1cSJulian Grajkowski 			   ICP_SAL_VERSIONS_MMP_VERSION_SIZE,
105*78ee8d1cSJulian Grajkowski 			   "%s",
106*78ee8d1cSJulian Grajkowski 			   param_value);
107*78ee8d1cSJulian Grajkowski 	LAC_CHECK_PARAM_RANGE(strSize, 1, ICP_SAL_VERSIONS_MMP_VERSION_SIZE);
108*78ee8d1cSJulian Grajkowski 
109*78ee8d1cSJulian Grajkowski 	snprintf((char *)pVerInfo->softwareVersion,
110*78ee8d1cSJulian Grajkowski 		 ICP_SAL_VERSIONS_SW_VERSION_SIZE,
111*78ee8d1cSJulian Grajkowski 		 "%d.%d.%d",
112*78ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER,
113*78ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER,
114*78ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_PATCH_NUMBER);
115*78ee8d1cSJulian Grajkowski 
116*78ee8d1cSJulian Grajkowski 	return status;
117*78ee8d1cSJulian Grajkowski }
118*78ee8d1cSJulian Grajkowski 
119*78ee8d1cSJulian Grajkowski CpaStatus
icp_sal_getDevVersionInfo(Cpa32U devId,icp_sal_dev_version_info_t * pVerInfo)120*78ee8d1cSJulian Grajkowski icp_sal_getDevVersionInfo(Cpa32U devId, icp_sal_dev_version_info_t *pVerInfo)
121*78ee8d1cSJulian Grajkowski {
122*78ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
123*78ee8d1cSJulian Grajkowski 	Cpa16U numInstances = 0;
124*78ee8d1cSJulian Grajkowski 	icp_accel_dev_t **pAccel_dev = NULL;
125*78ee8d1cSJulian Grajkowski 	Cpa16U num_accel_dev = 0, index = 0;
126*78ee8d1cSJulian Grajkowski 	icp_accel_dev_t *pDevice = NULL;
127*78ee8d1cSJulian Grajkowski 
128*78ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pVerInfo);
129*78ee8d1cSJulian Grajkowski 
130*78ee8d1cSJulian Grajkowski 	status = icp_amgr_getNumInstances(&numInstances);
131*78ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
132*78ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Error while getting number of devices.\n");
133*78ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
134*78ee8d1cSJulian Grajkowski 	}
135*78ee8d1cSJulian Grajkowski 
136*78ee8d1cSJulian Grajkowski 	if (devId >= ADF_MAX_DEVICES) {
137*78ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid devId\n");
138*78ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
139*78ee8d1cSJulian Grajkowski 	}
140*78ee8d1cSJulian Grajkowski 
141*78ee8d1cSJulian Grajkowski 	pAccel_dev =
142*78ee8d1cSJulian Grajkowski 	    malloc(numInstances * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
143*78ee8d1cSJulian Grajkowski 
144*78ee8d1cSJulian Grajkowski 	/* Get ADF to return all accel_devs */
145*78ee8d1cSJulian Grajkowski 	status =
146*78ee8d1cSJulian Grajkowski 	    icp_amgr_getAllAccelDevByCapabilities(ICP_SAL_VERSIONS_ALL_CAP_MASK,
147*78ee8d1cSJulian Grajkowski 						  pAccel_dev,
148*78ee8d1cSJulian Grajkowski 						  &num_accel_dev);
149*78ee8d1cSJulian Grajkowski 
150*78ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
151*78ee8d1cSJulian Grajkowski 		for (index = 0; index < num_accel_dev; index++) {
152*78ee8d1cSJulian Grajkowski 			pDevice = (icp_accel_dev_t *)pAccel_dev[index];
153*78ee8d1cSJulian Grajkowski 
154*78ee8d1cSJulian Grajkowski 			if (pDevice->accelId == devId) {
155*78ee8d1cSJulian Grajkowski 				status = SalVersions_FillVersionInfo(pDevice,
156*78ee8d1cSJulian Grajkowski 								     pVerInfo);
157*78ee8d1cSJulian Grajkowski 				if (CPA_STATUS_SUCCESS != status) {
158*78ee8d1cSJulian Grajkowski 					QAT_UTILS_LOG(
159*78ee8d1cSJulian Grajkowski 					    "Error while filling in version info.\n");
160*78ee8d1cSJulian Grajkowski 				}
161*78ee8d1cSJulian Grajkowski 				break;
162*78ee8d1cSJulian Grajkowski 			}
163*78ee8d1cSJulian Grajkowski 		}
164*78ee8d1cSJulian Grajkowski 
165*78ee8d1cSJulian Grajkowski 		if (index == num_accel_dev) {
166*78ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG("Device %d not found or not started.\n",
167*78ee8d1cSJulian Grajkowski 				      devId);
168*78ee8d1cSJulian Grajkowski 			status = CPA_STATUS_FAIL;
169*78ee8d1cSJulian Grajkowski 		}
170*78ee8d1cSJulian Grajkowski 	} else {
171*78ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Error while getting devices.\n");
172*78ee8d1cSJulian Grajkowski 	}
173*78ee8d1cSJulian Grajkowski 
174*78ee8d1cSJulian Grajkowski 	free(pAccel_dev, M_QAT);
175*78ee8d1cSJulian Grajkowski 	return status;
176*78ee8d1cSJulian Grajkowski }
177