From patchwork Mon Aug 7 02:16:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: 11 X-Patchwork-Id: 129924 X-Patchwork-Delegate: ferruh.yigit@amd.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 CCC0342FF3; Mon, 7 Aug 2023 04:17:09 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C05AA43247; Mon, 7 Aug 2023 04:17:03 +0200 (CEST) Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) by mails.dpdk.org (Postfix) with ESMTP id 1B07043247 for ; Mon, 7 Aug 2023 04:17:00 +0200 (CEST) X-QQ-mid: bizesmtp66t1691374594tkukhjsh Received: from steven.localdomain ( [183.81.182.182]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 07 Aug 2023 10:16:32 +0800 (CST) X-QQ-SSF: 01400000000000D0F000000A0000000 X-QQ-FEAT: ao4JQgu0M3+LuZwkdqeLmoYSDJBXlv/RqcLx9h5xN4iS7z7VJLLtnThgxt9Mu bBxNtpESbFNItwI6VZuwE/JekH5NUUNGOHqnlbeaOZeHpRwctCyLjQJXxiX1yyX6CsY1sMq qRN0pqdYxq9ozDOBRqDKDOOsJ8jOXVk22JV5K1E6MskvaE1S3XuHhh9RXcjKnkBXgtQIG60 3Gs116AwnhJ/Ei89DWEUX/pMJ7uEM034YP2oU8qRfK47w0hicNIYBzLsLJpecrrL2Qlf1jo rYMObElVMCAL0Mv5A2Zy9Uoo0jAKcdgoVdtxoha6Lxah3uruC5hNDPTQdX4+99QvaXNlrax SYXPl9sppuwVHbJ9W6m+IRlypl80MjK5XypCNfVp79CgCGVYipiHg0ZNYuM/vfo/uunXAXq ejQXlOWbCug= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 6984539663895766288 From: Wenbo Cao To: Wenbo Cao , Anatoly Burakov Cc: dev@dpdk.org, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru, yaojun@mucse.com Subject: [PATCH v5 3/8] net/rnp: add device init and uninit Date: Mon, 7 Aug 2023 02:16:10 +0000 Message-Id: <20230807021615.3663034-4-caowenbo@mucse.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230807021615.3663034-1-caowenbo@mucse.com> References: <20230807021615.3663034-1-caowenbo@mucse.com> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:mucse.com:qybglogicsvrgz:qybglogicsvrgz5a-0 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 init and uninit function Signed-off-by: Wenbo Cao --- drivers/net/rnp/base/rnp_hw.h | 19 ++++ drivers/net/rnp/meson.build | 1 + drivers/net/rnp/rnp.h | 25 +++++ drivers/net/rnp/rnp_ethdev.c | 196 +++++++++++++++++++++++++++++++++- drivers/net/rnp/rnp_logs.h | 34 ++++++ drivers/net/rnp/rnp_osdep.h | 30 ++++++ 6 files changed, 300 insertions(+), 5 deletions(-) create mode 100644 drivers/net/rnp/base/rnp_hw.h create mode 100644 drivers/net/rnp/rnp_logs.h create mode 100644 drivers/net/rnp/rnp_osdep.h diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h new file mode 100644 index 0000000000..d80d23f4b4 --- /dev/null +++ b/drivers/net/rnp/base/rnp_hw.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2023 Mucse IC Design Ltd. + */ +#ifndef __RNP_HW_H__ +#define __RNP_HW_H__ + +struct rnp_eth_adapter; +struct rnp_hw { + struct rnp_eth_adapter *back; + void *iobar0; + uint32_t iobar0_len; + void *iobar4; + uint32_t iobar4_len; + + uint16_t device_id; + uint16_t vendor_id; +} __rte_cache_aligned; + +#endif /* __RNP_H__*/ diff --git a/drivers/net/rnp/meson.build b/drivers/net/rnp/meson.build index 4f37c6b456..f85d597e68 100644 --- a/drivers/net/rnp/meson.build +++ b/drivers/net/rnp/meson.build @@ -9,3 +9,4 @@ endif sources = files( 'rnp_ethdev.c', ) +includes += include_directories('base') diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h index 76d281cc0a..c7959c64aa 100644 --- a/drivers/net/rnp/rnp.h +++ b/drivers/net/rnp/rnp.h @@ -4,10 +4,35 @@ #ifndef __RNP_H__ #define __RNP_H__ +#include "base/rnp_hw.h" + #define PCI_VENDOR_ID_MUCSE (0x8848) #define RNP_DEV_ID_N10G (0x1000) +#define RNP_MAX_PORT_OF_PF (4) +#define RNP_CFG_BAR (4) +#define RNP_PF_INFO_BAR (0) struct rnp_eth_port { + struct rnp_eth_adapter *adapt; + struct rte_eth_dev *eth_dev; +} __rte_cache_aligned; + +struct rnp_share_ops { } __rte_cache_aligned; +struct rnp_eth_adapter { + struct rnp_hw hw; + struct rte_pci_device *pdev; + struct rte_eth_dev *eth_dev; /* master eth_dev */ + struct rnp_eth_port *ports[RNP_MAX_PORT_OF_PF]; + struct rnp_share_ops *share_priv; + + uint8_t num_ports; /* Cur Pf Has physical Port Num */ +} __rte_cache_aligned; + +#define RNP_DEV_TO_PORT(eth_dev) \ + (((struct rnp_eth_port *)((eth_dev)->data->dev_private))) +#define RNP_DEV_TO_ADAPTER(eth_dev) \ + ((struct rnp_eth_adapter *)(RNP_DEV_TO_PORT(eth_dev)->adapt)) + #endif /* __RNP_H__ */ diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c index 390f2e7743..357375ee39 100644 --- a/drivers/net/rnp/rnp_ethdev.c +++ b/drivers/net/rnp/rnp_ethdev.c @@ -5,23 +5,198 @@ #include #include #include +#include #include "rnp.h" +#include "rnp_logs.h" static int -rnp_eth_dev_init(struct rte_eth_dev *eth_dev) +rnp_mac_rx_disable(struct rte_eth_dev *dev) { - RTE_SET_USED(eth_dev); + RTE_SET_USED(dev); - return -ENODEV; + return 0; +} + +static int +rnp_mac_tx_disable(struct rte_eth_dev *dev) +{ + RTE_SET_USED(dev); + + return 0; +} + +static int rnp_dev_close(struct rte_eth_dev *dev) +{ + RTE_SET_USED(dev); + + return 0; +} + +/* Features supported by this driver */ +static const struct eth_dev_ops rnp_eth_dev_ops = { +}; + +static int +rnp_init_port_resource(struct rnp_eth_adapter *adapter, + struct rte_eth_dev *dev, + char *name, + uint8_t p_id) +{ + struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev); + + port->eth_dev = dev; + adapter->ports[p_id] = port; + dev->dev_ops = &rnp_eth_dev_ops; + RTE_SET_USED(name); + + return 0; +} + +static struct rte_eth_dev * +rnp_alloc_eth_port(struct rte_pci_device *master_pci, char *name) +{ + struct rnp_eth_port *port; + struct rte_eth_dev *eth_dev; + + eth_dev = rte_eth_dev_allocate(name); + if (!eth_dev) { + RNP_PMD_DRV_LOG(ERR, "Could not allocate " + "eth_dev for %s\n", name); + return NULL; + } + port = rte_zmalloc_socket(name, + sizeof(*port), + RTE_CACHE_LINE_SIZE, + master_pci->device.numa_node); + if (!port) { + RNP_PMD_DRV_LOG(ERR, "Could not allocate " + "rnp_eth_port for %s\n", name); + return NULL; + } + eth_dev->data->dev_private = port; + eth_dev->process_private = calloc(1, sizeof(struct rnp_share_ops)); + if (!eth_dev->process_private) { + RNP_PMD_DRV_LOG(ERR, "Could not calloc " + "for Process_priv\n"); + goto fail_calloc; + } + return eth_dev; +fail_calloc: + rte_free(port); + rte_eth_dev_release_port(eth_dev); + + return NULL; +} + +static int +rnp_eth_dev_init(struct rte_eth_dev *dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); + struct rnp_eth_adapter *adapter = NULL; + char name[RTE_ETH_NAME_MAX_LEN] = " "; + struct rnp_eth_port *port = NULL; + struct rte_eth_dev *eth_dev; + struct rnp_hw *hw = NULL; + int32_t p_id; + int ret; + + PMD_INIT_FUNC_TRACE(); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + memset(name, 0, sizeof(name)); + snprintf(name, sizeof(name), "rnp_adapter_%d", dev->data->port_id); + adapter = rte_zmalloc(name, sizeof(struct rnp_eth_adapter), 0); + if (!adapter) { + RNP_PMD_DRV_LOG(ERR, "zmalloc for adapter failed\n"); + return -ENOMEM; + } + hw = &adapter->hw; + adapter->pdev = pci_dev; + adapter->eth_dev = dev; + adapter->num_ports = 1; + hw->back = adapter; + hw->iobar4 = pci_dev->mem_resource[RNP_CFG_BAR].addr; + hw->iobar0 = pci_dev->mem_resource[RNP_PF_INFO_BAR].addr; + hw->iobar4_len = pci_dev->mem_resource[RNP_CFG_BAR].len; + hw->iobar0_len = pci_dev->mem_resource[RNP_PF_INFO_BAR].len; + hw->device_id = pci_dev->id.device_id; + hw->vendor_id = pci_dev->id.vendor_id; + hw->device_id = pci_dev->id.device_id; + for (p_id = 0; p_id < adapter->num_ports; p_id++) { + /* port 0 resource has been alloced When Probe */ + if (!p_id) { + eth_dev = dev; + } else { + snprintf(name, sizeof(name), "%s_%d", + adapter->pdev->device.name, + p_id); + eth_dev = rnp_alloc_eth_port(pci_dev, name); + if (eth_dev) + rte_memcpy(eth_dev->process_private, + adapter->share_priv, + sizeof(*adapter->share_priv)); + if (!eth_dev) { + ret = -ENOMEM; + goto eth_alloc_error; + } + } + ret = rnp_init_port_resource(adapter, eth_dev, name, p_id); + if (ret) + goto eth_alloc_error; + + rnp_mac_rx_disable(eth_dev); + rnp_mac_tx_disable(eth_dev); + } + + return 0; +eth_alloc_error: + for (p_id = 0; p_id < adapter->num_ports; p_id++) { + port = adapter->ports[p_id]; + if (!port) + continue; + if (port->eth_dev) { + rnp_dev_close(port->eth_dev); + rte_eth_dev_release_port(port->eth_dev); + if (port->eth_dev->process_private) + free(port->eth_dev->process_private); + } + rte_free(port); + } + rte_free(adapter); + + return 0; } static int rnp_eth_dev_uninit(struct rte_eth_dev *eth_dev) { - RTE_SET_USED(eth_dev); + struct rnp_eth_adapter *adapter = RNP_DEV_TO_ADAPTER(eth_dev); + struct rnp_eth_port *port = NULL; + uint8_t p_id; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; - return -ENODEV; + if (adapter->eth_dev != eth_dev) { + RNP_PMD_DRV_LOG(ERR, "Input Argument ethdev " + "Isn't Master Ethdev\n"); + return -EINVAL; + } + for (p_id = 0; p_id < adapter->num_ports; p_id++) { + port = adapter->ports[p_id]; + if (!port) + continue; + if (port->eth_dev) { + rnp_dev_close(port->eth_dev); + /* Just Release Not Master Port Alloced By PMD */ + if (p_id) + rte_eth_dev_release_port(port->eth_dev); + } + } + + return 0; } static int @@ -84,3 +259,14 @@ static struct rte_pci_driver rte_rnp_pmd = { RTE_PMD_REGISTER_PCI(net_rnp, rte_rnp_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_rnp, pci_id_rnp_map); RTE_PMD_REGISTER_KMOD_DEP(net_rnp, "igb_uio | uio_pci_generic | vfio-pci"); + +RTE_LOG_REGISTER_SUFFIX(rnp_init_logtype, init, NOTICE); +RTE_LOG_REGISTER_SUFFIX(rnp_drv_logtype, driver, NOTICE); + +#ifdef RTE_LIBRTE_RNP_DEBUG_RX + RTE_LOG_REGISTER_SUFFIX(rnp_rx_logtype, rx, DEBUG); +#endif + +#ifdef RTE_LIBRTE_RNP_DEBUG_TX + RTE_LOG_REGISTER_SUFFIX(rnp_tx_logtype, tx, DEBUG); +#endif diff --git a/drivers/net/rnp/rnp_logs.h b/drivers/net/rnp/rnp_logs.h new file mode 100644 index 0000000000..1b3ee33745 --- /dev/null +++ b/drivers/net/rnp/rnp_logs.h @@ -0,0 +1,34 @@ +#ifndef __RNP_LOGS_H__ +#define __RNP_LOGS_H__ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2023 Mucse IC Design Ltd. + */ +extern int rnp_init_logtype; + +#define RNP_PMD_INIT_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_##level, rnp_init_logtype, \ + "%s() " fmt, __func__, ##args) +#define PMD_INIT_FUNC_TRACE() RNP_PMD_INIT_LOG(DEBUG, " >>") +extern int rnp_drv_logtype; +#define RNP_PMD_DRV_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_##level, rnp_drv_logtype, \ + "%s() " fmt, __func__, ##args) +#ifdef RTE_LIBRTE_RNP_DEBUG_RX +extern int rnp_rx_logtype; +#define RNP_PMD_RX_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, rnp_rx_logtype, \ + "%s(): " fmt "\n", __func__, ##args) +#else +#define RNP_PMD_RX_LOG(level, fmt, args...) do { } while (0) +#endif + +#ifdef RTE_LIBRTE_RNP_DEBUG_TX +extern int rnp_tx_logtype; +#define PMD_TX_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, rnp_tx_logtype, \ + "%s(): " fmt "\n", __func__, ##args) +#else +#define PMD_TX_LOG(level, fmt, args...) do { } while (0) +#endif + +#endif /* __RNP_LOGS_H__ */ diff --git a/drivers/net/rnp/rnp_osdep.h b/drivers/net/rnp/rnp_osdep.h new file mode 100644 index 0000000000..5685dd2404 --- /dev/null +++ b/drivers/net/rnp/rnp_osdep.h @@ -0,0 +1,30 @@ +#ifndef __RNP_OSDEP_H__ +#define __RNP_OSDEP_H__ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2023 Mucse IC Design Ltd. + */ +#include + +#include + +#define __iomem +#define _RING_(off) ((off) + 0x000000) +#define _DMA_(off) ((off)) +#define _GLB_(off) ((off) + 0x000000) +#define _NIC_(off) ((off) + 0x000000) +#define _ETH_(off) ((off)) +#define _MAC_(off) ((off)) +#define BIT(n) (1UL << (n)) +#define BIT64(n) (1ULL << (n)) +#define BITS_PER_LONG (__SIZEOF_LONG__ * 8) +#define GENMASK(h, l) \ + (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; +#endif /* __RNP_OSDEP_H__ */