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