178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
2c38bafeeSHareshx Sankar Raj /* Copyright(c) 2007-2025 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "qat_freebsd.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg.h"
578ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
678ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
778ee8d1cSJulian Grajkowski #include "adf_ver_dbg.h"
8*8aa51e6dSHareshx Sankar Raj #include <sys/priv.h>
978ee8d1cSJulian Grajkowski
adf_sysctl_read_fw_versions(SYSCTL_HANDLER_ARGS)1078ee8d1cSJulian Grajkowski static int adf_sysctl_read_fw_versions(SYSCTL_HANDLER_ARGS)
1178ee8d1cSJulian Grajkowski {
1278ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev = arg1;
1378ee8d1cSJulian Grajkowski char fw_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
1478ee8d1cSJulian Grajkowski
15*8aa51e6dSHareshx Sankar Raj if (priv_check(curthread, PRIV_DRIVER) != 0)
16*8aa51e6dSHareshx Sankar Raj return EPERM;
17*8aa51e6dSHareshx Sankar Raj
1878ee8d1cSJulian Grajkowski if (!accel_dev)
1978ee8d1cSJulian Grajkowski return -EINVAL;
2078ee8d1cSJulian Grajkowski
2178ee8d1cSJulian Grajkowski if (adf_dev_started(accel_dev))
2278ee8d1cSJulian Grajkowski snprintf(fw_version,
2378ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES,
2478ee8d1cSJulian Grajkowski "%d.%d.%d",
2578ee8d1cSJulian Grajkowski accel_dev->fw_versions.fw_version_major,
2678ee8d1cSJulian Grajkowski accel_dev->fw_versions.fw_version_minor,
2778ee8d1cSJulian Grajkowski accel_dev->fw_versions.fw_version_patch);
2878ee8d1cSJulian Grajkowski else
2978ee8d1cSJulian Grajkowski snprintf(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
3078ee8d1cSJulian Grajkowski
3178ee8d1cSJulian Grajkowski return SYSCTL_OUT(req,
3278ee8d1cSJulian Grajkowski fw_version,
3378ee8d1cSJulian Grajkowski strnlen(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
3478ee8d1cSJulian Grajkowski }
3578ee8d1cSJulian Grajkowski
adf_sysctl_read_hw_versions(SYSCTL_HANDLER_ARGS)3678ee8d1cSJulian Grajkowski static int adf_sysctl_read_hw_versions(SYSCTL_HANDLER_ARGS)
3778ee8d1cSJulian Grajkowski {
3878ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev = arg1;
3978ee8d1cSJulian Grajkowski char hw_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
4078ee8d1cSJulian Grajkowski
41*8aa51e6dSHareshx Sankar Raj if (priv_check(curthread, PRIV_DRIVER) != 0)
42*8aa51e6dSHareshx Sankar Raj return EPERM;
43*8aa51e6dSHareshx Sankar Raj
4478ee8d1cSJulian Grajkowski if (!accel_dev)
4578ee8d1cSJulian Grajkowski return -EINVAL;
4678ee8d1cSJulian Grajkowski
4778ee8d1cSJulian Grajkowski if (adf_dev_started(accel_dev))
4878ee8d1cSJulian Grajkowski snprintf(hw_version,
4978ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES,
5078ee8d1cSJulian Grajkowski "%d",
5178ee8d1cSJulian Grajkowski accel_dev->accel_pci_dev.revid);
5278ee8d1cSJulian Grajkowski else
5378ee8d1cSJulian Grajkowski snprintf(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
5478ee8d1cSJulian Grajkowski
5578ee8d1cSJulian Grajkowski return SYSCTL_OUT(req,
5678ee8d1cSJulian Grajkowski hw_version,
5778ee8d1cSJulian Grajkowski strnlen(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
5878ee8d1cSJulian Grajkowski }
5978ee8d1cSJulian Grajkowski
adf_sysctl_read_mmp_versions(SYSCTL_HANDLER_ARGS)6078ee8d1cSJulian Grajkowski static int adf_sysctl_read_mmp_versions(SYSCTL_HANDLER_ARGS)
6178ee8d1cSJulian Grajkowski {
6278ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev = arg1;
6378ee8d1cSJulian Grajkowski char mmp_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
6478ee8d1cSJulian Grajkowski
65*8aa51e6dSHareshx Sankar Raj if (priv_check(curthread, PRIV_DRIVER) != 0)
66*8aa51e6dSHareshx Sankar Raj return EPERM;
67*8aa51e6dSHareshx Sankar Raj
6878ee8d1cSJulian Grajkowski if (!accel_dev)
6978ee8d1cSJulian Grajkowski return -EINVAL;
7078ee8d1cSJulian Grajkowski
7178ee8d1cSJulian Grajkowski if (adf_dev_started(accel_dev))
7278ee8d1cSJulian Grajkowski snprintf(mmp_version,
7378ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES,
7478ee8d1cSJulian Grajkowski "%d.%d.%d",
7578ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_major,
7678ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_minor,
7778ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_patch);
7878ee8d1cSJulian Grajkowski
7978ee8d1cSJulian Grajkowski if (adf_dev_started(accel_dev))
8078ee8d1cSJulian Grajkowski snprintf(mmp_version,
8178ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES,
8278ee8d1cSJulian Grajkowski "%d.%d.%d",
8378ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_major,
8478ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_minor,
8578ee8d1cSJulian Grajkowski accel_dev->fw_versions.mmp_version_patch);
8678ee8d1cSJulian Grajkowski else
8778ee8d1cSJulian Grajkowski snprintf(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
8878ee8d1cSJulian Grajkowski
8978ee8d1cSJulian Grajkowski return SYSCTL_OUT(req,
9078ee8d1cSJulian Grajkowski mmp_version,
9178ee8d1cSJulian Grajkowski strnlen(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
9278ee8d1cSJulian Grajkowski }
9378ee8d1cSJulian Grajkowski
9478ee8d1cSJulian Grajkowski int
adf_ver_dbg_add(struct adf_accel_dev * accel_dev)9578ee8d1cSJulian Grajkowski adf_ver_dbg_add(struct adf_accel_dev *accel_dev)
9678ee8d1cSJulian Grajkowski {
9778ee8d1cSJulian Grajkowski struct sysctl_ctx_list *qat_sysctl_ctx;
9878ee8d1cSJulian Grajkowski struct sysctl_oid *qat_sysctl_tree;
9978ee8d1cSJulian Grajkowski
10078ee8d1cSJulian Grajkowski if (!accel_dev)
10178ee8d1cSJulian Grajkowski return -EINVAL;
10278ee8d1cSJulian Grajkowski
10378ee8d1cSJulian Grajkowski qat_sysctl_ctx =
10478ee8d1cSJulian Grajkowski device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
10578ee8d1cSJulian Grajkowski qat_sysctl_tree =
10678ee8d1cSJulian Grajkowski device_get_sysctl_tree(accel_dev->accel_pci_dev.pci_dev);
10778ee8d1cSJulian Grajkowski
108c38bafeeSHareshx Sankar Raj accel_dev->fw_version_oid =
109c38bafeeSHareshx Sankar Raj SYSCTL_ADD_OID(qat_sysctl_ctx,
11078ee8d1cSJulian Grajkowski SYSCTL_CHILDREN(qat_sysctl_tree),
11178ee8d1cSJulian Grajkowski OID_AUTO,
11278ee8d1cSJulian Grajkowski "fw_version",
11378ee8d1cSJulian Grajkowski CTLTYPE_STRING | CTLFLAG_RD,
11478ee8d1cSJulian Grajkowski accel_dev,
11578ee8d1cSJulian Grajkowski 0,
11678ee8d1cSJulian Grajkowski adf_sysctl_read_fw_versions,
11778ee8d1cSJulian Grajkowski "A",
11878ee8d1cSJulian Grajkowski "QAT FW version");
119c38bafeeSHareshx Sankar Raj if (!accel_dev->fw_version_oid)
12078ee8d1cSJulian Grajkowski goto err;
12178ee8d1cSJulian Grajkowski
122c38bafeeSHareshx Sankar Raj accel_dev->hw_version_oid =
123c38bafeeSHareshx Sankar Raj SYSCTL_ADD_OID(qat_sysctl_ctx,
12478ee8d1cSJulian Grajkowski SYSCTL_CHILDREN(qat_sysctl_tree),
12578ee8d1cSJulian Grajkowski OID_AUTO,
12678ee8d1cSJulian Grajkowski "hw_version",
12778ee8d1cSJulian Grajkowski CTLTYPE_STRING | CTLFLAG_RD,
12878ee8d1cSJulian Grajkowski accel_dev,
12978ee8d1cSJulian Grajkowski 0,
13078ee8d1cSJulian Grajkowski adf_sysctl_read_hw_versions,
13178ee8d1cSJulian Grajkowski "A",
13278ee8d1cSJulian Grajkowski "QAT HW version");
133c38bafeeSHareshx Sankar Raj if (!accel_dev->hw_version_oid)
13478ee8d1cSJulian Grajkowski goto err;
13578ee8d1cSJulian Grajkowski
136c38bafeeSHareshx Sankar Raj accel_dev->mmp_version_oid =
137c38bafeeSHareshx Sankar Raj SYSCTL_ADD_OID(qat_sysctl_ctx,
13878ee8d1cSJulian Grajkowski SYSCTL_CHILDREN(qat_sysctl_tree),
13978ee8d1cSJulian Grajkowski OID_AUTO,
14078ee8d1cSJulian Grajkowski "mmp_version",
14178ee8d1cSJulian Grajkowski CTLTYPE_STRING | CTLFLAG_RD,
14278ee8d1cSJulian Grajkowski accel_dev,
14378ee8d1cSJulian Grajkowski 0,
14478ee8d1cSJulian Grajkowski adf_sysctl_read_mmp_versions,
14578ee8d1cSJulian Grajkowski "A",
14678ee8d1cSJulian Grajkowski "QAT MMP version");
147c38bafeeSHareshx Sankar Raj if (!accel_dev->mmp_version_oid)
14878ee8d1cSJulian Grajkowski goto err;
14978ee8d1cSJulian Grajkowski
15078ee8d1cSJulian Grajkowski return 0;
15178ee8d1cSJulian Grajkowski err:
15278ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
15378ee8d1cSJulian Grajkowski "Failed to add firmware versions to sysctl\n");
15478ee8d1cSJulian Grajkowski return -EINVAL;
15578ee8d1cSJulian Grajkowski }
15678ee8d1cSJulian Grajkowski
15778ee8d1cSJulian Grajkowski void
adf_ver_dbg_del(struct adf_accel_dev * accel_dev)15878ee8d1cSJulian Grajkowski adf_ver_dbg_del(struct adf_accel_dev *accel_dev)
15978ee8d1cSJulian Grajkowski {
160c38bafeeSHareshx Sankar Raj struct sysctl_ctx_list *qat_sysctl_ctx;
161c38bafeeSHareshx Sankar Raj
162c38bafeeSHareshx Sankar Raj if (!accel_dev)
163c38bafeeSHareshx Sankar Raj return;
164c38bafeeSHareshx Sankar Raj
165c38bafeeSHareshx Sankar Raj qat_sysctl_ctx =
166c38bafeeSHareshx Sankar Raj device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
167c38bafeeSHareshx Sankar Raj
168c38bafeeSHareshx Sankar Raj if (accel_dev->mmp_version_oid) {
169c38bafeeSHareshx Sankar Raj sysctl_ctx_entry_del(qat_sysctl_ctx,
170c38bafeeSHareshx Sankar Raj accel_dev->mmp_version_oid);
171c38bafeeSHareshx Sankar Raj sysctl_remove_oid(accel_dev->mmp_version_oid, 1, 1);
172c38bafeeSHareshx Sankar Raj accel_dev->mmp_version_oid = NULL;
173c38bafeeSHareshx Sankar Raj }
174c38bafeeSHareshx Sankar Raj
175c38bafeeSHareshx Sankar Raj if (accel_dev->hw_version_oid) {
176c38bafeeSHareshx Sankar Raj sysctl_ctx_entry_del(qat_sysctl_ctx, accel_dev->hw_version_oid);
177c38bafeeSHareshx Sankar Raj sysctl_remove_oid(accel_dev->hw_version_oid, 1, 1);
178c38bafeeSHareshx Sankar Raj accel_dev->hw_version_oid = NULL;
179c38bafeeSHareshx Sankar Raj }
180c38bafeeSHareshx Sankar Raj
181c38bafeeSHareshx Sankar Raj if (accel_dev->fw_version_oid) {
182c38bafeeSHareshx Sankar Raj sysctl_ctx_entry_del(qat_sysctl_ctx, accel_dev->fw_version_oid);
183c38bafeeSHareshx Sankar Raj sysctl_remove_oid(accel_dev->fw_version_oid, 1, 1);
184c38bafeeSHareshx Sankar Raj accel_dev->fw_version_oid = NULL;
185c38bafeeSHareshx Sankar Raj }
18678ee8d1cSJulian Grajkowski }
187