1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
5 #include "qat_device.h"
6 #include "adf_transport_access_macros.h"
9 /* Hardware device information per generation */
11 struct qat_gen_hw_data qp_gen_config[] = {
14 .qp_hw_data = qat_gen1_qps,
18 .qp_hw_data = qat_gen1_qps,
19 /* gen2 has same ring layout as gen1 */
24 static struct qat_pci_device qat_pci_devices[QAT_MAX_PCI_DEVICES];
25 static int qat_nb_pci_devices;
27 int qat_sym_dev_config(__rte_unused struct rte_cryptodev *dev,
28 __rte_unused struct rte_cryptodev_config *config)
30 PMD_INIT_FUNC_TRACE();
34 int qat_sym_dev_start(__rte_unused struct rte_cryptodev *dev)
36 PMD_INIT_FUNC_TRACE();
40 void qat_sym_dev_stop(__rte_unused struct rte_cryptodev *dev)
42 PMD_INIT_FUNC_TRACE();
45 int qat_sym_dev_close(struct rte_cryptodev *dev)
49 PMD_INIT_FUNC_TRACE();
51 for (i = 0; i < dev->data->nb_queue_pairs; i++) {
52 ret = qat_sym_qp_release(dev, i);
60 void qat_sym_dev_info_get(struct rte_cryptodev *dev,
61 struct rte_cryptodev_info *info)
63 struct qat_sym_dev_private *internals = dev->data->dev_private;
64 const struct qat_qp_hw_data *sym_hw_qps =
65 qp_gen_config[internals->qat_dev->qat_dev_gen]
66 .qp_hw_data[QAT_SERVICE_SYMMETRIC];
68 PMD_INIT_FUNC_TRACE();
70 info->max_nb_queue_pairs =
71 qat_qps_per_service(sym_hw_qps, QAT_SERVICE_SYMMETRIC);
72 info->feature_flags = dev->feature_flags;
73 info->capabilities = internals->qat_dev_capabilities;
74 info->sym.max_nb_sessions = RTE_QAT_PMD_MAX_NB_SESSIONS;
75 info->driver_id = cryptodev_qat_driver_id;
76 info->pci_dev = RTE_DEV_TO_PCI(dev->device);
81 static struct qat_pci_device *
82 qat_pci_get_dev(uint8_t dev_id)
84 return &qat_pci_devices[dev_id];
87 static struct qat_pci_device *
88 qat_pci_get_named_dev(const char *name)
90 struct qat_pci_device *dev;
96 for (i = 0; i < QAT_MAX_PCI_DEVICES; i++) {
97 dev = &qat_pci_devices[i];
99 if ((dev->attached == QAT_ATTACHED) &&
100 (strcmp(dev->name, name) == 0))
108 qat_pci_find_free_device_index(void)
112 for (dev_id = 0; dev_id < QAT_MAX_PCI_DEVICES; dev_id++) {
113 if (qat_pci_devices[dev_id].attached == QAT_DETACHED)
119 struct qat_pci_device *
120 qat_get_qat_dev_from_pci_dev(struct rte_pci_device *pci_dev)
122 char name[QAT_DEV_NAME_MAX_LEN];
124 rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
126 return qat_pci_get_named_dev(name);
129 struct qat_pci_device *
130 qat_pci_device_allocate(struct rte_pci_device *pci_dev)
132 struct qat_pci_device *qat_dev;
134 char name[QAT_DEV_NAME_MAX_LEN];
136 rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
137 snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat");
138 if (qat_pci_get_named_dev(name) != NULL) {
139 PMD_DRV_LOG(ERR, "QAT device with name %s already allocated!",
144 qat_dev_id = qat_pci_find_free_device_index();
145 if (qat_dev_id == QAT_MAX_PCI_DEVICES) {
146 PMD_DRV_LOG(ERR, "Reached maximum number of QAT devices");
150 qat_dev = qat_pci_get_dev(qat_dev_id);
151 memset(qat_dev, 0, sizeof(*qat_dev));
152 snprintf(qat_dev->name, QAT_DEV_NAME_MAX_LEN, "%s", name);
153 qat_dev->qat_dev_id = qat_dev_id;
154 qat_dev->pci_dev = pci_dev;
155 switch (qat_dev->pci_dev->id.device_id) {
157 qat_dev->qat_dev_gen = QAT_GEN1;
162 qat_dev->qat_dev_gen = QAT_GEN2;
165 PMD_DRV_LOG(ERR, "Invalid dev_id, can't determine generation");
169 rte_spinlock_init(&qat_dev->arb_csr_lock);
171 qat_dev->attached = QAT_ATTACHED;
173 qat_nb_pci_devices++;
175 PMD_DRV_LOG(DEBUG, "QAT device %d allocated, name %s, total QATs %d",
176 qat_dev->qat_dev_id, qat_dev->name, qat_nb_pci_devices);
182 qat_pci_device_release(struct rte_pci_device *pci_dev)
184 struct qat_pci_device *qat_dev;
185 char name[QAT_DEV_NAME_MAX_LEN];
190 rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
191 snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat");
192 qat_dev = qat_pci_get_named_dev(name);
193 if (qat_dev != NULL) {
195 /* Check that there are no service devs still on pci device */
196 if (qat_dev->sym_dev != NULL)
199 qat_dev->attached = QAT_DETACHED;
200 qat_nb_pci_devices--;
202 PMD_DRV_LOG(DEBUG, "QAT device %s released, total QATs %d",
203 name, qat_nb_pci_devices);