[PATCH v20 00/13] drivers/zsda: introduce zsda drivers
v20 - add release note which was forgot in last version v19: - delete cryptodev drivers and prepare to submit it next time. - only submit compressdev driver this time. - resplit the patches. v18: - add code in drivers/meson.build to compile zsda drivers. - make every patch compile without any warnings or errors. v17: - fix some spelling errors v16: - resplit patches. - complete documentation which is yet there in that patch. - every patch should compile without any warnings or errors. - delete unused comments. v15: - split to more patches. v14: - Uniform Byte Alignment. v13: - resolve some comiler warnings that are being suppressed. v12: - use RTE_LOG_LINE_PREFIX in logging macro. - delete the check for null with rte_mempool_free. - delete some unused initial values. v11: - use RTE_LOG_LINE in logging macro. - fix some known bugs. v10: - delete new blank line at EOF - Cleaning up some code in zsda_log.h v9: - add a new feature in default.ini. - Re-split the patch according to the new PMD guidelines https://patches.dpdk.org/project/dpdk/patch/20241006184 254.53499-1-nandinipersad...@gmail.com/ - Split SM4-XTS tests into a new series to releases. - Separate out datapath(enqueue/dequeue) as a separate patch. v8: - fix some errors in cryptodevs/features/zsda.ini. v7: - add release notes and some documentations. - add MAINTAINERS context in the patch where the file/folder is added. - add files in meason.build which are included in the patch only. - add a check for unsupported on Windows. - notice the implicit cast in C. - add cover letter. - compile each of the patches individually. Hanxiao Li (13): config: add zsda device number common/zsda: add zsdadev driver common/zsda: add logging macros common/zsda: add functions to operate hardware queue common/zsda: add definition and use of msg chan. compress/zsda: add zsda compressdev driver skeleton compress/zsda: add zsda compressdev dev ops compress/zsda: add zsda compressdev stats ops compress/zsda: add zsda compressdev xform ops compress/zsda: add zsda compressdev qp ops compress/zsda: add zsda compressdev enqueue datapath compress/zsda: add zsda compressdev dequeue datapath compress/zsda: add zsda cryptodev capabilities MAINTAINERS | 6 + config/rte_config.h | 4 + doc/guides/compressdevs/features/zsda.ini | 15 + doc/guides/compressdevs/index.rst | 1 + doc/guides/compressdevs/zsda.rst | 222 + doc/guides/rel_notes/release_24_11.rst| 7 + drivers/common/zsda/meson.build | 26 + drivers/common/zsda/zsda_device.c | 206 + drivers/common/zsda/zsda_device.h | 60 ++ drivers/common/zsda/zsda_logs.c | 19 + drivers/common/zsda/zsda_logs.h | 27 + drivers/common/zsda/zsda_qp.c | 935 ++ drivers/common/zsda/zsda_qp.h | 182 + drivers/common/zsda/zsda_qp_common.c | 192 + drivers/common/zsda/zsda_qp_common.h | 198 + drivers/compress/zsda/zsda_comp.c | 388 + drivers/compress/zsda/zsda_comp.h | 45 ++ drivers/compress/zsda/zsda_comp_pmd.c | 465 +++ drivers/compress/zsda/zsda_comp_pmd.h | 42 + drivers/meson.build | 1 + 20 files changed, 3041 insertions(+) create mode 100644 doc/guides/compressdevs/features/zsda.ini create mode 100644 doc/guides/compressdevs/zsda.rst create mode 100644 drivers/common/zsda/meson.build create mode 100644 drivers/common/zsda/zsda_device.c create mode 100644 drivers/common/zsda/zsda_device.h create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h create mode 100644 drivers/common/zsda/zsda_qp_common.c create mode 100644 drivers/common/zsda/zsda_qp_common.h create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h create mode 100644 drivers/compress/zsda/zsda_comp_pmd.c create mode 100644 drivers/compress/zsda/zsda_comp_pmd.h -- 2.27.0
[PATCH v20 01/13] config: add zsda device number
Add the number of zsda devices. Signed-off-by: Hanxiao Li --- config/rte_config.h | 4 1 file changed, 4 insertions(+) diff --git a/config/rte_config.h b/config/rte_config.h index dd7bb0d35b..e1e85b3291 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -117,6 +117,10 @@ #define RTE_PMD_QAT_COMP_SGL_MAX_SEGMENTS 16 #define RTE_PMD_QAT_COMP_IM_BUFFER_SIZE 65536 +/* ZSDA device */ +/* Max. number of ZSDA devices which can be attached */ +#define RTE_PMD_ZSDA_MAX_PCI_DEVICES 256 + /* virtio crypto defines */ #define RTE_MAX_VIRTIO_CRYPTO 32 -- 2.27.0
[PATCH v20 05/13] common/zsda: add definition and use of msg chan.
Add msg chan functions and the use to get hardware information or operate hardware. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c| 309 +++ drivers/common/zsda/zsda_qp.h| 91 drivers/common/zsda/zsda_qp_common.h | 1 - 3 files changed, 400 insertions(+), 1 deletion(-) diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 8060d89ea1..0bb0f598b7 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -11,8 +11,48 @@ #include "zsda_qp.h" #include "zsda_qp_common.h" + +#define MAGIC_SEND 0xab +#define MAGIC_RECV 0xcd +#define ADMIN_VER 1 + static uint8_t zsda_num_used_qps; +static const uint8_t crc8_table[256] = { + 0x00, 0x41, 0x13, 0x52, 0x26, 0x67, 0x35, 0x74, 0x4c, 0x0d, 0x5f, 0x1e, + 0x6a, 0x2b, 0x79, 0x38, 0x09, 0x48, 0x1a, 0x5b, 0x2f, 0x6e, 0x3c, 0x7d, + 0x45, 0x04, 0x56, 0x17, 0x63, 0x22, 0x70, 0x31, 0x12, 0x53, 0x01, 0x40, + 0x34, 0x75, 0x27, 0x66, 0x5e, 0x1f, 0x4d, 0x0c, 0x78, 0x39, 0x6b, 0x2a, + 0x1b, 0x5a, 0x08, 0x49, 0x3d, 0x7c, 0x2e, 0x6f, 0x57, 0x16, 0x44, 0x05, + 0x71, 0x30, 0x62, 0x23, 0x24, 0x65, 0x37, 0x76, 0x02, 0x43, 0x11, 0x50, + 0x68, 0x29, 0x7b, 0x3a, 0x4e, 0x0f, 0x5d, 0x1c, 0x2d, 0x6c, 0x3e, 0x7f, + 0x0b, 0x4a, 0x18, 0x59, 0x61, 0x20, 0x72, 0x33, 0x47, 0x06, 0x54, 0x15, + 0x36, 0x77, 0x25, 0x64, 0x10, 0x51, 0x03, 0x42, 0x7a, 0x3b, 0x69, 0x28, + 0x5c, 0x1d, 0x4f, 0x0e, 0x3f, 0x7e, 0x2c, 0x6d, 0x19, 0x58, 0x0a, 0x4b, + 0x73, 0x32, 0x60, 0x21, 0x55, 0x14, 0x46, 0x07, 0x48, 0x09, 0x5b, 0x1a, + 0x6e, 0x2f, 0x7d, 0x3c, 0x04, 0x45, 0x17, 0x56, 0x22, 0x63, 0x31, 0x70, + 0x41, 0x00, 0x52, 0x13, 0x67, 0x26, 0x74, 0x35, 0x0d, 0x4c, 0x1e, 0x5f, + 0x2b, 0x6a, 0x38, 0x79, 0x5a, 0x1b, 0x49, 0x08, 0x7c, 0x3d, 0x6f, 0x2e, + 0x16, 0x57, 0x05, 0x44, 0x30, 0x71, 0x23, 0x62, 0x53, 0x12, 0x40, 0x01, + 0x75, 0x34, 0x66, 0x27, 0x1f, 0x5e, 0x0c, 0x4d, 0x39, 0x78, 0x2a, 0x6b, + 0x6c, 0x2d, 0x7f, 0x3e, 0x4a, 0x0b, 0x59, 0x18, 0x20, 0x61, 0x33, 0x72, + 0x06, 0x47, 0x15, 0x54, 0x65, 0x24, 0x76, 0x37, 0x43, 0x02, 0x50, 0x11, + 0x29, 0x68, 0x3a, 0x7b, 0x0f, 0x4e, 0x1c, 0x5d, 0x7e, 0x3f, 0x6d, 0x2c, + 0x58, 0x19, 0x4b, 0x0a, 0x32, 0x73, 0x21, 0x60, 0x14, 0x55, 0x07, 0x46, + 0x77, 0x36, 0x64, 0x25, 0x51, 0x10, 0x42, 0x03, 0x3b, 0x7a, 0x28, 0x69, + 0x1d, 0x5c, 0x0e, 0x4f}; + +static uint8_t +zsda_crc8(const uint8_t *message, const int length) +{ + uint8_t crc = 0; + int i; + + for (i = 0; i < length; i++) + crc = crc8_table[crc ^ message[i]]; + return crc; +} + static uint8_t zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) { @@ -173,6 +213,262 @@ zsda_queue_clear(const struct rte_pci_device *pci_dev) return ret; } +static uint32_t +zsda_set_reg_8(void *addr, const uint8_t val0, const uint8_t val1, + const uint8_t val2, const uint8_t val3) +{ + uint8_t val[4]; + + val[0] = val0; + val[1] = val1; + val[2] = val2; + val[3] = val3; + ZSDA_CSR_WRITE32(addr, *(uint32_t *)val); + return *(uint32_t *)val; +} + +static uint8_t +zsda_get_reg_8(void *addr, const int offset) +{ + uint32_t val = ZSDA_CSR_READ32(addr); + + return *(((uint8_t *)&val) + offset); +} + +static inline uint32_t +zsda_modulo_32(uint32_t data, uint32_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint16_t +zsda_modulo_16(uint16_t data, uint16_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint8_t +zsda_modulo_8(uint8_t data, uint8_t modulo_mask) +{ + return (data) & (modulo_mask); +} + +static int +zsda_send_admin_msg(const struct rte_pci_device *pci_dev, void *req, + const uint32_t len) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t wq_flag; + uint8_t crc; + uint16_t admin_db; + uint32_t retry = ZSDA_TIME_NUM; + int i; + uint16_t db; + int repeat = sizeof(struct zsda_admin_req) / sizeof(uint32_t); + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + + for (i = 0; i < repeat; i++) { + ZSDA_CSR_WRITE32(((uint32_t *)(mmio_base + ZSDA_ADMIN_WQ) + i), +*((uint32_t *)req + i)); + } + + crc = zsda_crc8((uint8_t *)req, ADMIN_BUF_DATA_LEN); + zsda_set_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, crc, ADMIN_VER, MAGIC_SEND, 0); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + rte_wmb(); + + admin_db = ZSDA_CSR_READ32(mmio_base + ZSDA_ADMIN_WQ_TAIL); + db = zsda_modulo_32(admin_db, 0x1ff); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_WQ_TAIL, db); + + do { + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + wq_flag = zsda_get_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, 2); + if (wq_flag == MAGIC_RECV)
[PATCH v20 04/13] common/zsda: add functions to operate hardware queue
Add functions to operate hardware queue, such as queue start,stop and clear. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c| 7 + drivers/common/zsda/zsda_qp.c| 196 +++ drivers/common/zsda/zsda_qp.h| 37 + drivers/common/zsda/zsda_qp_common.h | 28 5 files changed, 269 insertions(+) create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h create mode 100644 drivers/common/zsda/zsda_qp_common.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 342d000c6d..4c910d7e7d 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -11,4 +11,5 @@ deps += ['bus_pci', 'mbuf'] sources += files( 'zsda_device.c', 'zsda_logs.c', + 'zsda_qp.c', ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 1be3ea8016..5c835651ea 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -10,6 +10,7 @@ #include "zsda_device.h" #include "zsda_logs.h" +#include "zsda_qp.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -170,6 +171,12 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return -ENODEV; } + ret = zsda_queue_init(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! queue init."); + return ret; + } + return ret; } diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c new file mode 100644 index 00..8060d89ea1 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.c @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include + +#include "zsda_logs.h" +#include "zsda_device.h" +#include "zsda_qp.h" +#include "zsda_qp_common.h" + +static uint8_t zsda_num_used_qps; + +static uint8_t +zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t num_used_qps; + + num_used_qps = ZSDA_CSR_READ8(mmio_base + 0); + + return num_used_qps; +} + +static int +zsda_check_write(uint8_t *addr, const uint32_t dst_value) +{ + int times = ZSDA_TIME_NUM; + uint32_t val; + + val = ZSDA_CSR_READ32(addr); + + while ((val != dst_value) && times--) { + val = ZSDA_CSR_READ32(addr); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + } + if (val == dst_value) + return ZSDA_SUCCESS; + else + return ZSDA_FAILED; +} + +static int +zsda_admin_q_start(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, 0); + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + + return ret; +} + +static int __rte_unused +zsda_admin_q_stop(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP, ZSDA_Q_STOP); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q stop"); + + return ret; +} + +static int __rte_unused +zsda_admin_q_clear(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR, ZSDA_RESP_VALID); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q clear"); + + return ret; +} + + +static int +zsda_queue_start_single(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_queue_stop_single(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_IN
[PATCH v20 07/13] compress/zsda: add zsda compressdev dev ops
add zsda compressdev dev interface implementation. Signed-off-by: Hanxiao Li --- doc/guides/compressdevs/zsda.rst | 23 +--- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_qp_common.c | 57 ++ drivers/common/zsda/zsda_qp_common.h | 36 +++ drivers/compress/zsda/zsda_comp_pmd.c | 144 +- drivers/compress/zsda/zsda_comp_pmd.h | 5 + 6 files changed, 241 insertions(+), 25 deletions(-) create mode 100644 drivers/common/zsda/zsda_qp_common.c diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst index 56d4ca5245..edfc7508fe 100644 --- a/doc/guides/compressdevs/zsda.rst +++ b/doc/guides/compressdevs/zsda.rst @@ -193,24 +193,7 @@ ZSDA compression PMD can be tested by running the test application:: Debugging ~ -There are 2 sets of trace available via the dynamic logging feature: +ZSDA logging feature can be enabled using the log-level option (where 8=maximum +log level) on the process cmdline, e.g. using any of the following:: -* pmd.zsda.dp exposes trace on the data-path. -* pmd.zsda.general exposes all other trace. - -pmd.zsda exposes both sets of traces. -They can be enabled using the log-level option (where 8=maximum log level) on -the process cmdline, e.g. using any of the following:: - ---log-level="pmd.zsda.general,8" ---log-level="pmd.zsda.dp,8" - -.. Note:: - -The global RTE_LOG_DP_LEVEL overrides data-path trace so must be set to -RTE_LOG_DEBUG to see all the trace. This variable is in config/rte_config.h -for meson build. -Also the dynamic global log level overrides both sets of trace, so e.g. no -ZSDA trace would display in this case:: - - --log-level="pmd.zsda.general,8" --log-level="pmd.zsda,8" +--log-level="gen,8" diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 6ee2a68f4b..6e6d5ab006 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -12,6 +12,7 @@ sources += files( 'zsda_device.c', 'zsda_logs.c', 'zsda_qp.c', + 'zsda_qp_common.c', ) zsda_compress = true diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c new file mode 100644 index 00..9c7152eb24 --- /dev/null +++ b/drivers/common/zsda/zsda_qp_common.c @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include "zsda_qp_common.h" + +static void +zsda_queue_delete(const struct zsda_queue *queue) +{ + const struct rte_memzone *mz; + + if (queue == NULL) { + ZSDA_LOG(DEBUG, "Invalid queue"); + return; + } + + mz = rte_memzone_lookup(queue->memz_name); + if (mz != NULL) { + memset(queue->base_addr, 0x0, + (uint16_t)(queue->queue_size * queue->msg_size)); + rte_memzone_free(mz); + } else + ZSDA_LOG(DEBUG, "queue %s doesn't exist", queue->memz_name); +} + +int +zsda_queue_pair_release(struct zsda_qp **qp_addr) +{ + struct zsda_qp *qp = *qp_addr; + uint32_t i; + enum zsda_service_type type; + + if (qp == NULL) { + ZSDA_LOG(DEBUG, "qp already freed"); + return 0; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + + zsda_queue_delete(&(qp->srv[type].tx_q)); + zsda_queue_delete(&(qp->srv[type].rx_q)); + qp->srv[type].used = false; + for (i = 0; i < qp->srv[type].nb_descriptors; i++) + rte_mempool_put(qp->srv[type].op_cookie_pool, + qp->srv[type].op_cookies[i]); + + rte_mempool_free(qp->srv[type].op_cookie_pool); + rte_free(qp->srv[type].op_cookies); + } + + rte_free(qp); + *qp_addr = NULL; + + return ZSDA_SUCCESS; +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index a867268840..4bcec4ad4c 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -31,4 +31,40 @@ enum zsda_service_type { #define ZSDA_CSR_READ8(addr) rte_read8((addr)) #define ZSDA_CSR_WRITE8(addr, value) rte_write8_relaxed((value), (addr)) +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; + ui
[PATCH v20 02/13] common/zsda: add zsdadev driver
Add basic zsdadev init and register PCI probe functions Signed-off-by: Hanxiao Li --- MAINTAINERS | 3 + drivers/common/zsda/meson.build | 13 ++ drivers/common/zsda/zsda_device.c | 191 ++ drivers/common/zsda/zsda_device.h | 53 + drivers/meson.build | 1 + 5 files changed, 261 insertions(+) create mode 100644 drivers/common/zsda/meson.build create mode 100644 drivers/common/zsda/zsda_device.c create mode 100644 drivers/common/zsda/zsda_device.h diff --git a/MAINTAINERS b/MAINTAINERS index c5a703b5c0..0318d7357c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1268,6 +1268,9 @@ F: drivers/compress/zlib/ F: doc/guides/compressdevs/zlib.rst F: doc/guides/compressdevs/features/zlib.ini +ZTE Storage Data Accelerator(ZSDA) +M: Hanxiao Li +F: drivers/common/zsda/ DMAdev Drivers -- diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build new file mode 100644 index 00..68bc549c27 --- /dev/null +++ b/drivers/common/zsda/meson.build @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2024 ZTE Corporation + +if is_windows +build = false +reason = 'not supported on Windows' +subdir_done() +endif + +deps += ['bus_pci', 'mbuf'] +sources += files( + 'zsda_device.c', + ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c new file mode 100644 index 00..8d691b3bb8 --- /dev/null +++ b/drivers/common/zsda/zsda_device.c @@ -0,0 +1,191 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + + +#include +#include + +#include + +#include "zsda_device.h" + +/* per-process array of device data */ +struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; +static int zsda_nb_pci_devices; + +/* + * The set of PCI devices this driver supports + */ +static const struct rte_pci_id pci_id_zsda_map[] = { + { + RTE_PCI_DEVICE(0x1cf2, 0x8050), + }, + { + RTE_PCI_DEVICE(0x1cf2, 0x8051), + }, + {.device_id = 0}, +}; + +static struct zsda_pci_device * +zsda_pci_get_named_dev(const char *name) +{ + unsigned int i; + + if (name == NULL) + return NULL; + + for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { + if (zsda_devs[i].mz && + (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) + ->name, + name) == 0)) + return (struct zsda_pci_device *)zsda_devs[i].mz->addr; + } + + return NULL; +} +static uint8_t +zsda_pci_find_free_device_index(void) +{ + uint32_t dev_id; + + for (dev_id = 0; dev_id < RTE_PMD_ZSDA_MAX_PCI_DEVICES; dev_id++) + if (zsda_devs[dev_id].mz == NULL) + break; + + return dev_id & (ZSDA_MAX_DEV - 1); +} + +static struct zsda_pci_device * +zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev) +{ + char name[ZSDA_DEV_NAME_MAX_LEN]; + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + + return zsda_pci_get_named_dev(name); +} + +static struct zsda_pci_device * +zsda_pci_device_allocate(struct rte_pci_device *pci_dev) +{ + struct zsda_pci_device *zsda_pci_dev; + uint8_t zsda_dev_id; + char name[ZSDA_DEV_NAME_MAX_LEN]; + unsigned int socket_id = rte_socket_id(); + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + snprintf(name + strlen(name), (ZSDA_DEV_NAME_MAX_LEN - strlen(name)), +"_zsda"); + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + const struct rte_memzone *mz = rte_memzone_lookup(name); + + if (mz == NULL) + return NULL; + zsda_pci_dev = mz->addr; + zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; + zsda_nb_pci_devices++; + return zsda_pci_dev; + } + + if (zsda_pci_get_named_dev(name) != NULL) + return NULL; + + zsda_dev_id = zsda_pci_find_free_device_index(); + + if (zsda_dev_id == (RTE_PMD_ZSDA_MAX_PCI_DEVICES - 1)) + return NULL; + + zsda_devs[zsda_dev_id].mz = + rte_memzone_reserve(name, sizeof(struct zsda_pci_device), + (int)(socket_id & 0xfff), 0); + + if (zsda_devs[zsda_dev_id].mz == NULL) + return NULL; + + zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; + memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); + memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); + zsda_pci_dev->zsda_dev_id = zsda_dev_id; + zsda_pci_dev->pci_dev = pci_dev; + zsda_devs[zsda_dev_id].pci_dev = pci_dev; + + zsda_nb_pci_devices++; + +
[PATCH v20 06/13] compress/zsda: add zsda compressdev driver skeleton
Add zsda compressdev driver interface skeleton Signed-off-by: Hanxiao Li --- MAINTAINERS | 3 + doc/guides/compressdevs/features/zsda.ini | 6 + doc/guides/compressdevs/index.rst | 1 + doc/guides/compressdevs/zsda.rst | 216 ++ drivers/common/zsda/meson.build | 12 +- drivers/common/zsda/zsda_device.h | 12 +- drivers/common/zsda/zsda_qp.c | 30 ++- drivers/common/zsda/zsda_qp.h | 14 +- drivers/common/zsda/zsda_qp_common.h | 7 + drivers/compress/zsda/zsda_comp_pmd.c | 128 + drivers/compress/zsda/zsda_comp_pmd.h | 37 11 files changed, 454 insertions(+), 12 deletions(-) create mode 100644 doc/guides/compressdevs/features/zsda.ini create mode 100644 doc/guides/compressdevs/zsda.rst create mode 100644 drivers/compress/zsda/zsda_comp_pmd.c create mode 100644 drivers/compress/zsda/zsda_comp_pmd.h diff --git a/MAINTAINERS b/MAINTAINERS index 0318d7357c..dc3fa2097a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1271,6 +1271,9 @@ F: doc/guides/compressdevs/features/zlib.ini ZTE Storage Data Accelerator(ZSDA) M: Hanxiao Li F: drivers/common/zsda/ +F: drivers/compress/zsda/ +F: doc/guides/compressdevs/zsda.rst +F: doc/guides/compressdevs/features/zsda.ini DMAdev Drivers -- diff --git a/doc/guides/compressdevs/features/zsda.ini b/doc/guides/compressdevs/features/zsda.ini new file mode 100644 index 00..5cc9a3b1a6 --- /dev/null +++ b/doc/guides/compressdevs/features/zsda.ini @@ -0,0 +1,6 @@ +; +; Refer to default.ini for the full list of available PMD features. +; +; Supported features of 'ZSDA' compression driver. +; +[Features] diff --git a/doc/guides/compressdevs/index.rst b/doc/guides/compressdevs/index.rst index 87ed4f72a4..bab226ffbc 100644 --- a/doc/guides/compressdevs/index.rst +++ b/doc/guides/compressdevs/index.rst @@ -17,3 +17,4 @@ Compression Device Drivers qat_comp uadk zlib +zsda diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst new file mode 100644 index 00..56d4ca5245 --- /dev/null +++ b/doc/guides/compressdevs/zsda.rst @@ -0,0 +1,216 @@ +.. SPDX-License-Identifier: BSD-3-Clause +Copyright(c) 2024 ZTE Corporation. + +ZTE Storage Data Accelerator (ZSDA) Poll Mode Driver +=== + +The ZSDA compression PMD provides poll mode compression & decompression driver +support for the following hardware accelerator devices: + +* ``ZTE Processing accelerators 1cf2`` + + +Features + + + + +Limitations +--- + +* Compressdev level 0, no compression, is not supported. +* No BSD support as BSD ZSDA kernel driver not available. +* Stateful is not supported. + + +Installation + + +The ZSDA compression PMD is built by default with a standard DPDK build. + +It depends on a ZSDA kernel driver, see :ref:`building_zsda`. + + +.. _building_zsda: + +Building PMDs on ZSDA +- + +A ZSDA device can host multiple acceleration services: + +* data compression + +These services are provided to DPDK applications via PMDs which register to +implement the compressdev APIs. The PMDs use common ZSDA driver code +which manages the ZSDA PCI device. + + +Configuring and Building the DPDK ZSDA PMDs +~~~ + +Further information on configuring, building and installing DPDK is described +:doc:`here <../linux_gsg/build_dpdk>`. + +.. _building_zsda_config: + +Build Configuration +~~~ +These is the build configuration options affecting ZSDA, and its default values: + +.. code-block:: console + + RTE_PMD_ZSDA_MAX_PCI_DEVICES=256 + + +Ubuntu + +.. code-block:: console + + apt install libssl-dev + +RHEL + +.. code-block:: console + + dnf install openssl-devel + +The ZSDA compressdev PMD has no external dependencies, so is built by default. + + +Device and driver naming + + +* The zsda compressdev driver name is "compress_zsda". + The rte_compressdev_devices_get() returns the devices exposed by this driver. + +* Each zsda compression device has a unique name, in format + , e.g. ":cc:00.3_zsda". + This name can be passed to rte_compressdev_get_dev_id() to get the device_id. + + +Enable VFs + + +Instructions for installation are below, but first an explanation of the +relationships between the PF/VF devices and the PMDs visible to +DPDK applications. + +Each ZSDA PF device exposes a number of VF devices. Each VF device can +enable one compressdev PMD. + +These ZSDA PMDs share the same underlying device and pci-mgmt code, but are +enumerated independently on their respective APIs and appear as independent +devices to applications. + +.. Note:: + + Each VF can only be used by one DPDK process. It is not possible to share + the same VF across multiple processes, even if these pr
[PATCH v20 09/13] compress/zsda: add zsda compressdev xform ops
Add zsda compressdev xform interface implementation. Signed-off-by: Hanxiao Li --- drivers/compress/zsda/zsda_comp_pmd.c | 55 +-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 555178cd12..e9682e93cd 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -154,13 +154,62 @@ zsda_comp_stats_get(struct rte_compressdev *dev, stats->dequeue_err_count = stats_info.dequeue_err_count; } - static void zsda_comp_stats_reset(struct rte_compressdev *dev) { zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs); } +static int +zsda_comp_private_xform_create(struct rte_compressdev *dev, + const struct rte_comp_xform *xform, + void **private_xform) +{ + struct zsda_comp_dev_private *zsda = dev->data->dev_private; + + if (unlikely(private_xform == NULL)) { + ZSDA_LOG(ERR, "Failed! private_xform is NULL"); + return -EINVAL; + } + if (unlikely(zsda->xformpool == NULL)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + if (rte_mempool_get(zsda->xformpool, private_xform)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + + struct zsda_comp_xform *zsda_xform = *private_xform; + zsda_xform->type = xform->type; + + if (zsda_xform->type == RTE_COMP_COMPRESS) + zsda_xform->checksum_type = xform->compress.chksum; + else + zsda_xform->checksum_type = xform->decompress.chksum; + + if (zsda_xform->checksum_type == RTE_COMP_CHECKSUM_CRC32_ADLER32) + return -EINVAL; + + return ZSDA_SUCCESS; +} + +static int +zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused, +void *private_xform) +{ + struct zsda_comp_xform *zsda_xform = private_xform; + + if (zsda_xform) { + memset(zsda_xform, 0, zsda_comp_xform_size()); + struct rte_mempool *mp = rte_mempool_from_obj(zsda_xform); + + rte_mempool_put(mp, zsda_xform); + return ZSDA_SUCCESS; + } + return -EINVAL; +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -174,8 +223,8 @@ static struct rte_compressdev_ops compress_zsda_ops = { .queue_pair_setup = NULL, .queue_pair_release = NULL, - .private_xform_create = NULL, - .private_xform_free = NULL + .private_xform_create = zsda_comp_private_xform_create, + .private_xform_free = zsda_comp_private_xform_free, }; /* An rte_driver is needed in the registration of the device with compressdev. -- 2.27.0
[PATCH v20 10/13] compress/zsda: add zsda compressdev qp ops
Add zsda compressdev qp interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_device.c | 1 - drivers/common/zsda/zsda_device.h | 3 +- drivers/common/zsda/zsda_qp.c | 248 ++ drivers/common/zsda/zsda_qp.h | 122 + drivers/common/zsda/zsda_qp_common.c | 2 +- drivers/common/zsda/zsda_qp_common.h | 67 +++ drivers/compress/zsda/zsda_comp_pmd.c | 107 ++- 7 files changed, 507 insertions(+), 43 deletions(-) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 5c835651ea..5297c80ef9 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -11,7 +11,6 @@ #include "zsda_device.h" #include "zsda_logs.h" #include "zsda_qp.h" - /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; static int zsda_nb_pci_devices; diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h index b744e8df2d..0bd1805d25 100644 --- a/drivers/common/zsda/zsda_device.h +++ b/drivers/common/zsda/zsda_device.h @@ -5,13 +5,12 @@ #ifndef _ZSDA_DEVICE_H_ #define _ZSDA_DEVICE_H_ -#include #include "bus_pci_driver.h" + #include "zsda_qp_common.h" #define MAX_QPS_ON_FUNCTION128 #define ZSDA_DEV_NAME_MAX_LEN 64 -#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES struct zsda_device_info { const struct rte_memzone *mz; diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 7e000d5b3f..658b0b69e3 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -12,6 +12,8 @@ #define MAGIC_SEND 0xab #define MAGIC_RECV 0xcd #define ADMIN_VER 1 +#define RING_DIR_TX 0 +#define RING_DIR_RX 1 static uint8_t zsda_num_used_qps; @@ -523,3 +525,249 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) return ret; } + +struct zsda_qp_hw * +zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, + const enum zsda_service_type service) +{ + struct zsda_qp_hw *qp_hw = NULL; + + if (service < ZSDA_SERVICE_INVALID) + qp_hw = &(zsda_pci_dev->zsda_hw_qps[service]); + + return qp_hw; +} + +static const struct rte_memzone * +zsda_queue_dma_zone_reserve(const char *queue_name, + const unsigned int queue_size, + const unsigned int socket_id) +{ + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(queue_name); + if (mz != 0) { + if (((size_t)queue_size <= mz->len) && + ((socket_id == (SOCKET_ID_ANY & 0x)) || +(socket_id == (mz->socket_id & 0x { + ZSDA_LOG(DEBUG, +"re-use memzone already allocated for %s", +queue_name); + return mz; + } + ZSDA_LOG(ERR, "Failed! queue_name exist"); + return NULL; + } + + mz = rte_memzone_reserve_aligned(queue_name, queue_size, + (int)(socket_id & 0xfff), + RTE_MEMZONE_IOVA_CONTIG, queue_size); + + return mz; +} + +static int +zsda_queue_create(const uint32_t dev_id, struct zsda_queue *queue, + const struct zsda_qp_config *qp_conf, const uint8_t dir) +{ + void *io_addr; + const struct rte_memzone *qp_mz; + struct qinfo qcfg = {0}; + + uint16_t desc_size = ((dir == RING_DIR_TX) ? qp_conf->hw->tx_msg_size + : qp_conf->hw->rx_msg_size); + unsigned int queue_size_bytes = qp_conf->nb_descriptors * desc_size; + + queue->hw_queue_number = + ((dir == RING_DIR_TX) ? qp_conf->hw->tx_ring_num + : qp_conf->hw->rx_ring_num); + + struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev; + struct zsda_pci_device *zsda_dev = + (struct zsda_pci_device *)zsda_devs[dev_id].mz->addr; + + zsda_get_queue_cfg_by_id(zsda_dev, queue->hw_queue_number, &qcfg); + + if (dir == RING_DIR_TX) + snprintf(queue->memz_name, sizeof(queue->memz_name), +"%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, +qp_conf->service_str, "qptxmem", +queue->hw_queue_number); + else + snprintf(queue->memz_name, sizeof(queue->memz_name), +"%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, +qp_conf->service_str, "qprxmem", +queue->hw_queue_number); + + qp_mz = zsda_queue_dma_zone_reserve(queue->memz_name, queue_size_bytes, + rte_socket_id()); + if (qp_mz == NULL) { +
[PATCH v20 11/13] compress/zsda: add zsda compressdev enqueue datapath
Add zsda compressdev enqueue datapath. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 2 +- drivers/common/zsda/zsda_qp.c | 107 drivers/common/zsda/zsda_qp.h | 23 ++- drivers/common/zsda/zsda_qp_common.c | 72 drivers/common/zsda/zsda_qp_common.h | 41 + drivers/compress/zsda/zsda_comp.c | 233 ++ drivers/compress/zsda/zsda_comp.h | 36 drivers/compress/zsda/zsda_comp_pmd.c | 19 ++- 8 files changed, 515 insertions(+), 18 deletions(-) create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 6e6d5ab006..152150e5ef 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -20,7 +20,7 @@ zsda_compress_path = 'compress/zsda' zsda_compress_relpath = '../../' + zsda_compress_path includes += include_directories(zsda_compress_relpath) if zsda_compress - foreach f: ['zsda_comp_pmd.c'] + foreach f: ['zsda_comp_pmd.c', 'zsda_comp.c'] sources += files(join_paths(zsda_compress_relpath, f)) endforeach endif diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 658b0b69e3..c2a7d9b28b 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -771,3 +771,110 @@ zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr, } return ret; } + + +static int +zsda_find_next_free_cookie(const struct zsda_queue *queue, void **op_cookie, + uint16_t *idx) +{ + uint16_t old_tail = queue->tail; + uint16_t tail = queue->tail; + struct zsda_op_cookie *cookie; + + do { + cookie = op_cookie[tail]; + if (!cookie->used) { + *idx = tail & (queue->queue_size - 1); + return ZSDA_SUCCESS; + } + tail = zsda_modulo_16(tail++, queue->modulo_mask); + } while (old_tail != tail); + + return -EINVAL; +} + +static int +zsda_enqueue(void *op, struct zsda_qp *qp) +{ + uint16_t new_tail; + enum zsda_service_type type; + void **op_cookie; + int ret = ZSDA_SUCCESS; + struct zsda_queue *queue; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + if (!qp->srv[type].match(op)) + continue; + queue = &qp->srv[type].tx_q; + op_cookie = qp->srv[type].op_cookies; + + if (zsda_find_next_free_cookie(queue, op_cookie, + &new_tail)) { + ret = -EBUSY; + break; + } + ret = qp->srv[type].tx_cb(op, queue, op_cookie, + new_tail); + if (ret) { + qp->srv[type].stats.enqueue_err_count++; + ZSDA_LOG(ERR, "Failed! config wqe"); + break; + } + qp->srv[type].stats.enqueued_count++; + + queue->tail = zsda_modulo_16(new_tail + 1, +queue->queue_size - 1); + + if (new_tail > queue->tail) + queue->valid = + zsda_modulo_8(queue->valid + 1, + (uint8_t)(queue->cycle_size - 1)); + + queue->pushed_wqe++; + break; + } + } + + return ret; +} + +static void +zsda_tx_write_tail(struct zsda_queue *queue) +{ + if (queue->pushed_wqe) + WRITE_CSR_WQ_TAIL(queue->io_addr, queue->hw_queue_number, + queue->tail); + + queue->pushed_wqe = 0; +} + +uint16_t +zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + int ret = ZSDA_SUCCESS; + enum zsda_service_type type; + uint16_t i; + uint16_t nb_send = 0; + void *op; + + if (nb_ops > ZSDA_MAX_DESC) { + ZSDA_LOG(ERR, "Enqueue number bigger than %d", ZSDA_MAX_DESC); + return 0; + } + + for (i = 0; i < nb_ops; i++) { + op = ops[i]; + ret = zsda_enqueue(op, qp); + if (ret < 0) + break; + nb_send++; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) + if (qp->srv[type].used) + zsda_tx_write_tail(&qp->srv[type].tx_q); + + return nb_send; +} + diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/z
[PATCH v20 13/13] compress/zsda: add zsda cryptodev capabilities
Add zsda cryptodev capabilities. Signed-off-by: Hanxiao Li --- doc/guides/compressdevs/features/zsda.ini | 9 + doc/guides/compressdevs/zsda.rst | 23 +++ doc/guides/rel_notes/release_24_11.rst| 7 +++ drivers/compress/zsda/zsda_comp_pmd.c | 15 ++- 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/doc/guides/compressdevs/features/zsda.ini b/doc/guides/compressdevs/features/zsda.ini index 5cc9a3b1a6..3b087ea7f9 100644 --- a/doc/guides/compressdevs/features/zsda.ini +++ b/doc/guides/compressdevs/features/zsda.ini @@ -4,3 +4,12 @@ ; Supported features of 'ZSDA' compression driver. ; [Features] +HW Accelerated = Y +OOP SGL In SGL Out = Y +OOP SGL In LB Out = Y +OOP LB In SGL Out = Y +Deflate= Y +Adler32= Y +Crc32 = Y +Fixed = Y +Dynamic= Y diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst index edfc7508fe..6e3be87805 100644 --- a/doc/guides/compressdevs/zsda.rst +++ b/doc/guides/compressdevs/zsda.rst @@ -13,6 +13,29 @@ support for the following hardware accelerator devices: Features +ZSDA compression PMD has support for: + +Compression/Decompression algorithm: + +* DEFLATE - using Fixed and Dynamic Huffman encoding + +Checksum generation: + +* CRC32, Adler32 + +Huffman code type: + +* FIXED +* DYNAMIC + + +Limitations +--- + +* Compressdev level 0, no compression, is not supported. +* No BSD support as BSD ZSDA kernel driver not available. +* Stateful is not supported. + Limitations diff --git a/doc/guides/rel_notes/release_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index 0ff70d9057..583e509a45 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -24,6 +24,13 @@ DPDK Release 24.11 New Features +* **Added ZTE Storage Data Accelerator(ZSDA) device driver.** + + * Added a new compress driver for ZSDA devices to support +the deflate compression and decompression algorithm. + +See the :doc:`../compressdevs/zsda` guide for more details on the new driver. + .. This section should contain new features added in this release. Sample format: diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index ea3de2f505..85c934ace1 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -9,6 +9,19 @@ #include "zsda_comp_pmd.h" #include "zsda_comp.h" +static const struct rte_compressdev_capabilities zsda_comp_capabilities[] = { + { + .algo = RTE_COMP_ALGO_DEFLATE, + .comp_feature_flags = RTE_COMP_FF_HUFFMAN_DYNAMIC | + RTE_COMP_FF_OOP_SGL_IN_SGL_OUT | + RTE_COMP_FF_OOP_SGL_IN_LB_OUT | + RTE_COMP_FF_OOP_LB_IN_SGL_OUT | + RTE_COMP_FF_CRC32_CHECKSUM | + RTE_COMP_FF_ADLER32_CHECKSUM, + .window_size = {.min = 15, .max = 15, .increment = 0}, + }, +}; + static int zsda_comp_xform_size(void) { @@ -405,7 +418,7 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) comp_dev->zsda_pci_dev = zsda_pci_dev; comp_dev->compressdev = compressdev; - capabilities = NULL; + capabilities = zsda_comp_capabilities; comp_dev->capa_mz = rte_memzone_lookup(capa_memz_name); if (comp_dev->capa_mz == NULL) { -- 2.27.0
[PATCH v20 12/13] compress/zsda: add zsda compressdev dequeue datapath
Add zsda compressdev dequeue datapath. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c | 55 + drivers/common/zsda/zsda_qp.h | 1 + drivers/common/zsda/zsda_qp_common.h | 4 + drivers/compress/zsda/zsda_comp.c | 155 ++ drivers/compress/zsda/zsda_comp.h | 9 ++ drivers/compress/zsda/zsda_comp_pmd.c | 14 ++- 6 files changed, 235 insertions(+), 3 deletions(-) diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index c2a7d9b28b..fd45558868 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -878,3 +878,58 @@ zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) return nb_send; } +static void +zsda_dequeue(struct qp_srv *srv, void **ops, const uint16_t nb_ops, uint16_t *nb) +{ + uint16_t head; + struct zsda_cqe *cqe; + struct zsda_queue *queue = &srv->rx_q; + struct zsda_op_cookie *cookie; + head = queue->head; + + while (*nb < nb_ops) { + cqe = (struct zsda_cqe *)( + (uint8_t *)queue->base_addr + head * queue->msg_size); + + if (!CQE_VALID(cqe->err1)) + break; + cookie = srv->op_cookies[cqe->sid]; + + ops[*nb] = cookie->op; + if (srv->rx_cb(cookie, cqe) == ZSDA_SUCCESS) + srv->stats.dequeued_count++; + else { + ZSDA_LOG(ERR, +"ERR! Cqe, opcode 0x%x, sid 0x%x, " +"tx_real_length 0x%x, err0 0x%x, err1 0x%x", +cqe->op_code, cqe->sid, cqe->tx_real_length, +cqe->err0, cqe->err1); + srv->stats.dequeue_err_count++; + } + (*nb)++; + cookie->used = false; + + head = zsda_modulo_16(head + 1, queue->modulo_mask); + queue->head = head; + WRITE_CSR_CQ_HEAD(queue->io_addr, queue->hw_queue_number, head); + memset(cqe, 0x0, sizeof(struct zsda_cqe)); + } +} + +uint16_t +zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + uint16_t nb = 0; + uint32_t type = 0; + struct qp_srv *srv; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + srv = &qp->srv[type]; + zsda_dequeue(srv, ops, nb_ops, &nb); + if (nb >= nb_ops) + return nb_ops; + } + return nb; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 012ed19c62..931953b61c 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -177,5 +177,6 @@ int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr, const uint16_t queue_pair_id, const struct zsda_qp_config *conf); uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); +uint16_t zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index c67de6b04d..2fd1f9e7fd 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -47,6 +47,10 @@ enum zsda_service_type { #define ZSDA_OPC_DECOMP_ZLIB 0x19 /* Decompinfalte-Zlib */ #define ZSDA_OPC_INVALID 0xff +#define CQE_VALID(value) (value & 0x8000) +#define CQE_ERR0(value) (value & 0x) +#define CQE_ERR1(value) (value & 0x7FFF) + enum wqe_element_type { WQE_ELM_TYPE_PHYS_ADDR = 1, WQE_ELM_TYPE_LIST, diff --git a/drivers/compress/zsda/zsda_comp.c b/drivers/compress/zsda/zsda_comp.c index c00e0c2a4b..c22d690e5e 100644 --- a/drivers/compress/zsda/zsda_comp.c +++ b/drivers/compress/zsda/zsda_comp.c @@ -10,6 +10,83 @@ #define GZIP_TRAILER_SIZE 8 #define CHECKSUM_SIZE 4 +#define POLYNOMIAL 0xEDB88320 +static uint32_t crc32_table[8][256]; +static int table_config; + +static void +build_crc32_table(void) +{ + for (uint32_t i = 0; i < 256; i++) { + uint32_t crc = i; + for (uint32_t j = 0; j < 8; j++) + crc = (crc >> 1) ^ ((crc & 1) ? POLYNOMIAL : 0); + crc32_table[0][i] = crc; + } + + for (int i = 1; i < 8; i++) { + for (uint32_t j = 0; j < 256; j++) + crc32_table[i][j] = (crc32_table[i-1][j] >> 8) ^ + crc32_table[0][crc32_table[i-1][j] & 0xFF]; + } + table_config = 1; +} + +static uint32_t +zsda_crc32(const uint8_t *data, size_t length) +{ + uint32_t crc = 0x; + + if (!table_config) + build_crc32_table(); + + while (length >
[PATCH v19 00/13] drivers/zsda: introduce zsda drivers
v19: - delete cryptodev drivers and prepare to submit it next time. - only submit compressdev driver this time. - resplit the patches. v18: - add code in drivers/meson.build to compile zsda drivers. - make every patch compile without any warnings or errors. v17: - fix some spelling errors v16: - resplit patches. - complete documentation which is yet there in that patch. - every patch should compile without any warnings or errors. - delete unused comments. v15: - split to more patches. v14: - Uniform Byte Alignment. v13: - resolve some comiler warnings that are being suppressed. v12: - use RTE_LOG_LINE_PREFIX in logging macro. - delete the check for null with rte_mempool_free. - delete some unused initial values. v11: - use RTE_LOG_LINE in logging macro. - fix some known bugs. v10: - delete new blank line at EOF - Cleaning up some code in zsda_log.h v9: - add a new feature in default.ini. - Re-split the patch according to the new PMD guidelines https://patches.dpdk.org/project/dpdk/patch/20241006184 254.53499-1-nandinipersad...@gmail.com/ - Split SM4-XTS tests into a new series to releases. - Separate out datapath(enqueue/dequeue) as a separate patch. v8: - fix some errors in cryptodevs/features/zsda.ini. v7: - add release notes and some documentations. - add MAINTAINERS context in the patch where the file/folder is added. - add files in meason.build which are included in the patch only. - add a check for unsupported on Windows. - notice the implicit cast in C. - add cover letter. - compile each of the patches individually. Hanxiao Li (13): config: add zsda device number common/zsda: add zsdadev driver common/zsda: add logging macros common/zsda: add functions to operate hardware queue common/zsda: add definition and use of msg chan. compress/zsda: add zsda compressdev driver skeleton compress/zsda: add zsda compressdev dev ops compress/zsda: add zsda compressdev stats ops compress/zsda: add zsda compressdev xform ops compress/zsda: add zsda compressdev qp ops compress/zsda: add zsda compressdev enqueue datapath compress/zsda: add zsda compressdev dequeue datapath compress/zsda: add zsda cryptodev capabilities MAINTAINERS | 6 + config/rte_config.h | 4 + doc/guides/compressdevs/features/zsda.ini | 15 + doc/guides/compressdevs/index.rst | 1 + doc/guides/compressdevs/zsda.rst | 222 + drivers/common/zsda/meson.build | 26 + drivers/common/zsda/zsda_device.c | 206 + drivers/common/zsda/zsda_device.h | 60 ++ drivers/common/zsda/zsda_logs.c | 19 + drivers/common/zsda/zsda_logs.h | 27 + drivers/common/zsda/zsda_qp.c | 935 ++ drivers/common/zsda/zsda_qp.h | 182 + drivers/common/zsda/zsda_qp_common.c | 192 + drivers/common/zsda/zsda_qp_common.h | 198 + drivers/compress/zsda/zsda_comp.c | 388 + drivers/compress/zsda/zsda_comp.h | 45 ++ drivers/compress/zsda/zsda_comp_pmd.c | 465 +++ drivers/compress/zsda/zsda_comp_pmd.h | 42 + drivers/meson.build | 1 + 19 files changed, 3034 insertions(+) create mode 100644 doc/guides/compressdevs/features/zsda.ini create mode 100644 doc/guides/compressdevs/zsda.rst create mode 100644 drivers/common/zsda/meson.build create mode 100644 drivers/common/zsda/zsda_device.c create mode 100644 drivers/common/zsda/zsda_device.h create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h create mode 100644 drivers/common/zsda/zsda_qp_common.c create mode 100644 drivers/common/zsda/zsda_qp_common.h create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h create mode 100644 drivers/compress/zsda/zsda_comp_pmd.c create mode 100644 drivers/compress/zsda/zsda_comp_pmd.h -- 2.27.0
[PATCH v19 01/13] config: add zsda device number
Add the number of zsda devices. Signed-off-by: Hanxiao Li --- config/rte_config.h | 4 1 file changed, 4 insertions(+) diff --git a/config/rte_config.h b/config/rte_config.h index dd7bb0d35b..e1e85b3291 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -117,6 +117,10 @@ #define RTE_PMD_QAT_COMP_SGL_MAX_SEGMENTS 16 #define RTE_PMD_QAT_COMP_IM_BUFFER_SIZE 65536 +/* ZSDA device */ +/* Max. number of ZSDA devices which can be attached */ +#define RTE_PMD_ZSDA_MAX_PCI_DEVICES 256 + /* virtio crypto defines */ #define RTE_MAX_VIRTIO_CRYPTO 32 -- 2.27.0
[PATCH v19 04/13] common/zsda: add functions to operate hardware queue
Add functions to operate hardware queue, such as queue start,stop and clear. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c| 7 + drivers/common/zsda/zsda_qp.c| 196 +++ drivers/common/zsda/zsda_qp.h| 37 + drivers/common/zsda/zsda_qp_common.h | 28 5 files changed, 269 insertions(+) create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h create mode 100644 drivers/common/zsda/zsda_qp_common.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 342d000c6d..4c910d7e7d 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -11,4 +11,5 @@ deps += ['bus_pci', 'mbuf'] sources += files( 'zsda_device.c', 'zsda_logs.c', + 'zsda_qp.c', ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 1be3ea8016..5c835651ea 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -10,6 +10,7 @@ #include "zsda_device.h" #include "zsda_logs.h" +#include "zsda_qp.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -170,6 +171,12 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return -ENODEV; } + ret = zsda_queue_init(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! queue init."); + return ret; + } + return ret; } diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c new file mode 100644 index 00..8060d89ea1 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.c @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include + +#include "zsda_logs.h" +#include "zsda_device.h" +#include "zsda_qp.h" +#include "zsda_qp_common.h" + +static uint8_t zsda_num_used_qps; + +static uint8_t +zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t num_used_qps; + + num_used_qps = ZSDA_CSR_READ8(mmio_base + 0); + + return num_used_qps; +} + +static int +zsda_check_write(uint8_t *addr, const uint32_t dst_value) +{ + int times = ZSDA_TIME_NUM; + uint32_t val; + + val = ZSDA_CSR_READ32(addr); + + while ((val != dst_value) && times--) { + val = ZSDA_CSR_READ32(addr); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + } + if (val == dst_value) + return ZSDA_SUCCESS; + else + return ZSDA_FAILED; +} + +static int +zsda_admin_q_start(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, 0); + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + + return ret; +} + +static int __rte_unused +zsda_admin_q_stop(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP, ZSDA_Q_STOP); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q stop"); + + return ret; +} + +static int __rte_unused +zsda_admin_q_clear(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR, ZSDA_RESP_VALID); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q clear"); + + return ret; +} + + +static int +zsda_queue_start_single(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_queue_stop_single(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_IN
[PATCH v19 12/13] compress/zsda: add zsda compressdev dequeue datapath
Add zsda compressdev dequeue datapath. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c | 55 + drivers/common/zsda/zsda_qp.h | 1 + drivers/common/zsda/zsda_qp_common.h | 4 + drivers/compress/zsda/zsda_comp.c | 155 ++ drivers/compress/zsda/zsda_comp.h | 9 ++ drivers/compress/zsda/zsda_comp_pmd.c | 14 ++- 6 files changed, 235 insertions(+), 3 deletions(-) diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index c2a7d9b28b..fd45558868 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -878,3 +878,58 @@ zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) return nb_send; } +static void +zsda_dequeue(struct qp_srv *srv, void **ops, const uint16_t nb_ops, uint16_t *nb) +{ + uint16_t head; + struct zsda_cqe *cqe; + struct zsda_queue *queue = &srv->rx_q; + struct zsda_op_cookie *cookie; + head = queue->head; + + while (*nb < nb_ops) { + cqe = (struct zsda_cqe *)( + (uint8_t *)queue->base_addr + head * queue->msg_size); + + if (!CQE_VALID(cqe->err1)) + break; + cookie = srv->op_cookies[cqe->sid]; + + ops[*nb] = cookie->op; + if (srv->rx_cb(cookie, cqe) == ZSDA_SUCCESS) + srv->stats.dequeued_count++; + else { + ZSDA_LOG(ERR, +"ERR! Cqe, opcode 0x%x, sid 0x%x, " +"tx_real_length 0x%x, err0 0x%x, err1 0x%x", +cqe->op_code, cqe->sid, cqe->tx_real_length, +cqe->err0, cqe->err1); + srv->stats.dequeue_err_count++; + } + (*nb)++; + cookie->used = false; + + head = zsda_modulo_16(head + 1, queue->modulo_mask); + queue->head = head; + WRITE_CSR_CQ_HEAD(queue->io_addr, queue->hw_queue_number, head); + memset(cqe, 0x0, sizeof(struct zsda_cqe)); + } +} + +uint16_t +zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + uint16_t nb = 0; + uint32_t type = 0; + struct qp_srv *srv; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + srv = &qp->srv[type]; + zsda_dequeue(srv, ops, nb_ops, &nb); + if (nb >= nb_ops) + return nb_ops; + } + return nb; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 012ed19c62..931953b61c 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -177,5 +177,6 @@ int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr, const uint16_t queue_pair_id, const struct zsda_qp_config *conf); uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); +uint16_t zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index c67de6b04d..2fd1f9e7fd 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -47,6 +47,10 @@ enum zsda_service_type { #define ZSDA_OPC_DECOMP_ZLIB 0x19 /* Decompinfalte-Zlib */ #define ZSDA_OPC_INVALID 0xff +#define CQE_VALID(value) (value & 0x8000) +#define CQE_ERR0(value) (value & 0x) +#define CQE_ERR1(value) (value & 0x7FFF) + enum wqe_element_type { WQE_ELM_TYPE_PHYS_ADDR = 1, WQE_ELM_TYPE_LIST, diff --git a/drivers/compress/zsda/zsda_comp.c b/drivers/compress/zsda/zsda_comp.c index c00e0c2a4b..c22d690e5e 100644 --- a/drivers/compress/zsda/zsda_comp.c +++ b/drivers/compress/zsda/zsda_comp.c @@ -10,6 +10,83 @@ #define GZIP_TRAILER_SIZE 8 #define CHECKSUM_SIZE 4 +#define POLYNOMIAL 0xEDB88320 +static uint32_t crc32_table[8][256]; +static int table_config; + +static void +build_crc32_table(void) +{ + for (uint32_t i = 0; i < 256; i++) { + uint32_t crc = i; + for (uint32_t j = 0; j < 8; j++) + crc = (crc >> 1) ^ ((crc & 1) ? POLYNOMIAL : 0); + crc32_table[0][i] = crc; + } + + for (int i = 1; i < 8; i++) { + for (uint32_t j = 0; j < 256; j++) + crc32_table[i][j] = (crc32_table[i-1][j] >> 8) ^ + crc32_table[0][crc32_table[i-1][j] & 0xFF]; + } + table_config = 1; +} + +static uint32_t +zsda_crc32(const uint8_t *data, size_t length) +{ + uint32_t crc = 0x; + + if (!table_config) + build_crc32_table(); + + while (length >
[PATCH v19 13/13] compress/zsda: add zsda cryptodev capabilities
Add zsda cryptodev capabilities. Signed-off-by: Hanxiao Li --- doc/guides/compressdevs/features/zsda.ini | 9 + doc/guides/compressdevs/zsda.rst | 46 +-- drivers/compress/zsda/zsda_comp_pmd.c | 15 +++- 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/doc/guides/compressdevs/features/zsda.ini b/doc/guides/compressdevs/features/zsda.ini index 5cc9a3b1a6..3b087ea7f9 100644 --- a/doc/guides/compressdevs/features/zsda.ini +++ b/doc/guides/compressdevs/features/zsda.ini @@ -4,3 +4,12 @@ ; Supported features of 'ZSDA' compression driver. ; [Features] +HW Accelerated = Y +OOP SGL In SGL Out = Y +OOP SGL In LB Out = Y +OOP LB In SGL Out = Y +Deflate= Y +Adler32= Y +Crc32 = Y +Fixed = Y +Dynamic= Y diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst index 56d4ca5245..6e3be87805 100644 --- a/doc/guides/compressdevs/zsda.rst +++ b/doc/guides/compressdevs/zsda.rst @@ -13,6 +13,29 @@ support for the following hardware accelerator devices: Features +ZSDA compression PMD has support for: + +Compression/Decompression algorithm: + +* DEFLATE - using Fixed and Dynamic Huffman encoding + +Checksum generation: + +* CRC32, Adler32 + +Huffman code type: + +* FIXED +* DYNAMIC + + +Limitations +--- + +* Compressdev level 0, no compression, is not supported. +* No BSD support as BSD ZSDA kernel driver not available. +* Stateful is not supported. + Limitations @@ -193,24 +216,7 @@ ZSDA compression PMD can be tested by running the test application:: Debugging ~ -There are 2 sets of trace available via the dynamic logging feature: - -* pmd.zsda.dp exposes trace on the data-path. -* pmd.zsda.general exposes all other trace. - -pmd.zsda exposes both sets of traces. -They can be enabled using the log-level option (where 8=maximum log level) on -the process cmdline, e.g. using any of the following:: - ---log-level="pmd.zsda.general,8" ---log-level="pmd.zsda.dp,8" - -.. Note:: - -The global RTE_LOG_DP_LEVEL overrides data-path trace so must be set to -RTE_LOG_DEBUG to see all the trace. This variable is in config/rte_config.h -for meson build. -Also the dynamic global log level overrides both sets of trace, so e.g. no -ZSDA trace would display in this case:: +ZSDA logging feature can be enabled using the log-level option (where 8=maximum +log level) on the process cmdline, e.g. using any of the following:: - --log-level="pmd.zsda.general,8" --log-level="pmd.zsda,8" +--log-level="gen,8" diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index ea3de2f505..85c934ace1 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -9,6 +9,19 @@ #include "zsda_comp_pmd.h" #include "zsda_comp.h" +static const struct rte_compressdev_capabilities zsda_comp_capabilities[] = { + { + .algo = RTE_COMP_ALGO_DEFLATE, + .comp_feature_flags = RTE_COMP_FF_HUFFMAN_DYNAMIC | + RTE_COMP_FF_OOP_SGL_IN_SGL_OUT | + RTE_COMP_FF_OOP_SGL_IN_LB_OUT | + RTE_COMP_FF_OOP_LB_IN_SGL_OUT | + RTE_COMP_FF_CRC32_CHECKSUM | + RTE_COMP_FF_ADLER32_CHECKSUM, + .window_size = {.min = 15, .max = 15, .increment = 0}, + }, +}; + static int zsda_comp_xform_size(void) { @@ -405,7 +418,7 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) comp_dev->zsda_pci_dev = zsda_pci_dev; comp_dev->compressdev = compressdev; - capabilities = NULL; + capabilities = zsda_comp_capabilities; comp_dev->capa_mz = rte_memzone_lookup(capa_memz_name); if (comp_dev->capa_mz == NULL) { -- 2.27.0
[PATCH v19 08/13] compress/zsda: add zsda compressdev stats ops
Add zsda compressdev stats interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp_common.c | 63 +++ drivers/common/zsda/zsda_qp_common.h | 16 +++ drivers/compress/zsda/zsda_comp_pmd.c | 25 ++- 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c index 9c7152eb24..70367e6c82 100644 --- a/drivers/common/zsda/zsda_qp_common.c +++ b/drivers/common/zsda/zsda_qp_common.c @@ -55,3 +55,66 @@ zsda_queue_pair_release(struct zsda_qp **qp_addr) return ZSDA_SUCCESS; } + +void +zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if ((stats == NULL) || (queue_pairs == NULL)) { + ZSDA_LOG(ERR, "Failed! stats or queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + stats->enqueued_count += + qp->srv[type].stats.enqueued_count; + stats->dequeued_count += + qp->srv[type].stats.dequeued_count; + stats->enqueue_err_count += + qp->srv[type].stats.enqueue_err_count; + stats->dequeue_err_count += + qp->srv[type].stats.dequeue_err_count; + } + } + } +} + +void +zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if (queue_pairs == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + for (type = 0; type < ZSDA_MAX_SERVICES; type++) { + if (qp->srv[type].used) + memset(&(qp->srv[type].stats), 0, + sizeof(struct zsda_qp_stat)); + } + } +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 4bcec4ad4c..603c0e9e3a 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -52,10 +52,23 @@ struct zsda_queue { uint16_t sid; }; +struct zsda_qp_stat { + /**< Count of all operations enqueued */ + uint64_t enqueued_count; + /**< Count of all operations dequeued */ + uint64_t dequeued_count; + + /**< Total error count on operations enqueued */ + uint64_t enqueue_err_count; + /**< Total error count on operations dequeued */ + uint64_t dequeue_err_count; +}; + struct qp_srv { bool used; struct zsda_queue tx_q; struct zsda_queue rx_q; + struct zsda_qp_stat stats; struct rte_mempool *op_cookie_pool; void **op_cookies; uint16_t nb_descriptors; @@ -66,5 +79,8 @@ struct zsda_qp { }; int zsda_queue_pair_release(struct zsda_qp **qp_addr); +void zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats); +void zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs); #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 3bdcd66f6a..555178cd12 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -140,6 +140,27 @@ zsda_comp_dev_info_get(struct rte_compressdev *dev, } } +static void +zsda_comp_stats_get(struct rte_compressdev *dev, + struct rte_compressdev_stats *stats) +{ + struct zsda_qp_stat stats_info = {0}; + + zsda_stats_get(dev->data->queue_pairs, dev->data->nb_queue_pairs, + &stats_info); + stats->enqueued_count = stats_info.enqueued_count; + stats->dequeued_count = stats_info.dequeued_count; + stats->enqueue_err_count = stats_info.enqueue_err_count; + stats->dequeue_err_count = stats_info.dequeue_err_count; +} + + +static void +zsda_comp_stats_reset(struct rte_compressdev *dev) +{ + zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs);
[PATCH v19 07/13] compress/zsda: add zsda compressdev dev ops
add zsda compressdev dev interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_qp_common.c | 57 ++ drivers/common/zsda/zsda_qp_common.h | 36 +++ drivers/compress/zsda/zsda_comp_pmd.c | 144 +- drivers/compress/zsda/zsda_comp_pmd.h | 5 + 5 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 drivers/common/zsda/zsda_qp_common.c diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 6ee2a68f4b..6e6d5ab006 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -12,6 +12,7 @@ sources += files( 'zsda_device.c', 'zsda_logs.c', 'zsda_qp.c', + 'zsda_qp_common.c', ) zsda_compress = true diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c new file mode 100644 index 00..9c7152eb24 --- /dev/null +++ b/drivers/common/zsda/zsda_qp_common.c @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include "zsda_qp_common.h" + +static void +zsda_queue_delete(const struct zsda_queue *queue) +{ + const struct rte_memzone *mz; + + if (queue == NULL) { + ZSDA_LOG(DEBUG, "Invalid queue"); + return; + } + + mz = rte_memzone_lookup(queue->memz_name); + if (mz != NULL) { + memset(queue->base_addr, 0x0, + (uint16_t)(queue->queue_size * queue->msg_size)); + rte_memzone_free(mz); + } else + ZSDA_LOG(DEBUG, "queue %s doesn't exist", queue->memz_name); +} + +int +zsda_queue_pair_release(struct zsda_qp **qp_addr) +{ + struct zsda_qp *qp = *qp_addr; + uint32_t i; + enum zsda_service_type type; + + if (qp == NULL) { + ZSDA_LOG(DEBUG, "qp already freed"); + return 0; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + + zsda_queue_delete(&(qp->srv[type].tx_q)); + zsda_queue_delete(&(qp->srv[type].rx_q)); + qp->srv[type].used = false; + for (i = 0; i < qp->srv[type].nb_descriptors; i++) + rte_mempool_put(qp->srv[type].op_cookie_pool, + qp->srv[type].op_cookies[i]); + + rte_mempool_free(qp->srv[type].op_cookie_pool); + rte_free(qp->srv[type].op_cookies); + } + + rte_free(qp); + *qp_addr = NULL; + + return ZSDA_SUCCESS; +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index a867268840..4bcec4ad4c 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -31,4 +31,40 @@ enum zsda_service_type { #define ZSDA_CSR_READ8(addr) rte_read8((addr)) #define ZSDA_CSR_WRITE8(addr, value) rte_write8_relaxed((value), (addr)) +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]; +}; + +int zsda_queue_pair_release(struct zsda_qp **qp_addr); + #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index d1c33f448c..3bdcd66f6a 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -8,13 +8,145 @@ #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_create_xform_pool(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->z
[PATCH v19 03/13] common/zsda: add logging macros
Add zxdh logging implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c | 23 --- drivers/common/zsda/zsda_logs.c | 19 +++ drivers/common/zsda/zsda_logs.h | 27 +++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 68bc549c27..342d000c6d 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -10,4 +10,5 @@ endif deps += ['bus_pci', 'mbuf'] sources += files( 'zsda_device.c', + 'zsda_logs.c', ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 8d691b3bb8..1be3ea8016 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -9,6 +9,7 @@ #include #include "zsda_device.h" +#include "zsda_logs.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -32,9 +33,10 @@ zsda_pci_get_named_dev(const char *name) { unsigned int i; - if (name == NULL) + if (name == NULL) { + ZSDA_LOG(ERR, "Failed! name is NULL."); return NULL; - + } for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { if (zsda_devs[i].mz && (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) @@ -81,8 +83,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) if (rte_eal_process_type() == RTE_PROC_SECONDARY) { const struct rte_memzone *mz = rte_memzone_lookup(name); - if (mz == NULL) + if (mz == NULL) { + ZSDA_LOG(ERR, "Secondary can't find %s mz", name); return NULL; + } zsda_pci_dev = mz->addr; zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; @@ -90,8 +94,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) return zsda_pci_dev; } - if (zsda_pci_get_named_dev(name) != NULL) + if (zsda_pci_get_named_dev(name) != NULL) { + ZSDA_LOG(ERR, "Failed! config"); return NULL; + } zsda_dev_id = zsda_pci_find_free_device_index(); @@ -102,9 +108,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) rte_memzone_reserve(name, sizeof(struct zsda_pci_device), (int)(socket_id & 0xfff), 0); - if (zsda_devs[zsda_dev_id].mz == NULL) + if (zsda_devs[zsda_dev_id].mz == NULL) { + ZSDA_LOG(ERR, "Failed! malloc"); return NULL; - + } zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); @@ -158,8 +165,10 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct zsda_pci_device *zsda_pci_dev; zsda_pci_dev = zsda_pci_device_allocate(pci_dev); - if (zsda_pci_dev == NULL) + if (zsda_pci_dev == NULL) { + ZSDA_LOG(ERR, "Failed! zsda_pci_dev is NULL"); return -ENODEV; + } return ret; } diff --git a/drivers/common/zsda/zsda_logs.c b/drivers/common/zsda/zsda_logs.c new file mode 100644 index 00..f76d9d9d0d --- /dev/null +++ b/drivers/common/zsda/zsda_logs.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include "zsda_logs.h" + +int +zsda_hexdump_log(uint32_t level, uint32_t logtype, const char *title, + const void *buf, unsigned int len) +{ + if (rte_log_can_log(logtype, level)) + rte_hexdump(rte_log_get_stream(), title, buf, len); + + return 0; +} + +RTE_LOG_REGISTER_SUFFIX(zsda_logtype_gen, gen, NOTICE); diff --git a/drivers/common/zsda/zsda_logs.h b/drivers/common/zsda/zsda_logs.h new file mode 100644 index 00..9d77254773 --- /dev/null +++ b/drivers/common/zsda/zsda_logs.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_LOGS_H_ +#define _ZSDA_LOGS_H_ + +#include + +extern int zsda_logtype_gen; +#define RTE_LOGTYPE_ZSDA_GEN zsda_logtype_gen + +#define ZSDA_LOG(level, ...) \ + RTE_LOG_LINE_PREFIX(level, ZSDA_GEN, "%s(): ", \ + __func__, __VA_ARGS__) + +/** + * zsda_hexdump_log - Dump out memory in a special hex dump format. + * + * Dump out the message buffer in a special hex dump output format with + * characters printed for each line of 16 hex values. The message will be sent + * to the stream u
[PATCH v19 02/13] common/zsda: add zsdadev driver
Add basic zsdadev init and register PCI probe functions Signed-off-by: Hanxiao Li --- MAINTAINERS | 3 + drivers/common/zsda/meson.build | 13 ++ drivers/common/zsda/zsda_device.c | 191 ++ drivers/common/zsda/zsda_device.h | 53 + drivers/meson.build | 1 + 5 files changed, 261 insertions(+) create mode 100644 drivers/common/zsda/meson.build create mode 100644 drivers/common/zsda/zsda_device.c create mode 100644 drivers/common/zsda/zsda_device.h diff --git a/MAINTAINERS b/MAINTAINERS index c5a703b5c0..0318d7357c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1268,6 +1268,9 @@ F: drivers/compress/zlib/ F: doc/guides/compressdevs/zlib.rst F: doc/guides/compressdevs/features/zlib.ini +ZTE Storage Data Accelerator(ZSDA) +M: Hanxiao Li +F: drivers/common/zsda/ DMAdev Drivers -- diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build new file mode 100644 index 00..68bc549c27 --- /dev/null +++ b/drivers/common/zsda/meson.build @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2024 ZTE Corporation + +if is_windows +build = false +reason = 'not supported on Windows' +subdir_done() +endif + +deps += ['bus_pci', 'mbuf'] +sources += files( + 'zsda_device.c', + ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c new file mode 100644 index 00..8d691b3bb8 --- /dev/null +++ b/drivers/common/zsda/zsda_device.c @@ -0,0 +1,191 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + + +#include +#include + +#include + +#include "zsda_device.h" + +/* per-process array of device data */ +struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; +static int zsda_nb_pci_devices; + +/* + * The set of PCI devices this driver supports + */ +static const struct rte_pci_id pci_id_zsda_map[] = { + { + RTE_PCI_DEVICE(0x1cf2, 0x8050), + }, + { + RTE_PCI_DEVICE(0x1cf2, 0x8051), + }, + {.device_id = 0}, +}; + +static struct zsda_pci_device * +zsda_pci_get_named_dev(const char *name) +{ + unsigned int i; + + if (name == NULL) + return NULL; + + for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { + if (zsda_devs[i].mz && + (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) + ->name, + name) == 0)) + return (struct zsda_pci_device *)zsda_devs[i].mz->addr; + } + + return NULL; +} +static uint8_t +zsda_pci_find_free_device_index(void) +{ + uint32_t dev_id; + + for (dev_id = 0; dev_id < RTE_PMD_ZSDA_MAX_PCI_DEVICES; dev_id++) + if (zsda_devs[dev_id].mz == NULL) + break; + + return dev_id & (ZSDA_MAX_DEV - 1); +} + +static struct zsda_pci_device * +zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev) +{ + char name[ZSDA_DEV_NAME_MAX_LEN]; + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + + return zsda_pci_get_named_dev(name); +} + +static struct zsda_pci_device * +zsda_pci_device_allocate(struct rte_pci_device *pci_dev) +{ + struct zsda_pci_device *zsda_pci_dev; + uint8_t zsda_dev_id; + char name[ZSDA_DEV_NAME_MAX_LEN]; + unsigned int socket_id = rte_socket_id(); + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + snprintf(name + strlen(name), (ZSDA_DEV_NAME_MAX_LEN - strlen(name)), +"_zsda"); + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + const struct rte_memzone *mz = rte_memzone_lookup(name); + + if (mz == NULL) + return NULL; + zsda_pci_dev = mz->addr; + zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; + zsda_nb_pci_devices++; + return zsda_pci_dev; + } + + if (zsda_pci_get_named_dev(name) != NULL) + return NULL; + + zsda_dev_id = zsda_pci_find_free_device_index(); + + if (zsda_dev_id == (RTE_PMD_ZSDA_MAX_PCI_DEVICES - 1)) + return NULL; + + zsda_devs[zsda_dev_id].mz = + rte_memzone_reserve(name, sizeof(struct zsda_pci_device), + (int)(socket_id & 0xfff), 0); + + if (zsda_devs[zsda_dev_id].mz == NULL) + return NULL; + + zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; + memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); + memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); + zsda_pci_dev->zsda_dev_id = zsda_dev_id; + zsda_pci_dev->pci_dev = pci_dev; + zsda_devs[zsda_dev_id].pci_dev = pci_dev; + + zsda_nb_pci_devices++; + +
[PATCH v19 10/13] compress/zsda: add zsda compressdev qp ops
Add zsda compressdev qp interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_device.c | 1 - drivers/common/zsda/zsda_device.h | 3 +- drivers/common/zsda/zsda_qp.c | 248 ++ drivers/common/zsda/zsda_qp.h | 122 + drivers/common/zsda/zsda_qp_common.c | 2 +- drivers/common/zsda/zsda_qp_common.h | 67 +++ drivers/compress/zsda/zsda_comp_pmd.c | 107 ++- 7 files changed, 507 insertions(+), 43 deletions(-) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 5c835651ea..5297c80ef9 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -11,7 +11,6 @@ #include "zsda_device.h" #include "zsda_logs.h" #include "zsda_qp.h" - /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; static int zsda_nb_pci_devices; diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h index b744e8df2d..0bd1805d25 100644 --- a/drivers/common/zsda/zsda_device.h +++ b/drivers/common/zsda/zsda_device.h @@ -5,13 +5,12 @@ #ifndef _ZSDA_DEVICE_H_ #define _ZSDA_DEVICE_H_ -#include #include "bus_pci_driver.h" + #include "zsda_qp_common.h" #define MAX_QPS_ON_FUNCTION128 #define ZSDA_DEV_NAME_MAX_LEN 64 -#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES struct zsda_device_info { const struct rte_memzone *mz; diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 7e000d5b3f..658b0b69e3 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -12,6 +12,8 @@ #define MAGIC_SEND 0xab #define MAGIC_RECV 0xcd #define ADMIN_VER 1 +#define RING_DIR_TX 0 +#define RING_DIR_RX 1 static uint8_t zsda_num_used_qps; @@ -523,3 +525,249 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) return ret; } + +struct zsda_qp_hw * +zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, + const enum zsda_service_type service) +{ + struct zsda_qp_hw *qp_hw = NULL; + + if (service < ZSDA_SERVICE_INVALID) + qp_hw = &(zsda_pci_dev->zsda_hw_qps[service]); + + return qp_hw; +} + +static const struct rte_memzone * +zsda_queue_dma_zone_reserve(const char *queue_name, + const unsigned int queue_size, + const unsigned int socket_id) +{ + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(queue_name); + if (mz != 0) { + if (((size_t)queue_size <= mz->len) && + ((socket_id == (SOCKET_ID_ANY & 0x)) || +(socket_id == (mz->socket_id & 0x { + ZSDA_LOG(DEBUG, +"re-use memzone already allocated for %s", +queue_name); + return mz; + } + ZSDA_LOG(ERR, "Failed! queue_name exist"); + return NULL; + } + + mz = rte_memzone_reserve_aligned(queue_name, queue_size, + (int)(socket_id & 0xfff), + RTE_MEMZONE_IOVA_CONTIG, queue_size); + + return mz; +} + +static int +zsda_queue_create(const uint32_t dev_id, struct zsda_queue *queue, + const struct zsda_qp_config *qp_conf, const uint8_t dir) +{ + void *io_addr; + const struct rte_memzone *qp_mz; + struct qinfo qcfg = {0}; + + uint16_t desc_size = ((dir == RING_DIR_TX) ? qp_conf->hw->tx_msg_size + : qp_conf->hw->rx_msg_size); + unsigned int queue_size_bytes = qp_conf->nb_descriptors * desc_size; + + queue->hw_queue_number = + ((dir == RING_DIR_TX) ? qp_conf->hw->tx_ring_num + : qp_conf->hw->rx_ring_num); + + struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev; + struct zsda_pci_device *zsda_dev = + (struct zsda_pci_device *)zsda_devs[dev_id].mz->addr; + + zsda_get_queue_cfg_by_id(zsda_dev, queue->hw_queue_number, &qcfg); + + if (dir == RING_DIR_TX) + snprintf(queue->memz_name, sizeof(queue->memz_name), +"%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, +qp_conf->service_str, "qptxmem", +queue->hw_queue_number); + else + snprintf(queue->memz_name, sizeof(queue->memz_name), +"%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, +qp_conf->service_str, "qprxmem", +queue->hw_queue_number); + + qp_mz = zsda_queue_dma_zone_reserve(queue->memz_name, queue_size_bytes, + rte_socket_id()); + if (qp_mz == NULL) { +
[PATCH v19 09/13] compress/zsda: add zsda compressdev xform ops
Add zsda compressdev xform interface implementation. Signed-off-by: Hanxiao Li --- drivers/compress/zsda/zsda_comp_pmd.c | 55 +-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 555178cd12..e9682e93cd 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -154,13 +154,62 @@ zsda_comp_stats_get(struct rte_compressdev *dev, stats->dequeue_err_count = stats_info.dequeue_err_count; } - static void zsda_comp_stats_reset(struct rte_compressdev *dev) { zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs); } +static int +zsda_comp_private_xform_create(struct rte_compressdev *dev, + const struct rte_comp_xform *xform, + void **private_xform) +{ + struct zsda_comp_dev_private *zsda = dev->data->dev_private; + + if (unlikely(private_xform == NULL)) { + ZSDA_LOG(ERR, "Failed! private_xform is NULL"); + return -EINVAL; + } + if (unlikely(zsda->xformpool == NULL)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + if (rte_mempool_get(zsda->xformpool, private_xform)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + + struct zsda_comp_xform *zsda_xform = *private_xform; + zsda_xform->type = xform->type; + + if (zsda_xform->type == RTE_COMP_COMPRESS) + zsda_xform->checksum_type = xform->compress.chksum; + else + zsda_xform->checksum_type = xform->decompress.chksum; + + if (zsda_xform->checksum_type == RTE_COMP_CHECKSUM_CRC32_ADLER32) + return -EINVAL; + + return ZSDA_SUCCESS; +} + +static int +zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused, +void *private_xform) +{ + struct zsda_comp_xform *zsda_xform = private_xform; + + if (zsda_xform) { + memset(zsda_xform, 0, zsda_comp_xform_size()); + struct rte_mempool *mp = rte_mempool_from_obj(zsda_xform); + + rte_mempool_put(mp, zsda_xform); + return ZSDA_SUCCESS; + } + return -EINVAL; +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -174,8 +223,8 @@ static struct rte_compressdev_ops compress_zsda_ops = { .queue_pair_setup = NULL, .queue_pair_release = NULL, - .private_xform_create = NULL, - .private_xform_free = NULL + .private_xform_create = zsda_comp_private_xform_create, + .private_xform_free = zsda_comp_private_xform_free, }; /* An rte_driver is needed in the registration of the device with compressdev. -- 2.27.0
[PATCH v19 06/13] compress/zsda: add zsda compressdev driver skeleton
Add zsda compressdev driver interface skeleton Signed-off-by: Hanxiao Li --- MAINTAINERS | 3 + doc/guides/compressdevs/features/zsda.ini | 6 + doc/guides/compressdevs/index.rst | 1 + doc/guides/compressdevs/zsda.rst | 216 ++ drivers/common/zsda/meson.build | 12 +- drivers/common/zsda/zsda_device.h | 12 +- drivers/common/zsda/zsda_qp.c | 30 ++- drivers/common/zsda/zsda_qp.h | 14 +- drivers/common/zsda/zsda_qp_common.h | 7 + drivers/compress/zsda/zsda_comp_pmd.c | 128 + drivers/compress/zsda/zsda_comp_pmd.h | 37 11 files changed, 454 insertions(+), 12 deletions(-) create mode 100644 doc/guides/compressdevs/features/zsda.ini create mode 100644 doc/guides/compressdevs/zsda.rst create mode 100644 drivers/compress/zsda/zsda_comp_pmd.c create mode 100644 drivers/compress/zsda/zsda_comp_pmd.h diff --git a/MAINTAINERS b/MAINTAINERS index 0318d7357c..dc3fa2097a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1271,6 +1271,9 @@ F: doc/guides/compressdevs/features/zlib.ini ZTE Storage Data Accelerator(ZSDA) M: Hanxiao Li F: drivers/common/zsda/ +F: drivers/compress/zsda/ +F: doc/guides/compressdevs/zsda.rst +F: doc/guides/compressdevs/features/zsda.ini DMAdev Drivers -- diff --git a/doc/guides/compressdevs/features/zsda.ini b/doc/guides/compressdevs/features/zsda.ini new file mode 100644 index 00..5cc9a3b1a6 --- /dev/null +++ b/doc/guides/compressdevs/features/zsda.ini @@ -0,0 +1,6 @@ +; +; Refer to default.ini for the full list of available PMD features. +; +; Supported features of 'ZSDA' compression driver. +; +[Features] diff --git a/doc/guides/compressdevs/index.rst b/doc/guides/compressdevs/index.rst index 87ed4f72a4..bab226ffbc 100644 --- a/doc/guides/compressdevs/index.rst +++ b/doc/guides/compressdevs/index.rst @@ -17,3 +17,4 @@ Compression Device Drivers qat_comp uadk zlib +zsda diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst new file mode 100644 index 00..56d4ca5245 --- /dev/null +++ b/doc/guides/compressdevs/zsda.rst @@ -0,0 +1,216 @@ +.. SPDX-License-Identifier: BSD-3-Clause +Copyright(c) 2024 ZTE Corporation. + +ZTE Storage Data Accelerator (ZSDA) Poll Mode Driver +=== + +The ZSDA compression PMD provides poll mode compression & decompression driver +support for the following hardware accelerator devices: + +* ``ZTE Processing accelerators 1cf2`` + + +Features + + + + +Limitations +--- + +* Compressdev level 0, no compression, is not supported. +* No BSD support as BSD ZSDA kernel driver not available. +* Stateful is not supported. + + +Installation + + +The ZSDA compression PMD is built by default with a standard DPDK build. + +It depends on a ZSDA kernel driver, see :ref:`building_zsda`. + + +.. _building_zsda: + +Building PMDs on ZSDA +- + +A ZSDA device can host multiple acceleration services: + +* data compression + +These services are provided to DPDK applications via PMDs which register to +implement the compressdev APIs. The PMDs use common ZSDA driver code +which manages the ZSDA PCI device. + + +Configuring and Building the DPDK ZSDA PMDs +~~~ + +Further information on configuring, building and installing DPDK is described +:doc:`here <../linux_gsg/build_dpdk>`. + +.. _building_zsda_config: + +Build Configuration +~~~ +These is the build configuration options affecting ZSDA, and its default values: + +.. code-block:: console + + RTE_PMD_ZSDA_MAX_PCI_DEVICES=256 + + +Ubuntu + +.. code-block:: console + + apt install libssl-dev + +RHEL + +.. code-block:: console + + dnf install openssl-devel + +The ZSDA compressdev PMD has no external dependencies, so is built by default. + + +Device and driver naming + + +* The zsda compressdev driver name is "compress_zsda". + The rte_compressdev_devices_get() returns the devices exposed by this driver. + +* Each zsda compression device has a unique name, in format + , e.g. ":cc:00.3_zsda". + This name can be passed to rte_compressdev_get_dev_id() to get the device_id. + + +Enable VFs + + +Instructions for installation are below, but first an explanation of the +relationships between the PF/VF devices and the PMDs visible to +DPDK applications. + +Each ZSDA PF device exposes a number of VF devices. Each VF device can +enable one compressdev PMD. + +These ZSDA PMDs share the same underlying device and pci-mgmt code, but are +enumerated independently on their respective APIs and appear as independent +devices to applications. + +.. Note:: + + Each VF can only be used by one DPDK process. It is not possible to share + the same VF across multiple processes, even if these pr
[PATCH v19 11/13] compress/zsda: add zsda compressdev enqueue datapath
Add zsda compressdev enqueue datapath. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 2 +- drivers/common/zsda/zsda_qp.c | 107 drivers/common/zsda/zsda_qp.h | 23 ++- drivers/common/zsda/zsda_qp_common.c | 72 drivers/common/zsda/zsda_qp_common.h | 41 + drivers/compress/zsda/zsda_comp.c | 233 ++ drivers/compress/zsda/zsda_comp.h | 36 drivers/compress/zsda/zsda_comp_pmd.c | 19 ++- 8 files changed, 515 insertions(+), 18 deletions(-) create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 6e6d5ab006..152150e5ef 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -20,7 +20,7 @@ zsda_compress_path = 'compress/zsda' zsda_compress_relpath = '../../' + zsda_compress_path includes += include_directories(zsda_compress_relpath) if zsda_compress - foreach f: ['zsda_comp_pmd.c'] + foreach f: ['zsda_comp_pmd.c', 'zsda_comp.c'] sources += files(join_paths(zsda_compress_relpath, f)) endforeach endif diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 658b0b69e3..c2a7d9b28b 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -771,3 +771,110 @@ zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr, } return ret; } + + +static int +zsda_find_next_free_cookie(const struct zsda_queue *queue, void **op_cookie, + uint16_t *idx) +{ + uint16_t old_tail = queue->tail; + uint16_t tail = queue->tail; + struct zsda_op_cookie *cookie; + + do { + cookie = op_cookie[tail]; + if (!cookie->used) { + *idx = tail & (queue->queue_size - 1); + return ZSDA_SUCCESS; + } + tail = zsda_modulo_16(tail++, queue->modulo_mask); + } while (old_tail != tail); + + return -EINVAL; +} + +static int +zsda_enqueue(void *op, struct zsda_qp *qp) +{ + uint16_t new_tail; + enum zsda_service_type type; + void **op_cookie; + int ret = ZSDA_SUCCESS; + struct zsda_queue *queue; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + if (!qp->srv[type].match(op)) + continue; + queue = &qp->srv[type].tx_q; + op_cookie = qp->srv[type].op_cookies; + + if (zsda_find_next_free_cookie(queue, op_cookie, + &new_tail)) { + ret = -EBUSY; + break; + } + ret = qp->srv[type].tx_cb(op, queue, op_cookie, + new_tail); + if (ret) { + qp->srv[type].stats.enqueue_err_count++; + ZSDA_LOG(ERR, "Failed! config wqe"); + break; + } + qp->srv[type].stats.enqueued_count++; + + queue->tail = zsda_modulo_16(new_tail + 1, +queue->queue_size - 1); + + if (new_tail > queue->tail) + queue->valid = + zsda_modulo_8(queue->valid + 1, + (uint8_t)(queue->cycle_size - 1)); + + queue->pushed_wqe++; + break; + } + } + + return ret; +} + +static void +zsda_tx_write_tail(struct zsda_queue *queue) +{ + if (queue->pushed_wqe) + WRITE_CSR_WQ_TAIL(queue->io_addr, queue->hw_queue_number, + queue->tail); + + queue->pushed_wqe = 0; +} + +uint16_t +zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + int ret = ZSDA_SUCCESS; + enum zsda_service_type type; + uint16_t i; + uint16_t nb_send = 0; + void *op; + + if (nb_ops > ZSDA_MAX_DESC) { + ZSDA_LOG(ERR, "Enqueue number bigger than %d", ZSDA_MAX_DESC); + return 0; + } + + for (i = 0; i < nb_ops; i++) { + op = ops[i]; + ret = zsda_enqueue(op, qp); + if (ret < 0) + break; + nb_send++; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) + if (qp->srv[type].used) + zsda_tx_write_tail(&qp->srv[type].tx_q); + + return nb_send; +} + diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/z
[PATCH v19 05/13] common/zsda: add definition and use of msg chan.
Add msg chan functions and the use to get hardware information or operate hardware. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c| 309 +++ drivers/common/zsda/zsda_qp.h| 91 drivers/common/zsda/zsda_qp_common.h | 1 - 3 files changed, 400 insertions(+), 1 deletion(-) diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 8060d89ea1..0bb0f598b7 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -11,8 +11,48 @@ #include "zsda_qp.h" #include "zsda_qp_common.h" + +#define MAGIC_SEND 0xab +#define MAGIC_RECV 0xcd +#define ADMIN_VER 1 + static uint8_t zsda_num_used_qps; +static const uint8_t crc8_table[256] = { + 0x00, 0x41, 0x13, 0x52, 0x26, 0x67, 0x35, 0x74, 0x4c, 0x0d, 0x5f, 0x1e, + 0x6a, 0x2b, 0x79, 0x38, 0x09, 0x48, 0x1a, 0x5b, 0x2f, 0x6e, 0x3c, 0x7d, + 0x45, 0x04, 0x56, 0x17, 0x63, 0x22, 0x70, 0x31, 0x12, 0x53, 0x01, 0x40, + 0x34, 0x75, 0x27, 0x66, 0x5e, 0x1f, 0x4d, 0x0c, 0x78, 0x39, 0x6b, 0x2a, + 0x1b, 0x5a, 0x08, 0x49, 0x3d, 0x7c, 0x2e, 0x6f, 0x57, 0x16, 0x44, 0x05, + 0x71, 0x30, 0x62, 0x23, 0x24, 0x65, 0x37, 0x76, 0x02, 0x43, 0x11, 0x50, + 0x68, 0x29, 0x7b, 0x3a, 0x4e, 0x0f, 0x5d, 0x1c, 0x2d, 0x6c, 0x3e, 0x7f, + 0x0b, 0x4a, 0x18, 0x59, 0x61, 0x20, 0x72, 0x33, 0x47, 0x06, 0x54, 0x15, + 0x36, 0x77, 0x25, 0x64, 0x10, 0x51, 0x03, 0x42, 0x7a, 0x3b, 0x69, 0x28, + 0x5c, 0x1d, 0x4f, 0x0e, 0x3f, 0x7e, 0x2c, 0x6d, 0x19, 0x58, 0x0a, 0x4b, + 0x73, 0x32, 0x60, 0x21, 0x55, 0x14, 0x46, 0x07, 0x48, 0x09, 0x5b, 0x1a, + 0x6e, 0x2f, 0x7d, 0x3c, 0x04, 0x45, 0x17, 0x56, 0x22, 0x63, 0x31, 0x70, + 0x41, 0x00, 0x52, 0x13, 0x67, 0x26, 0x74, 0x35, 0x0d, 0x4c, 0x1e, 0x5f, + 0x2b, 0x6a, 0x38, 0x79, 0x5a, 0x1b, 0x49, 0x08, 0x7c, 0x3d, 0x6f, 0x2e, + 0x16, 0x57, 0x05, 0x44, 0x30, 0x71, 0x23, 0x62, 0x53, 0x12, 0x40, 0x01, + 0x75, 0x34, 0x66, 0x27, 0x1f, 0x5e, 0x0c, 0x4d, 0x39, 0x78, 0x2a, 0x6b, + 0x6c, 0x2d, 0x7f, 0x3e, 0x4a, 0x0b, 0x59, 0x18, 0x20, 0x61, 0x33, 0x72, + 0x06, 0x47, 0x15, 0x54, 0x65, 0x24, 0x76, 0x37, 0x43, 0x02, 0x50, 0x11, + 0x29, 0x68, 0x3a, 0x7b, 0x0f, 0x4e, 0x1c, 0x5d, 0x7e, 0x3f, 0x6d, 0x2c, + 0x58, 0x19, 0x4b, 0x0a, 0x32, 0x73, 0x21, 0x60, 0x14, 0x55, 0x07, 0x46, + 0x77, 0x36, 0x64, 0x25, 0x51, 0x10, 0x42, 0x03, 0x3b, 0x7a, 0x28, 0x69, + 0x1d, 0x5c, 0x0e, 0x4f}; + +static uint8_t +zsda_crc8(const uint8_t *message, const int length) +{ + uint8_t crc = 0; + int i; + + for (i = 0; i < length; i++) + crc = crc8_table[crc ^ message[i]]; + return crc; +} + static uint8_t zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) { @@ -173,6 +213,262 @@ zsda_queue_clear(const struct rte_pci_device *pci_dev) return ret; } +static uint32_t +zsda_set_reg_8(void *addr, const uint8_t val0, const uint8_t val1, + const uint8_t val2, const uint8_t val3) +{ + uint8_t val[4]; + + val[0] = val0; + val[1] = val1; + val[2] = val2; + val[3] = val3; + ZSDA_CSR_WRITE32(addr, *(uint32_t *)val); + return *(uint32_t *)val; +} + +static uint8_t +zsda_get_reg_8(void *addr, const int offset) +{ + uint32_t val = ZSDA_CSR_READ32(addr); + + return *(((uint8_t *)&val) + offset); +} + +static inline uint32_t +zsda_modulo_32(uint32_t data, uint32_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint16_t +zsda_modulo_16(uint16_t data, uint16_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint8_t +zsda_modulo_8(uint8_t data, uint8_t modulo_mask) +{ + return (data) & (modulo_mask); +} + +static int +zsda_send_admin_msg(const struct rte_pci_device *pci_dev, void *req, + const uint32_t len) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t wq_flag; + uint8_t crc; + uint16_t admin_db; + uint32_t retry = ZSDA_TIME_NUM; + int i; + uint16_t db; + int repeat = sizeof(struct zsda_admin_req) / sizeof(uint32_t); + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + + for (i = 0; i < repeat; i++) { + ZSDA_CSR_WRITE32(((uint32_t *)(mmio_base + ZSDA_ADMIN_WQ) + i), +*((uint32_t *)req + i)); + } + + crc = zsda_crc8((uint8_t *)req, ADMIN_BUF_DATA_LEN); + zsda_set_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, crc, ADMIN_VER, MAGIC_SEND, 0); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + rte_wmb(); + + admin_db = ZSDA_CSR_READ32(mmio_base + ZSDA_ADMIN_WQ_TAIL); + db = zsda_modulo_32(admin_db, 0x1ff); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_WQ_TAIL, db); + + do { + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + wq_flag = zsda_get_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, 2); + if (wq_flag == MAGIC_RECV)
[PATCH v20 08/13] compress/zsda: add zsda compressdev stats ops
Add zsda compressdev stats interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp_common.c | 63 +++ drivers/common/zsda/zsda_qp_common.h | 16 +++ drivers/compress/zsda/zsda_comp_pmd.c | 25 ++- 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c index 9c7152eb24..70367e6c82 100644 --- a/drivers/common/zsda/zsda_qp_common.c +++ b/drivers/common/zsda/zsda_qp_common.c @@ -55,3 +55,66 @@ zsda_queue_pair_release(struct zsda_qp **qp_addr) return ZSDA_SUCCESS; } + +void +zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if ((stats == NULL) || (queue_pairs == NULL)) { + ZSDA_LOG(ERR, "Failed! stats or queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + stats->enqueued_count += + qp->srv[type].stats.enqueued_count; + stats->dequeued_count += + qp->srv[type].stats.dequeued_count; + stats->enqueue_err_count += + qp->srv[type].stats.enqueue_err_count; + stats->dequeue_err_count += + qp->srv[type].stats.dequeue_err_count; + } + } + } +} + +void +zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if (queue_pairs == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + for (type = 0; type < ZSDA_MAX_SERVICES; type++) { + if (qp->srv[type].used) + memset(&(qp->srv[type].stats), 0, + sizeof(struct zsda_qp_stat)); + } + } +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 4bcec4ad4c..603c0e9e3a 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -52,10 +52,23 @@ struct zsda_queue { uint16_t sid; }; +struct zsda_qp_stat { + /**< Count of all operations enqueued */ + uint64_t enqueued_count; + /**< Count of all operations dequeued */ + uint64_t dequeued_count; + + /**< Total error count on operations enqueued */ + uint64_t enqueue_err_count; + /**< Total error count on operations dequeued */ + uint64_t dequeue_err_count; +}; + struct qp_srv { bool used; struct zsda_queue tx_q; struct zsda_queue rx_q; + struct zsda_qp_stat stats; struct rte_mempool *op_cookie_pool; void **op_cookies; uint16_t nb_descriptors; @@ -66,5 +79,8 @@ struct zsda_qp { }; int zsda_queue_pair_release(struct zsda_qp **qp_addr); +void zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats); +void zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs); #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 3bdcd66f6a..555178cd12 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -140,6 +140,27 @@ zsda_comp_dev_info_get(struct rte_compressdev *dev, } } +static void +zsda_comp_stats_get(struct rte_compressdev *dev, + struct rte_compressdev_stats *stats) +{ + struct zsda_qp_stat stats_info = {0}; + + zsda_stats_get(dev->data->queue_pairs, dev->data->nb_queue_pairs, + &stats_info); + stats->enqueued_count = stats_info.enqueued_count; + stats->dequeued_count = stats_info.dequeued_count; + stats->enqueue_err_count = stats_info.enqueue_err_count; + stats->dequeue_err_count = stats_info.dequeue_err_count; +} + + +static void +zsda_comp_stats_reset(struct rte_compressdev *dev) +{ + zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs);
Re: [v5 00/42] DPAA2 specific patches
23/10/2024 13:59, vanshika.shu...@nxp.com: > Apeksha Gupta (2): > net/dpaa2: add proper MTU debugging print > net/dpaa2: store drop priority in mbuf > > Brick Yang (1): > net/dpaa2: update DPNI link status method > > Gagandeep Singh (3): > bus/fslmc: upgrade with MC version 10.37 > net/dpaa2: fix memory corruption in TM > net/dpaa2: support software taildrop > > Hemant Agrawal (2): > net/dpaa2: add support to dump dpdmux counters > bus/fslmc: change dpcon close as internal symbol > > Jun Yang (23): > net/dpaa2: enhance Tx scatter-gather mempool > net/dpaa2: add new PMD API to check dpaa platform version > bus/fslmc: improve BMAN buffer acquire > bus/fslmc: get MC VFIO group FD directly > bus/fslmc: enhance MC VFIO multiprocess support > bus/fslmc: dynamic IOVA mode configuration > bus/fslmc: remove VFIO IRQ mapping > bus/fslmc: create dpaa2 device with it's object > bus/fslmc: introduce VFIO DMA mapping API for fslmc > net/dpaa2: flow API refactor > net/dpaa2: dump Rx parser result > net/dpaa2: enhancement of raw flow extract > net/dpaa2: frame attribute flags parser > net/dpaa2: add VXLAN distribution support > net/dpaa2: protocol inside tunnel distribution > net/dpaa2: eCPRI support by parser result > net/dpaa2: add GTP flow support > net/dpaa2: check if Soft parser is loaded > net/dpaa2: soft parser flow verification > net/dpaa2: add flow support for IPsec AH and ESP > net/dpaa2: check IOVA before sending MC command > net/dpaa2: add API to get endpoint name > net/dpaa2: dpdmux single flow/multiple rules support > > Rohit Raj (6): > bus/fslmc: add close API to close DPAA2 device > net/dpaa2: support link state for eth interfaces > bus/fslmc: free VFIO group FD in case of add group failure > bus/fslmc: fix coverity issue > bus/fslmc: change qbman eq desc from d to desc > net/dpaa2: change miss flow ID macro name > > Sachin Saxena (1): > net/dpaa2: improve DPDMUX error behavior settings > > Vanshika Shukla (4): > net/dpaa2: support PTP packet one-step timestamp > net/dpaa2: dpdmux: add support for CVLAN > net/dpaa2: support VLAN traffic splitting > net/dpaa2: add support for C-VLAN and MAC This series is not clean at all. There are a lot of unrelated changes in the middle of patches like reindent or cast cleanup. Some commits are breaking compilation. Some useless code is added and removed in the last commit. The features matrix for the flow items and actions are not updated. Some error messages are polluting the cleanup stage for everybody. The patch for DPDMUX based on C-VLAN and MAC address is present twice. Not even talking about conflicts because of a parallel series. I'm not sure why I'm trying to merge these patches, I suppose I'm trying to be kind. I've fixed all blocking issues and applied.
Re: [v5 06/42] bus/fslmc: add close API to close DPAA2 device
23/10/2024 13:59, vanshika.shu...@nxp.com: > +static int > +rte_fslmc_close(void) > +{ > + int ret = 0; > + > + ret = fslmc_vfio_close_group(); > + if (ret) > + DPAA2_BUS_ERR("Unable to close devices %d", ret); > + > + return 0; > +} You should not try to close if there is no devices on this bus. The error message is polluting cleanup for everybody. I change to info log level for now while merging.
Re: [PATCH] mbuf: add transport mode ESP packet type
15/10/2024 16:40, Dariusz Sosnowski: > > -Original Message- > > From: Alexander Kozyrev > > Sent: Thursday, August 22, 2024 17:32 > > To: dev@dpdk.org > > Cc: Dariusz Sosnowski ; Ori Kam ; > > nithind1...@gmail.com; olivier.m...@6wind.com; NBU-Contact-Thomas > > Monjalon (EXTERNAL) ; Matan Azrad > > ; jer...@marvell.com; rbhans...@marvell.com; > > ferruh.yi...@amd.com > > Subject: [PATCH] mbuf: add transport mode ESP packet type > > > > Support the IP Encapsulating Security Payload (ESP) in transport mode. > > Currently, we have RTE_PTYPE_TUNNEL_ESP for the ESP tunnel mode. > > Transport mode can be detected by parsing the "Next Header" field. > > The Next Header is TCP for the transport mode and IP for the tunnel mode. > > Add RTE_PTYPE_L4_ESP for the regular transport mode and > > RTE_PTYPE_INNER_L4_ESP for the ESP over UDP packets. > > > > Signed-off-by: Alexander Kozyrev > > Reviewed-by: Dariusz Sosnowski Applied, thanks.
Re: [v7 02/15] dma/dpaa2: refactor driver code
09/11/2024 14:37, Thomas Monjalon: > 15/10/2024 09:13, Gagandeep Singh: > > diff --git a/drivers/dma/dpaa2/version.map b/drivers/dma/dpaa2/version.map > > deleted file mode 100644 > > index 43e8b2d5c5..00 > > --- a/drivers/dma/dpaa2/version.map > > +++ /dev/null > > @@ -1,13 +0,0 @@ > > -DPDK_25 { > > - local: *; > > -}; > > - > > -EXPERIMENTAL { > > - global: > > - > > - # added in 22.07 > > - rte_dpaa2_qdma_completed_multi; > > - rte_dpaa2_qdma_copy_multi; > > - rte_dpaa2_qdma_vchan_fd_us_enable; > > - rte_dpaa2_qdma_vchan_internal_sg_enable; > > -}; > > What did you do here? With a second look, I see you really removed these functions. Note it is an API change that you should have written in the release notes (and in the commit log to avoid surprise). > Obviously it breaks compilation: > drivers/dma/dpaa2/version.map', needed by 'drivers/librte_dma_dpaa2.so.25.0', > missing and no known rule to make it It works when doing a fresh build.
Re: [v7 08/15] dma/dpaa: refactor driver
15/10/2024 09:13, Gagandeep Singh: > +static inline int > +ilog2_qthld(uint32_t q_thld) > { > - csgf->cfg = rte_cpu_to_le_32(QDMA_SG_FIN | (len & QDMA_SG_LEN_MASK)); > + return (ilog2(q_thld) - ilog2(16)); > } error: unused function 'ilog2_qthld' You must make sure each patch is compiling.
Re: [v7 15/15] bus/dpaa: add port bmi stats
15/10/2024 09:14, Gagandeep Singh: > From: Hemant Agrawal > > Add BMI statistics and fixing the existing extended > statistics > > Signed-off-by: Hemant Agrawal > Signed-off-by: Gagandeep Singh This patch was part of another series already merged. Skipping
Re: [v7 11/15] dma/dpaa: add workaround for ERR050757
15/10/2024 09:13, Gagandeep Singh: > From: Jun Yang > > --- a/config/arm/meson.build > +++ b/config/arm/meson.build > @@ -488,7 +488,8 @@ soc_dpaa = { > ['RTE_MACHINE', '"dpaa"'], > ['RTE_LIBRTE_DPAA2_USE_PHYS_IOVA', false], > ['RTE_MAX_LCORE', 16], > -['RTE_MAX_NUMA_NODES', 1] > +['RTE_MAX_NUMA_NODES', 1], > + ['RTE_DMA_DPAA_ERRATA_ERR050757', true] Error parsing config/arm/meson.build:491, got some tabulation
[PATCH v20 03/13] common/zsda: add logging macros
Add zxdh logging implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c | 23 --- drivers/common/zsda/zsda_logs.c | 19 +++ drivers/common/zsda/zsda_logs.h | 27 +++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 68bc549c27..342d000c6d 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -10,4 +10,5 @@ endif deps += ['bus_pci', 'mbuf'] sources += files( 'zsda_device.c', + 'zsda_logs.c', ) diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 8d691b3bb8..1be3ea8016 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -9,6 +9,7 @@ #include #include "zsda_device.h" +#include "zsda_logs.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -32,9 +33,10 @@ zsda_pci_get_named_dev(const char *name) { unsigned int i; - if (name == NULL) + if (name == NULL) { + ZSDA_LOG(ERR, "Failed! name is NULL."); return NULL; - + } for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { if (zsda_devs[i].mz && (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) @@ -81,8 +83,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) if (rte_eal_process_type() == RTE_PROC_SECONDARY) { const struct rte_memzone *mz = rte_memzone_lookup(name); - if (mz == NULL) + if (mz == NULL) { + ZSDA_LOG(ERR, "Secondary can't find %s mz", name); return NULL; + } zsda_pci_dev = mz->addr; zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; @@ -90,8 +94,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) return zsda_pci_dev; } - if (zsda_pci_get_named_dev(name) != NULL) + if (zsda_pci_get_named_dev(name) != NULL) { + ZSDA_LOG(ERR, "Failed! config"); return NULL; + } zsda_dev_id = zsda_pci_find_free_device_index(); @@ -102,9 +108,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) rte_memzone_reserve(name, sizeof(struct zsda_pci_device), (int)(socket_id & 0xfff), 0); - if (zsda_devs[zsda_dev_id].mz == NULL) + if (zsda_devs[zsda_dev_id].mz == NULL) { + ZSDA_LOG(ERR, "Failed! malloc"); return NULL; - + } zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); @@ -158,8 +165,10 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct zsda_pci_device *zsda_pci_dev; zsda_pci_dev = zsda_pci_device_allocate(pci_dev); - if (zsda_pci_dev == NULL) + if (zsda_pci_dev == NULL) { + ZSDA_LOG(ERR, "Failed! zsda_pci_dev is NULL"); return -ENODEV; + } return ret; } diff --git a/drivers/common/zsda/zsda_logs.c b/drivers/common/zsda/zsda_logs.c new file mode 100644 index 00..f76d9d9d0d --- /dev/null +++ b/drivers/common/zsda/zsda_logs.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include "zsda_logs.h" + +int +zsda_hexdump_log(uint32_t level, uint32_t logtype, const char *title, + const void *buf, unsigned int len) +{ + if (rte_log_can_log(logtype, level)) + rte_hexdump(rte_log_get_stream(), title, buf, len); + + return 0; +} + +RTE_LOG_REGISTER_SUFFIX(zsda_logtype_gen, gen, NOTICE); diff --git a/drivers/common/zsda/zsda_logs.h b/drivers/common/zsda/zsda_logs.h new file mode 100644 index 00..9d77254773 --- /dev/null +++ b/drivers/common/zsda/zsda_logs.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_LOGS_H_ +#define _ZSDA_LOGS_H_ + +#include + +extern int zsda_logtype_gen; +#define RTE_LOGTYPE_ZSDA_GEN zsda_logtype_gen + +#define ZSDA_LOG(level, ...) \ + RTE_LOG_LINE_PREFIX(level, ZSDA_GEN, "%s(): ", \ + __func__, __VA_ARGS__) + +/** + * zsda_hexdump_log - Dump out memory in a special hex dump format. + * + * Dump out the message buffer in a special hex dump output format with + * characters printed for each line of 16 hex values. The message will be sent + * to the stream u
Re: [PATCH] net/mlx5: add support for transport mode ESP ptype
> > Implement matching on RTE_PTYPE_L4_ESP and RTE_PTYPE_INNER_L4_ESP for IP > > Encapsulating Security Payload (ESP) in transport mode. > > > > Signed-off-by: Alexander Kozyrev > > Acked-by: Dariusz Sosnowski Applied, thanks.
Re: [v5 14/42] bus/fslmc: enhance MC VFIO multiprocess support
23/10/2024 13:59, vanshika.shu...@nxp.com: > --- a/drivers/bus/fslmc/version.map > +++ b/drivers/bus/fslmc/version.map > @@ -118,6 +118,7 @@ INTERNAL { > rte_fslmc_get_device_count; > rte_fslmc_object_register; > rte_global_active_dqs_list; > + rte_fslmc_vfio_mem_dmaunmap; > > local: *; > }; rte_fslmc_vfio_mem_dmaunmap is not flagged as internal but is listed as internal in version map
Re: [v5 23/42] net/dpaa2: flow API refactor
23/10/2024 13:59, vanshika.shu...@nxp.com: > +static inline int > +dpaa2_fs_action_supported(enum rte_flow_action_type action) > +{ > + int i; > + int action_num = sizeof(dpaa2_supported_fs_action_type) / > + sizeof(enum rte_flow_action_type); > > - curr = LIST_NEXT(curr, next); > + for (i = 0; i < action_num; i++) { > + if (action == dpaa2_supported_fs_action_type[i]) > + return true; > } > > - return 0; > + return false; > } One more compilation error: unused function 'dpaa2_fs_action_supported'
Re: [v7 02/15] dma/dpaa2: refactor driver code
15/10/2024 09:13, Gagandeep Singh: > diff --git a/drivers/dma/dpaa2/version.map b/drivers/dma/dpaa2/version.map > deleted file mode 100644 > index 43e8b2d5c5..00 > --- a/drivers/dma/dpaa2/version.map > +++ /dev/null > @@ -1,13 +0,0 @@ > -DPDK_25 { > - local: *; > -}; > - > -EXPERIMENTAL { > - global: > - > - # added in 22.07 > - rte_dpaa2_qdma_completed_multi; > - rte_dpaa2_qdma_copy_multi; > - rte_dpaa2_qdma_vchan_fd_us_enable; > - rte_dpaa2_qdma_vchan_internal_sg_enable; > -}; What did you do here? Obviously it breaks compilation: drivers/dma/dpaa2/version.map', needed by 'drivers/librte_dma_dpaa2.so.25.0', missing and no known rule to make it
Re: [v7 07/15] dma/dpaa2: move the qdma header to common place
15/10/2024 09:13, Gagandeep Singh: > --- a/doc/api/doxy-api.conf.in > +++ b/doc/api/doxy-api.conf.in > @@ -8,7 +8,7 @@ INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ >@TOPDIR@/drivers/bus/vdev \ >@TOPDIR@/drivers/crypto/cnxk \ >@TOPDIR@/drivers/crypto/scheduler \ > - @TOPDIR@/drivers/dma/dpaa2 \ > + @TOPDIR@/drivers/common/dpaax \ >@TOPDIR@/drivers/event/dlb2 \ >@TOPDIR@/drivers/event/cnxk \ >@TOPDIR@/drivers/mempool/cnxk \ > Not alphabetically sorted.
Re: [v7 02/15] dma/dpaa2: refactor driver code
15/10/2024 09:13, Gagandeep Singh: > +Device Arguments > + > +* Use dev arg option ``fle_pre_populate=1`` to pre-populate all > + DMA descriptors with pre-initialized values. > + usage example: ``fslmc:dpdmai.1,fle_pre_populate=1`` > +* Use dev arg option ``desc_debug=1`` to enable descriptor debugs. > + usage example: ``fslmc:dpdmai.1,desc_debug=1`` A blank line is missing after the headline.
Re: [v7 00/15] NXP DMA driver fixes and Enhancements
15/10/2024 09:13, Gagandeep Singh: > Jun Yang (14): > dma/dpaa2: configure route by port by PCIe port param > dma/dpaa2: refactor driver code > bus/fslmc: enhance the qbman dq storage logic > dma/dpaa2: add short FD support > dma/dpaa2: limit the max descriptor number > dma/dpaa2: change the DMA copy return value > dma/dpaa2: move the qdma header to common place > dma/dpaa: refactor driver > dma/dpaa: support burst capacity API > dma/dpaa: add silent mode support > dma/dpaa: add workaround for ERR050757 > dma/dpaa: qdma stall workaround for ERR050265 > dma/dpaa: add Scatter Gather support > dma/dpaa: add DMA error checks Applied with all the small fixes described in this thread.
Re: [PATCH v20 00/13] drivers/zsda: introduce zsda drivers
09/11/2024 11:36, Hanxiao Li: > v20 > - add release note which was forgot in last version Please when using --in-reply-to, you should target the very first version, so it avoid extra indents in mail clients, thanks.