add zsda compressdev dev interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c | 51 ++++++++++ drivers/common/zsda/zsda_qp.h | 3 + drivers/common/zsda/zsda_qp_common.h | 34 +++++++ drivers/compress/zsda/zsda_comp_pmd.c | 133 +++++++++++++++++++++++++- drivers/compress/zsda/zsda_comp_pmd.h | 5 + 5 files changed, 221 insertions(+), 5 deletions(-) diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index a87ec0f93a..1ad609675d 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -129,6 +129,31 @@ zsda_admin_q_clear(const struct rte_pci_device *pci_dev) return ret; } +static int +zsda_single_queue_start(uint8_t *mmio_base, const uint8_t id) +{ + uint8_t *addr_start = mmio_base + ZSDA_IO_Q_START + (4 * id); + + ZSDA_CSR_WRITE32(addr_start, ZSDA_Q_START); + return zsda_check_write(addr_start, ZSDA_Q_START); +} + +static int +zsda_single_queue_stop(uint8_t *mmio_base, const uint8_t id) +{ + int ret; + uint8_t *addr_stop = mmio_base + ZSDA_IO_Q_STOP + (4 * id); + uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_STOP_RESP + (4 * id); + + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(addr_stop, ZSDA_Q_STOP); + + ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID); + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + + return ret; +} + static int zsda_single_queue_clear(uint8_t *mmio_base, const uint8_t id) { @@ -144,6 +169,32 @@ zsda_single_queue_clear(uint8_t *mmio_base, const uint8_t id) return ret; } +int +zsda_queue_start(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t id; + int ret = ZSDA_SUCCESS; + + for (id = 0; id < zsda_num_used_qps; id++) + ret |= zsda_single_queue_start(mmio_base, id); + + return ret; +} + +int +zsda_queue_stop(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t id; + int ret = ZSDA_SUCCESS; + + for (id = 0; id < zsda_num_used_qps; id++) + ret |= zsda_single_queue_stop(mmio_base, id); + + return ret; +} + static int zsda_queue_clear(const struct rte_pci_device *pci_dev) { diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 0347b0f6cd..c07b8cc653 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -90,6 +90,9 @@ struct zsda_num_qps { extern struct zsda_num_qps zsda_nb_qps; +int zsda_queue_start(const struct rte_pci_device *pci_dev); +int zsda_queue_stop(const struct rte_pci_device *pci_dev); + int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev); #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index e69dd03bc9..550411dbc4 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -59,4 +59,38 @@ struct __rte_packed_begin zsda_admin_resp_qcfg { uint8_t data[14]; } __rte_packed_end; +struct zsda_queue { + char memz_name[RTE_MEMZONE_NAMESIZE]; + uint8_t *io_addr; + uint8_t *base_addr; /* Base address */ + rte_iova_t base_phys_addr; /* Queue physical address */ + uint16_t head; /* Shadow copy of the head */ + uint16_t tail; /* Shadow copy of the tail */ + uint16_t modulo_mask; + uint16_t msg_size; + uint16_t queue_size; + uint16_t cycle_size; + uint16_t pushed_wqe; + + uint8_t hw_queue_number; + uint32_t csr_head; /* last written head value */ + uint32_t csr_tail; /* last written tail value */ + + uint8_t valid; + uint16_t sid; +}; + +struct qp_srv { + bool used; + struct zsda_queue tx_q; + struct zsda_queue rx_q; + struct rte_mempool *op_cookie_pool; + void **op_cookies; + uint16_t nb_descriptors; +}; + +struct zsda_qp { + struct qp_srv srv[ZSDA_MAX_SERVICES]; +}; + #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index a9cb1f2996..07c03a8d13 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -8,13 +8,134 @@ #include "zsda_qp_common.h" #include "zsda_comp_pmd.h" +static int +zsda_comp_xform_size(void) +{ + return RTE_ALIGN_CEIL(sizeof(struct zsda_comp_xform), 8); +} + +static struct rte_mempool * +zsda_comp_xform_pool_create(struct zsda_comp_dev_private *comp_dev, + struct rte_compressdev_config *config, + uint32_t num_elements) +{ + char xform_pool_name[RTE_MEMPOOL_NAMESIZE]; + struct rte_mempool *mp; + + snprintf(xform_pool_name, RTE_MEMPOOL_NAMESIZE, "%s_xforms", + comp_dev->zsda_pci_dev->name); + + ZSDA_LOG(DEBUG, "xformpool: %s", xform_pool_name); + mp = rte_mempool_lookup(xform_pool_name); + + if (mp != NULL) { + ZSDA_LOG(DEBUG, "xformpool already created"); + if (mp->size != num_elements) { + ZSDA_LOG(DEBUG, "xformpool wrong size - delete it"); + rte_mempool_free(mp); + mp = NULL; + comp_dev->xformpool = NULL; + } + } else { + mp = rte_mempool_create(xform_pool_name, num_elements, + zsda_comp_xform_size(), 0, 0, NULL, + NULL, NULL, NULL, config->socket_id, 0); + if (mp == NULL) { + ZSDA_LOG(ERR, "Failed! mp is NULL"); + return NULL; + } + } + + return mp; +} + +static int +zsda_comp_dev_config(struct rte_compressdev *dev, + struct rte_compressdev_config *config) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + if (config->max_nb_priv_xforms) { + comp_dev->xformpool = zsda_comp_xform_pool_create( + comp_dev, config, config->max_nb_priv_xforms); + if (comp_dev->xformpool == NULL) + return -ENOMEM; + } else + comp_dev->xformpool = NULL; + + return ZSDA_SUCCESS; +} + +static int +zsda_comp_dev_start(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + int ret; + + ret = zsda_queue_start(comp_dev->zsda_pci_dev->pci_dev); + + if (ret) + ZSDA_LOG(ERR, "Failed! zsda_queue_start."); + + return ret; +} + +static void +zsda_comp_dev_stop(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + zsda_queue_stop(comp_dev->zsda_pci_dev->pci_dev); +} + +static int +zsda_comp_dev_close(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + rte_mempool_free(comp_dev->xformpool); + comp_dev->xformpool = NULL; + + return ZSDA_SUCCESS; +} + +static uint16_t +zsda_comp_max_nb_qps(void) +{ + uint16_t comp = zsda_nb_qps.encomp; + uint16_t decomp = zsda_nb_qps.decomp; + uint16_t min = 0; + + if ((comp == MAX_QPS_ON_FUNCTION) || + (decomp == MAX_QPS_ON_FUNCTION)) + min = MAX_QPS_ON_FUNCTION; + else + min = (comp < decomp) ? comp : decomp; + if (min == 0) + return MAX_QPS_ON_FUNCTION; + return min; +} + +static void +zsda_comp_dev_info_get(struct rte_compressdev *dev, + struct rte_compressdev_info *info) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + if (info != NULL) { + info->max_nb_queue_pairs = zsda_comp_max_nb_qps(); + info->feature_flags = dev->feature_flags; + info->capabilities = comp_dev->zsda_dev_capabilities; + } +} + static struct rte_compressdev_ops compress_zsda_ops = { - .dev_configure = NULL, - .dev_start = NULL, - .dev_stop = NULL, - .dev_close = NULL, - .dev_infos_get = NULL, + .dev_configure = zsda_comp_dev_config, + .dev_start = zsda_comp_dev_start, + .dev_stop = zsda_comp_dev_stop, + .dev_close = zsda_comp_dev_close, + .dev_infos_get = zsda_comp_dev_info_get, .stats_get = NULL, .stats_reset = NULL, @@ -97,6 +218,8 @@ zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev) if (rte_eal_process_type() == RTE_PROC_PRIMARY) rte_memzone_free(zsda_pci_dev->comp_dev->capa_mz); + zsda_comp_dev_close(comp_dev->compressdev); + rte_compressdev_pmd_destroy(comp_dev->compressdev); zsda_pci_dev->comp_dev = NULL; diff --git a/drivers/compress/zsda/zsda_comp_pmd.h b/drivers/compress/zsda/zsda_comp_pmd.h index b83dcd7202..1e691d7cc6 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.h +++ b/drivers/compress/zsda/zsda_comp_pmd.h @@ -29,6 +29,11 @@ struct zsda_comp_dev_private { /* Shared memzone for storing capabilities */ }; +struct zsda_comp_xform { + enum rte_comp_xform_type type; + enum rte_comp_checksum_type checksum_type; +}; + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev); int zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev); -- 2.27.0