xref: /freebsd/sys/dev/qat/qat_common/adf_freebsd_ver_dbg.c (revision 8aa51e6d7de0a828020de64560d1385e15955a1c)
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