1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2025 Intel Corporation */
3 #include "qat_freebsd.h"
4 #include "adf_cfg.h"
5 #include "adf_common_drv.h"
6 #include "adf_accel_devices.h"
7 #include "adf_ver_dbg.h"
8 #include <sys/priv.h>
9
adf_sysctl_read_fw_versions(SYSCTL_HANDLER_ARGS)10 static int adf_sysctl_read_fw_versions(SYSCTL_HANDLER_ARGS)
11 {
12 struct adf_accel_dev *accel_dev = arg1;
13 char fw_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
14
15 if (priv_check(curthread, PRIV_DRIVER) != 0)
16 return EPERM;
17
18 if (!accel_dev)
19 return -EINVAL;
20
21 if (adf_dev_started(accel_dev))
22 snprintf(fw_version,
23 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
24 "%d.%d.%d",
25 accel_dev->fw_versions.fw_version_major,
26 accel_dev->fw_versions.fw_version_minor,
27 accel_dev->fw_versions.fw_version_patch);
28 else
29 snprintf(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
30
31 return SYSCTL_OUT(req,
32 fw_version,
33 strnlen(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
34 }
35
adf_sysctl_read_hw_versions(SYSCTL_HANDLER_ARGS)36 static int adf_sysctl_read_hw_versions(SYSCTL_HANDLER_ARGS)
37 {
38 struct adf_accel_dev *accel_dev = arg1;
39 char hw_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
40
41 if (priv_check(curthread, PRIV_DRIVER) != 0)
42 return EPERM;
43
44 if (!accel_dev)
45 return -EINVAL;
46
47 if (adf_dev_started(accel_dev))
48 snprintf(hw_version,
49 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
50 "%d",
51 accel_dev->accel_pci_dev.revid);
52 else
53 snprintf(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
54
55 return SYSCTL_OUT(req,
56 hw_version,
57 strnlen(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
58 }
59
adf_sysctl_read_mmp_versions(SYSCTL_HANDLER_ARGS)60 static int adf_sysctl_read_mmp_versions(SYSCTL_HANDLER_ARGS)
61 {
62 struct adf_accel_dev *accel_dev = arg1;
63 char mmp_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
64
65 if (priv_check(curthread, PRIV_DRIVER) != 0)
66 return EPERM;
67
68 if (!accel_dev)
69 return -EINVAL;
70
71 if (adf_dev_started(accel_dev))
72 snprintf(mmp_version,
73 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
74 "%d.%d.%d",
75 accel_dev->fw_versions.mmp_version_major,
76 accel_dev->fw_versions.mmp_version_minor,
77 accel_dev->fw_versions.mmp_version_patch);
78
79 if (adf_dev_started(accel_dev))
80 snprintf(mmp_version,
81 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
82 "%d.%d.%d",
83 accel_dev->fw_versions.mmp_version_major,
84 accel_dev->fw_versions.mmp_version_minor,
85 accel_dev->fw_versions.mmp_version_patch);
86 else
87 snprintf(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
88
89 return SYSCTL_OUT(req,
90 mmp_version,
91 strnlen(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
92 }
93
94 int
adf_ver_dbg_add(struct adf_accel_dev * accel_dev)95 adf_ver_dbg_add(struct adf_accel_dev *accel_dev)
96 {
97 struct sysctl_ctx_list *qat_sysctl_ctx;
98 struct sysctl_oid *qat_sysctl_tree;
99
100 if (!accel_dev)
101 return -EINVAL;
102
103 qat_sysctl_ctx =
104 device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
105 qat_sysctl_tree =
106 device_get_sysctl_tree(accel_dev->accel_pci_dev.pci_dev);
107
108 accel_dev->fw_version_oid =
109 SYSCTL_ADD_OID(qat_sysctl_ctx,
110 SYSCTL_CHILDREN(qat_sysctl_tree),
111 OID_AUTO,
112 "fw_version",
113 CTLTYPE_STRING | CTLFLAG_RD,
114 accel_dev,
115 0,
116 adf_sysctl_read_fw_versions,
117 "A",
118 "QAT FW version");
119 if (!accel_dev->fw_version_oid)
120 goto err;
121
122 accel_dev->hw_version_oid =
123 SYSCTL_ADD_OID(qat_sysctl_ctx,
124 SYSCTL_CHILDREN(qat_sysctl_tree),
125 OID_AUTO,
126 "hw_version",
127 CTLTYPE_STRING | CTLFLAG_RD,
128 accel_dev,
129 0,
130 adf_sysctl_read_hw_versions,
131 "A",
132 "QAT HW version");
133 if (!accel_dev->hw_version_oid)
134 goto err;
135
136 accel_dev->mmp_version_oid =
137 SYSCTL_ADD_OID(qat_sysctl_ctx,
138 SYSCTL_CHILDREN(qat_sysctl_tree),
139 OID_AUTO,
140 "mmp_version",
141 CTLTYPE_STRING | CTLFLAG_RD,
142 accel_dev,
143 0,
144 adf_sysctl_read_mmp_versions,
145 "A",
146 "QAT MMP version");
147 if (!accel_dev->mmp_version_oid)
148 goto err;
149
150 return 0;
151 err:
152 device_printf(GET_DEV(accel_dev),
153 "Failed to add firmware versions to sysctl\n");
154 return -EINVAL;
155 }
156
157 void
adf_ver_dbg_del(struct adf_accel_dev * accel_dev)158 adf_ver_dbg_del(struct adf_accel_dev *accel_dev)
159 {
160 struct sysctl_ctx_list *qat_sysctl_ctx;
161
162 if (!accel_dev)
163 return;
164
165 qat_sysctl_ctx =
166 device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
167
168 if (accel_dev->mmp_version_oid) {
169 sysctl_ctx_entry_del(qat_sysctl_ctx,
170 accel_dev->mmp_version_oid);
171 sysctl_remove_oid(accel_dev->mmp_version_oid, 1, 1);
172 accel_dev->mmp_version_oid = NULL;
173 }
174
175 if (accel_dev->hw_version_oid) {
176 sysctl_ctx_entry_del(qat_sysctl_ctx, accel_dev->hw_version_oid);
177 sysctl_remove_oid(accel_dev->hw_version_oid, 1, 1);
178 accel_dev->hw_version_oid = NULL;
179 }
180
181 if (accel_dev->fw_version_oid) {
182 sysctl_ctx_entry_del(qat_sysctl_ctx, accel_dev->fw_version_oid);
183 sysctl_remove_oid(accel_dev->fw_version_oid, 1, 1);
184 accel_dev->fw_version_oid = NULL;
185 }
186 }
187