diff options
Diffstat (limited to 'drivers/common/qat')
-rw-r--r-- | drivers/common/qat/qat_common.h | 3 | ||||
-rw-r--r-- | drivers/common/qat/qat_device.c | 60 | ||||
-rw-r--r-- | drivers/common/qat/qat_device.h | 12 | ||||
-rw-r--r-- | drivers/common/qat/qat_qp.c | 48 | ||||
-rw-r--r-- | drivers/common/qat/qat_qp.h | 1 |
5 files changed, 104 insertions, 20 deletions
diff --git a/drivers/common/qat/qat_common.h b/drivers/common/qat/qat_common.h index d4bef539..de9a3ba5 100644 --- a/drivers/common/qat/qat_common.h +++ b/drivers/common/qat/qat_common.h @@ -17,7 +17,8 @@ */ enum qat_device_gen { QAT_GEN1 = 1, - QAT_GEN2 + QAT_GEN2, + QAT_GEN3 }; enum qat_service_type { diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_device.c index f32d7235..2a1cf3e1 100644 --- a/drivers/common/qat/qat_device.c +++ b/drivers/common/qat/qat_device.c @@ -7,6 +7,7 @@ #include "qat_device.h" #include "adf_transport_access_macros.h" #include "qat_sym_pmd.h" +#include "qat_comp_pmd.h" /* Hardware device information per generation */ __extension__ @@ -14,11 +15,18 @@ struct qat_gen_hw_data qat_gen_config[] = { [QAT_GEN1] = { .dev_gen = QAT_GEN1, .qp_hw_data = qat_gen1_qps, + .comp_num_im_bufs_required = QAT_NUM_INTERM_BUFS_GEN1 }, [QAT_GEN2] = { .dev_gen = QAT_GEN2, .qp_hw_data = qat_gen1_qps, /* gen2 has same ring layout as gen1 */ + .comp_num_im_bufs_required = QAT_NUM_INTERM_BUFS_GEN2 + }, + [QAT_GEN3] = { + .dev_gen = QAT_GEN3, + .qp_hw_data = qat_gen3_qps, + .comp_num_im_bufs_required = QAT_NUM_INTERM_BUFS_GEN3 }, }; @@ -43,10 +51,12 @@ static const struct rte_pci_id pci_id_qat_map[] = { { RTE_PCI_DEVICE(0x8086, 0x6f55), }, + { + RTE_PCI_DEVICE(0x8086, 0x18a1), + }, {.device_id = 0}, }; - static struct qat_pci_device * qat_pci_get_dev(uint8_t dev_id) { @@ -130,6 +140,9 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev) case 0x6f55: qat_dev->qat_dev_gen = QAT_GEN2; break; + case 0x18a1: + qat_dev->qat_dev_gen = QAT_GEN3; + break; default: QAT_LOG(ERR, "Invalid dev_id, can't determine generation"); return NULL; @@ -187,6 +200,7 @@ static int qat_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev) { int ret = 0; + int num_pmds_created = 0; struct qat_pci_device *qat_pci_dev; QAT_LOG(DEBUG, "Found QAT device at %02x:%02x.%x", @@ -199,23 +213,33 @@ static int qat_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return -ENODEV; ret = qat_sym_dev_create(qat_pci_dev); - if (ret != 0) - goto error_out; + if (ret == 0) + num_pmds_created++; + else + QAT_LOG(WARNING, + "Failed to create QAT SYM PMD on device %s", + qat_pci_dev->name); ret = qat_comp_dev_create(qat_pci_dev); - if (ret != 0) - goto error_out; + if (ret == 0) + num_pmds_created++; + else + QAT_LOG(WARNING, + "Failed to create QAT COMP PMD on device %s", + qat_pci_dev->name); ret = qat_asym_dev_create(qat_pci_dev); - if (ret != 0) - goto error_out; - - return 0; + if (ret == 0) + num_pmds_created++; + else + QAT_LOG(WARNING, + "Failed to create QAT ASYM PMD on device %s", + qat_pci_dev->name); -error_out: - qat_pci_dev_destroy(qat_pci_dev, pci_dev); - return ret; + if (num_pmds_created == 0) + qat_pci_dev_destroy(qat_pci_dev, pci_dev); + return 0; } static int qat_pci_remove(struct rte_pci_device *pci_dev) @@ -239,37 +263,37 @@ static struct rte_pci_driver rte_qat_pmd = { .remove = qat_pci_remove }; -__attribute__((weak)) int +__rte_weak int qat_sym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; } -__attribute__((weak)) int +__rte_weak int qat_asym_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; } -__attribute__((weak)) int +__rte_weak int qat_sym_dev_destroy(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; } -__attribute__((weak)) int +__rte_weak int qat_asym_dev_destroy(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; } -__attribute__((weak)) int +__rte_weak int qat_comp_dev_create(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; } -__attribute__((weak)) int +__rte_weak int qat_comp_dev_destroy(struct qat_pci_device *qat_pci_dev __rte_unused) { return 0; diff --git a/drivers/common/qat/qat_device.h b/drivers/common/qat/qat_device.h index 9599fc59..eb81c78f 100644 --- a/drivers/common/qat/qat_device.h +++ b/drivers/common/qat/qat_device.h @@ -16,6 +16,12 @@ #define QAT_DEV_NAME_MAX_LEN 64 +enum qat_comp_num_im_buffers { + QAT_NUM_INTERM_BUFS_GEN1 = 12, + QAT_NUM_INTERM_BUFS_GEN2 = 20, + QAT_NUM_INTERM_BUFS_GEN3 = 20 +}; + /* * This struct holds all the data about a QAT pci device * including data about all services it supports. @@ -59,6 +65,11 @@ struct qat_pci_device { /* Data relating to compression service */ struct qat_comp_dev_private *comp_dev; /**< link back to compressdev private data */ + struct rte_device comp_rte_dev; + /**< This represents the compression subset of this pci device. + * Register with this rather than with the one in + * pci_dev so that its driver can have a compression-specific name + */ /* Data relating to asymmetric crypto service */ @@ -67,6 +78,7 @@ struct qat_pci_device { struct qat_gen_hw_data { enum qat_device_gen dev_gen; const struct qat_qp_hw_data (*qp_hw_data)[ADF_MAX_QPS_ON_ANY_SERVICE]; + enum qat_comp_num_im_buffers comp_num_im_bufs_required; }; extern struct qat_gen_hw_data qat_gen_config[]; diff --git a/drivers/common/qat/qat_qp.c b/drivers/common/qat/qat_qp.c index 7ca7a45e..79f6a01b 100644 --- a/drivers/common/qat/qat_qp.c +++ b/drivers/common/qat/qat_qp.c @@ -90,6 +90,44 @@ const struct qat_qp_hw_data qat_gen1_qps[QAT_MAX_SERVICES] } }; +__extension__ +const struct qat_qp_hw_data qat_gen3_qps[QAT_MAX_SERVICES] + [ADF_MAX_QPS_ON_ANY_SERVICE] = { + /* queue pairs which provide an asymmetric crypto service */ + [QAT_SERVICE_ASYMMETRIC] = { + { + .service_type = QAT_SERVICE_ASYMMETRIC, + .hw_bundle_num = 0, + .tx_ring_num = 0, + .rx_ring_num = 4, + .tx_msg_size = 64, + .rx_msg_size = 32, + } + }, + /* queue pairs which provide a symmetric crypto service */ + [QAT_SERVICE_SYMMETRIC] = { + { + .service_type = QAT_SERVICE_SYMMETRIC, + .hw_bundle_num = 0, + .tx_ring_num = 1, + .rx_ring_num = 5, + .tx_msg_size = 128, + .rx_msg_size = 32, + } + }, + /* queue pairs which provide a compression service */ + [QAT_SERVICE_COMPRESSION] = { + { + .service_type = QAT_SERVICE_COMPRESSION, + .hw_bundle_num = 0, + .tx_ring_num = 3, + .rx_ring_num = 7, + .tx_msg_size = 128, + .rx_msg_size = 32, + } + } +}; + static int qat_qp_check_queue_alignment(uint64_t phys_addr, uint32_t queue_size_bytes); static void qat_queue_delete(struct qat_queue *queue); @@ -596,15 +634,23 @@ qat_dequeue_op_burst(void *qp, void **ops, uint16_t nb_ops) uint32_t head; uint32_t resp_counter = 0; uint8_t *resp_msg; + uint8_t hdr_flags; rx_queue = &(tmp_qp->rx_q); tx_queue = &(tmp_qp->tx_q); head = rx_queue->head; resp_msg = (uint8_t *)rx_queue->base_addr + rx_queue->head; + hdr_flags = ((struct icp_qat_fw_comn_resp_hdr *)resp_msg)->hdr_flags; while (*(uint32_t *)resp_msg != ADF_RING_EMPTY_SIG && resp_counter != nb_ops) { + if (unlikely(!ICP_QAT_FW_COMN_VALID_FLAG_GET(hdr_flags))) { + /* Fatal firmware error */ + QAT_LOG(ERR, "QAT Firmware returned invalid response"); + return 0; + } + if (tmp_qp->service_type == QAT_SERVICE_SYMMETRIC) qat_sym_process_response(ops, resp_msg); else if (tmp_qp->service_type == QAT_SERVICE_COMPRESSION) @@ -635,7 +681,7 @@ qat_dequeue_op_burst(void *qp, void **ops, uint16_t nb_ops) return resp_counter; } -__attribute__((weak)) int +__rte_weak int qat_comp_process_response(void **op __rte_unused, uint8_t *resp __rte_unused) { return 0; diff --git a/drivers/common/qat/qat_qp.h b/drivers/common/qat/qat_qp.h index 69f8a613..6f1525e1 100644 --- a/drivers/common/qat/qat_qp.h +++ b/drivers/common/qat/qat_qp.h @@ -85,6 +85,7 @@ struct qat_qp { } __rte_cache_aligned; 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]; uint16_t qat_enqueue_op_burst(void *qp, void **ops, uint16_t nb_ops); |