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 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 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 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 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 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