@@ -227,11 +227,18 @@ qat_dev_read_config_gen1(struct qat_pci_device *qat_dev __rte_unused)
return 0;
}
+int
+qat_dev_get_extra_size_gen1(void)
+{
+ return 0;
+}
+
static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen1 = {
.qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen1,
.qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen1,
.qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen1,
.qat_dev_read_config = qat_dev_read_config_gen1,
+ .qat_dev_get_extra_size = qat_dev_get_extra_size_gen1,
};
RTE_INIT(qat_dev_gen_gen1_init)
@@ -13,6 +13,9 @@
extern const struct qat_qp_hw_data qat_gen1_qps[QAT_MAX_SERVICES]
[ADF_MAX_QPS_ON_ANY_SERVICE];
+int
+qat_dev_get_extra_size_gen1(void);
+
int
qat_qp_rings_per_service_gen1(struct qat_pci_device *qat_dev,
enum qat_service_type service);
@@ -25,6 +25,7 @@ static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen2 = {
.qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen1,
.qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen1,
.qat_dev_read_config = qat_dev_read_config_gen1,
+ .qat_dev_get_extra_size = qat_dev_get_extra_size_gen1,
};
RTE_INIT(qat_dev_gen_gen2_init)
@@ -63,6 +63,7 @@ static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen3 = {
.qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen1,
.qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen1,
.qat_dev_read_config = qat_dev_read_config_gen1,
+ .qat_dev_get_extra_size = qat_dev_get_extra_size_gen1,
};
RTE_INIT(qat_dev_gen_gen3_init)
@@ -10,9 +10,27 @@
#include "adf_transport_access_macros_gen4vf.h"
#include "adf_pf2vf_msg.h"
#include "qat_pf2vf.h"
+#include "qat_dev_gen4.h"
#include <stdint.h>
+struct qat_dev_gen4_extra {
+ struct qat_qp_hw_data qp_gen4_data[QAT_GEN4_BUNDLE_NUM]
+ [QAT_GEN4_QPS_PER_BUNDLE_NUM];
+};
+
+enum qat_service_type qat_dev4_get_qp_serv(
+ struct qat_dev_gen4_extra *dev_extra, int ring_pair)
+{
+ return dev_extra->qp_gen4_data[ring_pair][0].service_type;
+}
+
+const struct qat_qp_hw_data *qat_dev4_get_hw(
+ struct qat_dev_gen4_extra *dev_extra, int ring_pair)
+{
+ return &dev_extra->qp_gen4_data[ring_pair][0];
+}
+
static struct qat_pf2vf_dev qat_pf2vf_gen4 = {
.pf2vf_offset = ADF_4XXXIOV_PF2VM_OFFSET,
.vf2pf_offset = ADF_4XXXIOV_VM2PF_OFFSET,
@@ -38,10 +56,11 @@ qat_qp_rings_per_service_gen4(struct qat_pci_device *qat_dev,
enum qat_service_type service)
{
int i = 0, count = 0, max_ops_per_srv = 0;
+ struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
max_ops_per_srv = QAT_GEN4_BUNDLE_NUM;
for (i = 0, count = 0; i < max_ops_per_srv; i++)
- if (qat_dev->qp_gen4_data[i][0].service_type == service)
+ if (dev_extra->qp_gen4_data[i][0].service_type == service)
count++;
return count;
}
@@ -51,12 +70,13 @@ qat_dev_read_config_gen4(struct qat_pci_device *qat_dev)
{
int i = 0;
uint16_t svc = 0;
+ struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
if (qat_query_svc(qat_dev, (uint8_t *)&svc))
return -EFAULT;
for (; i < QAT_GEN4_BUNDLE_NUM; i++) {
struct qat_qp_hw_data *hw_data =
- &qat_dev->qp_gen4_data[i][0];
+ &dev_extra->qp_gen4_data[i][0];
uint8_t svc1 = (svc >> (3 * i)) & 0x7;
enum qat_service_type service_type = QAT_SERVICE_INVALID;
@@ -239,11 +259,18 @@ qat_dev_get_misc_bar_gen4(
return 0;
}
+static int
+qat_dev_get_extra_size_gen4(void)
+{
+ return sizeof(struct qat_dev_gen4_extra);
+}
+
static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen4 = {
.qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen4,
.qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen4,
.qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen4,
.qat_dev_read_config = qat_dev_read_config_gen4,
+ .qat_dev_get_extra_size = qat_dev_get_extra_size_gen4,
};
RTE_INIT(qat_dev_gen_4_init)
new file mode 100644
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2021 Intel Corporation
+ */
+
+#ifndef _QAT_DEV_GEN_H_
+#define _QAT_DEV_GEN_H_
+
+#include <stdint.h>
+
+struct qat_dev_gen4_extra;
+
+enum qat_service_type qat_dev4_get_qp_serv(
+ struct qat_dev_gen4_extra *dev_extra, int ring_pair);
+
+const struct qat_qp_hw_data *qat_dev4_get_hw(
+ struct qat_dev_gen4_extra *dev_extra, int ring_pair);
+
+#endif
@@ -9,6 +9,7 @@ endif
qat_crypto = true
qat_crypto_path = 'crypto/qat'
+qat_devs_path = 'dev'
qat_crypto_relpath = '../../' + qat_crypto_path
qat_compress = true
qat_compress_path = 'compress/qat'
@@ -59,6 +60,7 @@ includes += include_directories(
'qat_adf',
qat_crypto_relpath,
qat_compress_relpath,
+ qat_devs_path
)
if qat_compress
@@ -51,6 +51,16 @@ static const struct rte_pci_id pci_id_qat_map[] = {
{.device_id = 0},
};
+static int
+qat_pci_get_extra_size(enum qat_device_gen qat_dev_gen)
+{
+ struct qat_dev_hw_spec_funcs *ops_hw =
+ qat_dev_hw_spec[qat_dev_gen];
+ RTE_FUNC_PTR_OR_ERR_RET(ops_hw->qat_dev_get_extra_size,
+ -ENOTSUP);
+ return ops_hw->qat_dev_get_extra_size();
+}
+
static struct qat_pci_device *
qat_pci_get_named_dev(const char *name)
{
@@ -156,15 +166,38 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
struct qat_dev_cmd_param *qat_dev_cmd_param)
{
struct qat_pci_device *qat_dev;
+ enum qat_device_gen qat_dev_gen;
uint8_t qat_dev_id = 0;
char name[QAT_DEV_NAME_MAX_LEN];
struct rte_devargs *devargs = pci_dev->device.devargs;
struct qat_dev_hw_spec_funcs *ops_hw = NULL;
struct rte_mem_resource *mem_resource;
+ int extra_size;
rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat");
+ switch (pci_dev->id.device_id) {
+ case 0x0443:
+ qat_dev_gen = QAT_GEN1;
+ break;
+ case 0x37c9:
+ case 0x19e3:
+ case 0x6f55:
+ case 0x18ef:
+ qat_dev_gen = QAT_GEN2;
+ break;
+ case 0x18a1:
+ qat_dev_gen = QAT_GEN3;
+ break;
+ case 0x4941:
+ qat_dev_gen = QAT_GEN4;
+ break;
+ default:
+ QAT_LOG(ERR, "Invalid dev_id, can't determine generation");
+ return NULL;
+ }
+
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
const struct rte_memzone *mz = rte_memzone_lookup(name);
@@ -194,9 +227,15 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
QAT_LOG(ERR, "Reached maximum number of QAT devices");
return NULL;
}
-
+ extra_size = qat_pci_get_extra_size(qat_dev_gen);
+ if (extra_size < 0) {
+ QAT_LOG(ERR, "Error when acquiring extra size len QAT_%d",
+ qat_dev_id);
+ return NULL;
+ }
qat_pci_devs[qat_dev_id].mz = rte_memzone_reserve(name,
- sizeof(struct qat_pci_device),
+ sizeof(struct qat_pci_device) +
+ extra_size,
rte_socket_id(), 0);
if (qat_pci_devs[qat_dev_id].mz == NULL) {
@@ -207,30 +246,11 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
qat_dev = qat_pci_devs[qat_dev_id].mz->addr;
memset(qat_dev, 0, sizeof(*qat_dev));
+ qat_dev->dev_private = qat_dev + 1;
strlcpy(qat_dev->name, name, QAT_DEV_NAME_MAX_LEN);
qat_dev->qat_dev_id = qat_dev_id;
qat_pci_devs[qat_dev_id].pci_dev = pci_dev;
- switch (pci_dev->id.device_id) {
- case 0x0443:
- qat_dev->qat_dev_gen = QAT_GEN1;
- break;
- case 0x37c9:
- case 0x19e3:
- case 0x6f55:
- case 0x18ef:
- qat_dev->qat_dev_gen = QAT_GEN2;
- break;
- case 0x18a1:
- qat_dev->qat_dev_gen = QAT_GEN3;
- break;
- case 0x4941:
- qat_dev->qat_dev_gen = QAT_GEN4;
- break;
- default:
- QAT_LOG(ERR, "Invalid dev_id, can't determine generation");
- rte_memzone_free(qat_pci_devs[qat_dev->qat_dev_id].mz);
- return NULL;
- }
+ qat_dev->qat_dev_gen = qat_dev_gen;
ops_hw = qat_dev_hw_spec[qat_dev->qat_dev_gen];
RTE_FUNC_PTR_OR_ERR_RET(ops_hw->qat_dev_get_misc_bar, NULL);
@@ -29,12 +29,14 @@ typedef int (*qat_dev_get_misc_bar_t)
(struct rte_mem_resource **, struct rte_pci_device *);
typedef int (*qat_dev_read_config_t)
(struct qat_pci_device *);
+typedef int (*qat_dev_get_extra_size_t)(void);
struct qat_dev_hw_spec_funcs {
qat_dev_reset_ring_pairs_t qat_dev_reset_ring_pairs;
qat_dev_get_transport_bar_t qat_dev_get_transport_bar;
qat_dev_get_misc_bar_t qat_dev_get_misc_bar;
qat_dev_read_config_t qat_dev_read_config;
+ qat_dev_get_extra_size_t qat_dev_get_extra_size;
};
extern struct qat_dev_hw_spec_funcs *qat_dev_hw_spec[];
@@ -75,9 +77,6 @@ struct qat_device_info {
*/
};
-extern const struct qat_qp_hw_data qat_gen1_qps[][ADF_MAX_QPS_ON_ANY_SERVICE];
-extern const struct qat_qp_hw_data qat_gen3_qps[][ADF_MAX_QPS_ON_ANY_SERVICE];
-
extern struct qat_device_info qat_pci_devs[];
struct qat_sym_dev_private;
@@ -126,11 +125,10 @@ struct qat_pci_device {
/* Data relating to compression service */
struct qat_comp_dev_private *comp_dev;
/**< link back to compressdev private data */
- struct qat_qp_hw_data qp_gen4_data[QAT_GEN4_BUNDLE_NUM]
- [QAT_GEN4_QPS_PER_BUNDLE_NUM];
- /**< Data of ring configuration on gen4 */
void *misc_bar_io_addr;
/**< Address of misc bar */
+ void *dev_private;
+ /**< Address per generation */
};
struct qat_gen_hw_data {
@@ -38,15 +38,6 @@ struct qat_qp_hw_data {
uint16_t rx_msg_size;
};
-/**
- * Structure with data needed for creation of queue pair on gen4.
- */
-struct qat_qp_gen4_data {
- struct qat_qp_hw_data qat_qp_hw_data;
- uint8_t reserved;
- uint8_t valid;
-};
-
/**
* Structure with data needed for creation of queue pair.
*/
@@ -7,6 +7,7 @@
#include "qat_sym_pmd.h"
#include "qat_sym_session.h"
#include "qat_sym.h"
+#include "qat_dev_gen4.h"
static struct rte_cryptodev_capabilities qat_gen4_sym_capabilities[] = {
QAT_BASE_GEN4_SYM_CAPABILITIES,
@@ -18,9 +19,10 @@ qat_select_valid_queue(struct qat_pci_device *qat_dev, int qp_id,
enum qat_service_type service_type)
{
int i = 0, valid_qps = 0;
+ struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
for (; i < QAT_GEN4_BUNDLE_NUM; i++) {
- if (qat_dev->qp_gen4_data[i][0].service_type ==
+ if (qat_dev4_get_qp_serv(dev_extra, i) ==
service_type) {
if (valid_qps == qp_id)
return i;
@@ -39,6 +41,7 @@ static int qat_sym_qp_setup_gen4(struct rte_cryptodev *dev, uint16_t qp_id,
struct qat_qp_config qat_qp_conf = { };
struct qat_sym_dev_private *qat_sym_private = dev->data->dev_private;
struct qat_pci_device *qat_dev = qat_sym_private->qat_dev;
+ struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
ring_pair =
qat_select_valid_queue(qat_sym_private->qat_dev, qp_id,
@@ -50,7 +53,7 @@ static int qat_sym_qp_setup_gen4(struct rte_cryptodev *dev, uint16_t qp_id,
return -EINVAL;
}
qat_qp_conf.hw =
- &qat_dev->qp_gen4_data[ring_pair][0];
+ qat_dev4_get_hw(dev_extra, ring_pair);
ret = qat_sym_qp_setup(dev, qp_id, qp_conf, qat_qp_conf, socket_id);