From patchwork Wed Nov 13 02:29:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148374 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 3242845CC8; Wed, 13 Nov 2024 03:37:13 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0AAF24025F; Wed, 13 Nov 2024 03:37:13 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 9596B400D7 for ; Wed, 13 Nov 2024 03:37:11 +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 4Xp6r56LTtz8R041 for ; Wed, 13 Nov 2024 10:37:09 +0800 (CST) Received: from szxlzmapp05.zte.com.cn ([10.5.230.85]) by mse-fl2.zte.com.cn with SMTP id 4AD2abv4062852 for ; Wed, 13 Nov 2024 10:36:37 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:36:38 +0800 X-Zmail-TransId: 3e81673410b6005-aadb8 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 01/13] config: add zsda device number Date: Wed, 13 Nov 2024 10:29:18 +0800 Message-ID: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113022918.3228337-1-li.hanxiao@zte.com.cn> References: <20241111024219.3126193-2-li.hanxiao@zte.com.cn> <20241113022918.3228337-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2abv4062852 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 673410D5.002/4Xp6r56LTtz8R041 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 dd7bb0d35b..e1e85b3291 100644 --- a/config/rte_config.h +++ b/config/rte_config.h @@ -117,6 +117,10 @@ #define RTE_PMD_QAT_COMP_SGL_MAX_SEGMENTS 16 #define RTE_PMD_QAT_COMP_IM_BUFFER_SIZE 65536 +/* ZSDA device */ +/* Max. number of ZSDA devices which can be attached */ +#define RTE_PMD_ZSDA_MAX_PCI_DEVICES 256 + /* virtio crypto defines */ #define RTE_MAX_VIRTIO_CRYPTO 32 From patchwork Wed Nov 13 02:33:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148377 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 B7C7145CC8; Wed, 13 Nov 2024 03:39:36 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DCC8040E2E; Wed, 13 Nov 2024 03:39:26 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id D3C0D40DFD for ; Wed, 13 Nov 2024 03:39:21 +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 4Xp6tW5DpPz8R040 for ; Wed, 13 Nov 2024 10:39:15 +0800 (CST) Received: from szxlzmapp06.zte.com.cn ([10.5.230.252]) by mse-fl1.zte.com.cn with SMTP id 4AD2d3tC067046 for ; Wed, 13 Nov 2024 10:39:03 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:05 +0800 X-Zmail-TransId: 3e8167341141005-aaedd From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 02/13] common/zsda: add zsdadev driver Date: Wed, 13 Nov 2024 10:33:07 +0800 Message-ID: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 4AD2d3tC067046 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341153.002/4Xp6tW5DpPz8R040 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 | 191 ++++++++++++++++++++++++++++++ drivers/common/zsda/zsda_device.h | 53 +++++++++ drivers/meson.build | 1 + 5 files changed, 261 insertions(+) create mode 100644 drivers/common/zsda/meson.build create mode 100644 drivers/common/zsda/zsda_device.c create mode 100644 drivers/common/zsda/zsda_device.h -- 2.27.0 diff --git a/MAINTAINERS b/MAINTAINERS index c5a703b5c0..0318d7357c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1268,6 +1268,9 @@ F: drivers/compress/zlib/ F: doc/guides/compressdevs/zlib.rst F: doc/guides/compressdevs/features/zlib.ini +ZTE Storage Data Accelerator(ZSDA) +M: Hanxiao Li +F: drivers/common/zsda/ DMAdev Drivers -------------- diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build new file mode 100644 index 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..8d691b3bb8 --- /dev/null +++ b/drivers/common/zsda/zsda_device.c @@ -0,0 +1,191 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + + +#include +#include + +#include + +#include "zsda_device.h" + +/* per-process array of device data */ +struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; +static int zsda_nb_pci_devices; + +/* + * The set of PCI devices this driver supports + */ +static const struct rte_pci_id pci_id_zsda_map[] = { + { + RTE_PCI_DEVICE(0x1cf2, 0x8050), + }, + { + RTE_PCI_DEVICE(0x1cf2, 0x8051), + }, + {.device_id = 0}, +}; + +static struct zsda_pci_device * +zsda_pci_get_named_dev(const char *name) +{ + unsigned int i; + + if (name == NULL) + return NULL; + + for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { + if (zsda_devs[i].mz && + (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) + ->name, + name) == 0)) + return (struct zsda_pci_device *)zsda_devs[i].mz->addr; + } + + return NULL; +} +static uint8_t +zsda_pci_find_free_device_index(void) +{ + uint32_t dev_id; + + for (dev_id = 0; dev_id < RTE_PMD_ZSDA_MAX_PCI_DEVICES; dev_id++) + if (zsda_devs[dev_id].mz == NULL) + break; + + return dev_id & (ZSDA_MAX_DEV - 1); +} + +static struct zsda_pci_device * +zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev) +{ + char name[ZSDA_DEV_NAME_MAX_LEN]; + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + + return zsda_pci_get_named_dev(name); +} + +static struct zsda_pci_device * +zsda_pci_device_allocate(struct rte_pci_device *pci_dev) +{ + struct zsda_pci_device *zsda_pci_dev; + uint8_t zsda_dev_id; + char name[ZSDA_DEV_NAME_MAX_LEN]; + unsigned int socket_id = rte_socket_id(); + + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); + snprintf(name + strlen(name), (ZSDA_DEV_NAME_MAX_LEN - strlen(name)), + "_zsda"); + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + const struct rte_memzone *mz = rte_memzone_lookup(name); + + if (mz == NULL) + return NULL; + zsda_pci_dev = mz->addr; + zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; + zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; + zsda_nb_pci_devices++; + return zsda_pci_dev; + } + + if (zsda_pci_get_named_dev(name) != NULL) + return NULL; + + zsda_dev_id = zsda_pci_find_free_device_index(); + + if (zsda_dev_id == (RTE_PMD_ZSDA_MAX_PCI_DEVICES - 1)) + return NULL; + + zsda_devs[zsda_dev_id].mz = + rte_memzone_reserve(name, sizeof(struct zsda_pci_device), + (int)(socket_id & 0xfff), 0); + + if (zsda_devs[zsda_dev_id].mz == NULL) + return NULL; + + zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; + memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); + memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); + zsda_pci_dev->zsda_dev_id = zsda_dev_id; + zsda_pci_dev->pci_dev = pci_dev; + zsda_devs[zsda_dev_id].pci_dev = pci_dev; + + zsda_nb_pci_devices++; + + 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_get_named_dev(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(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_get_zsda_dev_from_pci_dev(pci_dev); + if (zsda_pci_dev == NULL) + return 0; + + return zsda_pci_dev_destroy(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..0c9f332ca2 --- /dev/null +++ b/drivers/common/zsda/zsda_device.h @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_DEVICE_H_ +#define _ZSDA_DEVICE_H_ + +#include +#include "bus_pci_driver.h" + +#define MAX_QPS_ON_FUNCTION 128 +#define ZSDA_DEV_NAME_MAX_LEN 64 +#define ZSDA_MAX_SERVICES (0) +#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES + +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_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/meson.build b/drivers/meson.build index 66931d4241..cdbd3b1c17 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 Wed Nov 13 02:33:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148376 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 CEA6645CC8; Wed, 13 Nov 2024 03:39:29 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6DFCE40E17; Wed, 13 Nov 2024 03:39:25 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id A0D794025F for ; Wed, 13 Nov 2024 03:39:21 +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 4Xp6tc4cpnz5B1J6 for ; Wed, 13 Nov 2024 10:39:20 +0800 (CST) Received: from szxlzmapp04.zte.com.cn ([10.5.231.166]) by mse-fl2.zte.com.cn with SMTP id 4AD2d44u065778 for ; Wed, 13 Nov 2024 10:39:04 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:05 +0800 X-Zmail-TransId: 3e8167341149005-aaee5 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 03/13] common/zsda: add logging macros Date: Wed, 13 Nov 2024 10:33:08 +0800 Message-ID: <20241113023323.3228516-2-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d44u065778 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341158.000/4Xp6tc4cpnz5B1J6 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 | 23 ++++++++++++++++------- drivers/common/zsda/zsda_logs.c | 19 +++++++++++++++++++ drivers/common/zsda/zsda_logs.h | 27 +++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 drivers/common/zsda/zsda_logs.c create mode 100644 drivers/common/zsda/zsda_logs.h -- 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 8d691b3bb8..1be3ea8016 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -9,6 +9,7 @@ #include #include "zsda_device.h" +#include "zsda_logs.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -32,9 +33,10 @@ zsda_pci_get_named_dev(const char *name) { unsigned int i; - if (name == NULL) + if (name == NULL) { + ZSDA_LOG(ERR, "Failed! name is NULL."); return NULL; - + } for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) { if (zsda_devs[i].mz && (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr) @@ -81,8 +83,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) if (rte_eal_process_type() == RTE_PROC_SECONDARY) { const struct rte_memzone *mz = rte_memzone_lookup(name); - if (mz == NULL) + if (mz == NULL) { + ZSDA_LOG(ERR, "Secondary can't find %s mz", name); return NULL; + } zsda_pci_dev = mz->addr; zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz; zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev; @@ -90,8 +94,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) return zsda_pci_dev; } - if (zsda_pci_get_named_dev(name) != NULL) + if (zsda_pci_get_named_dev(name) != NULL) { + ZSDA_LOG(ERR, "Failed! config"); return NULL; + } zsda_dev_id = zsda_pci_find_free_device_index(); @@ -102,9 +108,10 @@ zsda_pci_device_allocate(struct rte_pci_device *pci_dev) rte_memzone_reserve(name, sizeof(struct zsda_pci_device), (int)(socket_id & 0xfff), 0); - if (zsda_devs[zsda_dev_id].mz == NULL) + if (zsda_devs[zsda_dev_id].mz == NULL) { + ZSDA_LOG(ERR, "Failed! malloc"); return NULL; - + } zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr; memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev)); memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN); @@ -158,8 +165,10 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct zsda_pci_device *zsda_pci_dev; zsda_pci_dev = zsda_pci_device_allocate(pci_dev); - if (zsda_pci_dev == NULL) + if (zsda_pci_dev == NULL) { + ZSDA_LOG(ERR, "Failed! zsda_pci_dev is NULL"); return -ENODEV; + } return ret; } diff --git a/drivers/common/zsda/zsda_logs.c b/drivers/common/zsda/zsda_logs.c new file mode 100644 index 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_ */ From patchwork Wed Nov 13 02:33:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148384 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 DB02945CC8; Wed, 13 Nov 2024 03:40:37 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C1C57410F9; Wed, 13 Nov 2024 03:39:40 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 371EB40E15 for ; Wed, 13 Nov 2024 03:39:31 +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 4Xp6tc1KYVz8R046 for ; Wed, 13 Nov 2024 10:39:20 +0800 (CST) Received: from szxlzmapp04.zte.com.cn ([10.5.231.166]) by mse-fl2.zte.com.cn with SMTP id 4AD2d4ib065779 for ; Wed, 13 Nov 2024 10:39:04 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:05 +0800 X-Zmail-TransId: 3e8167341149005-aaee7 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 04/13] common/zsda: add functions to operate hardware queue Date: Wed, 13 Nov 2024 10:33:09 +0800 Message-ID: <20241113023323.3228516-3-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d4ib065779 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341158.000/4Xp6tc1KYVz8R046 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 | 196 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 37 +++++ drivers/common/zsda/zsda_qp_common.h | 27 ++++ 5 files changed, 268 insertions(+) create mode 100644 drivers/common/zsda/zsda_qp.c create mode 100644 drivers/common/zsda/zsda_qp.h create mode 100644 drivers/common/zsda/zsda_qp_common.h -- 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 1be3ea8016..5c835651ea 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -10,6 +10,7 @@ #include "zsda_device.h" #include "zsda_logs.h" +#include "zsda_qp.h" /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; @@ -170,6 +171,12 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return -ENODEV; } + ret = zsda_queue_init(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! queue init."); + return ret; + } + return ret; } diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c new file mode 100644 index 0000000000..8060d89ea1 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.c @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include + +#include + +#include "zsda_logs.h" +#include "zsda_device.h" +#include "zsda_qp.h" +#include "zsda_qp_common.h" + +static uint8_t zsda_num_used_qps; + +static uint8_t +zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t num_used_qps; + + num_used_qps = ZSDA_CSR_READ8(mmio_base + 0); + + return num_used_qps; +} + +static int +zsda_check_write(uint8_t *addr, const uint32_t dst_value) +{ + int times = ZSDA_TIME_NUM; + uint32_t val; + + val = ZSDA_CSR_READ32(addr); + + while ((val != dst_value) && times--) { + val = ZSDA_CSR_READ32(addr); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + } + if (val == dst_value) + return ZSDA_SUCCESS; + else + return ZSDA_FAILED; +} + +static int +zsda_admin_q_start(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, 0); + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START); + + return ret; +} + +static int __rte_unused +zsda_admin_q_stop(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP, ZSDA_Q_STOP); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q stop"); + + return ret; +} + +static int __rte_unused +zsda_admin_q_clear(const struct rte_pci_device *pci_dev) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + int ret; + + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR, ZSDA_RESP_VALID); + + ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, + ZSDA_RESP_VALID); + + if (ret) + ZSDA_LOG(INFO, "Failed! zsda_admin q clear"); + + return ret; +} + + +static int +zsda_queue_start_single(uint8_t *mmio_base, const uint8_t id) +{ + uint8_t *addr_start = mmio_base + ZSDA_IO_Q_START + (4 * id); + + ZSDA_CSR_WRITE32(addr_start, ZSDA_Q_START); + return zsda_check_write(addr_start, ZSDA_Q_START); +} + + +static int +zsda_queue_stop_single(uint8_t *mmio_base, const uint8_t id) +{ + int ret; + uint8_t *addr_stop = mmio_base + ZSDA_IO_Q_STOP + (4 * id); + uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_STOP_RESP + (4 * id); + + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + ZSDA_CSR_WRITE32(addr_stop, ZSDA_Q_STOP); + + ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID); + ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID); + + return ret; +} + +static int +zsda_queue_clear_single(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_queue_start_single(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_queue_stop_single(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_queue_clear_single(mmio_base, id); + + return ret; +} + +int +zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) +{ + int ret; + + zsda_num_used_qps = zsda_get_num_used_qps(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..9861606ac8 --- /dev/null +++ b/drivers/common/zsda/zsda_qp.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef _ZSDA_QP_H_ +#define _ZSDA_QP_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 new file mode 100644 index 0000000000..9c09a227a3 --- /dev/null +++ b/drivers/common/zsda/zsda_qp_common.h @@ -0,0 +1,27 @@ +/* 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 "zsda_logs.h" + +#define ZSDA_SUCCESS 0 +#define ZSDA_FAILED (-1) + +#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 Wed Nov 13 02:33:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148375 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 4E99245CC8; Wed, 13 Nov 2024 03:39:24 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 220024025F; Wed, 13 Nov 2024 03:39:24 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 1EF00400D7 for ; Wed, 13 Nov 2024 03:39:21 +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 4Xp6tb5Sn0z5B1J5 for ; Wed, 13 Nov 2024 10:39:19 +0800 (CST) Received: from szxlzmapp04.zte.com.cn ([10.5.231.166]) by mse-fl2.zte.com.cn with SMTP id 4AD2cmAJ065432 for ; Wed, 13 Nov 2024 10:39:04 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:05 +0800 X-Zmail-TransId: 3e8167341149005-aaee9 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 05/13] common/zsda: add definition and use of msg chan. Date: Wed, 13 Nov 2024 10:33:10 +0800 Message-ID: <20241113023323.3228516-4-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2cmAJ065432 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341157.001/4Xp6tb5Sn0z5B1J5 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 | 309 +++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 52 +++++ drivers/common/zsda/zsda_qp_common.h | 37 ++++ 3 files changed, 398 insertions(+) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 8060d89ea1..0bb0f598b7 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -11,8 +11,48 @@ #include "zsda_qp.h" #include "zsda_qp_common.h" + +#define MAGIC_SEND 0xab +#define MAGIC_RECV 0xcd +#define ADMIN_VER 1 + static uint8_t zsda_num_used_qps; +static const uint8_t crc8_table[256] = { + 0x00, 0x41, 0x13, 0x52, 0x26, 0x67, 0x35, 0x74, 0x4c, 0x0d, 0x5f, 0x1e, + 0x6a, 0x2b, 0x79, 0x38, 0x09, 0x48, 0x1a, 0x5b, 0x2f, 0x6e, 0x3c, 0x7d, + 0x45, 0x04, 0x56, 0x17, 0x63, 0x22, 0x70, 0x31, 0x12, 0x53, 0x01, 0x40, + 0x34, 0x75, 0x27, 0x66, 0x5e, 0x1f, 0x4d, 0x0c, 0x78, 0x39, 0x6b, 0x2a, + 0x1b, 0x5a, 0x08, 0x49, 0x3d, 0x7c, 0x2e, 0x6f, 0x57, 0x16, 0x44, 0x05, + 0x71, 0x30, 0x62, 0x23, 0x24, 0x65, 0x37, 0x76, 0x02, 0x43, 0x11, 0x50, + 0x68, 0x29, 0x7b, 0x3a, 0x4e, 0x0f, 0x5d, 0x1c, 0x2d, 0x6c, 0x3e, 0x7f, + 0x0b, 0x4a, 0x18, 0x59, 0x61, 0x20, 0x72, 0x33, 0x47, 0x06, 0x54, 0x15, + 0x36, 0x77, 0x25, 0x64, 0x10, 0x51, 0x03, 0x42, 0x7a, 0x3b, 0x69, 0x28, + 0x5c, 0x1d, 0x4f, 0x0e, 0x3f, 0x7e, 0x2c, 0x6d, 0x19, 0x58, 0x0a, 0x4b, + 0x73, 0x32, 0x60, 0x21, 0x55, 0x14, 0x46, 0x07, 0x48, 0x09, 0x5b, 0x1a, + 0x6e, 0x2f, 0x7d, 0x3c, 0x04, 0x45, 0x17, 0x56, 0x22, 0x63, 0x31, 0x70, + 0x41, 0x00, 0x52, 0x13, 0x67, 0x26, 0x74, 0x35, 0x0d, 0x4c, 0x1e, 0x5f, + 0x2b, 0x6a, 0x38, 0x79, 0x5a, 0x1b, 0x49, 0x08, 0x7c, 0x3d, 0x6f, 0x2e, + 0x16, 0x57, 0x05, 0x44, 0x30, 0x71, 0x23, 0x62, 0x53, 0x12, 0x40, 0x01, + 0x75, 0x34, 0x66, 0x27, 0x1f, 0x5e, 0x0c, 0x4d, 0x39, 0x78, 0x2a, 0x6b, + 0x6c, 0x2d, 0x7f, 0x3e, 0x4a, 0x0b, 0x59, 0x18, 0x20, 0x61, 0x33, 0x72, + 0x06, 0x47, 0x15, 0x54, 0x65, 0x24, 0x76, 0x37, 0x43, 0x02, 0x50, 0x11, + 0x29, 0x68, 0x3a, 0x7b, 0x0f, 0x4e, 0x1c, 0x5d, 0x7e, 0x3f, 0x6d, 0x2c, + 0x58, 0x19, 0x4b, 0x0a, 0x32, 0x73, 0x21, 0x60, 0x14, 0x55, 0x07, 0x46, + 0x77, 0x36, 0x64, 0x25, 0x51, 0x10, 0x42, 0x03, 0x3b, 0x7a, 0x28, 0x69, + 0x1d, 0x5c, 0x0e, 0x4f}; + +static uint8_t +zsda_crc8(const uint8_t *message, const int length) +{ + uint8_t crc = 0; + int i; + + for (i = 0; i < length; i++) + crc = crc8_table[crc ^ message[i]]; + return crc; +} + static uint8_t zsda_get_num_used_qps(const struct rte_pci_device *pci_dev) { @@ -173,6 +213,262 @@ zsda_queue_clear(const struct rte_pci_device *pci_dev) return ret; } +static uint32_t +zsda_set_reg_8(void *addr, const uint8_t val0, const uint8_t val1, + const uint8_t val2, const uint8_t val3) +{ + uint8_t val[4]; + + val[0] = val0; + val[1] = val1; + val[2] = val2; + val[3] = val3; + ZSDA_CSR_WRITE32(addr, *(uint32_t *)val); + return *(uint32_t *)val; +} + +static uint8_t +zsda_get_reg_8(void *addr, const int offset) +{ + uint32_t val = ZSDA_CSR_READ32(addr); + + return *(((uint8_t *)&val) + offset); +} + +static inline uint32_t +zsda_modulo_32(uint32_t data, uint32_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint16_t +zsda_modulo_16(uint16_t data, uint16_t modulo_mask) +{ + return (data) & (modulo_mask); +} +static inline uint8_t +zsda_modulo_8(uint8_t data, uint8_t modulo_mask) +{ + return (data) & (modulo_mask); +} + +static int +zsda_send_admin_msg(const struct rte_pci_device *pci_dev, void *req, + const uint32_t len) +{ + uint8_t *mmio_base = pci_dev->mem_resource[0].addr; + uint8_t wq_flag; + uint8_t crc; + uint16_t admin_db; + uint32_t retry = ZSDA_TIME_NUM; + int i; + uint16_t db; + int repeat = sizeof(struct zsda_admin_req) / sizeof(uint32_t); + + if (len > ADMIN_BUF_DATA_LEN) + return -EINVAL; + + for (i = 0; i < repeat; i++) { + ZSDA_CSR_WRITE32(((uint32_t *)(mmio_base + ZSDA_ADMIN_WQ) + i), + *((uint32_t *)req + i)); + } + + crc = zsda_crc8((uint8_t *)req, ADMIN_BUF_DATA_LEN); + zsda_set_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, crc, ADMIN_VER, MAGIC_SEND, 0); + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + rte_wmb(); + + admin_db = ZSDA_CSR_READ32(mmio_base + ZSDA_ADMIN_WQ_TAIL); + db = zsda_modulo_32(admin_db, 0x1ff); + ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_WQ_TAIL, db); + + do { + rte_delay_us_sleep(ZSDA_TIME_SLEEP_US); + wq_flag = zsda_get_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, 2); + if (wq_flag == MAGIC_RECV) + break; + + retry--; + if (!retry) { + ZSDA_LOG(ERR, "wq_flag 0x%X", wq_flag); + zsda_set_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, 0, crc, + ADMIN_VER, 0); + return -EIO; + } + } while (1); + + return ZSDA_SUCCESS; +} + +static int +zsda_recv_admin_msg(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_get_reg_8(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_set_reg_8(mmio_base + ZSDA_ADMIN_WQ_BASE7, 0, 0, MAGIC_RECV, 0); + zsda_set_reg_8(mmio_base + ZSDA_ADMIN_CQ_BASE7, 0, 0, MAGIC_RECV, 0); + return 0; +} + +static void +zsda_set_queue_head_tail(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_get_queue_cfg_by_id(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_send_admin_msg(pci_dev, &req, sizeof(req)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Send msg"); + return ret; + } + + ret = zsda_recv_admin_msg(pci_dev, &resp, sizeof(resp)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Receive msg"); + return ret; + } + + *qcfg = resp.qcfg; + + return ZSDA_SUCCESS; +} + +static struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = { + +}; + +static int +zsda_get_queue_cfg(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; + + for (i = 0; i < zsda_num_used_qps; i++) { + zsda_set_queue_head_tail(zsda_pci_dev, i); + ret = zsda_get_queue_cfg_by_id(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_unmask_flr(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_send_admin_msg(pci_dev, &req, sizeof(req)); + if (ret) { + ZSDA_LOG(ERR, "Failed! Send msg"); + return ret; + } + + ret = zsda_recv_admin_msg(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) { @@ -192,5 +488,18 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) ZSDA_LOG(ERR, "Failed! used zsda_io q clear"); return ret; } + + ret = zsda_get_queue_cfg(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_get_queue_cfg"); + return ret; + } + + ret = zsda_unmask_flr(zsda_pci_dev); + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_unmask_flr"); + return ret; + } + return ret; } diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 9861606ac8..c3fc284239 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -17,6 +17,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 @@ -24,11 +37,50 @@ #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 +}; + +enum zsda_service_type { + ZSDA_SERVICE_INVALID, +}; + +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 9c09a227a3..75271d7823 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -24,4 +24,41 @@ #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 Wed Nov 13 02:33:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148381 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 3C48945CC8; Wed, 13 Nov 2024 03:40:10 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3C89340E54; Wed, 13 Nov 2024 03:39:35 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 06C7F40E09 for ; Wed, 13 Nov 2024 03:39:26 +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 4Xp6tb4P6xz8R045 for ; Wed, 13 Nov 2024 10:39:19 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl1.zte.com.cn with SMTP id 4AD2d4or067067 for ; Wed, 13 Nov 2024 10:39:04 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e8167341149005-aaeeb From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 06/13] compress/zsda: add zsda compressdev driver skeleton Date: Wed, 13 Nov 2024 10:33:11 +0800 Message-ID: <20241113023323.3228516-5-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 4AD2d4or067067 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341157.000/4Xp6tb4P6xz8R045 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 | 178 ++++++++++++++++++++++ drivers/common/zsda/meson.build | 12 +- drivers/common/zsda/zsda_device.h | 29 +++- drivers/common/zsda/zsda_qp.c | 30 +++- drivers/common/zsda/zsda_qp.h | 16 +- drivers/common/zsda/zsda_qp_common.h | 7 + drivers/compress/zsda/zsda_comp_pmd.c | 128 ++++++++++++++++ drivers/compress/zsda/zsda_comp_pmd.h | 20 +++ 11 files changed, 418 insertions(+), 12 deletions(-) create mode 100644 doc/guides/compressdevs/features/zsda.ini create mode 100644 doc/guides/compressdevs/zsda.rst create mode 100644 drivers/compress/zsda/zsda_comp_pmd.c create mode 100644 drivers/compress/zsda/zsda_comp_pmd.h -- 2.27.0 diff --git a/MAINTAINERS b/MAINTAINERS index 0318d7357c..dc3fa2097a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1271,6 +1271,9 @@ F: doc/guides/compressdevs/features/zlib.ini ZTE Storage Data Accelerator(ZSDA) M: Hanxiao Li F: drivers/common/zsda/ +F: drivers/compress/zsda/ +F: doc/guides/compressdevs/zsda.rst +F: doc/guides/compressdevs/features/zsda.ini DMAdev Drivers -------------- diff --git a/doc/guides/compressdevs/features/zsda.ini b/doc/guides/compressdevs/features/zsda.ini new file mode 100644 index 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..c02423d650 --- /dev/null +++ b/doc/guides/compressdevs/zsda.rst @@ -0,0 +1,178 @@ +.. 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. + +It depends on a ZSDA kernel driver, see :ref:`building_zsda`. + + +.. _building_zsda: + +Building PMDs on ZSDA +--------------------- + +A ZSDA device can host multiple acceleration services: + +* data compression + +These services are provided to DPDK applications via PMDs which register to +implement the compressdev APIs. The PMDs use common ZSDA driver code +which manages the ZSDA PCI device. + + +Configuring and Building the DPDK ZSDA PMDs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Further information on configuring, building and installing DPDK is described +:doc:`here <../linux_gsg/build_dpdk>`. + +.. _building_zsda_config: + +Build Configuration +~~~~~~~~~~~~~~~~~~~ +These is the build configuration options affecting ZSDA, and its default values: + +.. code-block:: console + + RTE_PMD_ZSDA_MAX_PCI_DEVICES=256 + + +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. +See note in the section `Binding the available VFs to the vfio-pci driver`_ +above. + + +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, e.g. using any of the following:: + + --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 0c9f332ca2..564d68ac6a 100644 --- a/drivers/common/zsda/zsda_device.h +++ b/drivers/common/zsda/zsda_device.h @@ -7,10 +7,10 @@ #include #include "bus_pci_driver.h" +#include "zsda_qp_common.h" #define MAX_QPS_ON_FUNCTION 128 #define ZSDA_DEV_NAME_MAX_LEN 64 -#define ZSDA_MAX_SERVICES (0) #define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES struct zsda_device_info { @@ -18,7 +18,11 @@ struct zsda_device_info { /**< 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; }; @@ -37,6 +41,23 @@ struct zsda_qp_hw { struct zsda_qp_hw_data data[MAX_QPS_ON_FUNCTION]; }; +/** 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 */ +}; + struct zsda_pci_device { /* Data used by all services */ char name[ZSDA_DEV_NAME_MAX_LEN]; @@ -46,6 +67,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 0bb0f598b7..7e000d5b3f 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -3,15 +3,12 @@ */ #include - -#include +#include #include "zsda_logs.h" -#include "zsda_device.h" #include "zsda_qp.h" #include "zsda_qp_common.h" - #define MAGIC_SEND 0xab #define MAGIC_RECV 0xcd #define ADMIN_VER 1 @@ -400,7 +397,8 @@ zsda_get_queue_cfg_by_id(const struct zsda_pci_device *zsda_pci_dev, } static struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = { - + [ZSDA_SERVICE_ENCOMPRESSION] = {32, 16}, + [ZSDA_SERVICE_DECOMPRESSION] = {32, 16}, }; static int @@ -468,6 +466,26 @@ zsda_unmask_flr(const struct zsda_pci_device *zsda_pci_dev) return ZSDA_SUCCESS; } +static uint16_t +zsda_qps_per_service(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_get_nb_qps(const struct zsda_pci_device *zsda_pci_dev) +{ + zsda_nb_qps.encomp = + zsda_qps_per_service(zsda_pci_dev, ZSDA_SERVICE_ENCOMPRESSION); + zsda_nb_qps.decomp = + zsda_qps_per_service(zsda_pci_dev, ZSDA_SERVICE_DECOMPRESSION); +} int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) @@ -501,5 +519,7 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) return ret; } + zsda_get_nb_qps(zsda_pci_dev); + return ret; } diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index c3fc284239..0c8f36061a 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -5,6 +5,8 @@ #ifndef _ZSDA_QP_H_ #define _ZSDA_QP_H_ +#include "zsda_device.h" + #define ZSDA_ADMIN_Q_START 0x100 #define ZSDA_ADMIN_Q_STOP 0x100 #define ZSDA_ADMIN_Q_STOP_RESP 0x104 @@ -72,15 +74,21 @@ enum zsda_admin_msg_id { ZSDA_ADMIN_INT_TEST }; -enum zsda_service_type { - ZSDA_SERVICE_INVALID, -}; - struct ring_size { uint16_t tx_msg_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 75271d7823..722fd730b2 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -17,6 +17,13 @@ #define ZSDA_SUCCESS 0 #define ZSDA_FAILED (-1) +enum zsda_service_type { + ZSDA_SERVICE_ENCOMPRESSION = 0, + ZSDA_SERVICE_DECOMPRESSION = 1, + ZSDA_SERVICE_INVALID, +}; +#define ZSDA_MAX_SERVICES (2) + #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)) 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..c6ef57af8e --- /dev/null +++ b/drivers/compress/zsda/zsda_comp_pmd.h @@ -0,0 +1,20 @@ +/* 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" +#include "zsda_device.h" + +/**< ZSDA Compression PMD driver name */ +#define COMPRESSDEV_NAME_ZSDA_PMD compress_zsda + +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 Wed Nov 13 02:33:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148379 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 43F5F45CC8; Wed, 13 Nov 2024 03:39:55 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A925C40E3A; Wed, 13 Nov 2024 03:39:32 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 1028640E0A for ; Wed, 13 Nov 2024 03:39:25 +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 4Xp6th0wlnz5B1Jt for ; Wed, 13 Nov 2024 10:39:24 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl2.zte.com.cn with SMTP id 4AD2d4fl065781 for ; Wed, 13 Nov 2024 10:39:04 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e816734114a005-aaeed From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 07/13] compress/zsda: add zsda compressdev dev ops Date: Wed, 13 Nov 2024 10:33:12 +0800 Message-ID: <20241113023323.3228516-6-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d4fl065781 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6734115C.001/4Xp6th0wlnz5B1Jt 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_qp_common.c | 57 ++++++++++ drivers/common/zsda/zsda_qp_common.h | 36 +++++++ drivers/compress/zsda/zsda_comp_pmd.c | 144 +++++++++++++++++++++++++- drivers/compress/zsda/zsda_comp_pmd.h | 5 + 5 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 drivers/common/zsda/zsda_qp_common.c -- 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_qp_common.c b/drivers/common/zsda/zsda_qp_common.c new file mode 100644 index 0000000000..9c7152eb24 --- /dev/null +++ b/drivers/common/zsda/zsda_qp_common.c @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include "zsda_qp_common.h" + +static void +zsda_queue_delete(const struct zsda_queue *queue) +{ + const struct rte_memzone *mz; + + if (queue == NULL) { + ZSDA_LOG(DEBUG, "Invalid queue"); + return; + } + + mz = rte_memzone_lookup(queue->memz_name); + if (mz != NULL) { + memset(queue->base_addr, 0x0, + (uint16_t)(queue->queue_size * queue->msg_size)); + rte_memzone_free(mz); + } else + ZSDA_LOG(DEBUG, "queue %s doesn't exist", queue->memz_name); +} + +int +zsda_queue_pair_release(struct zsda_qp **qp_addr) +{ + struct zsda_qp *qp = *qp_addr; + uint32_t i; + enum zsda_service_type type; + + if (qp == NULL) { + ZSDA_LOG(DEBUG, "qp already freed"); + return 0; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + + zsda_queue_delete(&(qp->srv[type].tx_q)); + zsda_queue_delete(&(qp->srv[type].rx_q)); + qp->srv[type].used = false; + for (i = 0; i < qp->srv[type].nb_descriptors; i++) + rte_mempool_put(qp->srv[type].op_cookie_pool, + qp->srv[type].op_cookies[i]); + + rte_mempool_free(qp->srv[type].op_cookie_pool); + rte_free(qp->srv[type].op_cookies); + } + + rte_free(qp); + *qp_addr = NULL; + + return ZSDA_SUCCESS; +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 722fd730b2..1522f9605e 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -68,4 +68,40 @@ 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]; +}; + +int zsda_queue_pair_release(struct zsda_qp **qp_addr); + #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index d1c33f448c..3bdcd66f6a 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -8,13 +8,145 @@ #include "zsda_qp_common.h" #include "zsda_comp_pmd.h" +static int +zsda_comp_xform_size(void) +{ + return RTE_ALIGN_CEIL(sizeof(struct zsda_comp_xform), 8); +} + +static struct rte_mempool * +zsda_comp_create_xform_pool(struct zsda_comp_dev_private *comp_dev, + struct rte_compressdev_config *config, + uint32_t num_elements) +{ + char xform_pool_name[RTE_MEMPOOL_NAMESIZE]; + struct rte_mempool *mp; + + snprintf(xform_pool_name, RTE_MEMPOOL_NAMESIZE, "%s_xforms", + comp_dev->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_create_xform_pool( + 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_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) +{ + uint16_t i; + struct zsda_comp_dev_private *comp_dev = dev->data->dev_private; + + for (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; + + 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 +253,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 c6ef57af8e..8d76ef2bcc 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.h +++ b/drivers/compress/zsda/zsda_comp_pmd.h @@ -13,6 +13,11 @@ /**< ZSDA Compression PMD driver name */ #define COMPRESSDEV_NAME_ZSDA_PMD compress_zsda +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 Wed Nov 13 02:33:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148380 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 D355345CC8; Wed, 13 Nov 2024 03:40:02 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E153B40E4B; Wed, 13 Nov 2024 03:39:33 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 44FA440E0A for ; Wed, 13 Nov 2024 03:39:26 +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 4Xp6tj29FDz5B1Jv for ; Wed, 13 Nov 2024 10:39:25 +0800 (CST) Received: from szxlzmapp06.zte.com.cn ([10.5.230.252]) by mse-fl2.zte.com.cn with SMTP id 4AD2d57L065783 for ; Wed, 13 Nov 2024 10:39:05 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e816734114a005-aaeef From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 08/13] compress/zsda: add zsda compressdev stats ops Date: Wed, 13 Nov 2024 10:33:13 +0800 Message-ID: <20241113023323.3228516-7-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d57L065783 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6734115D.000/4Xp6tj29FDz5B1Jv 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 | 25 ++++++++++- 3 files changed, 102 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 9c7152eb24..70367e6c82 100644 --- a/drivers/common/zsda/zsda_qp_common.c +++ b/drivers/common/zsda/zsda_qp_common.c @@ -55,3 +55,66 @@ zsda_queue_pair_release(struct zsda_qp **qp_addr) return ZSDA_SUCCESS; } + +void +zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if ((stats == NULL) || (queue_pairs == NULL)) { + ZSDA_LOG(ERR, "Failed! stats or queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + stats->enqueued_count += + qp->srv[type].stats.enqueued_count; + stats->dequeued_count += + qp->srv[type].stats.dequeued_count; + stats->enqueue_err_count += + qp->srv[type].stats.enqueue_err_count; + stats->dequeue_err_count += + qp->srv[type].stats.dequeue_err_count; + } + } + } +} + +void +zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs) +{ + enum zsda_service_type type; + uint32_t i; + struct zsda_qp *qp; + + if (queue_pairs == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs is NULL"); + return; + } + + for (i = 0; i < nb_queue_pairs; i++) { + qp = queue_pairs[i]; + + if (qp == NULL) { + ZSDA_LOG(ERR, "Failed! queue_pairs[i] is NULL"); + break; + } + for (type = 0; type < ZSDA_MAX_SERVICES; type++) { + if (qp->srv[type].used) + memset(&(qp->srv[type].stats), 0, + sizeof(struct zsda_qp_stat)); + } + } +} diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 1522f9605e..35c7038a4d 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -89,10 +89,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; @@ -103,5 +116,8 @@ struct zsda_qp { }; int zsda_queue_pair_release(struct zsda_qp **qp_addr); +void zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs, + struct zsda_qp_stat *stats); +void zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs); #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 3bdcd66f6a..555178cd12 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -140,6 +140,27 @@ zsda_comp_dev_info_get(struct rte_compressdev *dev, } } +static void +zsda_comp_stats_get(struct rte_compressdev *dev, + struct rte_compressdev_stats *stats) +{ + struct zsda_qp_stat stats_info = {0}; + + zsda_stats_get(dev->data->queue_pairs, dev->data->nb_queue_pairs, + &stats_info); + stats->enqueued_count = stats_info.enqueued_count; + stats->dequeued_count = stats_info.dequeued_count; + stats->enqueue_err_count = stats_info.enqueue_err_count; + stats->dequeue_err_count = stats_info.dequeue_err_count; +} + + +static void +zsda_comp_stats_reset(struct rte_compressdev *dev) +{ + zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs); +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -148,8 +169,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 Wed Nov 13 02:33:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148378 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 8784845CC8; Wed, 13 Nov 2024 03:39:48 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7F50C40E28; Wed, 13 Nov 2024 03:39:31 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 0D70440E09 for ; Wed, 13 Nov 2024 03:39:25 +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 4Xp6tg70b9z5B1J5 for ; Wed, 13 Nov 2024 10:39:23 +0800 (CST) Received: from szxlzmapp05.zte.com.cn ([10.5.230.85]) by mse-fl1.zte.com.cn with SMTP id 4AD2d5Q6067093 for ; Wed, 13 Nov 2024 10:39:05 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e816734114a005-aaef1 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 09/13] compress/zsda: add zsda compressdev xform ops Date: Wed, 13 Nov 2024 10:33:14 +0800 Message-ID: <20241113023323.3228516-8-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 4AD2d5Q6067093 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6734115B.002/4Xp6tg70b9z5B1J5 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 | 55 +++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) -- 2.27.0 diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index 555178cd12..e9682e93cd 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -154,13 +154,62 @@ zsda_comp_stats_get(struct rte_compressdev *dev, stats->dequeue_err_count = stats_info.dequeue_err_count; } - static void zsda_comp_stats_reset(struct rte_compressdev *dev) { zsda_stats_reset(dev->data->queue_pairs, dev->data->nb_queue_pairs); } +static int +zsda_comp_private_xform_create(struct rte_compressdev *dev, + const struct rte_comp_xform *xform, + void **private_xform) +{ + struct zsda_comp_dev_private *zsda = dev->data->dev_private; + + if (unlikely(private_xform == NULL)) { + ZSDA_LOG(ERR, "Failed! private_xform is NULL"); + return -EINVAL; + } + if (unlikely(zsda->xformpool == NULL)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + if (rte_mempool_get(zsda->xformpool, private_xform)) { + ZSDA_LOG(ERR, "Failed! zsda->xformpool is NULL"); + return -ENOMEM; + } + + struct zsda_comp_xform *zsda_xform = *private_xform; + zsda_xform->type = xform->type; + + if (zsda_xform->type == RTE_COMP_COMPRESS) + zsda_xform->checksum_type = xform->compress.chksum; + else + zsda_xform->checksum_type = xform->decompress.chksum; + + if (zsda_xform->checksum_type == RTE_COMP_CHECKSUM_CRC32_ADLER32) + return -EINVAL; + + return ZSDA_SUCCESS; +} + +static int +zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused, + void *private_xform) +{ + struct zsda_comp_xform *zsda_xform = private_xform; + + if (zsda_xform) { + memset(zsda_xform, 0, zsda_comp_xform_size()); + struct rte_mempool *mp = rte_mempool_from_obj(zsda_xform); + + rte_mempool_put(mp, zsda_xform); + return ZSDA_SUCCESS; + } + return -EINVAL; +} + static struct rte_compressdev_ops compress_zsda_ops = { .dev_configure = zsda_comp_dev_config, @@ -174,8 +223,8 @@ static struct rte_compressdev_ops compress_zsda_ops = { .queue_pair_setup = NULL, .queue_pair_release = NULL, - .private_xform_create = NULL, - .private_xform_free = NULL + .private_xform_create = zsda_comp_private_xform_create, + .private_xform_free = zsda_comp_private_xform_free, }; /* An rte_driver is needed in the registration of the device with compressdev. From patchwork Wed Nov 13 02:33:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148386 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 2C36345CC8; Wed, 13 Nov 2024 03:40:50 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2A538410DC; Wed, 13 Nov 2024 03:39:43 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 1634D40E4D for ; Wed, 13 Nov 2024 03:39: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 mxhk.zte.com.cn (FangMail) with ESMTPS id 4Xp6tm0T1Yz8R045 for ; Wed, 13 Nov 2024 10:39:28 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl2.zte.com.cn with SMTP id 4AD2d5gm065784 for ; Wed, 13 Nov 2024 10:39:05 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e816734114a005-aaef3 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 10/13] compress/zsda: add zsda compressdev qp ops Date: Wed, 13 Nov 2024 10:33:15 +0800 Message-ID: <20241113023323.3228516-9-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d5gm065784 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341160.000/4Xp6tm0T1Yz8R045 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_device.c | 1 - drivers/common/zsda/zsda_device.h | 3 +- drivers/common/zsda/zsda_qp.c | 248 ++++++++++++++++++++++++++ drivers/common/zsda/zsda_qp.h | 85 +++++++++ drivers/common/zsda/zsda_qp_common.c | 2 +- drivers/common/zsda/zsda_qp_common.h | 30 ++++ drivers/compress/zsda/zsda_comp_pmd.c | 107 ++++++++++- 7 files changed, 470 insertions(+), 6 deletions(-) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c index 5c835651ea..5297c80ef9 100644 --- a/drivers/common/zsda/zsda_device.c +++ b/drivers/common/zsda/zsda_device.c @@ -11,7 +11,6 @@ #include "zsda_device.h" #include "zsda_logs.h" #include "zsda_qp.h" - /* per-process array of device data */ struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES]; static int zsda_nb_pci_devices; diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h index 564d68ac6a..af4a5c8cc7 100644 --- a/drivers/common/zsda/zsda_device.h +++ b/drivers/common/zsda/zsda_device.h @@ -5,13 +5,12 @@ #ifndef _ZSDA_DEVICE_H_ #define _ZSDA_DEVICE_H_ -#include #include "bus_pci_driver.h" + #include "zsda_qp_common.h" #define MAX_QPS_ON_FUNCTION 128 #define ZSDA_DEV_NAME_MAX_LEN 64 -#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES struct zsda_device_info { const struct rte_memzone *mz; diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index 7e000d5b3f..658b0b69e3 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -12,6 +12,8 @@ #define MAGIC_SEND 0xab #define MAGIC_RECV 0xcd #define ADMIN_VER 1 +#define RING_DIR_TX 0 +#define RING_DIR_RX 1 static uint8_t zsda_num_used_qps; @@ -523,3 +525,249 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev) return ret; } + +struct zsda_qp_hw * +zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, + const enum zsda_service_type service) +{ + struct zsda_qp_hw *qp_hw = NULL; + + if (service < ZSDA_SERVICE_INVALID) + qp_hw = &(zsda_pci_dev->zsda_hw_qps[service]); + + return qp_hw; +} + +static const struct rte_memzone * +zsda_queue_dma_zone_reserve(const char *queue_name, + const unsigned int queue_size, + const unsigned int socket_id) +{ + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(queue_name); + if (mz != 0) { + if (((size_t)queue_size <= mz->len) && + ((socket_id == (SOCKET_ID_ANY & 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 uint32_t dev_id, struct zsda_queue *queue, + const struct zsda_qp_config *qp_conf, const uint8_t dir) +{ + void *io_addr; + const struct rte_memzone *qp_mz; + struct qinfo qcfg = {0}; + + uint16_t desc_size = ((dir == RING_DIR_TX) ? qp_conf->hw->tx_msg_size + : qp_conf->hw->rx_msg_size); + unsigned int queue_size_bytes = qp_conf->nb_descriptors * desc_size; + + queue->hw_queue_number = + ((dir == RING_DIR_TX) ? qp_conf->hw->tx_ring_num + : qp_conf->hw->rx_ring_num); + + struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev; + struct zsda_pci_device *zsda_dev = + (struct zsda_pci_device *)zsda_devs[dev_id].mz->addr; + + zsda_get_queue_cfg_by_id(zsda_dev, queue->hw_queue_number, &qcfg); + + if (dir == RING_DIR_TX) + snprintf(queue->memz_name, sizeof(queue->memz_name), + "%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, + qp_conf->service_str, "qptxmem", + queue->hw_queue_number); + else + snprintf(queue->memz_name, sizeof(queue->memz_name), + "%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id, + qp_conf->service_str, "qprxmem", + queue->hw_queue_number); + + qp_mz = zsda_queue_dma_zone_reserve(queue->memz_name, queue_size_bytes, + rte_socket_id()); + if (qp_mz == NULL) { + 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 uint32_t dev_id, struct zsda_qp **qp_addr, + const uint16_t queue_pair_id, + const struct zsda_qp_config *zsda_qp_conf) +{ + struct zsda_qp *qp = *qp_addr; + struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev; + char op_cookie_pool_name[RTE_RING_NAMESIZE]; + uint32_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, "%s%d_cks_%s_qp%hu", + pci_dev->driver->driver.name, 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 uint32_t dev_id, struct zsda_qp **qp_addr, + const uint16_t queue_pair_id, + const struct zsda_qp_config *zsda_qp_conf) +{ + struct zsda_qp *qp = *qp_addr; + 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_addr, 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; +} + +int +zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr, + const uint16_t queue_pair_id, const struct zsda_qp_config *conf) +{ + uint32_t i; + int ret; + struct zsda_qp *qp; + rte_iova_t cookie_phys_addr; + + ret = zsda_queue_pair_setup(zsda_dev_id, qp_addr, queue_pair_id, conf); + if (ret) + return ret; + + qp = (struct zsda_qp *)*qp_addr; + + 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; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 0c8f36061a..1e3115e6c9 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -5,6 +5,8 @@ #ifndef _ZSDA_QP_H_ #define _ZSDA_QP_H_ +#include "zsda_qp_common.h" + #include "zsda_device.h" #define ZSDA_ADMIN_Q_START 0x100 @@ -50,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 { @@ -87,6 +132,39 @@ 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_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]; +}; + +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; +}; + extern struct zsda_num_qps zsda_nb_qps; int zsda_queue_start(const struct rte_pci_device *pci_dev); @@ -94,4 +172,11 @@ 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_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr, + const uint16_t queue_pair_id, const struct zsda_qp_config *conf); + #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c index 70367e6c82..577392871f 100644 --- a/drivers/common/zsda/zsda_qp_common.c +++ b/drivers/common/zsda/zsda_qp_common.c @@ -4,7 +4,7 @@ #include "zsda_qp_common.h" -static void +void zsda_queue_delete(const struct zsda_queue *queue) { const struct rte_memzone *mz; diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index 35c7038a4d..de746ad00b 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -31,6 +31,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]; @@ -101,10 +110,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,5 +148,6 @@ 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); +void zsda_queue_delete(const struct zsda_queue *queue); #endif /* _ZSDA_QP_COMMON_H_ */ diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index e9682e93cd..9824f7c83f 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -210,6 +210,109 @@ zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused, return -EINVAL; } +static int +zsda_setup_comp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id, + struct zsda_qp *qp, uint16_t nb_des, int socket_id) +{ + enum zsda_service_type type = ZSDA_SERVICE_ENCOMPRESSION; + struct zsda_qp_config conf; + int ret; + struct zsda_qp_hw *qp_hw; + + 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 = nb_des; + conf.socket_id = socket_id; + conf.service_str = "comp"; + + ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); + qp->srv[type].rx_cb = NULL; + qp->srv[type].tx_cb = NULL; + qp->srv[type].match = NULL; + + return ret; +} + +static int +zsda_setup_decomp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id, + struct zsda_qp *qp, uint16_t nb_des, int socket_id) +{ + enum zsda_service_type type = ZSDA_SERVICE_DECOMPRESSION; + struct zsda_qp_config conf; + int ret; + struct zsda_qp_hw *qp_hw; + + 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 = nb_des; + conf.socket_id = socket_id; + conf.service_str = "decomp"; + + ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); + qp->srv[type].rx_cb = NULL; + qp->srv[type].tx_cb = NULL; + qp->srv[type].match = NULL; + + return ret; +} + +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 num_qps_comp = zsda_nb_qps.encomp; + uint16_t num_qps_decomp = zsda_nb_qps.decomp; + uint16_t nb_des = max_inflight_ops & 0xffff; + + 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; + } + + if (num_qps_comp == MAX_QPS_ON_FUNCTION) + ret = zsda_setup_comp_queue(zsda_pci_dev, qp_id, qp_new, nb_des, + socket_id); + else if (num_qps_decomp == MAX_QPS_ON_FUNCTION) + ret = zsda_setup_decomp_queue(zsda_pci_dev, qp_id, qp_new, nb_des, + socket_id); + else { + ret = zsda_setup_comp_queue(zsda_pci_dev, qp_id, qp_new, nb_des, + socket_id); + ret |= zsda_setup_decomp_queue(zsda_pci_dev, qp_id, qp_new, nb_des, + socket_id); + } + + 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, @@ -220,8 +323,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 Wed Nov 13 02:33:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148382 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 9BD5E45CC8; Wed, 13 Nov 2024 03:40:17 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AF33C40E8A; Wed, 13 Nov 2024 03:39:36 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.40]) by mails.dpdk.org (Postfix) with ESMTP id 6A2AA40E20 for ; Wed, 13 Nov 2024 03:39:26 +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 4Xp6tc2s47z8R047 for ; Wed, 13 Nov 2024 10:39:20 +0800 (CST) Received: from szxlzmapp03.zte.com.cn ([10.5.231.207]) by mse-fl1.zte.com.cn with SMTP id 4AD2d5ek067130 for ; Wed, 13 Nov 2024 10:39:05 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:06 +0800 X-Zmail-TransId: 3e816734114a005-aaef5 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 11/13] compress/zsda: add zsda compressdev enqueue datapath Date: Wed, 13 Nov 2024 10:33:16 +0800 Message-ID: <20241113023323.3228516-10-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 4AD2d5ek067130 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341158.001/4Xp6tc2s47z8R047 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 | 107 ++++++++++++ drivers/common/zsda/zsda_qp.h | 23 ++- drivers/common/zsda/zsda_qp_common.c | 72 ++++++++ drivers/common/zsda/zsda_qp_common.h | 41 +++++ drivers/compress/zsda/zsda_comp.c | 233 ++++++++++++++++++++++++++ drivers/compress/zsda/zsda_comp.h | 36 ++++ drivers/compress/zsda/zsda_comp_pmd.c | 19 ++- 8 files changed, 515 insertions(+), 18 deletions(-) create mode 100644 drivers/compress/zsda/zsda_comp.c create mode 100644 drivers/compress/zsda/zsda_comp.h -- 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 658b0b69e3..c2a7d9b28b 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -771,3 +771,110 @@ zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr, } return ret; } + + +static int +zsda_find_next_free_cookie(const struct zsda_queue *queue, void **op_cookie, + uint16_t *idx) +{ + uint16_t old_tail = queue->tail; + uint16_t tail = queue->tail; + struct zsda_op_cookie *cookie; + + do { + cookie = op_cookie[tail]; + if (!cookie->used) { + *idx = tail & (queue->queue_size - 1); + return ZSDA_SUCCESS; + } + tail = zsda_modulo_16(tail++, queue->modulo_mask); + } while (old_tail != tail); + + return -EINVAL; +} + +static int +zsda_enqueue(void *op, struct zsda_qp *qp) +{ + uint16_t new_tail; + enum zsda_service_type type; + void **op_cookie; + int ret = ZSDA_SUCCESS; + struct zsda_queue *queue; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (qp->srv[type].used) { + if (!qp->srv[type].match(op)) + continue; + queue = &qp->srv[type].tx_q; + op_cookie = qp->srv[type].op_cookies; + + if (zsda_find_next_free_cookie(queue, op_cookie, + &new_tail)) { + ret = -EBUSY; + break; + } + ret = qp->srv[type].tx_cb(op, queue, op_cookie, + new_tail); + if (ret) { + qp->srv[type].stats.enqueue_err_count++; + ZSDA_LOG(ERR, "Failed! config wqe"); + break; + } + qp->srv[type].stats.enqueued_count++; + + queue->tail = zsda_modulo_16(new_tail + 1, + queue->queue_size - 1); + + if (new_tail > queue->tail) + queue->valid = + zsda_modulo_8(queue->valid + 1, + (uint8_t)(queue->cycle_size - 1)); + + queue->pushed_wqe++; + break; + } + } + + return ret; +} + +static void +zsda_tx_write_tail(struct zsda_queue *queue) +{ + if (queue->pushed_wqe) + WRITE_CSR_WQ_TAIL(queue->io_addr, queue->hw_queue_number, + queue->tail); + + queue->pushed_wqe = 0; +} + +uint16_t +zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + int ret = ZSDA_SUCCESS; + enum zsda_service_type type; + uint16_t i; + uint16_t nb_send = 0; + void *op; + + if (nb_ops > ZSDA_MAX_DESC) { + ZSDA_LOG(ERR, "Enqueue number bigger than %d", ZSDA_MAX_DESC); + return 0; + } + + for (i = 0; i < nb_ops; i++) { + op = ops[i]; + ret = zsda_enqueue(op, qp); + if (ret < 0) + break; + nb_send++; + } + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) + if (qp->srv[type].used) + zsda_tx_write_tail(&qp->srv[type].tx_q); + + return nb_send; +} + diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index 1e3115e6c9..c68c8ed380 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 { @@ -141,17 +149,6 @@ struct zsda_qp_config { const char *service_str; }; -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]; -}; - struct zsda_op_cookie { struct zsda_sgl sgl_src; struct zsda_sgl sgl_dst; @@ -179,4 +176,6 @@ zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev, int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr, const uint16_t queue_pair_id, const struct zsda_qp_config *conf); +uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); + #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c index 577392871f..8eff8a5485 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_fill_sgl(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 de746ad00b..e4b00d8307 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -39,6 +39,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; @@ -144,10 +165,30 @@ 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]; +}; + +struct comp_head_info { + uint32_t head_len; + phys_addr_t head_phys_addr; +}; + 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); void zsda_queue_delete(const struct zsda_queue *queue); +int zsda_fill_sgl(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..c00e0c2a4b --- /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 +get_opcode(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_build_comp_request(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 = get_opcode(xform); + if (opcode == ZSDA_OPC_INVALID) { + ZSDA_LOG(ERR, "Failed! get_opcode"); + 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_fill_sgl(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_fill_sgl(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_fill_sgl"); + 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_build_decomp_request(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 = get_opcode(xform); + if (opcode == ZSDA_OPC_INVALID) { + ZSDA_LOG(ERR, "Failed! get_opcode"); + 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_fill_sgl(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_fill_sgl(op->m_dst, op_offset, sgl_dst, + cookie->sgl_dst_phys_addr, op_dst_len, NULL); + + if (ret) { + ZSDA_LOG(ERR, "Failed! zsda_fill_sgl"); + 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..e7dea7e5a4 --- /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_build_comp_request(void *op_in, const struct zsda_queue *queue, + void **op_cookies, const uint16_t new_tail); + +int zsda_build_decomp_request(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 9824f7c83f..9cb2169d68 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -7,6 +7,7 @@ #include "zsda_logs.h" #include "zsda_qp_common.h" #include "zsda_comp_pmd.h" +#include "zsda_comp.h" static int zsda_comp_xform_size(void) @@ -229,8 +230,8 @@ zsda_setup_comp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); qp->srv[type].rx_cb = NULL; - qp->srv[type].tx_cb = NULL; - qp->srv[type].match = NULL; + qp->srv[type].tx_cb = zsda_build_comp_request; + qp->srv[type].match = zsda_comp_match; return ret; } @@ -254,8 +255,8 @@ zsda_setup_decomp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_ ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); qp->srv[type].rx_cb = NULL; - qp->srv[type].tx_cb = NULL; - qp->srv[type].match = NULL; + qp->srv[type].tx_cb = zsda_build_decomp_request; + qp->srv[type].match = zsda_decomp_match; return ret; } @@ -339,6 +340,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_op_burst((struct zsda_qp *)qp, (void **)ops, + nb_ops); +} + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) { @@ -376,7 +385,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 Wed Nov 13 02:33:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148385 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 8B57745CC8; Wed, 13 Nov 2024 03:40:43 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EE51D410D0; Wed, 13 Nov 2024 03:39:41 +0100 (CET) Received: from mxct.zte.com.cn (mxct.zte.com.cn [183.62.165.209]) by mails.dpdk.org (Postfix) with ESMTP id 9EA9240E20 for ; Wed, 13 Nov 2024 03:39:28 +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 4Xp6tf0k1Fz501gW for ; Wed, 13 Nov 2024 10:39:22 +0800 (CST) Received: from szxlzmapp05.zte.com.cn ([10.5.230.85]) by mse-fl1.zte.com.cn with SMTP id 4AD2d5ZZ067131 for ; Wed, 13 Nov 2024 10:39:05 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:07 +0800 X-Zmail-TransId: 3e816734114a005-aaef7 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 12/13] compress/zsda: add zsda compressdev dequeue datapath Date: Wed, 13 Nov 2024 10:33:17 +0800 Message-ID: <20241113023323.3228516-11-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl1.zte.com.cn 4AD2d5ZZ067131 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6734115A.000/4Xp6tf0k1Fz501gW 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 | 14 ++- 6 files changed, 235 insertions(+), 3 deletions(-) -- 2.27.0 diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c index c2a7d9b28b..fd45558868 100644 --- a/drivers/common/zsda/zsda_qp.c +++ b/drivers/common/zsda/zsda_qp.c @@ -878,3 +878,58 @@ zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) return nb_send; } +static void +zsda_dequeue(struct qp_srv *srv, void **ops, const uint16_t nb_ops, uint16_t *nb) +{ + uint16_t head; + struct zsda_cqe *cqe; + struct zsda_queue *queue = &srv->rx_q; + struct zsda_op_cookie *cookie; + head = queue->head; + + while (*nb < nb_ops) { + cqe = (struct zsda_cqe *)( + (uint8_t *)queue->base_addr + head * queue->msg_size); + + if (!CQE_VALID(cqe->err1)) + break; + cookie = srv->op_cookies[cqe->sid]; + + ops[*nb] = cookie->op; + if (srv->rx_cb(cookie, cqe) == ZSDA_SUCCESS) + srv->stats.dequeued_count++; + else { + ZSDA_LOG(ERR, + "ERR! Cqe, opcode 0x%x, sid 0x%x, " + "tx_real_length 0x%x, err0 0x%x, err1 0x%x", + cqe->op_code, cqe->sid, cqe->tx_real_length, + cqe->err0, cqe->err1); + srv->stats.dequeue_err_count++; + } + (*nb)++; + cookie->used = false; + + head = zsda_modulo_16(head + 1, queue->modulo_mask); + queue->head = head; + WRITE_CSR_CQ_HEAD(queue->io_addr, queue->hw_queue_number, head); + memset(cqe, 0x0, sizeof(struct zsda_cqe)); + } +} + +uint16_t +zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops) +{ + uint16_t nb = 0; + uint32_t type = 0; + struct qp_srv *srv; + + for (type = 0; type < ZSDA_SERVICE_INVALID; type++) { + if (!qp->srv[type].used) + continue; + srv = &qp->srv[type]; + zsda_dequeue(srv, ops, nb_ops, &nb); + if (nb >= nb_ops) + return nb_ops; + } + return nb; +} diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h index c68c8ed380..9595a91208 100644 --- a/drivers/common/zsda/zsda_qp.h +++ b/drivers/common/zsda/zsda_qp.h @@ -177,5 +177,6 @@ int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr, const uint16_t queue_pair_id, const struct zsda_qp_config *conf); uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); +uint16_t zsda_dequeue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops); #endif /* _ZSDA_QP_H_ */ diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h index e4b00d8307..834a89e910 100644 --- a/drivers/common/zsda/zsda_qp_common.h +++ b/drivers/common/zsda/zsda_qp_common.h @@ -47,6 +47,10 @@ enum zsda_service_type { #define ZSDA_OPC_DECOMP_ZLIB 0x19 /* 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 c00e0c2a4b..c22d690e5e 100644 --- a/drivers/compress/zsda/zsda_comp.c +++ b/drivers/compress/zsda/zsda_comp.c @@ -10,6 +10,83 @@ #define GZIP_TRAILER_SIZE 8 #define CHECKSUM_SIZE 4 +#define POLYNOMIAL 0xEDB88320 +static uint32_t crc32_table[8][256]; +static int table_config; + +static void +build_crc32_table(void) +{ + for (uint32_t i = 0; i < 256; i++) { + uint32_t crc = i; + for (uint32_t j = 0; j < 8; j++) + crc = (crc >> 1) ^ ((crc & 1) ? POLYNOMIAL : 0); + crc32_table[0][i] = crc; + } + + for (int i = 1; i < 8; i++) { + for (uint32_t j = 0; j < 256; j++) + crc32_table[i][j] = (crc32_table[i-1][j] >> 8) ^ + crc32_table[0][crc32_table[i-1][j] & 0xFF]; + } + table_config = 1; +} + +static uint32_t +zsda_crc32(const uint8_t *data, size_t length) +{ + uint32_t crc = 0xFFFFFFFF; + + if (!table_config) + build_crc32_table(); + + 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_build_decomp_request(void *op_in, const struct zsda_queue *queue, return ret; } + +static uint32_t +zsda_read_chksum(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_read_chksum(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_read_chksum(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 e7dea7e5a4..bb2feecb31 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_build_comp_request(void *op_in, const struct zsda_queue *queue, int zsda_build_decomp_request(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 9cb2169d68..ea3de2f505 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -229,7 +229,7 @@ zsda_setup_comp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id conf.service_str = "comp"; ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); - qp->srv[type].rx_cb = NULL; + qp->srv[type].rx_cb = zsda_comp_callback; qp->srv[type].tx_cb = zsda_build_comp_request; qp->srv[type].match = zsda_comp_match; @@ -254,7 +254,7 @@ zsda_setup_decomp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_ conf.service_str = "decomp"; ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf); - qp->srv[type].rx_cb = NULL; + qp->srv[type].rx_cb = zsda_comp_callback; qp->srv[type].tx_cb = zsda_build_decomp_request; qp->srv[type].match = zsda_decomp_match; @@ -348,6 +348,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_op_burst((struct zsda_qp *)qp, (void **)ops, + nb_ops); +} + int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) { @@ -386,7 +394,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 Wed Nov 13 02:33:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hanxiao Li X-Patchwork-Id: 148383 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 1735245CC8; Wed, 13 Nov 2024 03:40:26 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 243BD40E39; Wed, 13 Nov 2024 03:39:38 +0100 (CET) Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [63.216.63.35]) by mails.dpdk.org (Postfix) with ESMTP id 2A37840E16 for ; Wed, 13 Nov 2024 03:39:29 +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 4Xp6tm13KPz5B1J5 for ; Wed, 13 Nov 2024 10:39:28 +0800 (CST) Received: from szxlzmapp07.zte.com.cn ([10.5.230.251]) by mse-fl2.zte.com.cn with SMTP id 4AD2d6lt065785 for ; Wed, 13 Nov 2024 10:39:06 +0800 (+08) (envelope-from li.hanxiao@zte.com.cn) Received: from localhost.localdomain (unknown [192.168.6.15]) by smtp (Zmail) with SMTP; Wed, 13 Nov 2024 10:39:07 +0800 X-Zmail-TransId: 3e816734114b005-aaef9 From: Hanxiao Li To: dev@dpdk.org Cc: Hanxiao Li Subject: [PATCH v22 13/13] compress/zsda: add zsda compressdev capabilities Date: Wed, 13 Nov 2024 10:33:18 +0800 Message-ID: <20241113023323.3228516-12-li.hanxiao@zte.com.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241113023323.3228516-1-li.hanxiao@zte.com.cn> References: <20241113022918.3228337-2-li.hanxiao@zte.com.cn> <20241113023323.3228516-1-li.hanxiao@zte.com.cn> MIME-Version: 1.0 X-MAIL: mse-fl2.zte.com.cn 4AD2d6lt065785 X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 67341160.001/4Xp6tm13KPz5B1J5 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_24_11.rst | 7 +++++++ drivers/compress/zsda/zsda_comp_pmd.c | 15 ++++++++++++++- 4 files changed, 53 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 c02423d650..30d1c55766 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_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index 0ff70d9057..583e509a45 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -24,6 +24,13 @@ DPDK Release 24.11 New Features ------------ +* **Added ZTE Storage Data Accelerator(ZSDA) device driver.** + + * Added a new compress driver for ZSDA devices to support + the deflate compression and decompression algorithm. + + See the :doc:`../compressdevs/zsda` guide for more details on the new driver. + .. This section should contain new features added in this release. Sample format: diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c index ea3de2f505..85c934ace1 100644 --- a/drivers/compress/zsda/zsda_comp_pmd.c +++ b/drivers/compress/zsda/zsda_comp_pmd.c @@ -9,6 +9,19 @@ #include "zsda_comp_pmd.h" #include "zsda_comp.h" +static const struct rte_compressdev_capabilities zsda_comp_capabilities[] = { + { + .algo = RTE_COMP_ALGO_DEFLATE, + .comp_feature_flags = RTE_COMP_FF_HUFFMAN_DYNAMIC | + RTE_COMP_FF_OOP_SGL_IN_SGL_OUT | + RTE_COMP_FF_OOP_SGL_IN_LB_OUT | + RTE_COMP_FF_OOP_LB_IN_SGL_OUT | + RTE_COMP_FF_CRC32_CHECKSUM | + RTE_COMP_FF_ADLER32_CHECKSUM, + .window_size = {.min = 15, .max = 15, .increment = 0}, + }, +}; + static int zsda_comp_xform_size(void) { @@ -405,7 +418,7 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev) comp_dev->zsda_pci_dev = zsda_pci_dev; comp_dev->compressdev = compressdev; - capabilities = NULL; + capabilities = zsda_comp_capabilities; comp_dev->capa_mz = rte_memzone_lookup(capa_memz_name); if (comp_dev->capa_mz == NULL) {