From patchwork Thu Jan 9 10:42:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149760 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 24F7445F6A; Thu, 9 Jan 2025 11:52:36 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 14C6640B94; Thu, 9 Jan 2025 11:52:36 +0100 (CET) Received: from mxct.zte.com.cn (mxct.zte.com.cn [183.62.165.209]) by mails.dpdk.org (Postfix) with ESMTP id 7BC0140B90 for ; Thu, 9 Jan 2025 11:52:34 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxct.zte.com.cn (FangMail) with ESMTPS id 4YTM7K4b0lz501bt for ; Thu, 9 Jan 2025 18:52:29 +0800 (CST) Received: from szxl2zmapp06.zte.com.cn ([10.1.32.108]) by mse-fl2.zte.com.cn with SMTP id 509Aq1l1039749 for ; Thu, 9 Jan 2025 18:52:01 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:52:04 +0800 X-Zmail-TransId: 3e81677faa54002-53ac9 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 01/13] config: add zsda device number Date: Thu, 9 Jan 2025 18:42:03 +0800 Message-ID: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104203.2404659-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20250109104203.2404659-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509Aq1l1039749 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAA6D.000/4YTM7K4b0lz501bt X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add the number of zsda devices. Signed-off-by: Hanxiao Li --- config/rte_config.h | 4 ++++ 1 file changed, 4 insertions(+) -- 2.27.0 diff --git a/config/rte_config.h b/config/rte_config.h index 3734db6bdc..86897de75e 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -119,6 +119,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 From patchwork Thu Jan 9 10:44:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149766 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E49FA45F6A; Thu, 9 Jan 2025 11:55:37 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A0B0340ED6; Thu, 9 Jan 2025 11:55:17 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id E778040E22 for ; Thu, 9 Jan 2025 11:55:14 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBT5D5Rz5B1Gw for ; Thu, 9 Jan 2025 18:55:13 +0800 (CST) Received: from szxl2zmapp06.zte.com.cn ([10.1.32.108]) by mse-fl2.zte.com.cn with SMTP id 509AsfkX043521 for ; Thu, 9 Jan 2025 18:54:41 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:44 +0800 X-Zmail-TransId: 3e81677faae9002-53b2f From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 02/13] common/zsda: add zsdadev driver Date: Thu, 9 Jan 2025 18:44:06 +0800 Message-ID: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509AsfkX043521 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB11.000/4YTMBT5D5Rz5B1Gw X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 187 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_device.h | 54 ++++++++ drivers/common/zsda/zsda_qp_common.h | 28 ++++ drivers/meson.build | 1 + 6 files changed, 286 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 create mode 100644 drivers/common/zsda/zsda_qp_common.h -- 2.27.0 diff --git a/MAINTAINERS b/MAINTAINERS index 60bdcce543..001b72f55a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1312,6 +1312,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 0000000000..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 0000000000..a7a3ff5440 --- /dev/null +++ b/drivers/common/zsda/zsda_device.c @@ -0,0 +1,187 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#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_dev_by_name_get(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_dev_free_id_get(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_pci_dev_get(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_dev_by_name_get(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_dev_by_name_get(name) != NULL) + return NULL; + + zsda_dev_id = zsda_pci_dev_free_id_get(); + + 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++; + + return zsda_pci_dev; +} + +static int +zsda_pci_device_release(const struct rte_pci_device *pci_dev) +{ + struct zsda_pci_device *zsda_pci_dev; + struct zsda_device_info *inst; + char name[ZSDA_DEV_NAME_MAX_LEN]; + + if (pci_dev == NULL) + return -EINVAL; + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + + snprintf(name + strlen(name), + ZSDA_DEV_NAME_MAX_LEN - (strlen(name) - 1), "_zsda"); + zsda_pci_dev = zsda_pci_dev_by_name_get(name); + if (zsda_pci_dev != NULL) { + inst = &zsda_devs[zsda_pci_dev->zsda_dev_id]; + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + rte_memzone_free(inst->mz); + + memset(inst, 0, sizeof(struct zsda_device_info)); + zsda_nb_pci_devices--; + } + return 0; +} + +static int +zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev __rte_unused, + const struct rte_pci_device *pci_dev) +{ + return zsda_pci_device_release(pci_dev); +} + +static int +zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + int ret = 0; + struct zsda_pci_device *zsda_pci_dev; + + zsda_pci_dev = zsda_pci_device_allocate(pci_dev); + if (zsda_pci_dev == NULL) + return -ENODEV; + + return ret; +} + +static int +zsda_pci_remove(struct rte_pci_device *pci_dev) +{ + struct zsda_pci_device *zsda_pci_dev; + + if (pci_dev == NULL) + return -EINVAL; + + zsda_pci_dev = zsda_pci_dev_get(pci_dev); + if (zsda_pci_dev == NULL) + return 0; + + return zsda_pci_dev_destroy(zsda_pci_dev, pci_dev); +} + +static struct rte_pci_driver rte_zsda_pmd = { + .id_table = pci_id_zsda_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING, + .probe = zsda_pci_probe, + .remove = zsda_pci_remove }; + +RTE_PMD_REGISTER_PCI(ZSDA_PCI_NAME, rte_zsda_pmd); +RTE_PMD_REGISTER_PCI_TABLE(ZSDA_PCI_NAME, pci_id_zsda_map); +RTE_PMD_REGISTER_KMOD_DEP(ZSDA_PCI_NAME, + "* igb_uio | uio_pci_generic | vfio-pci"); diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h new file mode 100644 index 0000000000..67f8cc09e4 --- /dev/null +++ b/drivers/common/zsda/zsda_device.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_DEVICE_H_ +#define _ZSDA_DEVICE_H_ + +#include "zsda_qp_common.h" + +#define MAX_QPS_ON_FUNCTION 128 +#define ZSDA_DEV_NAME_MAX_LEN 64 + +struct zsda_device_info { + const struct rte_memzone *mz; + /**< mz to store theļ¼š struct zsda_pci_device , so it can be + * shared across processes + */ + struct rte_device comp_rte_dev; + /**< This represents the compression subset of this pci device. + * Register with this rather than with the one in + * pci_dev so that its driver can have a compression-specific name + */ + struct rte_pci_device *pci_dev; +}; + +extern struct zsda_device_info zsda_devs[]; + +struct zsda_qp_hw_data { + bool used; + + uint8_t tx_ring_num; + uint8_t rx_ring_num; + uint16_t tx_msg_size; + uint16_t rx_msg_size; +}; + +struct zsda_qp_hw { + struct zsda_qp_hw_data data[MAX_QPS_ON_FUNCTION]; +}; + +struct zsda_pci_device { + /* Data used by all services */ + char name[ZSDA_DEV_NAME_MAX_LEN]; + /**< Name of zsda pci device */ + uint8_t zsda_dev_id; + /**< Id of device instance for this zsda pci device */ + + struct rte_pci_device *pci_dev; + + struct zsda_qp_hw zsda_hw_qps[ZSDA_MAX_SERVICES]; + uint16_t zsda_qp_hw_num[ZSDA_MAX_SERVICES]; +}; + +#endif /* _ZSDA_DEVICE_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h new file mode 100644 index 0000000000..7635ecc9c1 --- /dev/null +++ b/drivers/common/zsda/zsda_qp_common.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_QP_COMMON_H_ +#define _ZSDA_QP_COMMON_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "bus_pci_driver.h" + +#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES + +#define ZSDA_SUCCESS 0 +#define ZSDA_FAILED (-1) + +enum zsda_service_type { + ZSDA_SERVICE_INVALID, +}; +#define ZSDA_MAX_SERVICES (0) + +#endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/meson.build b/drivers/meson.build index 495e21b54a..63ffa1f416 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -17,6 +17,7 @@ subdirs = [ 'common/nitrox', # depends on bus. 'common/qat', # depends on bus. 'common/sfc_efx', # depends on bus. + 'common/zsda', # depends on bus. 'mempool', # depends on common and bus. 'dma', # depends on common and bus. 'net', # depends on common, bus, mempool From patchwork Thu Jan 9 10:44:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149761 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9A60145F6A; Thu, 9 Jan 2025 11:54:59 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 62C4F4042E; Thu, 9 Jan 2025 11:54:59 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 6D2754042E for ; Thu, 9 Jan 2025 11:54:57 +0100 (CET) Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMB457Tqz8RV6L for ; Thu, 9 Jan 2025 18:54:52 +0800 (CST) Received: from szxl2zmapp05.zte.com.cn ([10.1.32.37]) by mse-fl1.zte.com.cn with SMTP id 509AsfSf028706 for ; Thu, 9 Jan 2025 18:54:41 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:44 +0800 X-Zmail-TransId: 3e81677faaf4002-53b3b From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 03/13] common/zsda: add logging macros Date: Thu, 9 Jan 2025 18:44:07 +0800 Message-ID: <20250109104454.2404815-2-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 509AsfSf028706 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAAFC.002/4YTMB457Tqz8RV6L X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add zxdh logging implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c | 22 +++++++++++++++------- drivers/common/zsda/zsda_logs.c | 19 +++++++++++++++++++ drivers/common/zsda/zsda_logs.h | 27 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp_common.h | 1 + 5 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h -- 2.27.0 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 a7a3ff5440..18ca372f60 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -26,9 +26,10 @@ zsda_pci_dev_by_name_get(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) @@ -76,8 +77,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; @@ -85,8 +88,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) return zsda_pci_dev; } - if (zsda_pci_dev_by_name_get(name) != NULL) + if (zsda_pci_dev_by_name_get(name) != NULL) { + ZSDA_LOG(ERR, "Failed! config"); return NULL; + } zsda_dev_id = zsda_pci_dev_free_id_get(); @@ -97,9 +102,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); @@ -154,8 +160,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 0000000000..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 0000000000..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 used by the rte_log infrastructure. + */ +int zsda_hexdump_log(uint32_t level, uint32_t logtype, const char *title, + const void *buf, unsigned int len); + +#endif /* _ZSDA_LOGS_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 7635ecc9c1..44cf50cfea 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -14,6 +14,7 @@ #include #include "bus_pci_driver.h" +#include "zsda_logs.h" #define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES From patchwork Thu Jan 9 10:44:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149770 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 07F6045FDF; Thu, 9 Jan 2025 11:56:09 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C55CA410E7; Thu, 9 Jan 2025 11:55:23 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 7C1B541060 for ; Thu, 9 Jan 2025 11:55:20 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBW5jc7z8R048 for ; Thu, 9 Jan 2025 18:55:15 +0800 (CST) Received: from szxlzmapp02.zte.com.cn ([10.5.231.79]) by mse-fl2.zte.com.cn with SMTP id 509AsgOX043523 for ; Thu, 9 Jan 2025 18:54:42 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf4002-53b3d From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 04/13] common/zsda: add functions to operate hardware queue Date: Thu, 9 Jan 2025 18:44:08 +0800 Message-ID: <20250109104454.2404815-3-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509AsgOX043523 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB13.001/4YTMBW5jc7z8R048 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 187 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 40 ++++++ drivers/common/zsda/zsda_qp_common.h | 7 + 5 files changed, 242 insertions(+) create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h -- 2.27.0 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 18ca372f60..189614f881 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -2,6 +2,7 @@ * Copyright(c) 2024 ZTE Corporation */ +#include "zsda_qp.h" #include "zsda_device.h" /* per-process array of device data */ @@ -165,6 +166,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 0000000000..bc489f6296 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.c @@ -0,0 +1,187 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include "zsda_qp.h" + +static uint8_t zsda_num_used_qps; + +static uint8_t +zsda_used_qps_num_get(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_single_queue_start(uint8_t *mmio_base, const uint8_t id) +{ + uint8_t *addr_start = mmio_base + ZSDA_IO_Q_START + (4 * id); + + ZSDA_CSR_WRITE32(addr_start, ZSDA_Q_START); + return zsda_check_write(addr_start, ZSDA_Q_START); +} + +static int +zsda_single_queue_stop(uint8_t *mmio_base, const uint8_t id) +{ + int ret; + uint8_t *addr_stop = mmio_base + ZSDA_IO_Q_STOP + (4 * id); + uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_STOP_RESP + (4 * id); + + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(addr_stop, ZSDA_Q_STOP); + + ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID); + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + + return ret; +} + +static int +zsda_single_queue_clear(uint8_t *mmio_base, const uint8_t id) +{ + int ret; + uint8_t *addr_clear = mmio_base + ZSDA_IO_Q_CLR + (4 * id); + uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_CLR_RESP + (4 * id); + + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(addr_clear, ZSDA_CLEAR_VALID); + ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID); + ZSDA_CSR_WRITE32(addr_clear, ZSDA_CLEAR_INVALID); + + return ret; +} + +int +zsda_queue_start(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t id; + int ret = ZSDA_SUCCESS; + + for (id = 0; id < zsda_num_used_qps; id++) + ret |= zsda_single_queue_start(mmio_base, id); + + return ret; +} + +int +zsda_queue_stop(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t id; + int ret = ZSDA_SUCCESS; + + for (id = 0; id < zsda_num_used_qps; id++) + ret |= zsda_single_queue_stop(mmio_base, id); + + return ret; +} + +static int +zsda_queue_clear(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t id; + int ret = ZSDA_SUCCESS; + + for (id = 0; id < zsda_num_used_qps; id++) + ret |= zsda_single_queue_clear(mmio_base, id); + + return ret; +} + +int +zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) +{ + int ret; + + zsda_num_used_qps = zsda_used_qps_num_get(zsda_pci_dev->pci_dev); + zsda_num_used_qps++; + + ret = zsda_admin_q_start(zsda_pci_dev->pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! admin q start"); + return ret; + } + + ret = zsda_queue_clear(zsda_pci_dev->pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! used zsda_io q clear"); + return ret; + } + return ret; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h new file mode 100644 index 0000000000..95bc6bacd5 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_QP_H_ +#define _ZSDA_QP_H_ + +#include "zsda_qp_common.h" +#include "zsda_device.h" + +#define ZSDA_ADMIN_Q_START 0x100 +#define ZSDA_ADMIN_Q_STOP 0x100 +#define ZSDA_ADMIN_Q_STOP_RESP 0x104 +#define ZSDA_ADMIN_Q_CLR 0x108 +#define ZSDA_ADMIN_Q_CLR_RESP 0x10C + +#define ZSDA_IO_Q_START 0x200 +#define ZSDA_IO_Q_STOP 0x200 +#define ZSDA_IO_Q_STOP_RESP 0x400 +#define ZSDA_IO_Q_CLR 0x600 +#define ZSDA_IO_Q_CLR_RESP 0x800 + +#define ZSDA_Q_START 0x1 +#define ZSDA_Q_STOP 0x0 +#define ZSDA_CLEAR_VALID 0x1 +#define ZSDA_CLEAR_INVALID 0x0 +#define ZSDA_RESP_VALID 0x1 +#define ZSDA_RESP_INVALID 0x0 + +#define ZSDA_TIME_SLEEP_US 100 +#define ZSDA_TIME_NUM 500 + +extern struct zsda_num_qps zsda_nb_qps; + +int zsda_queue_start(const struct rte_pci_device *pci_dev); +int zsda_queue_stop(const struct rte_pci_device *pci_dev); + +int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev); + +#endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 44cf50cfea..bc29dfdf60 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -26,4 +26,11 @@ enum zsda_service_type { }; #define ZSDA_MAX_SERVICES (0) +#define ZSDA_CSR_READ32(addr) rte_read32((addr)) +#define ZSDA_CSR_WRITE32(addr, value) rte_write32((value), (addr)) +#define ZSDA_CSR_READ16(addr) rte_read16((addr)) +#define ZSDA_CSR_WRITE16(addr, value) rte_write16((value), (addr)) +#define ZSDA_CSR_READ8(addr) rte_read8((addr)) +#define ZSDA_CSR_WRITE8(addr, value) rte_write8_relaxed((value), (addr)) + #endif /* _ZSDA_QP_COMMON_H_ */ From patchwork Thu Jan 9 10:44:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149762 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7348545F6A; Thu, 9 Jan 2025 11:55:04 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B3E8A40DDB; Thu, 9 Jan 2025 11:55:00 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id EC9294026A for ; Thu, 9 Jan 2025 11:54:56 +0100 (CET) Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMB41G8jz8QrkZ for ; Thu, 9 Jan 2025 18:54:52 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl1.zte.com.cn with SMTP id 509AsfkT028708 for ; Thu, 9 Jan 2025 18:54:41 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf5002-53b3f From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 05/13] common/zsda: add definition and use of msg chan. Date: Thu, 9 Jan 2025 18:44:09 +0800 Message-ID: <20250109104454.2404815-4-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 509AsfkT028708 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAAFC.000/4YTMB41G8jz8QrkZ X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 307 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 48 +++++ drivers/common/zsda/zsda_qp_common.h | 37 ++++ 3 files changed, 392 insertions(+) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index bc489f6296..6c1875746d 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -4,8 +4,50 @@ #include "zsda_qp.h" +#define MAGIC_SEND 0xab +#define MAGIC_RECV 0xcd +#define ADMIN_VER 1 + static uint8_t zsda_num_used_qps; +static struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = { +}; + +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_used_qps_num_get(const struct rte_pci_device *pci_dev) { @@ -164,6 +206,258 @@ zsda_queue_clear(const struct rte_pci_device *pci_dev) return ret; } +static uint32_t +zsda_reg_8_set(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_reg_8_get(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_admin_msg_send(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_reg_8_set(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_reg_8_get(mmio_base + ZSDA_ADMIN_WQ_BASE7, 2); + if (wq_flag == MAGIC_RECV) + break; + + retry--; + if (!retry) { + ZSDA_LOG(ERR, "wq_flag 0x%X", wq_flag); + zsda_reg_8_set(mmio_base + ZSDA_ADMIN_WQ_BASE7, 0, crc, + ADMIN_VER, 0); + return -EIO; + } + } while (1); + + return ZSDA_SUCCESS; +} + +static int +zsda_admin_msg_recv(const struct rte_pci_device *pci_dev, void *resp, + const uint32_t len) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t cq_flag; + uint32_t retry = ZSDA_TIME_NUM; + uint8_t crc; + uint8_t buf[ADMIN_BUF_TOTAL_LEN] = {0}; + uint32_t i; + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + + do { + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + + cq_flag = zsda_reg_8_get(mmio_base + ZSDA_ADMIN_CQ_BASE7, 2); + if (cq_flag == MAGIC_SEND) + break; + + retry--; + if (!retry) + return -EIO; + } while (1); + + for (i = 0; i < len; i++) + buf[i] = ZSDA_CSR_READ8(mmio_base + ZSDA_ADMIN_CQ + i); + + crc = ZSDA_CSR_READ8(mmio_base + ZSDA_ADMIN_CQ_CRC); + rte_rmb(); + ZSDA_CSR_WRITE8(mmio_base + ZSDA_ADMIN_CQ_FLAG, MAGIC_RECV); + if (crc != zsda_crc8(buf, ADMIN_BUF_DATA_LEN)) { + ZSDA_LOG(ERR, "[%d] Failed! crc error!", __LINE__); + return -EIO; + } + + memcpy(resp, buf, len); + + return ZSDA_SUCCESS; +} + +static int +zsda_admin_msg_init(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + + zsda_reg_8_set(mmio_base + ZSDA_ADMIN_WQ_BASE7, 0, 0, MAGIC_RECV, 0); + zsda_reg_8_set(mmio_base + ZSDA_ADMIN_CQ_BASE7, 0, 0, MAGIC_RECV, 0); + return 0; +} + +static void +zsda_queue_head_tail_set(const struct zsda_pci_device *zsda_pci_dev, + const uint8_t qid) +{ + struct rte_pci_device *pci_dev = + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev; + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + + ZSDA_CSR_WRITE32(mmio_base + IO_DB_INITIAL_CONFIG + (qid * 4), + SET_HEAD_INTI); +} + +static int +zsda_queue_cfg_by_id_get(const struct zsda_pci_device *zsda_pci_dev, + const uint8_t qid, struct qinfo *qcfg) +{ + struct zsda_admin_req_qcfg req = {0}; + struct zsda_admin_resp_qcfg resp = {0}; + int ret; + struct rte_pci_device *pci_dev = + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev; + + if (qid >= MAX_QPS_ON_FUNCTION) { + ZSDA_LOG(ERR, "qid beyond limit!"); + return ZSDA_FAILED; + } + + zsda_admin_msg_init(pci_dev); + req.msg_type = ZSDA_ADMIN_QUEUE_CFG_REQ; + req.qid = qid; + + ret = zsda_admin_msg_send(pci_dev, &req, sizeof(req)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Send msg"); + return ret; + } + + ret = zsda_admin_msg_recv(pci_dev, &resp, sizeof(resp)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Receive msg"); + return ret; + } + + *qcfg = resp.qcfg; + + return ZSDA_SUCCESS; +} + +static int +zsda_queue_cfg_get(struct zsda_pci_device *zsda_pci_dev) +{ + uint8_t i; + uint32_t index; + enum zsda_service_type type; + struct zsda_qp_hw *zsda_hw_qps = zsda_pci_dev->zsda_hw_qps; + struct qinfo qcfg = {0}; + int ret = ZSDA_FAILED; + + for (i = 0; i < zsda_num_used_qps; i++) { + zsda_queue_head_tail_set(zsda_pci_dev, i); + ret = zsda_queue_cfg_by_id_get(zsda_pci_dev, i, &qcfg); + type = qcfg.q_type; + if (ret) { + ZSDA_LOG(ERR, "get queue cfg!"); + return ret; + } + if (type >= ZSDA_SERVICE_INVALID) + continue; + + index = zsda_pci_dev->zsda_qp_hw_num[type]; + zsda_hw_qps[type].data[index].used = true; + zsda_hw_qps[type].data[index].tx_ring_num = i; + zsda_hw_qps[type].data[index].rx_ring_num = i; + zsda_hw_qps[type].data[index].tx_msg_size = + zsda_qp_hw_ring_size[type].tx_msg_size; + zsda_hw_qps[type].data[index].rx_msg_size = + zsda_qp_hw_ring_size[type].rx_msg_size; + + zsda_pci_dev->zsda_qp_hw_num[type]++; + } + + return ret; +} + +static int +zsda_flr_unmask_set(const struct zsda_pci_device *zsda_pci_dev) +{ + struct zsda_admin_req_qcfg req = {0}; + struct zsda_admin_resp_qcfg resp = {0}; + + int ret = 0; + struct rte_pci_device *pci_dev = + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev; + + zsda_admin_msg_init(pci_dev); + + req.msg_type = ZSDA_FLR_SET_FUNCTION; + + ret = zsda_admin_msg_send(pci_dev, &req, sizeof(req)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Send msg"); + return ret; + } + + ret = zsda_admin_msg_recv(pci_dev, &resp, sizeof(resp)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Receive msg"); + return ret; + } + + return ZSDA_SUCCESS; +} + + int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) { @@ -183,5 +477,18 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) ZSDA_LOG(ERR, "Failed! used zsda_io q clear"); return ret; } + + ret = zsda_queue_cfg_get(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_queue_cfg_get"); + return ret; + } + + ret = zsda_flr_unmask_set(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_flr_unmask_set"); + return ret; + } + return ret; } diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 95bc6bacd5..a1d70f155f 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -20,6 +20,19 @@ #define ZSDA_IO_Q_CLR 0x600 #define ZSDA_IO_Q_CLR_RESP 0x800 +#define ZSDA_ADMIN_WQ 0x40 +#define ZSDA_ADMIN_WQ_BASE7 0x5C +#define ZSDA_ADMIN_WQ_CRC 0x5C +#define ZSDA_ADMIN_WQ_VERSION 0x5D +#define ZSDA_ADMIN_WQ_FLAG 0x5E +#define ZSDA_ADMIN_CQ 0x60 +#define ZSDA_ADMIN_CQ_BASE7 0x7C +#define ZSDA_ADMIN_CQ_CRC 0x7C +#define ZSDA_ADMIN_CQ_VERSION 0x7D +#define ZSDA_ADMIN_CQ_FLAG 0x7E +#define ZSDA_ADMIN_WQ_TAIL 0x80 +#define ZSDA_ADMIN_CQ_HEAD 0x84 + #define ZSDA_Q_START 0x1 #define ZSDA_Q_STOP 0x0 #define ZSDA_CLEAR_VALID 0x1 @@ -27,11 +40,46 @@ #define ZSDA_RESP_VALID 0x1 #define ZSDA_RESP_INVALID 0x0 +#define ADMIN_BUF_DATA_LEN 0x1C +#define ADMIN_BUF_TOTAL_LEN 0x20 + +#define IO_DB_INITIAL_CONFIG 0x1C00 +#define SET_CYCLE 0xff +#define SET_HEAD_INTI 0x0 + + #define ZSDA_TIME_SLEEP_US 100 #define ZSDA_TIME_NUM 500 extern struct zsda_num_qps zsda_nb_qps; +enum zsda_admin_msg_id { + /* Version information */ + ZSDA_ADMIN_VERSION_REQ = 0, + ZSDA_ADMIN_VERSION_RESP, + /* algo type */ + ZSDA_ADMIN_QUEUE_CFG_REQ, + ZSDA_ADMIN_QUEUE_CFG_RESP, + /* get cycle */ + ZSDA_ADMIN_QUEUE_CYCLE_REQ, + ZSDA_ADMIN_QUEUE_CYCLE_RESP, + /* set cyclr */ + ZSDA_ADMIN_SET_CYCLE_REQ, + ZSDA_ADMIN_SET_CYCLE_RESP, + + ZSDA_MIG_STATE_WARNING, + ZSDA_ADMIN_RESERVE, + /* set close flr register */ + ZSDA_FLR_SET_FUNCTION, + ZSDA_ADMIN_MSG_VALID, + ZSDA_ADMIN_INT_TEST +}; + +struct ring_size { + uint16_t tx_msg_size; + uint16_t rx_msg_size; +}; + int zsda_queue_start(const struct rte_pci_device *pci_dev); int zsda_queue_stop(const struct rte_pci_device *pci_dev); diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index bc29dfdf60..ac25408aeb 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -33,4 +33,41 @@ 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_admin_req { + uint16_t msg_type; + uint8_t data[26]; +} __rte_packed; + +struct zsda_admin_resp { + uint16_t msg_type; + uint8_t data[26]; +} __rte_packed; + +struct zsda_admin_req_qcfg { + uint16_t msg_type; + uint8_t qid; + uint8_t data[25]; +} __rte_packed; + +struct zsda_test_msg { + uint32_t msg_type; + uint32_t data_in; + uint8_t data[20]; +} __rte_packed; + +struct qinfo { + uint16_t q_type; + uint16_t wq_tail; + uint16_t wq_head; + uint16_t cq_tail; + uint16_t cq_head; + uint16_t cycle; +} __rte_packed; + +struct zsda_admin_resp_qcfg { + uint16_t msg_type; + struct qinfo qcfg; + uint8_t data[14]; +} __rte_packed; + #endif /* _ZSDA_QP_COMMON_H_ */ From patchwork Thu Jan 9 10:44:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149764 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6ECF245F6A; Thu, 9 Jan 2025 11:55:19 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1682840E2B; Thu, 9 Jan 2025 11:55:05 +0100 (CET) Received: from mxct.zte.com.cn (mxct.zte.com.cn [183.62.165.209]) by mails.dpdk.org (Postfix) with ESMTP id 3860240E11 for ; Thu, 9 Jan 2025 11:55:02 +0100 (CET) Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxct.zte.com.cn (FangMail) with ESMTPS id 4YTMB94g4qz501gP for ; Thu, 9 Jan 2025 18:54:57 +0800 (CST) Received: from szxl2zmapp06.zte.com.cn ([10.1.32.108]) by mse-fl1.zte.com.cn with SMTP id 509AsgtO028710 for ; Thu, 9 Jan 2025 18:54:42 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf5002-53b41 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 06/13] compress/zsda: add zsda compressdev driver skeleton Date: Thu, 9 Jan 2025 18:44:10 +0800 Message-ID: <20250109104454.2404815-5-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 509AsgtO028710 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB01.001/4YTMB94g4qz501gP X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 171 ++++++++++++++++++++++ drivers/common/zsda/meson.build | 12 +- drivers/common/zsda/zsda_device.h | 5 + drivers/common/zsda/zsda_qp.c | 24 +++ drivers/common/zsda/zsda_qp.h | 10 ++ drivers/common/zsda/zsda_qp_common.h | 4 +- drivers/compress/zsda/zsda_comp_pmd.c | 128 ++++++++++++++++ drivers/compress/zsda/zsda_comp_pmd.h | 36 +++++ 11 files changed, 398 insertions(+), 2 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 -- 2.27.0 diff --git a/MAINTAINERS b/MAINTAINERS index 001b72f55a..44e0c3f2ae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1315,6 +1315,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 0000000000..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 0000000000..da7117b45e --- /dev/null +++ b/doc/guides/compressdevs/zsda.rst @@ -0,0 +1,171 @@ +.. 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 +-------- + + +Installation +------------ + +The ZSDA compression PMD is built by default with a standard DPDK build. + + + +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>`. + + +Build Configuration +~~~~~~~~~~~~~~~~~~~ +These is the build configuration options affecting ZSDA, and its default values: + +.. code-block:: console + + RTE_PMD_ZSDA_MAX_PCI_DEVICES=256 + + +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. "0000: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 processes are using + different acceleration services. + Conversely one DPDK process can use one or more ZSDA VFs and can expose + compressdev instances on each of those VFs. + + +The examples below are based on the 1cf2 device, if you have a different device +use the corresponding values in the above table. + +In BIOS ensure that SRIOV is enabled and either: + +* Disable VT-d or +* Enable VT-d and set ``"intel_iommu=on iommu=pt"`` in the grub file. + +you need to expose the Virtual Functions (VFs) using the sysfs file system. + +First find the BDFs (Bus-Device-Function) of the physical functions (PFs) of +your device, e.g.:: + + lspci -d:8050 + +You should see output similar to:: + + cc:00.4 Processing accelerators: Device 1cf2:8050 (rev 01) + ce:00.3 Processing accelerators: Device 1cf2:8050 (rev 01) + d0:00.3 Processing accelerators: Device 1cf2:8050 (rev 01) + d2:00.3 Processing accelerators: Device 1cf2:8050 (rev 01) + +Enable the VFs for each PF by echoing the number of VFs per PF to the pci driver:: + + echo 31 > /sys/bus/pci/device/0000:cc:00.4/sriov_numvfs + echo 31 > /sys/bus/pci/device/0000:ce:00.3/sriov_numvfs + echo 31 > /sys/bus/pci/device/0000:d0:00.3/sriov_numvfs + echo 31 > /sys/bus/pci/device/0000:d2:00.3/sriov_numvfs + +Check that the VFs are available for use. For example ``lspci -d:8051`` should +list 124 VF devices available. + +To complete the installation follow the instructions in +`Binding the available VFs to the vfio-pci driver`_. + +.. Note:: + + If you see the following warning in ``/var/log/messages`` it can be ignored: + ``IOMMU should be enabled for SR-IOV to work correctly``. + + +Binding the available VFs to the vfio-pci driver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Note: + +* Please note that due to security issues, the usage of older DPDK igb_uio + driver is not recommended. This document shows how to use the more secure + vfio-pci driver. + +Unbind the VFs from the stock driver so they can be bound to the vfio-pci driver. + + +Bind to the vfio-pci driver +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Load the vfio-pci driver, bind the VF PCI Device id to it using the +``dpdk-devbind.py`` script then use the ``--status`` option +to confirm the VF devices are now in use by vfio-pci kernel driver, +e.g. for the 1cf2 device:: + + cd to the top-level DPDK directory + modprobe vfio-pci + usertools/dpdk-devbind.py -b vfio-pci 0000:cc:01.4 + usertools/dpdk-devbind.py --status + +Use ``modprobe vfio-pci disable_denylist=1`` from kernel 5.9 onwards. + + +Testing +-------- + +ZSDA compression PMD can be tested by running the test application:: + + cd .//app/test + ./dpdk-test -l1 -n1 -a + RTE>>compressdev_autotest + + +Debugging +------------ + +ZSDA logging feature can be enabled using the log-level option (where 8=maximum +log level) on the process cmdline, as shown in the following example:: + + --log-level="gen,8" diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build index 4c910d7e7d..6ee2a68f4b 100644 --- a/drivers/common/zsda/meson.build +++ b/drivers/common/zsda/meson.build @@ -7,9 +7,19 @@ if is_windows subdir_done() endif -deps += ['bus_pci', 'mbuf'] +deps += ['bus_pci', 'mbuf', 'compressdev'] sources += files( 'zsda_device.c', 'zsda_logs.c', 'zsda_qp.c', ) + +zsda_compress = true +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'] + sources += files(join_paths(zsda_compress_relpath, f)) + endforeach +endif diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h index 67f8cc09e4..dd0fa35ba6 100644 --- a/drivers/common/zsda/zsda_device.h +++ b/drivers/common/zsda/zsda_device.h @@ -6,6 +6,7 @@ #define _ZSDA_DEVICE_H_ #include "zsda_qp_common.h" +#include "zsda_comp_pmd.h" #define MAX_QPS_ON_FUNCTION 128 #define ZSDA_DEV_NAME_MAX_LEN 64 @@ -47,6 +48,10 @@ struct zsda_pci_device { struct rte_pci_device *pci_dev; + /* Data relating to compression service */ + struct zsda_comp_dev_private *comp_dev; + /**< link back to compressdev private data */ + struct zsda_qp_hw zsda_hw_qps[ZSDA_MAX_SERVICES]; uint16_t zsda_qp_hw_num[ZSDA_MAX_SERVICES]; }; diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 6c1875746d..2ddbf51665 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -11,6 +11,8 @@ static uint8_t zsda_num_used_qps; static struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = { + [ZSDA_SERVICE_COMPRESSION] = {32, 16}, + [ZSDA_SERVICE_DECOMPRESSION] = {32, 16}, }; static const uint8_t crc8_table[256] = { @@ -457,6 +459,26 @@ zsda_flr_unmask_set(const struct zsda_pci_device *zsda_pci_dev) return ZSDA_SUCCESS; } +static uint16_t +zsda_num_qps_get(const struct zsda_pci_device *zsda_pci_dev, + const enum zsda_service_type service) +{ + uint16_t qp_hw_num = 0; + + if (service < ZSDA_SERVICE_INVALID) + qp_hw_num = zsda_pci_dev->zsda_qp_hw_num[service]; + return qp_hw_num; +} + +struct zsda_num_qps zsda_nb_qps; +static void +zsda_nb_qps_get(const struct zsda_pci_device *zsda_pci_dev) +{ + zsda_nb_qps.encomp = + zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_COMPRESSION); + zsda_nb_qps.decomp = + zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_DECOMPRESSION); +} int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) @@ -490,5 +512,7 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) return ret; } + zsda_nb_qps_get(zsda_pci_dev); + return ret; } diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index a1d70f155f..c07b8cc653 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -80,6 +80,16 @@ struct ring_size { uint16_t rx_msg_size; }; +struct zsda_num_qps { + uint16_t encomp; + uint16_t decomp; + uint16_t encrypt; + uint16_t decrypt; + uint16_t hash; +}; + +extern struct zsda_num_qps zsda_nb_qps; + int zsda_queue_start(const struct rte_pci_device *pci_dev); int zsda_queue_stop(const struct rte_pci_device *pci_dev); diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index ac25408aeb..0d5eda2e06 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -22,9 +22,11 @@ #define ZSDA_FAILED (-1) enum zsda_service_type { + ZSDA_SERVICE_COMPRESSION = 0, + ZSDA_SERVICE_DECOMPRESSION = 1, ZSDA_SERVICE_INVALID, }; -#define ZSDA_MAX_SERVICES (0) +#define ZSDA_MAX_SERVICES (2) #define ZSDA_CSR_READ32(addr) rte_read32((addr)) #define ZSDA_CSR_WRITE32(addr, value) rte_write32((value), (addr)) diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c new file mode 100644 index 0000000000..d1c33f448c --- /dev/null +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include "zsda_logs.h" +#include "zsda_qp_common.h" +#include "zsda_comp_pmd.h" + +static struct rte_compressdev_ops compress_zsda_ops = { + + .dev_configure = NULL, + .dev_start = NULL, + .dev_stop = NULL, + .dev_close = NULL, + .dev_infos_get = NULL, + + .stats_get = NULL, + .stats_reset = NULL, + .queue_pair_setup = NULL, + .queue_pair_release = NULL, + + .private_xform_create = NULL, + .private_xform_free = NULL +}; + +/* An rte_driver is needed in the registration of the device with compressdev. + * The actual zsda pci's rte_driver can't be used as its name represents + * the whole pci device with all services. Think of this as a holder for a name + * for the compression part of the pci device. + */ +static const char zsda_comp_drv_name[] = RTE_STR(COMPRESSDEV_NAME_ZSDA_PMD); +static const struct rte_driver compdev_zsda_driver = { + .name = zsda_comp_drv_name, .alias = zsda_comp_drv_name}; + +int +zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) +{ + struct zsda_device_info *dev_info = + &zsda_devs[zsda_pci_dev->zsda_dev_id]; + + struct rte_compressdev_pmd_init_params init_params = { + .name = "", + .socket_id = (int)rte_socket_id(), + }; + + char name[RTE_COMPRESSDEV_NAME_MAX_LEN]; + char capa_memz_name[RTE_COMPRESSDEV_NAME_MAX_LEN]; + struct rte_compressdev *compressdev; + struct zsda_comp_dev_private *comp_dev; + const struct rte_compressdev_capabilities *capabilities; + uint16_t capa_size = sizeof(struct rte_compressdev_capabilities); + + snprintf(name, RTE_COMPRESSDEV_NAME_MAX_LEN, "%s_%s", + zsda_pci_dev->name, "comp"); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + + dev_info->comp_rte_dev.driver = &compdev_zsda_driver; + dev_info->comp_rte_dev.numa_node = dev_info->pci_dev->device.numa_node; + dev_info->comp_rte_dev.devargs = NULL; + + compressdev = rte_compressdev_pmd_create( + name, &(dev_info->comp_rte_dev), + sizeof(struct zsda_comp_dev_private), &init_params); + + if (compressdev == NULL) + return -ENODEV; + + compressdev->dev_ops = &compress_zsda_ops; + + compressdev->enqueue_burst = NULL; + compressdev->dequeue_burst = NULL; + + compressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED; + + snprintf(capa_memz_name, RTE_COMPRESSDEV_NAME_MAX_LEN, + "ZSDA_COMP_CAPA"); + + comp_dev = compressdev->data->dev_private; + comp_dev->zsda_pci_dev = zsda_pci_dev; + comp_dev->compressdev = compressdev; + + capabilities = NULL; + + comp_dev->capa_mz = rte_memzone_lookup(capa_memz_name); + if (comp_dev->capa_mz == NULL) { + comp_dev->capa_mz = rte_memzone_reserve( + capa_memz_name, capa_size, rte_socket_id(), 0); + } + if (comp_dev->capa_mz == NULL) { + ZSDA_LOG(DEBUG, "Failed! comp_dev->capa_mz is NULL"); + memset(&dev_info->comp_rte_dev, 0, + sizeof(dev_info->comp_rte_dev)); + rte_compressdev_pmd_destroy(compressdev); + return -EFAULT; + } + + memcpy(comp_dev->capa_mz->addr, capabilities, capa_size); + comp_dev->zsda_dev_capabilities = comp_dev->capa_mz->addr; + + zsda_pci_dev->comp_dev = comp_dev; + + return ZSDA_SUCCESS; +} + +int +zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev) +{ + struct zsda_comp_dev_private *comp_dev; + + if (zsda_pci_dev == NULL) + return -ENODEV; + + comp_dev = zsda_pci_dev->comp_dev; + if (comp_dev == NULL) + return ZSDA_SUCCESS; + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + rte_memzone_free(zsda_pci_dev->comp_dev->capa_mz); + + rte_compressdev_pmd_destroy(comp_dev->compressdev); + zsda_pci_dev->comp_dev = NULL; + + return ZSDA_SUCCESS; +} diff --git a/drivers/compress/zsda/zsda_comp_pmd.h b/drivers/compress/zsda/zsda_comp_pmd.h new file mode 100644 index 0000000000..b83dcd7202 --- /dev/null +++ b/drivers/compress/zsda/zsda_comp_pmd.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_COMP_PMD_H_ +#define _ZSDA_COMP_PMD_H_ + +#include + +#include "zsda_qp.h" + +/**< ZSDA Compression PMD driver name */ +#define COMPRESSDEV_NAME_ZSDA_PMD compress_zsda + +/** private data structure for a ZSDA compression device. + * This ZSDA device is a device offering only a compression service, + * there can be one of these on each zsda_pci_device (VF). + */ +struct zsda_comp_dev_private { + struct zsda_pci_device *zsda_pci_dev; + /**< The zsda pci device hosting the service */ + struct rte_compressdev *compressdev; + /**< The pointer to this compression device structure */ + const struct rte_compressdev_capabilities *zsda_dev_capabilities; + /* ZSDA device compression capabilities */ + struct rte_mempool *xformpool; + /**< The device's pool for zsda_comp_xforms */ + const struct rte_memzone *capa_mz; + /* Shared memzone for storing capabilities */ +}; + +int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev); + +int zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev); + +#endif /* _ZSDA_COMP_PMD_H_ */ From patchwork Thu Jan 9 10:44:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149767 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A134F45F6A; Thu, 9 Jan 2025 11:55:45 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1592940EE7; Thu, 9 Jan 2025 11:55:19 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 4D8E940E4D for ; Thu, 9 Jan 2025 11:55:16 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBW2Csrz5B1Gs for ; Thu, 9 Jan 2025 18:55:15 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl2.zte.com.cn with SMTP id 509AsgcJ043524 for ; Thu, 9 Jan 2025 18:54:42 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf5002-53b43 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 07/13] compress/zsda: add zsda compressdev dev ops Date: Thu, 9 Jan 2025 18:44:11 +0800 Message-ID: <20250109104454.2404815-6-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509AsgcJ043524 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB13.001/4YTMBW2Csrz5B1Gs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org add zsda compressdev dev interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 1 + drivers/common/zsda/zsda_device.c | 9 +- drivers/common/zsda/zsda_qp_common.c | 57 +++++++++++ drivers/common/zsda/zsda_qp_common.h | 37 +++++++ drivers/compress/zsda/zsda_comp_pmd.c | 133 +++++++++++++++++++++++++- drivers/compress/zsda/zsda_comp_pmd.h | 5 + 6 files changed, 236 insertions(+), 6 deletions(-) create mode 100644 drivers/common/zsda/zsda_qp_common.c -- 2.27.0 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_device.c b/drivers/common/zsda/zsda_device.c index 189614f881..8a89dc7fc9 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -147,9 +147,12 @@ zsda_pci_device_release(const struct rte_pci_device *pci_dev) } static int -zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev __rte_unused, +zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev, const struct rte_pci_device *pci_dev) { + + zsda_comp_dev_destroy(zsda_pci_dev); + return zsda_pci_device_release(pci_dev); } @@ -172,6 +175,10 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return ret; } + ret = zsda_comp_dev_create(zsda_pci_dev); + if (ret) + ZSDA_LOG(ERR, "Failed! dev create."); + return ret; } diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c new file mode 100644 index 0000000000..5a249be675 --- /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" + +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 0d5eda2e06..edce415298 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -72,4 +72,41 @@ struct zsda_admin_resp_qcfg { uint8_t data[14]; } __rte_packed; +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]; +}; + +void zsda_queue_delete(const struct zsda_queue *queue); +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..7e4e0372df 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -8,13 +8,134 @@ #include "zsda_qp_common.h" #include "zsda_comp_pmd.h" +static int +zsda_comp_xform_size(void) +{ + return RTE_ALIGN_CEIL(sizeof(struct zsda_comp_xform), 8); +} + +static struct rte_mempool * +zsda_comp_xform_pool_create(struct zsda_comp_dev_private *comp_dev, + struct rte_compressdev_config *config, + uint32_t num_elements) +{ + char xform_pool_name[RTE_MEMPOOL_NAMESIZE]; + struct rte_mempool *mp; + + snprintf(xform_pool_name, RTE_MEMPOOL_NAMESIZE, "%s_xforms", + comp_dev->zsda_pci_dev->name); + + ZSDA_LOG(DEBUG, "xformpool: %s", xform_pool_name); + mp = rte_mempool_lookup(xform_pool_name); + + if (mp != NULL) { + ZSDA_LOG(DEBUG, "xformpool already created"); + if (mp->size != num_elements) { + ZSDA_LOG(DEBUG, "xformpool wrong size - delete it"); + rte_mempool_free(mp); + mp = NULL; + comp_dev->xformpool = NULL; + } + } else { + mp = rte_mempool_create(xform_pool_name, num_elements, + zsda_comp_xform_size(), 0, 0, NULL, + NULL, NULL, NULL, config->socket_id, 0); + if (mp == NULL) { + ZSDA_LOG(ERR, "Failed! mp is NULL"); + return NULL; + } + } + + return mp; +} + +static int +zsda_comp_dev_config(struct rte_compressdev *dev, + struct rte_compressdev_config *config) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + if (config->max_nb_priv_xforms) { + comp_dev->xformpool = zsda_comp_xform_pool_create( + comp_dev, config, config->max_nb_priv_xforms); + if (comp_dev->xformpool == NULL) + return -ENOMEM; + } else + comp_dev->xformpool = NULL; + + return ZSDA_SUCCESS; +} + +static int +zsda_comp_dev_start(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + int ret; + + ret = zsda_queue_start(comp_dev->zsda_pci_dev->pci_dev); + + if (ret) + ZSDA_LOG(ERR, "Failed! zsda_queue_start."); + + return ret; +} + +static void +zsda_comp_dev_stop(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + zsda_queue_stop(comp_dev->zsda_pci_dev->pci_dev); +} + +static int +zsda_comp_dev_close(struct rte_compressdev *dev) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + rte_mempool_free(comp_dev->xformpool); + comp_dev->xformpool = NULL; + + return ZSDA_SUCCESS; +} + +static uint16_t +zsda_comp_max_nb_qps(void) +{ + uint16_t comp = zsda_nb_qps.encomp; + uint16_t decomp = zsda_nb_qps.decomp; + uint16_t min = 0; + + if ((comp == MAX_QPS_ON_FUNCTION) || + (decomp == MAX_QPS_ON_FUNCTION)) + min = MAX_QPS_ON_FUNCTION; + else + min = (comp < decomp) ? comp : decomp; + if (min == 0) + return MAX_QPS_ON_FUNCTION; + return min; +} + +static void +zsda_comp_dev_info_get(struct rte_compressdev *dev, + struct rte_compressdev_info *info) +{ + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + if (info != NULL) { + info->max_nb_queue_pairs = zsda_comp_max_nb_qps(); + info->feature_flags = dev->feature_flags; + info->capabilities = comp_dev->zsda_dev_capabilities; + } +} + static struct rte_compressdev_ops compress_zsda_ops = { - .dev_configure = NULL, - .dev_start = NULL, - .dev_stop = NULL, - .dev_close = NULL, - .dev_infos_get = NULL, + .dev_configure = zsda_comp_dev_config, + .dev_start = zsda_comp_dev_start, + .dev_stop = zsda_comp_dev_stop, + .dev_close = zsda_comp_dev_close, + .dev_infos_get = zsda_comp_dev_info_get, .stats_get = NULL, .stats_reset = NULL, @@ -121,6 +242,8 @@ zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev) if (rte_eal_process_type() == RTE_PROC_PRIMARY) rte_memzone_free(zsda_pci_dev->comp_dev->capa_mz); + zsda_comp_dev_close(comp_dev->compressdev); + rte_compressdev_pmd_destroy(comp_dev->compressdev); zsda_pci_dev->comp_dev = NULL; diff --git a/drivers/compress/zsda/zsda_comp_pmd.h b/drivers/compress/zsda/zsda_comp_pmd.h index b83dcd7202..1e691d7cc6 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.h +++ b/drivers/compress/zsda/zsda_comp_pmd.h @@ -29,6 +29,11 @@ struct zsda_comp_dev_private { /* Shared memzone for storing capabilities */ }; +struct zsda_comp_xform { + enum rte_comp_xform_type type; + enum rte_comp_checksum_type checksum_type; +}; + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev); int zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev); From patchwork Thu Jan 9 10:44:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149768 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4E26645F6A; Thu, 9 Jan 2025 11:55:54 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8D004410D2; Thu, 9 Jan 2025 11:55:20 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 0561B40EE4 for ; Thu, 9 Jan 2025 11:55:19 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBV2KS7z8R043 for ; Thu, 9 Jan 2025 18:55:14 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl2.zte.com.cn with SMTP id 509Ash85043527 for ; Thu, 9 Jan 2025 18:54:43 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf5002-53b45 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 08/13] compress/zsda: add zsda compressdev stats ops Date: Thu, 9 Jan 2025 18:44:12 +0800 Message-ID: <20250109104454.2404815-7-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509Ash85043527 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB12.000/4YTMBV2KS7z8R043 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 24 +++++++++- 3 files changed, 101 insertions(+), 2 deletions(-) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c index 5a249be675..577392871f 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 edce415298..f589df986e 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -93,10 +93,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; @@ -108,5 +121,8 @@ struct zsda_qp { void zsda_queue_delete(const struct zsda_queue *queue); 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 7e4e0372df..ee3d6602ec 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -129,6 +129,26 @@ 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); +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -137,8 +157,8 @@ static struct rte_compressdev_ops compress_zsda_ops = { .dev_close = zsda_comp_dev_close, .dev_infos_get = zsda_comp_dev_info_get, - .stats_get = NULL, - .stats_reset = NULL, + .stats_get = zsda_comp_stats_get, + .stats_reset = zsda_comp_stats_reset, .queue_pair_setup = NULL, .queue_pair_release = NULL, From patchwork Thu Jan 9 10:44:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149763 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 39D9B45F6A; Thu, 9 Jan 2025 11:55:13 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3621740E49; Thu, 9 Jan 2025 11:55:03 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 1301D40E11 for ; Thu, 9 Jan 2025 11:55:01 +0100 (CET) Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMB81lgGz8RV6P for ; Thu, 9 Jan 2025 18:54:56 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl1.zte.com.cn with SMTP id 509AsgG6028721 for ; Thu, 9 Jan 2025 18:54:42 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:45 +0800 X-Zmail-TransId: 3e81677faaf5002-53b47 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 09/13] compress/zsda: add zsda compressdev xform ops Date: Thu, 9 Jan 2025 18:44:13 +0800 Message-ID: <20250109104454.2404815-8-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 509AsgG6028721 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB00.000/4YTMB81lgGz8RV6P X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add zsda compressdev xform interface implementation. Signed-off-by: Hanxiao Li --- drivers/compress/zsda/zsda_comp_pmd.c | 54 ++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) -- 2.27.0 diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index ee3d6602ec..a8d2da0477 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -149,6 +149,56 @@ 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, @@ -162,8 +212,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. From patchwork Thu Jan 9 10:44:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149771 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7160B45FDF; Thu, 9 Jan 2025 11:56:14 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E0689410ED; Thu, 9 Jan 2025 11:55:24 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 7496A40E22 for ; Thu, 9 Jan 2025 11:55:20 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBW5T7sz8R046 for ; Thu, 9 Jan 2025 18:55:15 +0800 (CST) Received: from szxlzmapp02.zte.com.cn ([10.5.231.79]) by mse-fl2.zte.com.cn with SMTP id 509AshOH043536 for ; Thu, 9 Jan 2025 18:54:43 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:46 +0800 X-Zmail-TransId: 3e81677faaf5002-53b49 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 10/13] compress/zsda: add zsda compressdev qp ops Date: Thu, 9 Jan 2025 18:44:14 +0800 Message-ID: <20250109104454.2404815-9-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509AshOH043536 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB13.000/4YTMBW5T7sz8R046 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add zsda compressdev qp interface implementation. Signed-off-by: Hanxiao Li --- drivers/common/zsda/zsda_qp.c | 267 ++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 84 ++++++++ drivers/common/zsda/zsda_qp_common.h | 40 ++++ drivers/compress/zsda/zsda_comp_pmd.c | 66 ++++++- 4 files changed, 455 insertions(+), 2 deletions(-) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 2ddbf51665..66b212b39e 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -7,6 +7,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; @@ -516,3 +518,268 @@ 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, + enum zsda_service_type type) +{ + struct zsda_qp_hw *qp_hw = NULL; + + if (type < ZSDA_SERVICE_INVALID) + qp_hw = &(zsda_pci_dev->zsda_hw_qps[type]); + + 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 & 0xffff)) || + (socket_id == (mz->socket_id & 0xffff)))) { + 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 uint8_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_queue_cfg_by_id_get(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) { + ZSDA_LOG(ERR, "Failed! qp_mz is NULL"); + return -ENOMEM; + } + + queue->base_addr = qp_mz->addr; + queue->base_phys_addr = qp_mz->iova; + queue->modulo_mask = MAX_NUM_OPS; + queue->msg_size = desc_size; + + queue->head = (dir == RING_DIR_TX) ? qcfg.wq_head : qcfg.cq_head; + queue->tail = (dir == RING_DIR_TX) ? qcfg.wq_tail : qcfg.cq_tail; + + if ((queue->head == 0) && (queue->tail == 0)) + qcfg.cycle += 1; + + queue->valid = qcfg.cycle & (ZSDA_MAX_CYCLE - 1); + queue->queue_size = ZSDA_MAX_DESC; + queue->cycle_size = ZSDA_MAX_CYCLE; + queue->io_addr = pci_dev->mem_resource[0].addr; + + memset(queue->base_addr, 0x0, queue_size_bytes); + io_addr = pci_dev->mem_resource[0].addr; + + if (dir == RING_DIR_TX) + ZSDA_CSR_WQ_RING_BASE(io_addr, queue->hw_queue_number, + queue->base_phys_addr); + else + ZSDA_CSR_CQ_RING_BASE(io_addr, queue->hw_queue_number, + queue->base_phys_addr); + + return 0; +} + +static int +zsda_cookie_init(const uint8_t dev_id, struct zsda_qp *qp, + const uint16_t queue_pair_id, + const struct zsda_qp_config *zsda_qp_conf) +{ + char op_cookie_pool_name[RTE_RING_NAMESIZE]; + uint16_t i; + enum zsda_service_type type = zsda_qp_conf->service_type; + + if (zsda_qp_conf->nb_descriptors != ZSDA_MAX_DESC) + ZSDA_LOG(ERR, "Can't create qp for %u descriptors", + zsda_qp_conf->nb_descriptors); + + qp->srv[type].nb_descriptors = zsda_qp_conf->nb_descriptors; + + qp->srv[type].op_cookies = rte_zmalloc_socket( + "zsda PMD op cookie pointer", + zsda_qp_conf->nb_descriptors * + sizeof(*qp->srv[type].op_cookies), + RTE_CACHE_LINE_SIZE, zsda_qp_conf->socket_id); + + if (qp->srv[type].op_cookies == NULL) { + ZSDA_LOG(ERR, "Failed! op_cookies is NULL"); + return -ENOMEM; + } + + snprintf(op_cookie_pool_name, RTE_RING_NAMESIZE, "ZSDA%d_cks_%s_qp%hu", + dev_id, zsda_qp_conf->service_str, queue_pair_id); + + qp->srv[type].op_cookie_pool = rte_mempool_lookup(op_cookie_pool_name); + if (qp->srv[type].op_cookie_pool == NULL) + qp->srv[type].op_cookie_pool = rte_mempool_create( + op_cookie_pool_name, qp->srv[type].nb_descriptors, + zsda_qp_conf->cookie_size, 64, 0, NULL, NULL, NULL, + NULL, (int)(rte_socket_id() & 0xfff), 0); + if (!qp->srv[type].op_cookie_pool) { + ZSDA_LOG(ERR, "Failed! op_cookie_pool is NULL"); + goto exit; + } + + for (i = 0; i < qp->srv[type].nb_descriptors; i++) { + if (rte_mempool_get(qp->srv[type].op_cookie_pool, + &qp->srv[type].op_cookies[i])) { + ZSDA_LOG(ERR, "ZSDA PMD Cannot get op_cookie"); + goto exit; + } + memset(qp->srv[type].op_cookies[i], 0, + zsda_qp_conf->cookie_size); + } + return ZSDA_SUCCESS; + +exit: + + rte_mempool_free(qp->srv[type].op_cookie_pool); + rte_free(qp->srv[type].op_cookies); + + return -EFAULT; +} + +static int +zsda_queue_pair_setup(const uint8_t dev_id, struct zsda_qp *qp, + const uint16_t queue_pair_id, + const struct zsda_qp_config *zsda_qp_conf) +{ + struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev; + int ret; + enum zsda_service_type type = zsda_qp_conf->service_type; + + if (type >= ZSDA_SERVICE_INVALID) { + ZSDA_LOG(ERR, "Failed! service type"); + return -EINVAL; + } + + if (pci_dev->mem_resource[0].addr == NULL) { + ZSDA_LOG(ERR, "Failed! mem_resource[0].addr is NULL"); + return -EINVAL; + } + + if (zsda_queue_create(dev_id, &(qp->srv[type].tx_q), zsda_qp_conf, + RING_DIR_TX) != 0) { + ZSDA_LOG(ERR, "Failed! zsda_queue_create tx"); + return -EFAULT; + } + + if (zsda_queue_create(dev_id, &(qp->srv[type].rx_q), zsda_qp_conf, + RING_DIR_RX) != 0) { + ZSDA_LOG(ERR, "Failed! zsda_queue_create rx"); + zsda_queue_delete(&(qp->srv[type].tx_q)); + return -EFAULT; + } + + ret = zsda_cookie_init(dev_id, qp, queue_pair_id, zsda_qp_conf); + if (ret) { + zsda_queue_delete(&(qp->srv[type].tx_q)); + zsda_queue_delete(&(qp->srv[type].rx_q)); + qp->srv[type].used = false; + } + qp->srv[type].used = true; + return ret; +} + +static int +zsda_common_qp_setup(uint8_t zsda_dev_id, struct zsda_qp *qp, + const uint16_t queue_pair_id, const struct zsda_qp_config *conf) +{ + uint16_t i; + int ret; + rte_iova_t cookie_phys_addr; + + ret = zsda_queue_pair_setup(zsda_dev_id, qp, queue_pair_id, conf); + if (ret) + return ret; + + for (i = 0; i < qp->srv[conf->service_type].nb_descriptors; i++) { + struct zsda_op_cookie *cookie = + qp->srv[conf->service_type].op_cookies[i]; + cookie_phys_addr = rte_mempool_virt2iova(cookie); + + cookie->comp_head_phys_addr = cookie_phys_addr + + offsetof(struct zsda_op_cookie, comp_head); + + cookie->sgl_src_phys_addr = cookie_phys_addr + + offsetof(struct zsda_op_cookie, sgl_src); + + cookie->sgl_dst_phys_addr = cookie_phys_addr + + offsetof(struct zsda_op_cookie, sgl_dst); + } + return ret; +} + +int +zsda_task_queue_setup(struct zsda_pci_device *zsda_pci_dev, + struct zsda_qp *qp, struct task_queue_info *task_q_info) +{ + enum zsda_service_type type = task_q_info->type; + struct zsda_qp_config conf; + int ret; + struct zsda_qp_hw *qp_hw; + const uint16_t qp_id = task_q_info->qp_id; + + qp_hw = zsda_qps_hw_per_service(zsda_pci_dev, type); + conf.hw = qp_hw->data + qp_id; + conf.service_type = type; + conf.cookie_size = sizeof(struct zsda_op_cookie); + conf.nb_descriptors = task_q_info->nb_des; + conf.socket_id = task_q_info->socket_id; + conf.service_str = task_q_info->service_str; + + ret = zsda_common_qp_setup(zsda_pci_dev->zsda_dev_id, qp, qp_id, &conf); + qp->srv[type].rx_cb = task_q_info->rx_cb; + qp->srv[type].tx_cb = task_q_info->tx_cb; + qp->srv[type].match = task_q_info->match; + + return ret; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index c07b8cc653..c79bfb5d36 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -6,6 +6,7 @@ #define _ZSDA_QP_H_ #include "zsda_qp_common.h" + #include "zsda_device.h" #define ZSDA_ADMIN_Q_START 0x100 @@ -51,6 +52,49 @@ #define ZSDA_TIME_SLEEP_US 100 #define ZSDA_TIME_NUM 500 +#define WQ_CSR_LBASE 0x1000 +#define WQ_CSR_UBASE 0x1004 +#define CQ_CSR_LBASE 0x1400 +#define CQ_CSR_UBASE 0x1404 +#define WQ_TAIL 0x1800 +#define CQ_HEAD 0x1804 + +/* CSR write macro */ +#define ZSDA_CSR_WR(csrAddr, csrOffset, val) \ + rte_write32(val, (((uint8_t *)csrAddr) + csrOffset)) +#define ZSDA_CSR_WC_WR(csrAddr, csrOffset, val) \ + rte_write32_wc(val, (((uint8_t *)csrAddr) + csrOffset)) + +/* CSR read macro */ +#define ZSDA_CSR_RD(csrAddr, csrOffset) \ + rte_read32((((uint8_t *)csrAddr) + csrOffset)) + +#define ZSDA_CSR_WQ_RING_BASE(csr_base_addr, ring, value) \ + do { \ + uint32_t l_base = 0, u_base = 0; \ + l_base = (uint32_t)(value & 0xFFFFFFFF); \ + u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32); \ + ZSDA_CSR_WR(csr_base_addr, (ring << 3) + WQ_CSR_LBASE, \ + l_base); \ + ZSDA_LOG(INFO, "l_basg - offset:0x%x, value:0x%x", \ + ((ring << 3) + WQ_CSR_LBASE), l_base); \ + ZSDA_CSR_WR(csr_base_addr, (ring << 3) + WQ_CSR_UBASE, \ + u_base); \ + ZSDA_LOG(INFO, "h_base - offset:0x%x, value:0x%x", \ + ((ring << 3) + WQ_CSR_UBASE), u_base); \ + } while (0) + +#define ZSDA_CSR_CQ_RING_BASE(csr_base_addr, ring, value) \ + do { \ + uint32_t l_base = 0, u_base = 0; \ + l_base = (uint32_t)(value & 0xFFFFFFFF); \ + u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32); \ + ZSDA_CSR_WR(csr_base_addr, (ring << 3) + CQ_CSR_LBASE, \ + l_base); \ + ZSDA_CSR_WR(csr_base_addr, (ring << 3) + CQ_CSR_UBASE, \ + u_base); \ + } while (0) + extern struct zsda_num_qps zsda_nb_qps; enum zsda_admin_msg_id { @@ -88,6 +132,40 @@ struct zsda_num_qps { uint16_t hash; }; +struct zsda_qp_config { + enum zsda_service_type service_type; + const struct zsda_qp_hw_data *hw; + uint16_t nb_descriptors; + uint32_t cookie_size; + int socket_id; + const char *service_str; +}; + +struct zsda_op_cookie { + struct zsda_sgl sgl_src; + struct zsda_sgl sgl_dst; + phys_addr_t sgl_src_phys_addr; + phys_addr_t sgl_dst_phys_addr; + phys_addr_t comp_head_phys_addr; + uint8_t comp_head[COMP_REMOVE_SPACE_LEN]; + uint16_t sid; + bool used; + bool decomp_no_tail; + void *op; +}; + +struct task_queue_info { + uint16_t qp_id; + uint16_t nb_des; + int socket_id; + enum zsda_service_type type; + const char *service_str; + + rx_callback rx_cb; + tx_callback tx_cb; + srv_match match; +}; + extern struct zsda_num_qps zsda_nb_qps; int zsda_queue_start(const struct rte_pci_device *pci_dev); @@ -95,4 +173,10 @@ int zsda_queue_stop(const struct rte_pci_device *pci_dev); int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev); +struct zsda_qp_hw * +zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, + const enum zsda_service_type service); + +int zsda_task_queue_setup(struct zsda_pci_device *zsda_pci_dev, + struct zsda_qp *qp, struct task_queue_info *task_q_info); #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index f589df986e..ba77b0f027 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -35,6 +35,15 @@ enum zsda_service_type { #define ZSDA_CSR_READ8(addr) rte_read8((addr)) #define ZSDA_CSR_WRITE8(addr, value) rte_write8_relaxed((value), (addr)) +#define NB_DES 512 +#define ZSDA_SGL_MAX_NUMBER 512 +#define COMP_REMOVE_SPACE_LEN 16 + +#define ZSDA_MAX_DESC 512 +#define ZSDA_MAX_CYCLE 256 +#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES +#define MAX_NUM_OPS 0x1FF + struct zsda_admin_req { uint16_t msg_type; uint8_t data[26]; @@ -105,10 +114,30 @@ struct zsda_qp_stat { uint64_t dequeue_err_count; }; +struct zsda_cqe { + uint8_t valid; /* cqe_cycle */ + uint8_t op_code; + uint16_t sid; + uint8_t state; + uint8_t result; + uint16_t zsda_wq_id; + uint32_t tx_real_length; + uint16_t err0; + uint16_t err1; +} __rte_packed; + +typedef int (*rx_callback)(void *cookie_in, struct zsda_cqe *cqe); +typedef int (*tx_callback)(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail); +typedef int (*srv_match)(const void *op_in); + struct qp_srv { bool used; struct zsda_queue tx_q; struct zsda_queue rx_q; + rx_callback rx_cb; + tx_callback tx_cb; + srv_match match; struct zsda_qp_stat stats; struct rte_mempool *op_cookie_pool; void **op_cookies; @@ -119,6 +148,17 @@ struct zsda_qp { struct qp_srv srv[ZSDA_MAX_SERVICES]; }; +struct zsda_buf { + uint64_t addr; + uint32_t len; + uint8_t resrvd[3]; + uint8_t type; +} __rte_packed; + +struct __rte_cache_aligned zsda_sgl { + struct zsda_buf buffers[ZSDA_SGL_MAX_NUMBER]; +}; + void zsda_queue_delete(const struct zsda_queue *queue); int zsda_queue_pair_release(struct zsda_qp **qp_addr); void zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index a8d2da0477..19a4932525 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -6,6 +6,7 @@ #include "zsda_logs.h" #include "zsda_qp_common.h" +#include "zsda_qp.h" #include "zsda_comp_pmd.h" static int @@ -88,11 +89,21 @@ zsda_comp_dev_stop(struct rte_compressdev *dev) zsda_queue_stop(comp_dev->zsda_pci_dev->pci_dev); } +static int +zsda_comp_qp_release(struct rte_compressdev *dev, uint16_t queue_pair_id) +{ + return zsda_queue_pair_release( + (struct zsda_qp **)&(dev->data->queue_pairs[queue_pair_id])); +} + static int zsda_comp_dev_close(struct rte_compressdev *dev) { struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + for (int i = 0; i < dev->data->nb_queue_pairs; i++) + zsda_comp_qp_release(dev, i); + rte_mempool_free(comp_dev->xformpool); comp_dev->xformpool = NULL; @@ -199,6 +210,57 @@ zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused, return -EINVAL; } +static int +zsda_comp_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, + uint32_t max_inflight_ops, int socket_id) +{ + int ret = ZSDA_SUCCESS; + struct zsda_qp *qp_new; + + struct zsda_qp **qp_addr = + (struct zsda_qp **)&(dev->data->queue_pairs[qp_id]); + struct zsda_comp_dev_private *comp_priv = dev->data->dev_private; + struct zsda_pci_device *zsda_pci_dev = comp_priv->zsda_pci_dev; + uint16_t nb_des = max_inflight_ops & 0xffff; + struct task_queue_info task_q_info; + + nb_des = (nb_des == NB_DES) ? nb_des : NB_DES; + + if (*qp_addr != NULL) { + ret = zsda_comp_qp_release(dev, qp_id); + if (ret) + return ret; + } + + qp_new = rte_zmalloc_socket("zsda PMD qp metadata", sizeof(*qp_new), + RTE_CACHE_LINE_SIZE, socket_id); + if (qp_new == NULL) { + ZSDA_LOG(ERR, "Failed! qp_new is NULL"); + return -ENOMEM; + } + + task_q_info.nb_des = nb_des; + task_q_info.socket_id = socket_id; + task_q_info.qp_id = qp_id; + + task_q_info.type = ZSDA_SERVICE_COMPRESSION; + task_q_info.service_str = "comp"; + ret = zsda_task_queue_setup(zsda_pci_dev, qp_new, &task_q_info); + + task_q_info.type = ZSDA_SERVICE_DECOMPRESSION; + task_q_info.service_str = "decomp"; + ret |= zsda_task_queue_setup(zsda_pci_dev, qp_new, &task_q_info); + + if (ret) { + rte_free(qp_new); + return ret; + } + + *qp_addr = qp_new; + + return ret; +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -209,8 +271,8 @@ static struct rte_compressdev_ops compress_zsda_ops = { .stats_get = zsda_comp_stats_get, .stats_reset = zsda_comp_stats_reset, - .queue_pair_setup = NULL, - .queue_pair_release = NULL, + .queue_pair_setup = zsda_comp_qp_setup, + .queue_pair_release = zsda_comp_qp_release, .private_xform_create = zsda_comp_private_xform_create, .private_xform_free = zsda_comp_private_xform_free, From patchwork Thu Jan 9 10:44:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149769 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CD1E045FDF; Thu, 9 Jan 2025 11:56:00 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B797840EF1; Thu, 9 Jan 2025 11:55:21 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 03C8540E5E for ; Thu, 9 Jan 2025 11:55:19 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBV2SS1z8R044 for ; Thu, 9 Jan 2025 18:55:14 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl2.zte.com.cn with SMTP id 509AshNv043537 for ; Thu, 9 Jan 2025 18:54:43 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:46 +0800 X-Zmail-TransId: 3e81677faaf6002-53b4b From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 11/13] compress/zsda: add zsda compressdev enqueue datapath Date: Thu, 9 Jan 2025 18:44:15 +0800 Message-ID: <20250109104454.2404815-10-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509AshNv043537 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB12.001/4YTMBV2SS1z8R044 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add zsda compressdev enqueue datapath. Signed-off-by: Hanxiao Li --- drivers/common/zsda/meson.build | 2 +- drivers/common/zsda/zsda_qp.c | 106 ++++++++++++ drivers/common/zsda/zsda_qp.h | 13 +- drivers/common/zsda/zsda_qp_common.c | 72 ++++++++ drivers/common/zsda/zsda_qp_common.h | 30 ++++ drivers/compress/zsda/zsda_comp.c | 233 ++++++++++++++++++++++++++ drivers/compress/zsda/zsda_comp.h | 36 ++++ drivers/compress/zsda/zsda_comp_pmd.c | 15 +- 8 files changed, 504 insertions(+), 3 deletions(-) create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h -- 2.27.0 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 66b212b39e..53169afea4 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -783,3 +783,109 @@ zsda_task_queue_setup(struct zsda_pci_device *zsda_pci_dev, return ret; } + +static int +zsda_free_cookie_find(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_free_cookie_find(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_tail_write(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_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_tail_write(&qp->srv[type].tx_q); + + return nb_send; +} + diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index c79bfb5d36..96fc38ea09 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -48,7 +48,6 @@ #define SET_CYCLE 0xff #define SET_HEAD_INTI 0x0 - #define ZSDA_TIME_SLEEP_US 100 #define ZSDA_TIME_NUM 500 @@ -95,6 +94,15 @@ u_base); \ } while (0) +#define READ_CSR_WQ_HEAD(csr_base_addr, ring) \ + ZSDA_CSR_RD(csr_base_addr, WQ_TAIL + (ring << 3)) +#define WRITE_CSR_WQ_TAIL(csr_base_addr, ring, value) \ + ZSDA_CSR_WC_WR(csr_base_addr, WQ_TAIL + (ring << 3), value) +#define READ_CSR_CQ_HEAD(csr_base_addr, ring) \ + ZSDA_CSR_RD(csr_base_addr, WQ_TAIL + (ring << 3)) +#define WRITE_CSR_CQ_HEAD(csr_base_addr, ring, value) \ + ZSDA_CSR_WC_WR(csr_base_addr, CQ_HEAD + (ring << 3), value) + extern struct zsda_num_qps zsda_nb_qps; enum zsda_admin_msg_id { @@ -179,4 +187,7 @@ zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, int zsda_task_queue_setup(struct zsda_pci_device *zsda_pci_dev, struct zsda_qp *qp, struct task_queue_info *task_q_info); + +uint16_t zsda_enqueue_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.c b/drivers/common/zsda/zsda_qp_common.c index 577392871f..399fba87e3 100644 --- a/drivers/common/zsda/zsda_qp_common.c +++ b/drivers/common/zsda/zsda_qp_common.c @@ -118,3 +118,75 @@ zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs) } } } + +int +zsda_sgl_fill(const struct rte_mbuf *buf, uint32_t offset, struct zsda_sgl *sgl, + const phys_addr_t sgl_phy_addr, uint32_t remain_len, + struct comp_head_info *comp_head_info) +{ + uint32_t nr; + uint16_t put_in_len; + bool head_set = false; + + for (nr = 0; (buf && (nr < (ZSDA_SGL_MAX_NUMBER - 1)));) { + if (offset >= rte_pktmbuf_data_len(buf)) { + offset -= rte_pktmbuf_data_len(buf); + buf = buf->next; + continue; + } + memset(&(sgl->buffers[nr]), 0, sizeof(struct zsda_buf)); + if ((nr > 0) && (((nr + 1) % ZSDA_SGL_FRAGMENT_SIZE) == 0) && + (buf->next != NULL)) { + sgl->buffers[nr].len = SGL_TYPE_PHYS_ADDR; + sgl->buffers[nr].addr = + sgl_phy_addr + + ((nr + 1) * sizeof(struct zsda_buf)); + sgl->buffers[nr].type = SGL_TYPE_NEXT_LIST; + ++nr; + continue; + } + if (comp_head_info && !head_set) { + sgl->buffers[nr].len = comp_head_info->head_len; + sgl->buffers[nr].addr = comp_head_info->head_phys_addr; + sgl->buffers[nr].type = SGL_TYPE_PHYS_ADDR; + ++nr; + head_set = true; + remain_len -= comp_head_info->head_len; + continue; + } else { + put_in_len = rte_pktmbuf_data_len(buf) - (offset & 0xffff); + if (remain_len <= put_in_len) + put_in_len = remain_len; + remain_len -= put_in_len; + + sgl->buffers[nr].len = put_in_len; + sgl->buffers[nr].addr = rte_pktmbuf_iova_offset(buf, offset); + sgl->buffers[nr].type = SGL_TYPE_PHYS_ADDR; + } + offset = 0; + ++nr; + buf = buf->next; + + if (remain_len == 0) + break; + } + + if (nr == 0) { + ZSDA_LOG(ERR, "In fill_sgl, nr == 0"); + return ZSDA_FAILED; + } + + sgl->buffers[nr - 1].type = SGL_TYPE_LAST_PHYS_ADDR; + + if (buf) { + if (unlikely(buf->next)) { + if (nr == (ZSDA_SGL_MAX_NUMBER - 1)) { + ZSDA_LOG(ERR, "ERR! segs size (%u)", + (ZSDA_SGL_MAX_NUMBER)); + return -EINVAL; + } + } + } + + return ZSDA_SUCCESS; +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index ba77b0f027..2b1a549a69 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -43,6 +43,27 @@ enum zsda_service_type { #define ZSDA_MAX_CYCLE 256 #define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES #define MAX_NUM_OPS 0x1FF +#define ZSDA_SGL_FRAGMENT_SIZE 32 + +#define ZSDA_OPC_COMP_GZIP 0x10 /* Encomp deflate-Gzip */ +#define ZSDA_OPC_COMP_ZLIB 0x11 /* Encomp deflate-Zlib */ +#define ZSDA_OPC_DECOMP_GZIP 0x18 /* Decomp inflate-Gzip */ +#define ZSDA_OPC_DECOMP_ZLIB 0x19 /* Decomp inflate-Zlib */ +#define ZSDA_OPC_INVALID 0xff + +enum wqe_element_type { + WQE_ELM_TYPE_PHYS_ADDR = 1, + WQE_ELM_TYPE_LIST, + WQE_ELM_TYPE_LIST_ADDR, + WQE_ELM_TYPE_LIST_SGL32, +}; + +enum sgl_element_type { + SGL_TYPE_PHYS_ADDR = 0, + SGL_TYPE_LAST_PHYS_ADDR, + SGL_TYPE_NEXT_LIST, + SGL_TYPE_EC_LEVEL1_SGL32, +}; struct zsda_admin_req { uint16_t msg_type; @@ -159,10 +180,19 @@ struct __rte_cache_aligned zsda_sgl { struct zsda_buf buffers[ZSDA_SGL_MAX_NUMBER]; }; +struct comp_head_info { + uint32_t head_len; + phys_addr_t head_phys_addr; +}; + void zsda_queue_delete(const struct zsda_queue *queue); 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); +int zsda_sgl_fill(const struct rte_mbuf *buf, uint32_t offset, + struct zsda_sgl *sgl, const phys_addr_t sgl_phy_addr, + uint32_t remain_len, struct comp_head_info *comp_head_info); + #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp.c b/drivers/compress/zsda/zsda_comp.c new file mode 100644 index 0000000000..608c50c49a --- /dev/null +++ b/drivers/compress/zsda/zsda_comp.c @@ -0,0 +1,233 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include "zsda_comp.h" + +#define ZLIB_HEADER_SIZE 2 +#define ZLIB_TRAILER_SIZE 4 +#define GZIP_HEADER_SIZE 10 +#define GZIP_TRAILER_SIZE 8 +#define CHECKSUM_SIZE 4 + +int +zsda_comp_match(const void *op_in) +{ + const struct rte_comp_op *op = op_in; + const struct zsda_comp_xform *xform = op->private_xform; + + if (op->op_type != RTE_COMP_OP_STATELESS) + return 0; + + if (xform->type != RTE_COMP_COMPRESS) + return 0; + + return 1; +} + +int +zsda_decomp_match(const void *op_in) +{ + const struct rte_comp_op *op = op_in; + const struct zsda_comp_xform *xform = op->private_xform; + + if (op->op_type != RTE_COMP_OP_STATELESS) + return 0; + + if (xform->type != RTE_COMP_DECOMPRESS) + return 0; + return 1; +} + +static uint8_t +zsda_opcode_get(const struct zsda_comp_xform *xform) +{ + if (xform->type == RTE_COMP_COMPRESS) { + if (xform->checksum_type == RTE_COMP_CHECKSUM_NONE || + xform->checksum_type == RTE_COMP_CHECKSUM_CRC32) + return ZSDA_OPC_COMP_GZIP; + else if (xform->checksum_type == RTE_COMP_CHECKSUM_ADLER32) + return ZSDA_OPC_COMP_ZLIB; + } + if (xform->type == RTE_COMP_DECOMPRESS) { + if (xform->checksum_type == RTE_COMP_CHECKSUM_CRC32 || + xform->checksum_type == RTE_COMP_CHECKSUM_NONE) + return ZSDA_OPC_DECOMP_GZIP; + else if (xform->checksum_type == RTE_COMP_CHECKSUM_ADLER32) + return ZSDA_OPC_DECOMP_ZLIB; + } + + return ZSDA_OPC_INVALID; +} + +int +zsda_comp_request_build(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail) +{ + struct rte_comp_op *op = op_in; + struct zsda_comp_xform *xform = op->private_xform; + struct zsda_wqe_comp *wqe = + (struct zsda_wqe_comp *)(queue->base_addr + + (new_tail * queue->msg_size)); + + struct zsda_op_cookie *cookie = op_cookies[new_tail]; + struct zsda_sgl *sgl_src = (struct zsda_sgl *)&cookie->sgl_src; + struct zsda_sgl *sgl_dst = (struct zsda_sgl *)&cookie->sgl_dst; + struct comp_head_info comp_head_info; + + uint8_t opcode; + int ret; + uint32_t op_offset; + uint32_t op_src_len; + uint32_t op_dst_len; + uint32_t head_len; + + if ((op->m_dst == NULL) || (op->m_dst == op->m_src)) { + ZSDA_LOG(ERR, "Failed! m_dst"); + return -EINVAL; + } + + opcode = zsda_opcode_get(xform); + if (opcode == ZSDA_OPC_INVALID) { + ZSDA_LOG(ERR, "Failed! zsda_opcode_get"); + return -EINVAL; + } + + cookie->used = true; + cookie->sid = new_tail; + cookie->op = op; + + if (opcode == ZSDA_OPC_COMP_GZIP) + head_len = GZIP_HEADER_SIZE; + else if (opcode == ZSDA_OPC_COMP_ZLIB) + head_len = ZLIB_HEADER_SIZE; + else { + ZSDA_LOG(ERR, "Comp, op_code error!"); + return -EINVAL; + } + + comp_head_info.head_len = head_len; + comp_head_info.head_phys_addr = cookie->comp_head_phys_addr; + + op_offset = op->src.offset; + op_src_len = op->src.length; + ret = zsda_sgl_fill(op->m_src, op_offset, sgl_src, + cookie->sgl_src_phys_addr, op_src_len, NULL); + + op_offset = op->dst.offset; + op_dst_len = op->m_dst->pkt_len - op_offset; + op_dst_len += head_len; + ret |= zsda_sgl_fill(op->m_dst, op_offset, sgl_dst, + cookie->sgl_dst_phys_addr, op_dst_len, + &comp_head_info); + + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_sgl_fill"); + return ret; + } + + memset(wqe, 0, sizeof(struct zsda_wqe_comp)); + wqe->rx_length = op_src_len; + wqe->tx_length = op_dst_len; + wqe->valid = queue->valid; + wqe->op_code = opcode; + wqe->sid = cookie->sid; + wqe->rx_sgl_type = WQE_ELM_TYPE_LIST; + wqe->tx_sgl_type = WQE_ELM_TYPE_LIST; + + wqe->rx_addr = cookie->sgl_src_phys_addr; + wqe->tx_addr = cookie->sgl_dst_phys_addr; + + return ret; +} + +int +zsda_decomp_request_build(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail) +{ + struct rte_comp_op *op = op_in; + struct zsda_comp_xform *xform = op->private_xform; + + struct zsda_wqe_comp *wqe = + (struct zsda_wqe_comp *)(queue->base_addr + + (new_tail * queue->msg_size)); + struct zsda_op_cookie *cookie = op_cookies[new_tail]; + struct zsda_sgl *sgl_src = (struct zsda_sgl *)&cookie->sgl_src; + struct zsda_sgl *sgl_dst = (struct zsda_sgl *)&cookie->sgl_dst; + uint8_t opcode; + int ret; + + uint32_t op_offset; + uint32_t op_src_len; + uint32_t op_dst_len; + + uint8_t *head_data; + uint16_t head_len; + struct comp_head_info comp_head_info; + uint8_t head_zlib[ZLIB_HEADER_SIZE] = {0x78, 0xDA}; + uint8_t head_gzip[GZIP_HEADER_SIZE] = {0x1F, 0x8B, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03}; + + if ((op->m_dst == NULL) || (op->m_dst == op->m_src)) { + ZSDA_LOG(ERR, "Failed! m_dst"); + return -EINVAL; + } + + opcode = zsda_opcode_get(xform); + if (opcode == ZSDA_OPC_INVALID) { + ZSDA_LOG(ERR, "Failed! zsda_opcode_get"); + return -EINVAL; + } + + cookie->used = true; + cookie->sid = new_tail; + cookie->op = op; + + if (opcode == ZSDA_OPC_DECOMP_GZIP) { + head_data = head_gzip; + head_len = GZIP_HEADER_SIZE; + } else if (opcode == ZSDA_OPC_DECOMP_ZLIB) { + head_data = head_zlib; + head_len = ZLIB_HEADER_SIZE; + } else { + ZSDA_LOG(ERR, "Comp, op_code error!"); + return -EINVAL; + } + + op_offset = op->src.offset; + op_src_len = op->src.length; + op_src_len += head_len; + comp_head_info.head_len = head_len; + comp_head_info.head_phys_addr = cookie->comp_head_phys_addr; + cookie->decomp_no_tail = true; + for (int i = 0; i < head_len; i++) + cookie->comp_head[i] = head_data[i]; + + ret = zsda_sgl_fill(op->m_src, op_offset, sgl_src, + cookie->sgl_src_phys_addr, op_src_len, + &comp_head_info); + + op_offset = op->dst.offset; + op_dst_len = op->m_dst->pkt_len - op_offset; + ret |= zsda_sgl_fill(op->m_dst, op_offset, sgl_dst, + cookie->sgl_dst_phys_addr, op_dst_len, NULL); + + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_sgl_fill"); + return ret; + } + + memset(wqe, 0, sizeof(struct zsda_wqe_comp)); + + wqe->rx_length = op_src_len; + wqe->tx_length = op_dst_len; + wqe->valid = queue->valid; + wqe->op_code = opcode; + wqe->sid = cookie->sid; + wqe->rx_sgl_type = WQE_ELM_TYPE_LIST; + wqe->tx_sgl_type = WQE_ELM_TYPE_LIST; + wqe->rx_addr = cookie->sgl_src_phys_addr; + wqe->tx_addr = cookie->sgl_dst_phys_addr; + + return ret; +} diff --git a/drivers/compress/zsda/zsda_comp.h b/drivers/compress/zsda/zsda_comp.h new file mode 100644 index 0000000000..0f312accdf --- /dev/null +++ b/drivers/compress/zsda/zsda_comp.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_COMP_H_ +#define _ZSDA_COMP_H_ + +#include "zsda_comp_pmd.h" + +struct compress_cfg { +} __rte_packed; + +struct zsda_wqe_comp { + uint8_t valid; + uint8_t op_code; + uint16_t sid; + uint8_t resv[3]; + uint8_t rx_sgl_type : 4; + uint8_t tx_sgl_type : 4; + uint64_t rx_addr; + uint32_t rx_length; + uint64_t tx_addr; + uint32_t tx_length; + struct compress_cfg cfg; +} __rte_packed; + +int zsda_comp_match(const void *op_in); +int zsda_decomp_match(const void *op_in); + +int zsda_comp_request_build(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail); + +int zsda_decomp_request_build(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail); + +#endif /* _ZSDA_COMP_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 19a4932525..d9e444972b 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -8,6 +8,7 @@ #include "zsda_qp_common.h" #include "zsda_qp.h" #include "zsda_comp_pmd.h" +#include "zsda_comp.h" static int zsda_comp_xform_size(void) @@ -245,10 +246,14 @@ zsda_comp_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, task_q_info.type = ZSDA_SERVICE_COMPRESSION; task_q_info.service_str = "comp"; + task_q_info.tx_cb = zsda_comp_request_build; + task_q_info.match = zsda_comp_match; ret = zsda_task_queue_setup(zsda_pci_dev, qp_new, &task_q_info); task_q_info.type = ZSDA_SERVICE_DECOMPRESSION; task_q_info.service_str = "decomp"; + task_q_info.tx_cb = zsda_decomp_request_build; + task_q_info.match = zsda_decomp_match; ret |= zsda_task_queue_setup(zsda_pci_dev, qp_new, &task_q_info); if (ret) { @@ -287,6 +292,14 @@ static const char zsda_comp_drv_name[] = RTE_STR(COMPRESSDEV_NAME_ZSDA_PMD); static const struct rte_driver compdev_zsda_driver = { .name = zsda_comp_drv_name, .alias = zsda_comp_drv_name}; +static uint16_t +zsda_comp_pmd_enqueue_op_burst(void *qp, struct rte_comp_op **ops, + uint16_t nb_ops) +{ + return zsda_enqueue_burst((struct zsda_qp *)qp, (void **)ops, + nb_ops); +} + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) { @@ -324,7 +337,7 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) compressdev->dev_ops = &compress_zsda_ops; - compressdev->enqueue_burst = NULL; + compressdev->enqueue_burst = zsda_comp_pmd_enqueue_op_burst; compressdev->dequeue_burst = NULL; compressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED; From patchwork Thu Jan 9 10:44:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149765 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 413CB45F6A; Thu, 9 Jan 2025 11:55:29 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4AFEE40E8A; Thu, 9 Jan 2025 11:55:08 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 1F0D940E8A for ; Thu, 9 Jan 2025 11:55:06 +0100 (CET) Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBH571yz5B1Gx for ; Thu, 9 Jan 2025 18:55:03 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl1.zte.com.cn with SMTP id 509AsgYX028722 for ; Thu, 9 Jan 2025 18:54:42 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:46 +0800 X-Zmail-TransId: 3e81677faaf6002-53b4d From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 12/13] compress/zsda: add zsda compressdev dequeue datapath Date: Thu, 9 Jan 2025 18:44:16 +0800 Message-ID: <20250109104454.2404815-11-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 509AsgYX028722 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB07.001/4YTMBH571yz5B1Gx X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 | 11 +- 6 files changed, 234 insertions(+), 1 deletion(-) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 53169afea4..0ef7cac585 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -889,3 +889,58 @@ zsda_enqueue_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_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 96fc38ea09..45d37a7905 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -189,5 +189,6 @@ int zsda_task_queue_setup(struct zsda_pci_device *zsda_pci_dev, struct zsda_qp *qp, struct task_queue_info *task_q_info); uint16_t zsda_enqueue_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); +uint16_t zsda_dequeue_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 2b1a549a69..e1d294fed3 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -51,6 +51,10 @@ enum zsda_service_type { #define ZSDA_OPC_DECOMP_ZLIB 0x19 /* Decomp inflate-Zlib */ #define ZSDA_OPC_INVALID 0xff +#define CQE_VALID(value) (value & 0x8000) +#define CQE_ERR0(value) (value & 0xFFFF) +#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 608c50c49a..af57c237b2 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 +crc32_table_build(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 = 0xFFFFFFFF; + + if (!table_config) + crc32_table_build(); + + while (length >= 8) { + crc ^= *(const uint32_t *)data; + crc = crc32_table[7][crc & 0xFF] ^ + crc32_table[6][(crc >> 8) & 0xFF] ^ + crc32_table[5][(crc >> 16) & 0xFF] ^ + crc32_table[4][(crc >> 24) & 0xFF] ^ + crc32_table[3][data[4]] ^ + crc32_table[2][data[5]] ^ + crc32_table[1][data[6]] ^ + crc32_table[0][data[7]]; + + data += 8; + length -= 8; + } + + for (size_t i = 0; i < length; i++) + crc = (crc >> 8) ^ crc32_table[0][(crc ^ data[i]) & 0xFF]; + + return crc ^ 0xFFFFFFFF; +} + +#define MOD_ADLER 65521 +#define NMAX 5552 +static uint32_t +zsda_adler32(const uint8_t *buf, uint32_t len) +{ + uint32_t s1 = 1; + uint32_t s2 = 0; + + while (len > 0) { + uint32_t k = (len < NMAX) ? len : NMAX; + len -= k; + + for (uint32_t i = 0; i < k; i++) { + s1 += buf[i]; + s2 += s1; + } + + s1 %= MOD_ADLER; + s2 %= MOD_ADLER; + + buf += k; + } + + return (s2 << 16) | s1; +} + int zsda_comp_match(const void *op_in) { @@ -231,3 +308,81 @@ zsda_decomp_request_build(void *op_in, const struct zsda_queue *queue, return ret; } + +static uint32_t +zsda_chksum_read(uint8_t *data_addr, uint8_t op_code, uint32_t produced) +{ + uint8_t *chk_addr; + uint32_t chksum = 0; + int i = 0; + + if (op_code == ZSDA_OPC_COMP_ZLIB) { + chk_addr = data_addr + produced - ZLIB_TRAILER_SIZE; + for (i = 0; i < CHECKSUM_SIZE; i++) { + chksum = chksum << 8; + chksum |= (*(chk_addr + i)); + } + } else if (op_code == ZSDA_OPC_COMP_GZIP) { + chk_addr = data_addr + produced - GZIP_TRAILER_SIZE; + for (i = 0; i < CHECKSUM_SIZE; i++) + chksum |= (*(chk_addr + i) << (i * 8)); + } + + return chksum; +} + +int +zsda_comp_callback(void *cookie_in, struct zsda_cqe *cqe) +{ + struct zsda_op_cookie *tmp_cookie = cookie_in; + struct rte_comp_op *tmp_op = tmp_cookie->op; + uint8_t *data_addr = + (uint8_t *)tmp_op->m_dst->buf_addr + tmp_op->m_dst->data_off; + uint32_t chksum = 0; + uint16_t head_len; + uint16_t tail_len; + + if (tmp_cookie->decomp_no_tail && CQE_ERR0_RIGHT(cqe->err0)) + cqe->err0 = 0x0000; + + if (!(CQE_ERR0(cqe->err0) || CQE_ERR1(cqe->err1))) + tmp_op->status = RTE_COMP_OP_STATUS_SUCCESS; + else { + tmp_op->status = RTE_COMP_OP_STATUS_ERROR; + return ZSDA_FAILED; + } + + /* handle chksum */ + tmp_op->produced = cqe->tx_real_length; + if (cqe->op_code == ZSDA_OPC_COMP_ZLIB) { + head_len = ZLIB_HEADER_SIZE; + tail_len = ZLIB_TRAILER_SIZE; + chksum = zsda_chksum_read(data_addr, cqe->op_code, + tmp_op->produced - head_len); + } + if (cqe->op_code == ZSDA_OPC_COMP_GZIP) { + head_len = GZIP_HEADER_SIZE; + tail_len = GZIP_TRAILER_SIZE; + chksum = zsda_chksum_read(data_addr, cqe->op_code, + tmp_op->produced - head_len); + } else if (cqe->op_code == ZSDA_OPC_DECOMP_ZLIB) { + head_len = ZLIB_HEADER_SIZE; + tail_len = ZLIB_TRAILER_SIZE; + chksum = zsda_adler32(data_addr, tmp_op->produced); + } else if (cqe->op_code == ZSDA_OPC_DECOMP_GZIP) { + head_len = GZIP_HEADER_SIZE; + tail_len = GZIP_TRAILER_SIZE; + chksum = zsda_crc32(data_addr, tmp_op->produced); + } + tmp_op->output_chksum = chksum; + + if (cqe->op_code == ZSDA_OPC_COMP_ZLIB || + cqe->op_code == ZSDA_OPC_COMP_GZIP) { + /* remove tail data*/ + rte_pktmbuf_trim(tmp_op->m_dst, GZIP_TRAILER_SIZE); + /* remove head and tail length */ + tmp_op->produced = tmp_op->produced - (head_len + tail_len); + } + + return ZSDA_SUCCESS; +} diff --git a/drivers/compress/zsda/zsda_comp.h b/drivers/compress/zsda/zsda_comp.h index 0f312accdf..eb9fde529c 100644 --- a/drivers/compress/zsda/zsda_comp.h +++ b/drivers/compress/zsda/zsda_comp.h @@ -24,6 +24,14 @@ struct zsda_wqe_comp { struct compress_cfg cfg; } __rte_packed; +/* For situations where err0 are reported but the results are correct */ +#define DECOMP_RIGHT_ERR0_0 0xC710 +#define DECOMP_RIGHT_ERR0_1 0xC727 +#define DECOMP_RIGHT_ERR0_2 0xC729 +#define CQE_ERR0_RIGHT(value) \ + (value == DECOMP_RIGHT_ERR0_0 || value == DECOMP_RIGHT_ERR0_1 || \ + value == DECOMP_RIGHT_ERR0_2) + int zsda_comp_match(const void *op_in); int zsda_decomp_match(const void *op_in); @@ -32,5 +40,6 @@ int zsda_comp_request_build(void *op_in, const struct zsda_queue *queue, int zsda_decomp_request_build(void *op_in, const struct zsda_queue *queue, void **op_cookies, const uint16_t new_tail); +int zsda_comp_callback(void *cookie_in, struct zsda_cqe *cqe); #endif /* _ZSDA_COMP_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index d9e444972b..dc8b07f5f7 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -243,6 +243,7 @@ zsda_comp_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, task_q_info.nb_des = nb_des; task_q_info.socket_id = socket_id; task_q_info.qp_id = qp_id; + task_q_info.rx_cb = zsda_comp_callback; task_q_info.type = ZSDA_SERVICE_COMPRESSION; task_q_info.service_str = "comp"; @@ -300,6 +301,14 @@ zsda_comp_pmd_enqueue_op_burst(void *qp, struct rte_comp_op **ops, nb_ops); } +static uint16_t +zsda_comp_pmd_dequeue_op_burst(void *qp, struct rte_comp_op **ops, + uint16_t nb_ops) +{ + return zsda_dequeue_burst((struct zsda_qp *)qp, (void **)ops, + nb_ops); +} + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) { @@ -338,7 +347,7 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) compressdev->dev_ops = &compress_zsda_ops; compressdev->enqueue_burst = zsda_comp_pmd_enqueue_op_burst; - compressdev->dequeue_burst = NULL; + compressdev->dequeue_burst = zsda_comp_pmd_dequeue_op_burst; compressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED; From patchwork Thu Jan 9 10:44:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 149772 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1F6AD45FDF; Thu, 9 Jan 2025 11:56:24 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACC524113D; Thu, 9 Jan 2025 11:55:26 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id E8A43410F1 for ; Thu, 9 Jan 2025 11:55:24 +0100 (CET) Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4YTMBg6vmfz5B1H4 for ; Thu, 9 Jan 2025 18:55:23 +0800 (CST) Received: from szxl2zmapp06.zte.com.cn ([10.1.32.108]) by mse-fl2.zte.com.cn with SMTP id 509Ashb1043548 for ; Thu, 9 Jan 2025 18:54:43 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Sat, 9 Jan 2025 18:54:46 +0800 X-Zmail-TransId: 3e81677faaf6002-53b4f From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v23 13/13] compress/zsda: add zsda compressdev capabilities Date: Thu, 9 Jan 2025 18:44:17 +0800 Message-ID: <20250109104454.2404815-12-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250109104454.2404815-1-li.hanxiao@zte.com.cn> References: <20250109104203.2404659-2-li.hanxiao@zte.com.cn> <20250109104454.2404815-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 509Ashb1043548 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 677FAB1B.000/4YTMBg6vmfz5B1H4 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add zsda compressdev capabilities Signed-off-by: Hanxiao Li --- doc/guides/compressdevs/features/zsda.ini | 9 +++++++++ doc/guides/compressdevs/zsda.rst | 23 +++++++++++++++++++++++ doc/guides/rel_notes/release_25_03.rst | 7 +++++++ drivers/compress/zsda/zsda_comp_pmd.c | 16 +++++++++++++++- 4 files changed, 54 insertions(+), 1 deletion(-) -- 2.27.0 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 da7117b45e..77de026a16 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. + Installation ------------ diff --git a/doc/guides/rel_notes/release_25_03.rst b/doc/guides/rel_notes/release_25_03.rst index 426dfcd982..62fc20701b 100644 --- a/doc/guides/rel_notes/release_25_03.rst +++ b/doc/guides/rel_notes/release_25_03.rst @@ -24,6 +24,13 @@ DPDK Release 25.03 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 dc8b07f5f7..fb3fa6679b 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -10,6 +10,20 @@ #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 | + RTE_COMP_FF_SHAREABLE_PRIV_XFORM, + .window_size = {.min = 15, .max = 15, .increment = 0}, + }, +}; + static int zsda_comp_xform_size(void) { @@ -358,7 +372,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) {