1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 #include "qat_freebsd.h"
5 #include "adf_cfg.h"
6 #include "adf_common_drv.h"
7 #include "adf_accel_devices.h"
8 #include "adf_ver_dbg.h"
9 
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 (!accel_dev)
16 		return -EINVAL;
17 
18 	if (adf_dev_started(accel_dev))
19 		snprintf(fw_version,
20 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
21 			 "%d.%d.%d",
22 			 accel_dev->fw_versions.fw_version_major,
23 			 accel_dev->fw_versions.fw_version_minor,
24 			 accel_dev->fw_versions.fw_version_patch);
25 	else
26 		snprintf(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
27 
28 	return SYSCTL_OUT(req,
29 			  fw_version,
30 			  strnlen(fw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
31 }
32 
33 static int adf_sysctl_read_hw_versions(SYSCTL_HANDLER_ARGS)
34 {
35 	struct adf_accel_dev *accel_dev = arg1;
36 	char hw_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
37 
38 	if (!accel_dev)
39 		return -EINVAL;
40 
41 	if (adf_dev_started(accel_dev))
42 		snprintf(hw_version,
43 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
44 			 "%d",
45 			 accel_dev->accel_pci_dev.revid);
46 	else
47 		snprintf(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
48 
49 	return SYSCTL_OUT(req,
50 			  hw_version,
51 			  strnlen(hw_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
52 }
53 
54 static int adf_sysctl_read_mmp_versions(SYSCTL_HANDLER_ARGS)
55 {
56 	struct adf_accel_dev *accel_dev = arg1;
57 	char mmp_version[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
58 
59 	if (!accel_dev)
60 		return -EINVAL;
61 
62 	if (adf_dev_started(accel_dev))
63 		snprintf(mmp_version,
64 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
65 			 "%d.%d.%d",
66 			 accel_dev->fw_versions.mmp_version_major,
67 			 accel_dev->fw_versions.mmp_version_minor,
68 			 accel_dev->fw_versions.mmp_version_patch);
69 
70 	if (adf_dev_started(accel_dev))
71 		snprintf(mmp_version,
72 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
73 			 "%d.%d.%d",
74 			 accel_dev->fw_versions.mmp_version_major,
75 			 accel_dev->fw_versions.mmp_version_minor,
76 			 accel_dev->fw_versions.mmp_version_patch);
77 	else
78 		snprintf(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES, "");
79 
80 	return SYSCTL_OUT(req,
81 			  mmp_version,
82 			  strnlen(mmp_version, ADF_CFG_MAX_VAL_LEN_IN_BYTES));
83 }
84 
85 int
86 adf_ver_dbg_add(struct adf_accel_dev *accel_dev)
87 {
88 	struct sysctl_ctx_list *qat_sysctl_ctx;
89 	struct sysctl_oid *qat_sysctl_tree;
90 	struct sysctl_oid *rc = 0;
91 
92 	if (!accel_dev)
93 		return -EINVAL;
94 
95 	qat_sysctl_ctx =
96 	    device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
97 	qat_sysctl_tree =
98 	    device_get_sysctl_tree(accel_dev->accel_pci_dev.pci_dev);
99 
100 	rc = SYSCTL_ADD_OID(qat_sysctl_ctx,
101 			    SYSCTL_CHILDREN(qat_sysctl_tree),
102 			    OID_AUTO,
103 			    "fw_version",
104 			    CTLTYPE_STRING | CTLFLAG_RD,
105 			    accel_dev,
106 			    0,
107 			    adf_sysctl_read_fw_versions,
108 			    "A",
109 			    "QAT FW version");
110 	if (!rc)
111 		goto err;
112 
113 	rc = SYSCTL_ADD_OID(qat_sysctl_ctx,
114 			    SYSCTL_CHILDREN(qat_sysctl_tree),
115 			    OID_AUTO,
116 			    "hw_version",
117 			    CTLTYPE_STRING | CTLFLAG_RD,
118 			    accel_dev,
119 			    0,
120 			    adf_sysctl_read_hw_versions,
121 			    "A",
122 			    "QAT HW version");
123 	if (!rc)
124 		goto err;
125 
126 	rc = SYSCTL_ADD_OID(qat_sysctl_ctx,
127 			    SYSCTL_CHILDREN(qat_sysctl_tree),
128 			    OID_AUTO,
129 			    "mmp_version",
130 			    CTLTYPE_STRING | CTLFLAG_RD,
131 			    accel_dev,
132 			    0,
133 			    adf_sysctl_read_mmp_versions,
134 			    "A",
135 			    "QAT MMP version");
136 	if (!rc)
137 		goto err;
138 
139 	return 0;
140 err:
141 	device_printf(GET_DEV(accel_dev),
142 		      "Failed to add firmware versions to sysctl\n");
143 	return -EINVAL;
144 }
145 
146 void
147 adf_ver_dbg_del(struct adf_accel_dev *accel_dev)
148 {
149 }
150