[PATCH v2 12/16] net/nbl: add nbl device rxtx queue setup and release ops
Implement NBL device Rx and Tx queue setup & release functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 81 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 2 + drivers/net/nbl/nbl_hw/nbl_resource.h | 99 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 287 -- drivers/net/nbl/nbl_hw/nbl_txrx.h | 99 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 5 + drivers/net/nbl/nbl_include/nbl_include.h | 1 + 7 files changed, 552 insertions(+), 22 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4eea07c1ff..4faa58ace8 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -57,11 +57,92 @@ static int nbl_dev_close(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_tx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_txconf *conf) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *tx_ring = &ring_mgt->tx_rings[queue_idx]; + struct nbl_start_tx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.product = adapter->caps.product_type; + param.bond_broadcast_check = NULL; + ret = disp_ops->start_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &tx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_tx_ring failed %d", ret); + return ret; + } + + tx_ring->desc_num = nb_desc; + + return ret; +} + +static int nbl_rx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_rxconf *conf, + struct rte_mempool *mempool) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *rx_ring = &ring_mgt->rx_rings[queue_idx]; + struct nbl_start_rx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.mempool = mempool; + param.product = adapter->caps.product_type; + ret = disp_ops->start_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &rx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_rx_ring failed %d", ret); + return ret; + } + + rx_ring->desc_num = nb_desc; + + return ret; +} + +static void nbl_tx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + +static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, .dev_stop = nbl_dev_port_stop, .dev_close = nbl_dev_close, + .tx_queue_setup = nbl_tx_queue_setup, + .rx_queue_setup = nbl_rx_queue_setup, + .tx_queue_release = nbl_tx_queues_release, + .rx_queue_release = nbl_rx_queues_release, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c index 6327aa55b4..b785774f67 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c @@ -53,6 +53,8 @@ static int nbl_res_start(struct nbl_resource_mgt_leonis *res_mgt_leonis) struct nbl_resource_mgt *res_mgt = &a
[PATCH v2 14/16] net/nbl: add nbl device Tx and Rx burst
Implement NBL device Tx and Rx burst Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 108 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 5 + drivers/net/nbl/nbl_dispatch.c| 62 drivers/net/nbl/nbl_ethdev.c | 7 + drivers/net/nbl/nbl_ethdev.h | 19 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 1 + drivers/net/nbl/nbl_hw/nbl_resource.h | 2 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 325 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 19 +- drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 + drivers/net/nbl/nbl_include/nbl_def_channel.h | 4 + drivers/net/nbl/nbl_include/nbl_def_common.h | 1 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 3 + .../net/nbl/nbl_include/nbl_def_resource.h| 7 + drivers/net/nbl/nbl_include/nbl_include.h | 31 ++ 15 files changed, 683 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx_ops.h diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index bdd06613e6..949d42506d 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -291,6 +291,99 @@ static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); } +static int nbl_dev_infos_get(struct rte_eth_dev *eth_dev __rte_unused, +struct rte_eth_dev_info *dev_info) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_board_port_info *board_info = &dev_mgt->common->board_info; + u8 speed_mode = board_info->speed; + + dev_info->min_mtu = RTE_ETHER_MIN_MTU; + dev_info->max_mtu = NBL_MAX_JUMBO_FRAME_SIZE - NBL_PKT_HDR_PAD; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + dev_info->max_mac_addrs = dev_mgt->net_dev->max_mac_num; + dev_info->max_rx_queues = ring_mgt->rx_ring_num; + dev_info->max_tx_queues = ring_mgt->tx_ring_num; + /* rx buffer size must be 2KB, 4KB, 8KB or 16KB */ + dev_info->min_rx_bufsize = NBL_DEV_MIN_RX_BUFSIZE; + dev_info->flow_type_rss_offloads = NBL_RSS_OFFLOAD_TYPE; + + dev_info->hash_key_size = NBL_EPRO_RSS_SK_SIZE; + + dev_info->tx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->rx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->speed_capa = RTE_ETH_LINK_SPEED_10G; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + + dev_info->default_rxportconf.nb_queues = ring_mgt->rx_ring_num; + dev_info->default_txportconf.nb_queues = ring_mgt->tx_ring_num; + dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_UDP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_TSO | + RTE_ETH_TX_OFFLOAD_UDP_TSO | + RTE_ETH_TX_OFFLOAD_MULTI_SEGS; + dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM | + RTE_ETH_RX_OFFLOAD_SCATTER; + + switch (speed_mode) { + case NBL_FW_PORT_SPEED_100G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_50G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_50G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_25G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_25G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_10G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_10G; + break; + default: + dev_info->speed_capa = RTE_ETH_LINK_SPEED_25G; + } + + return 0; +} + +static int nbl_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct rte_eth_link link = { 0 }; + + link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; + link.link_status = !!dev_mgt->net_dev->eth_link_info.link_status; + if (link.link_status) + link.link_speed = dev_mgt->net_dev-&g
[PATCH v2 08/16] net/nbl: add complete device init and uninit functionality
NBL device is a concept of low level device which used to manage hw resource and to interact with fw Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.c| 8 +- drivers/net/nbl/nbl_core.h| 7 + drivers/net/nbl/nbl_dev/nbl_dev.c | 248 +++- drivers/net/nbl/nbl_dev/nbl_dev.h | 32 + drivers/net/nbl/nbl_dispatch.c| 548 +++--- drivers/net/nbl/nbl_ethdev.c | 26 + drivers/net/nbl/nbl_hw/nbl_resource.h | 1 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 30 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 51 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 7 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 7 +- .../net/nbl/nbl_include/nbl_def_resource.h| 18 + drivers/net/nbl/nbl_include/nbl_include.h | 61 ++ 13 files changed, 955 insertions(+), 89 deletions(-) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 1a6a6bc11d..f4ddc9e219 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -20,7 +20,7 @@ static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_ty return &nbl_product_core_ops[product_type]; } -static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +static void nbl_init_func_caps(const struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) { if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) @@ -29,8 +29,8 @@ static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_c int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) { - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); - struct nbl_product_core_ops *product_base_ops = NULL; + const struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + const struct nbl_product_core_ops *product_base_ops = NULL; int ret = 0; nbl_init_func_caps(pci_dev, &adapter->caps); @@ -74,7 +74,7 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) void nbl_core_remove(struct nbl_adapter *adapter) { - struct nbl_product_core_ops *product_base_ops = NULL; + const struct nbl_product_core_ops *product_base_ops = NULL; product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 9a05bbee48..bdf31e15da 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -46,6 +46,12 @@ #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) #define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) +#define NBL_ADAPTER_TO_COMMON(adapter) (&((adapter)->common)) + +#define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ + _common->nl_socket_route < 0 || \ + _common->ifindex < 0; }) + struct nbl_core { void *phy_mgt; void *res_mgt; @@ -80,6 +86,7 @@ struct nbl_adapter { struct nbl_interface intf; struct nbl_func_caps caps; enum nbl_ethdev_state state; + struct nbl_common_info common; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 86006d6762..f02ed7f94e 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,7 +38,7 @@ struct nbl_dev_ops dev_ops = { static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->setup_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -49,7 +49,7 @@ static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) static int nbl_dev_teardown_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->teardown_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -67,15 +67,67 @@ static void nbl_dev_leonis_uninit(void *adapter) nbl_dev_teardown_chan_queue((struct nbl_adapter *)adapter); } +static int nbl_dev_common_start(struct nbl_dev_mgt *dev_mgt) +{ + const struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + s
[PATCH v2 09/16] net/nbl: add UIO and VFIO mode for nbl
NBL device support UIO/VFIO Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_common/nbl_userdev.c | 24 +++ drivers/net/nbl/nbl_common/nbl_userdev.h | 10 .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 7 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 4 5 files changed, 46 insertions(+) create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 7f4abd3db0..a3e700d93d 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -16,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', + 'nbl_common/nbl_userdev.c', 'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c new file mode 100644 index 00..87b943ccd7 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_userdev.h" + +int nbl_pci_map_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + int ret = 0; + + ret = rte_pci_map_device(pci_dev); + if (ret) + NBL_LOG(ERR, "device %s uio or vfio map failed", pci_dev->device.name); + + return ret; +} + +void nbl_pci_unmap_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + + return rte_pci_unmap_device(pci_dev); +} diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.h b/drivers/net/nbl/nbl_common/nbl_userdev.h new file mode 100644 index 00..11cc2c --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_USERDEV_H_ +#define _NBL_USERDEV_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c index 49ada3b525..9ed375bc1e 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c @@ -183,6 +183,11 @@ int nbl_phy_init_leonis_snic(void *p) phy_mgt_leonis_snic = (struct nbl_phy_mgt_leonis_snic **)&NBL_ADAPTER_TO_PHY_MGT(adapter); phy_ops_tbl = &NBL_ADAPTER_TO_PHY_OPS_TBL(adapter); + /* map device */ + ret = nbl_pci_map_device(adapter); + if (ret) + return ret; + *phy_mgt_leonis_snic = rte_zmalloc("nbl_phy_mgt", sizeof(struct nbl_phy_mgt_leonis_snic), 0); if (!*phy_mgt_leonis_snic) { @@ -205,6 +210,7 @@ int nbl_phy_init_leonis_snic(void *p) setup_ops_failed: rte_free(*phy_mgt_leonis_snic); alloc_phy_mgt_failed: + nbl_pci_unmap_device(adapter); return ret; } @@ -220,4 +226,5 @@ void nbl_phy_remove_leonis_snic(void *p) rte_free(*phy_mgt_leonis_snic); nbl_phy_remove_ops(phy_ops_tbl); + nbl_pci_unmap_device(adapter); } diff --git a/drivers/net/nbl/nbl_include/nbl_def_common.h b/drivers/net/nbl/nbl_include/nbl_def_common.h index b7955abfab..0b87c3003d 100644 --- a/drivers/net/nbl/nbl_include/nbl_def_common.h +++ b/drivers/net/nbl/nbl_include/nbl_def_common.h @@ -48,4 +48,8 @@ void nbl_free_dma_mem(struct nbl_dma_mem *mem); int nbl_thread_add_work(struct nbl_work *work); void nbl_thread_del_work(struct nbl_work *work); +struct nbl_adapter; +int nbl_pci_map_device(struct nbl_adapter *adapter); +void nbl_pci_unmap_device(struct nbl_adapter *adapter); + #endif -- 2.34.1
[PATCH v2 10/16] net/nbl: add nbl coexistence mode for nbl
NBL device support coexistence mode Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_common/nbl_userdev.c | 729 +- drivers/net/nbl/nbl_common/nbl_userdev.h | 11 + drivers/net/nbl/nbl_core.c| 3 +- drivers/net/nbl/nbl_core.h| 1 - drivers/net/nbl/nbl_hw/nbl_channel.c | 185 - drivers/net/nbl/nbl_hw/nbl_channel.h | 11 + .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 2 +- drivers/net/nbl/nbl_include/nbl_def_common.h | 63 ++ drivers/net/nbl/nbl_include/nbl_include.h | 2 + 9 files changed, 997 insertions(+), 10 deletions(-) diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c index 87b943ccd7..284a5b19c9 100644 --- a/drivers/net/nbl/nbl_common/nbl_userdev.c +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -3,15 +3,720 @@ */ #include "nbl_userdev.h" +#include -int nbl_pci_map_device(struct nbl_adapter *adapter) +#define NBL_USERDEV_EVENT_CLB_NAME "nbl_userspace_mem_event_clb" +#define NBL_USERDEV_BAR0_SIZE 65536 +#define NBL_USERDEV_DMA_LIMIT 0x + +/* Size of the buffer to receive kernel messages */ +#define NBL_NL_BUF_SIZE (32 * 1024) +/* Send buffer size for the Netlink socket */ +#define NBL_SEND_BUF_SIZE 32768 +/* Receive buffer size for the Netlink socket */ +#define NBL_RECV_BUF_SIZE 32768 + +struct nbl_userdev_map_record { + TAILQ_ENTRY(nbl_userdev_map_record) next; + u64 vaddr; + u64 iova; + u64 len; +}; + +static int nbl_default_container = -1; +static int nbl_group_count; + +TAILQ_HEAD(nbl_adapter_list_head, nbl_adapter); +static struct nbl_adapter_list_head nbl_adapter_list = + TAILQ_HEAD_INITIALIZER(nbl_adapter_list); + +TAILQ_HEAD(nbl_userdev_map_record_head, nbl_userdev_map_record); +static struct nbl_userdev_map_record_head nbl_map_list = + TAILQ_HEAD_INITIALIZER(nbl_map_list); + +static int +nbl_userdev_dma_mem_map(int devfd, uint64_t vaddr, uint64_t iova, uint64_t len) { - struct rte_pci_device *pci_dev = adapter->pci_dev; + struct nbl_dev_user_dma_map dma_map; int ret = 0; - ret = rte_pci_map_device(pci_dev); + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct nbl_dev_user_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = iova; + dma_map.flags = NBL_DEV_USER_DMA_MAP_FLAG_READ | + NBL_DEV_USER_DMA_MAP_FLAG_WRITE; + + ret = ioctl(devfd, NBL_DEV_USER_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "nbl container Memory segment is already mapped,skipping"); + ret = 0; + } else { + NBL_LOG(ERR, + "nbl container cannot set up DMA remapping,error %i (%s), ret %d", + errno, strerror(errno), ret); + } + } + + return ret; +} + +static int +nbl_vfio_dma_mem_map(int vfio_container_fd, uint64_t vaddr, uint64_t len, int do_map) +{ + struct vfio_iommu_type1_dma_map dma_map; + struct vfio_iommu_type1_dma_unmap dma_unmap; + int ret; + + if (do_map != 0) { + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = vaddr; + dma_map.flags = VFIO_DMA_MAP_FLAG_READ | + VFIO_DMA_MAP_FLAG_WRITE; + + ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "Memory segment is already mapped, skipping"); + } else { + NBL_LOG(ERR, + "cannot set up DMA remapping,error %i (%s)", + errno, strerror(errno)); + return -1; + } + } + } else { + memset(&dma_unmap, 0, sizeof(dma_unmap)); + dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap); + dma_unmap.size = len; + dma_unmap.iova = vaddr; + + ret = i
[PATCH v2 15/16] net/nbl: add nbl device xstats and stats
Implement NBL device xstats and stats functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 148 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 2 + drivers/net/nbl/nbl_dispatch.c| 111 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 113 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 113 - drivers/net/nbl/nbl_include/nbl_def_channel.h | 5 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 9 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 12 +- drivers/net/nbl/nbl_include/nbl_include.h | 4 + 9 files changed, 511 insertions(+), 6 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 949d42506d..4fa132ae1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -384,6 +384,129 @@ static int nbl_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_ return disp_ops->get_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), rte_stats); } +static int nbl_stats_reset(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + return disp_ops->reset_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt)); +} + +static int nbl_dev_update_hw_xstats(struct nbl_dev_mgt *dev_mgt, struct rte_eth_xstat *xstats, + u16 hw_xstats_cnt, u16 *xstats_cnt) +{ + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u64 *hw_stats; + int i; + u16 count = *xstats_cnt; + + hw_stats = rte_zmalloc("nbl_xstats_cnt", hw_xstats_cnt * sizeof(u64), 0); + if (!hw_stats) + return -ENOMEM; + + disp_ops->get_private_stat_data(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + common->eth_id, hw_stats, hw_xstats_cnt * sizeof(u64)); + for (i = 0; i < hw_xstats_cnt; i++) { + xstats[count].value = hw_stats[i] - dev_mgt->net_dev->hw_xstats_offset[i]; + xstats[count].id = count; + count++; + } + + *xstats_cnt = count; + rte_free(hw_stats); + return 0; +} + +static int nbl_xstats_get(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat *xstats, unsigned int n) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + int ret = 0; + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + + if (!xstats) + return 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (n < (txrx_xstats_cnt + hw_xstats_cnt)) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) + ret = disp_ops->get_txrx_xstats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + xstats, &xstats_cnt); + if (hw_xstats_cnt) + ret |= nbl_dev_update_hw_xstats(dev_mgt, xstats, hw_xstats_cnt, &xstats_cnt); + + if (ret) + return -EIO; + + return xstats_cnt; +} + +static int nbl_xstats_get_names(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat_name *xstats_names, + __rte_unused unsigned int limit) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + int ret = 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (!xstats_names) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) +
[PATCH v2 06/16] net/nbl: add Dispatch layer definitions and implementation
add Dispatch layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_core.c| 7 + drivers/net/nbl/nbl_core.h| 4 + drivers/net/nbl/nbl_dispatch.c| 466 ++ drivers/net/nbl/nbl_dispatch.h| 29 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 18 + drivers/net/nbl/nbl_include/nbl_def_common.h | 4 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 77 +++ .../net/nbl/nbl_include/nbl_def_resource.h| 5 + drivers/net/nbl/nbl_include/nbl_include.h | 17 + 10 files changed, 628 insertions(+) create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dispatch.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index f34121260e..23601727ef 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,6 +12,7 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 70600401fe..548eb3a2fd 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -50,8 +50,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto res_init_fail; + ret = nbl_disp_init(adapter); + if (ret) + goto disp_init_fail; + return 0; +disp_init_fail: + product_base_ops->res_remove(adapter); res_init_fail: product_base_ops->chan_remove(adapter); chan_init_fail: @@ -66,6 +72,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index f693913b47..2730539050 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -10,6 +10,7 @@ #include "nbl_def_phy.h" #include "nbl_def_channel.h" #include "nbl_def_resource.h" +#include "nbl_def_dispatch.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -35,10 +36,12 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) +#define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) +#define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) struct nbl_core { void *phy_mgt; @@ -52,6 +55,7 @@ struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; + struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c new file mode 100644 index 00..ffeeba3048 --- /dev/null +++ b/drivers/net/nbl/nbl_dispatch.c @@ -0,0 +1,466 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_dispatch.h" + +static int nbl_disp_alloc_txrx_queues(void *priv, u16 vsi_id, u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_resource_ops *res_ops; + + res_ops = NBL_DISP_MGT_TO_RES_OPS(disp_mgt); + return res_ops->alloc_txrx_queues(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt), + vsi_id, queue_num); +} + +static int nbl_disp_chan_alloc_txrx_queues_req(void *priv, u16 vsi_id, + u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_channel_ops *chan_ops; + struct nbl_chan_param_alloc_txrx_queues param = {0}; + struct nbl_chan_param_alloc_txrx_queues result = {0}; + struct nbl_chan_send_info chan_send; + + chan_ops = NBL_DISP_MGT_TO_CHAN_OPS(disp_mgt); + + param.vsi_id
[PATCH v2 07/16] net/nbl: add Dev layer definitions and implementation
add Dev layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 14 +- drivers/net/nbl/nbl_core.h| 16 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 200 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 24 +++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 6 files changed, 360 insertions(+), 3 deletions(-) create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 23601727ef..7f4abd3db0 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -8,6 +8,7 @@ endif includes += include_directories('nbl_include') includes += include_directories('nbl_hw') +includes += include_directories('nbl_common') sources = files( 'nbl_ethdev.c', @@ -15,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', +'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', 'nbl_hw/nbl_txrx.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 548eb3a2fd..1a6a6bc11d 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -54,8 +54,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto disp_init_fail; + ret = nbl_dev_init(adapter, eth_dev); + if (ret) + goto dev_init_fail; + return 0; +dev_init_fail: + nbl_disp_remove(adapter); disp_init_fail: product_base_ops->res_remove(adapter); res_init_fail: @@ -72,6 +78,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_dev_remove(adapter); nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); @@ -80,12 +87,13 @@ void nbl_core_remove(struct nbl_adapter *adapter) int nbl_core_start(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + int ret = 0; - return 0; + ret = nbl_dev_start(adapter); + return ret; } void nbl_core_stop(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + nbl_dev_stop(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 2730539050..9a05bbee48 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -11,6 +11,7 @@ #include "nbl_def_channel.h" #include "nbl_def_resource.h" #include "nbl_def_dispatch.h" +#include "nbl_def_dev.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -37,11 +38,13 @@ #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) +#define NBL_ADAPTER_TO_DEV_MGT(adapter) ((adapter)->core.dev_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) +#define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) struct nbl_core { void *phy_mgt; @@ -51,11 +54,23 @@ struct nbl_core { void *dev_mgt; }; +enum nbl_ethdev_state { + NBL_ETHDEV_UNINITIALIZED = 0, + NBL_ETHDEV_INITIALIZED, + NBL_ETHDEV_CONFIGURING, + NBL_ETHDEV_CONFIGURED, + NBL_ETHDEV_CLOSING, + NBL_ETHDEV_STARTING, + NBL_ETHDEV_STARTED, + NBL_ETHDEV_STOPPING, +}; + struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; + struct nbl_dev_ops_tbl *dev_ops_tbl; }; struct nbl_adapter { @@ -64,6 +79,7 @@ struct nbl_adapter { struct nbl_core core; struct nbl_interface intf; struct nbl_func_caps caps; + enum nbl_ethdev_state state; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c new file mode 100644 index 00..86006d6762 --- /
[PATCH v2 00/16] NBL PMD for Nebulamatrix NICs
Features: - - MTU update - promisc mode set - xstats - Basic stats Support NICs: - - S1205CQ-A00CHT - S1105AS-A00CHT - S1055AS-A00CHT - S1052AS-A00CHT - S1051AS-A00CHT - S1045XS-A00CHT - S1205CQ-A00CSP - S1055AS-A00CSP - S1052AS-A00CSP Dimon Zhao (16): net/nbl: add doc and minimum nbl build framework net/nbl: add simple probe/remove and log module net/nbl: add PHY layer definitions and implementation net/nbl: add Channel layer definitions and implementation net/nbl: add Resource layer definitions and implementation net/nbl: add Dispatch layer definitions and implementation net/nbl: add Dev layer definitions and implementation net/nbl: add complete device init and uninit functionality net/nbl: add UIO and VFIO mode for nbl net/nbl: add nbl coexistence mode for nbl net/nbl: add nbl ethdev configuration net/nbl: add nbl device rxtx queue setup and release ops net/nbl: add nbl device start and stop ops net/nbl: add nbl device Tx and Rx burst net/nbl: add nbl device xstats and stats net/nbl: nbl device support set MTU and promisc .mailmap |5 + MAINTAINERS |9 + doc/guides/nics/features/nbl.ini |9 + doc/guides/nics/index.rst |1 + doc/guides/nics/nbl.rst | 42 + drivers/net/meson.build |1 + drivers/net/nbl/meson.build | 26 + drivers/net/nbl/nbl_common/nbl_common.c | 47 + drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 ++ drivers/net/nbl/nbl_common/nbl_userdev.c | 743 ++ drivers/net/nbl/nbl_common/nbl_userdev.h | 21 + drivers/net/nbl/nbl_core.c| 100 ++ drivers/net/nbl/nbl_core.h| 98 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 1007 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 65 + drivers/net/nbl/nbl_dispatch.c| 1227 + drivers/net/nbl/nbl_dispatch.h| 31 + drivers/net/nbl/nbl_ethdev.c | 161 +++ drivers/net/nbl/nbl_ethdev.h | 32 + drivers/net/nbl/nbl_hw/nbl_channel.c | 853 drivers/net/nbl/nbl_hw/nbl_channel.h | 127 ++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 230 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 53 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 253 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 + drivers/net/nbl/nbl_hw/nbl_phy.h | 28 + drivers/net/nbl/nbl_hw/nbl_resource.c |5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 153 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 907 drivers/net/nbl/nbl_hw/nbl_txrx.h | 136 ++ drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 434 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 128 ++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 ++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 95 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 + .../net/nbl/nbl_include/nbl_def_resource.h| 87 ++ drivers/net/nbl/nbl_include/nbl_include.h | 203 +++ drivers/net/nbl/nbl_include/nbl_logs.h| 25 + .../net/nbl/nbl_include/nbl_product_base.h| 37 + 41 files changed, 7720 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_ethdev.c create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nb
[PATCH v2 11/16] net/nbl: add nbl ethdev configuration
NBL device add ethdev configuration Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 33 +-- drivers/net/nbl/nbl_include/nbl_include.h | 3 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index f02ed7f94e..4eea07c1ff 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -4,15 +4,44 @@ #include "nbl_dev.h" -static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +static int nbl_dev_port_configure(struct nbl_adapter *adapter) { - RTE_SET_USED(eth_dev); + adapter->state = NBL_ETHDEV_CONFIGURED; + return 0; } +static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + int ret; + + NBL_LOG(INFO, "Begin to configure the device, state: %d", adapter->state); + + if (dev_data == NULL || adapter == NULL) + return -EINVAL; + + dev_data->dev_conf.intr_conf.lsc = 0; + + switch (adapter->state) { + case NBL_ETHDEV_CONFIGURED: + case NBL_ETHDEV_INITIALIZED: + ret = nbl_dev_port_configure(adapter); + break; + default: + ret = -EINVAL; + break; + } + + NBL_LOG(INFO, "configure the device done %d", ret); + return ret; +} + static int nbl_dev_port_start(struct rte_eth_dev *eth_dev) { RTE_SET_USED(eth_dev); + return 0; } diff --git a/drivers/net/nbl/nbl_include/nbl_include.h b/drivers/net/nbl/nbl_include/nbl_include.h index 2f5e426c91..33b2c25684 100644 --- a/drivers/net/nbl/nbl_include/nbl_include.h +++ b/drivers/net/nbl/nbl_include/nbl_include.h @@ -131,9 +131,10 @@ struct nbl_common_info { /* curr_network 0 means kernel network, 1 means user network */ u8 curr_network:1; u8 is_vf:1; + u8 pf_start:1; u8 specific_dma:1; u8 dma_set_msb:1; - u8 rsv:3; + u8 rsv:2; struct nbl_board_port_info board_info; }; -- 2.34.1
[PATCH v2 04/16] net/nbl: add Channel layer definitions and implementation
add Channel layer related definitions and nbl_thread for mbx interact Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_common/nbl_common.c | 47 ++ drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 +++ drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 6 + drivers/net/nbl/nbl_hw/nbl_channel.c | 672 ++ drivers/net/nbl/nbl_hw/nbl_channel.h | 116 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 124 .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 43 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 326 + drivers/net/nbl/nbl_include/nbl_def_common.h | 40 ++ drivers/net/nbl/nbl_include/nbl_include.h | 8 + 13 files changed, 1492 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_common.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4ec1273100..c849cab185 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,5 +12,8 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_common/nbl_common.c', +'nbl_common/nbl_thread.c', +'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_common/nbl_common.c b/drivers/net/nbl/nbl_common/nbl_common.c new file mode 100644 index 00..9fcf03b015 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.c @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +/** + * @brief: used to alloc continuous dma memory region for cmd buffer + * @mem: output, the memory object containing va, pa and size of memory + * @size: input, memory size in bytes + * @return: memory virtual address for cpu usage + */ +void *nbl_alloc_dma_mem(struct nbl_dma_mem *mem, uint32_t size) +{ + static uint64_t nbl_dma_memzone_id; + const struct rte_memzone *mz = NULL; + char z_name[RTE_MEMZONE_NAMESIZE]; + + if (!mem) + return NULL; + + snprintf(z_name, sizeof(z_name), "nbl_dma_%" NBL_PRIU64 "", + rte_atomic_fetch_add_explicit(&nbl_dma_memzone_id, 1, rte_memory_order_relaxed)); + mz = rte_memzone_reserve_bounded(z_name, size, SOCKET_ID_ANY, 0, +0, RTE_PGSIZE_2M); + if (!mz) + return NULL; + + mem->size = size; + mem->va = mz->addr; + mem->pa = mz->iova; + mem->zone = (const void *)mz; + + return mem->va; +} + +/** + * @brief: used to free dma memory region + * @mem: input, the memory object + */ +void nbl_free_dma_mem(struct nbl_dma_mem *mem) +{ + rte_memzone_free((const struct rte_memzone *)mem->zone); + mem->zone = NULL; + mem->va = NULL; + mem->pa = (uint64_t)0; +} diff --git a/drivers/net/nbl/nbl_common/nbl_common.h b/drivers/net/nbl/nbl_common/nbl_common.h new file mode 100644 index 00..7ff028f5a9 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_COMMON_H_ +#define _NBL_COMMON_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_common/nbl_thread.c b/drivers/net/nbl/nbl_common/nbl_thread.c new file mode 100644 index 00..b6a2f97fad --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_thread.c @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +static rte_spinlock_t nbl_work_list_lock = RTE_SPINLOCK_INITIALIZER; +TAILQ_HEAD(nbl_work_list_head, nbl_work); +rte_thread_t nbl_work_tid; +static bool thread_exit; + +static struct nbl_work_list_head nbl_work_list = TAILQ_HEAD_INITIALIZER(nbl_work_list); + +static uint32_t nbl_thread_polling_task(__rte_unused void *param) +{ + struct timespec time; + struct nbl_work *work; + struct nbl_work *work_tmp; + int i = 0; + + time.tv_sec = 0; + time.tv_nsec = 10; + + while (true) { + i++; + rte_spinlock_lock(&nbl_work_list_lock); + RTE_TAILQ_FOREACH_SA
[PATCH v2 02/16] net/nbl: add simple probe/remove and log module
Our driver architecture is relatively complex because the code is highly reusable and designed to support multiple features. For example, our driver can support open-source UIO/VFIO drivers while also coexisting with kernel drivers. Additionally, the codebase supports multiple chip variants, each with distinct hardware-software interactions. To ensure compatibility, our architecture is divided into the following layers: 1. Dev Layer (Device Layer) The top-level business logic layer where all DPDK operations are device-centric. Every operation is performed relative to the device context. 2. Dispatch Layer The dispatching layer determines whether tasks from the Dev Layer should be routed to the Resource Layer or Channel Layer based on two criteria: 2.1 The driver type in use (UIO/VFIO vs. vendor-specific driver) 2.2 Whether the task requires hardware access 3. Resource Layer Handles tasks dispatched from the Dev Layer (via Dispatch Layer) in userspace. These tasks fall into two categories: 3.1 Hardware control in userspace (common with UIO/VFIO drivers): The Resource Layer further invokes the PHY Layer when hardware access is needed, as only the PHY Layer has OS-level privileges. 3.2 Software resource management: Operations like packet statistics collection that don't require hardware access. 4. PHY Layer (Physical Layer) Serves the Resource Layer by interacting with different hardware chipsets.Writes to hardware registers to drive the hardware based on Resource Layer directives. 5. Channel Layer Dedicated to coexistence mode with kernel drivers. When a BDF device is shared between two drivers (with the kernel driver as primary), all hardware operations from DPDK are forwarded through this layer to the kernel driver. Exceptions include performance-sensitive operations (e.g., doorbell ringing) handled directly in userspace. Architecture Flow Summary Our top-down architecture varies by driver mode: 1. UIO/VFIO Mode (e.g., configuring a hardware queue) Dev Layer → Dispatch Layer → Resource Layer → PHY Layer The Dispatch Layer routes tasks to the Resource Layer, which interacts with the PHY Layer for hardware writes. 2. Coexistence Mode Dev Layer → Dispatch Layer → Channel Layer The Dispatch Layer redirects hooks to the Channel Layer, which communicates with the kernel driver to configure hardware. This layered approach ensures flexibility across driver types and hardware variants. My subsequent patches will iteratively define and implement each layer’s functionality. Let me know if further clarification would be helpful for the review process. Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 30 ++ drivers/net/nbl/nbl_core.h| 40 drivers/net/nbl/nbl_ethdev.c | 113 ++ drivers/net/nbl/nbl_ethdev.h | 13 +++ drivers/net/nbl/nbl_include/nbl_include.h | 43 drivers/net/nbl/nbl_include/nbl_logs.h| 25 + 7 files changed, 267 insertions(+) create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_include.h create mode 100644 drivers/net/nbl/nbl_include/nbl_logs.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4cfbdb023f..013a4126f6 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -6,6 +6,9 @@ if not is_linux reason = 'only supported on Linux' endif +includes += include_directories('nbl_include') + sources = files( 'nbl_ethdev.c', +'nbl_core.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c new file mode 100644 index 00..63b707f0ba --- /dev/null +++ b/drivers/net/nbl/nbl_core.c @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_core.h" + +int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +{ + RTE_SET_USED(adapter); + RTE_SET_USED(eth_dev); + + return 0; +} + +void nbl_core_remove(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} + +int nbl_core_start(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); + + return 0; +} + +void nbl_core_stop(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h new file mode 100644 index 00..4ba13e5bd7 --- /dev/null +++ b/drivers/net/nbl/nbl_core.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_CORE_H_ +#define _NBL_CORE_H_ + +#include "nbl_include.h" + +#define NBL_VENDOR_ID (0x1F0F)
[PATCH v2 05/16] net/nbl: add Resource layer definitions and implementation
add Resource layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 4 + drivers/net/nbl/nbl_hw/nbl_channel.h | 2 +- .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 137 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_resource.c | 5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 51 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 148 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 10 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 47 ++ drivers/net/nbl/nbl_include/nbl_include.h | 20 +++ 12 files changed, 445 insertions(+), 3 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_resource.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index c849cab185..f34121260e 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -15,5 +15,8 @@ sources = files( 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', +'nbl_hw/nbl_resource.c', +'nbl_hw/nbl_txrx.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', +'nbl_hw/nbl_hw_leonis/nbl_res_leonis.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index f4388fe3b5..70600401fe 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -8,8 +8,8 @@ static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { { .phy_init = nbl_phy_init_leonis_snic, .phy_remove = nbl_phy_remove_leonis_snic, - .res_init = NULL, - .res_remove = NULL, + .res_init = nbl_res_init_leonis, + .res_remove = nbl_res_remove_leonis, .chan_init = nbl_chan_init_leonis, .chan_remove= nbl_chan_remove_leonis, }, @@ -46,8 +46,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto chan_init_fail; + ret = product_base_ops->res_init(adapter, eth_dev); + if (ret) + goto res_init_fail; + return 0; +res_init_fail: + product_base_ops->chan_remove(adapter); chan_init_fail: product_base_ops->phy_remove(adapter); phy_init_fail: @@ -60,6 +66,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index a6c1103c77..f693913b47 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -9,6 +9,7 @@ #include "nbl_def_common.h" #include "nbl_def_phy.h" #include "nbl_def_channel.h" +#include "nbl_def_resource.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -33,9 +34,11 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) +#define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) +#define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) struct nbl_core { void *phy_mgt; @@ -48,6 +51,7 @@ struct nbl_core { struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; + struct nbl_resource_ops_tbl *resource_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_hw/nbl_channel.h b/drivers/net/nbl/nbl_hw/nbl_channel.h index dfd995..59e8dfc800 100644 --- a/drivers/net/nbl/nbl_hw/nbl_channel.h +++ b/drivers/net/nbl/nbl_hw/nbl_channel.h @@ -106,7 +106,7 @@ struct nbl_channel_mgt { }; /* Mgt structure for each product. - * Every indivisual mgt must have the common mgt as its first member, and contains its unique + * Every individual mgt must have t
[PATCH v2 03/16] net/nbl: add PHY layer definitions and implementation
add PHY layer related definitions and product ops Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 54 -- drivers/net/nbl/nbl_core.h| 30 +- drivers/net/nbl/nbl_ethdev.c | 4 +- .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 99 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_phy.h | 28 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 +++ drivers/net/nbl/nbl_include/nbl_include.h | 15 +++ .../net/nbl/nbl_include/nbl_product_base.h| 37 +++ 10 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_product_base.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 013a4126f6..4ec1273100 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -7,8 +7,10 @@ if not is_linux endif includes += include_directories('nbl_include') +includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 63b707f0ba..fc7222d526 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -4,27 +4,67 @@ #include "nbl_core.h" -int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { + { + .phy_init = nbl_phy_init_leonis_snic, + .phy_remove = nbl_phy_remove_leonis_snic, + .res_init = NULL, + .res_remove = NULL, + .chan_init = NULL, + .chan_remove= NULL, + }, +}; + +static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_type product_type) { - RTE_SET_USED(adapter); - RTE_SET_USED(eth_dev); + return &nbl_product_core_ops[product_type]; +} + +static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +{ + if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && + pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) + caps->product_type = NBL_LEONIS_TYPE; +} + +int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + struct nbl_product_core_ops *product_base_ops = NULL; + int ret = 0; + + nbl_init_func_caps(pci_dev, &adapter->caps); + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + /* every product's phy/chan/res layer has a great difference, so call their own init ops */ + ret = product_base_ops->phy_init(adapter); + if (ret) + goto phy_init_fail; return 0; + +phy_init_fail: + return -EINVAL; } -void nbl_core_remove(const struct nbl_adapter *adapter) +void nbl_core_remove(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + struct nbl_product_core_ops *product_base_ops = NULL; + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + product_base_ops->phy_remove(adapter); } -int nbl_core_start(const struct nbl_adapter *adapter) +int nbl_core_start(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); return 0; } -void nbl_core_stop(const struct nbl_adapter *adapter) +void nbl_core_stop(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 4ba13e5bd7..2d0e39afa2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -5,7 +5,8 @@ #ifndef _NBL_CORE_H_ #define _NBL_CORE_H_ -#include "nbl_include.h" +#include "nbl_product_base.h" +#include "nbl_def_phy.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -27,14 +28,33 @@ #define NBL_DEVICE_ID_M18100_VF(0x3413) #define NBL_MAX_INSTANCE_CNT 516 + +#define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) +#define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) + +struct nbl_core { + void *phy_mgt; + void *res_mgt; + void *disp_mgt; + void *chan_mgt; + void *dev_mgt; +}; + +st
[PATCH v2 01/16] net/nbl: add doc and minimum nbl build framework
add minimum PMD code, doc and build infrastructure for nbl driver. Signed-off-by: dimon.zhao --- .mailmap | 5 MAINTAINERS | 9 +++ doc/guides/nics/features/nbl.ini | 9 +++ doc/guides/nics/index.rst| 1 + doc/guides/nics/nbl.rst | 42 drivers/net/meson.build | 1 + drivers/net/nbl/meson.build | 11 + drivers/net/nbl/nbl_ethdev.c | 3 +++ 8 files changed, 81 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_ethdev.c diff --git a/.mailmap b/.mailmap index 8483d96ec5..c46d273447 100644 --- a/.mailmap +++ b/.mailmap @@ -362,6 +362,7 @@ Diana Wang Didier Pallard Dilshod Urazov Dima Ruinskiy +Dimon Zhao Ding Zhi Diogo Behrens Dirk-Holger Lenz @@ -833,6 +834,7 @@ Kumar Amber Kumara Parameshwaran Kumar Sanghvi Kyle Larose +Kyo Liu Lance Richardson Laszlo Ersek Laura Stroe @@ -847,6 +849,7 @@ Lei Gong Lei Ji Lei Yao Leonid Myravjev +Leon Yu Leo Xu Leszek Zygo Levend Sayar @@ -1352,6 +1355,7 @@ Saikrishna Edupuganti Saleh Alsouqi Salem Sol Sam Andrew +Sam Chen Sameh Gobriel Sam Grove Samik Gupta @@ -1850,3 +1854,4 @@ Ziye Yang Zoltan Kiss Zorik Machulsky Zyta Szpak +Leon Yu diff --git a/MAINTAINERS b/MAINTAINERS index 0e9357f3a3..5d0ff04999 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1010,6 +1010,15 @@ F: drivers/net/rnp/ F: doc/guides/nics/rnp.rst F: doc/guides/nics/features/rnp.ini +nebulamatrix nbl +M: Dimon Zhao +M: Kyo Liu +M: Leon Yu +M: Sam Chen +F: drivers/net/nbl +F: doc/guides/nics/nbl.rst +F: doc/guides/nics/features/nbl.ini + Realtek r8169 M: Howard Wang M: Chunhao Lin diff --git a/doc/guides/nics/features/nbl.ini b/doc/guides/nics/features/nbl.ini new file mode 100644 index 00..6daabe6ed3 --- /dev/null +++ b/doc/guides/nics/features/nbl.ini @@ -0,0 +1,9 @@ +; +; Supported features of the 'nbl' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Linux= Y +ARMv8= Y +x86-64 = Y diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst index 57d161c526..84d4ece101 100644 --- a/doc/guides/nics/index.rst +++ b/doc/guides/nics/index.rst @@ -50,6 +50,7 @@ Network Interface Controller Drivers mvneta mvpp2 netvsc +nbl nfb nfp ngbe diff --git a/doc/guides/nics/nbl.rst b/doc/guides/nics/nbl.rst new file mode 100644 index 00..6cd09fe97f --- /dev/null +++ b/doc/guides/nics/nbl.rst @@ -0,0 +1,42 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2025 Nebulamatrix Technology Co., Ltd + +NBL Poll Mode Driver + + +The NBL PMD (**librte_net_nbl**) provides poll mode driver support for +10/25/50/100/200 Gbps Nebulamatrix Series Network Adapters. + + +Supported NICs +-- + +The following Nebulamatrix device models are supported by the same nbl driver: + + - S1205CQ-A00CHT + - S1105AS-A00CHT + - S1055AS-A00CHT + - S1052AS-A00CHT + - S1051AS-A00CHT + - S1045XS-A00CHT + - S1205CQ-A00CSP + - S1055AS-A00CSP + - S1052AS-A00CSP + + +Prerequisites +- + +- Follow the DPDK :ref:`Getting Started Guide for Linux ` + to setup the basic DPDK environment. + +- Learn about `Nebulamatrix Series NICs + <https://www.nebula-matrix.com/main>`_. + + +Limitations or Known Issues +--- + +32-bit architectures are not supported. + +Windows and BSD are not supported yet. diff --git a/drivers/net/meson.build b/drivers/net/meson.build index 61f8cddb30..517e78d18b 100644 --- a/drivers/net/meson.build +++ b/drivers/net/meson.build @@ -40,6 +40,7 @@ drivers = [ 'mlx5', 'mvneta', 'mvpp2', +'nbl', 'netvsc', 'nfb', 'nfp', diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build new file mode 100644 index 00..4cfbdb023f --- /dev/null +++ b/drivers/net/nbl/meson.build @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2025 NebulaMatrix Technology Co., Ltd. + +if not is_linux +build = false +reason = 'only supported on Linux' +endif + +sources = files( +'nbl_ethdev.c', +) diff --git a/drivers/net/nbl/nbl_ethdev.c b/drivers/net/nbl/nbl_ethdev.c new file mode 100644 index 00..3ad8e4033a --- /dev/null +++ b/drivers/net/nbl/nbl_ethdev.c @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ -- 2.34.1
[PATCH v2 13/16] net/nbl: add nbl device start and stop ops
Implement NBL device start and stop functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 173 +- drivers/net/nbl/nbl_dispatch.c| 121 +++- drivers/net/nbl/nbl_ethdev.c | 5 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 72 +++- drivers/net/nbl/nbl_hw/nbl_txrx.h | 14 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 20 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 6 +- .../net/nbl/nbl_include/nbl_def_dispatch.h| 2 +- .../net/nbl/nbl_include/nbl_def_resource.h| 4 + drivers/net/nbl/nbl_include/nbl_include.h | 6 +- 10 files changed, 392 insertions(+), 31 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4faa58ace8..bdd06613e6 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,22 +38,179 @@ static int nbl_dev_configure(struct rte_eth_dev *eth_dev) return ret; } +static int nbl_dev_txrx_start(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_txrx_queue_param param = {0}; + struct nbl_dev_ring *ring; + int ret = 0; + int i; + + eth_dev->data->scattered_rx = 0; + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + ring = &ring_mgt->tx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.extend_header = 1; + param.split = 0; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, true); + if (ret) { + NBL_LOG(ERR, "setup_tx_queue failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + eth_dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + ring = &ring_mgt->rx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.half_offload_en = 1; + param.extend_header = 1; + param.split = 0; + param.rxcsum = 1; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, false); + if (ret) { + NBL_LOG(ERR, "setup_rx_queue failed %d", ret); + return ret; + } + + ret = disp_ops->alloc_rx_bufs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + if (ret) { + NBL_LOG(ERR, "alloc_rx_bufs failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + disp_ops->update_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + eth_dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + ret = disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, true); + if (ret) { + NBL_LOG(ERR, "cfg_dsch failed %d", ret); + goto cfg_dsch_fail; + } + ret = disp_ops->setup_cqs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, eth_dev->data->nb_rx_queues, true); + if (ret) + goto setup_cqs_fail; + + return ret; + +setup_cqs_fail: + disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, false); +cfg_dsch_fail: + disp_ops->remove_all_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id); + + return ret; +} + static int nbl_dev_port_start(struct rte_e
[PATCH v2 16/16] net/nbl: nbl device support set MTU and promisc
Implement NBL device set MTU and promisc functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.h| 2 + drivers/net/nbl/nbl_dev/nbl_dev.c | 60 +++ drivers/net/nbl/nbl_dev/nbl_dev.h | 4 +- drivers/net/nbl/nbl_dispatch.c| 77 +++ drivers/net/nbl/nbl_dispatch.h| 2 + drivers/net/nbl/nbl_ethdev.c | 31 +--- drivers/net/nbl/nbl_include/nbl_def_channel.h | 10 +++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 1 + .../net/nbl/nbl_include/nbl_def_resource.h| 2 + 9 files changed, 176 insertions(+), 13 deletions(-) diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 997544b112..d3fe1d02d2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -51,6 +51,8 @@ #define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ _common->nl_socket_route < 0 || \ _common->ifindex < 0; }) +#define NBL_IS_COEXISTENCE(common) ((common)->devfd != -1) + struct nbl_core { void *phy_mgt; void *res_mgt; diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4fa132ae1c..6e26989e1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -507,6 +507,63 @@ static int nbl_xstats_reset(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + uint32_t frame_size = mtu + NBL_ETH_OVERHEAD; + int ret; + + /* check if mtu is within the allowed range */ + if (mtu < RTE_ETHER_MIN_MTU || frame_size > NBL_FRAME_SIZE_MAX) + return -EINVAL; + + /* mtu setting is forbidden if port is start */ + if (dev_data->dev_started) { + NBL_LOG(ERR, "port %d must be stopped before configuration", dev_data->port_id); + return -EBUSY; + } + + dev_data->dev_conf.rxmode.mtu = frame_size; + ret = disp_ops->set_mtu(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, mtu); + if (ret) + return ret; + + return 0; +} + +static int nbl_promiscuous_enable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 1); + dev_mgt->net_dev->promisc = 1; + + return 0; +} + +static int nbl_promiscuous_disable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 0); + dev_mgt->net_dev->promisc = 0; + + return 0; +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, @@ -523,6 +580,9 @@ struct nbl_dev_ops dev_ops = { .xstats_get = nbl_xstats_get, .xstats_get_names = nbl_xstats_get_names, .xstats_reset = nbl_xstats_reset, + .promiscuous_disable = nbl_promiscuous_disable, + .promiscuous_enable = nbl_promiscuous_enable, + .mtu_set = nbl_mtu_set, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.h b/drivers/net/nbl/nbl_dev/nbl_dev.h index 1541aebba5..a97a53bc02 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.h +++ b/drivers/net/nbl/nbl_dev/nbl_dev.h @@ -47,7 +47,9 @@ struct nbl_dev_net_mgt { u8 eth_mode; u8 eth_id; u16 max_mac_num; - bool trust; + u8 trust:1; + u8 promisc:1; + u8 rsv:6; }; struct nbl_dev_mgt { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c index a9a23f8083..9eb868f504 100644 --- a/drivers/net/nbl/nbl_dispatch.c +++ b/drivers/net/nbl/nbl_dispa
[PATCH v2 02/16] net/nbl: add simple probe/remove and log module
Our driver architecture is relatively complex because the code is highly reusable and designed to support multiple features. For example, our driver can support open-source UIO/VFIO drivers while also coexisting with kernel drivers. Additionally, the codebase supports multiple chip variants, each with distinct hardware-software interactions. To ensure compatibility, our architecture is divided into the following layers: 1. Dev Layer (Device Layer) The top-level business logic layer where all DPDK operations are device-centric. Every operation is performed relative to the device context. 2. Dispatch Layer The dispatching layer determines whether tasks from the Dev Layer should be routed to the Resource Layer or Channel Layer based on two criteria: 2.1 The driver type in use (UIO/VFIO vs. vendor-specific driver) 2.2 Whether the task requires hardware access 3. Resource Layer Handles tasks dispatched from the Dev Layer (via Dispatch Layer) in userspace. These tasks fall into two categories: 3.1 Hardware control in userspace (common with UIO/VFIO drivers): The Resource Layer further invokes the PHY Layer when hardware access is needed, as only the PHY Layer has OS-level privileges. 3.2 Software resource management: Operations like packet statistics collection that don't require hardware access. 4. PHY Layer (Physical Layer) Serves the Resource Layer by interacting with different hardware chipsets.Writes to hardware registers to drive the hardware based on Resource Layer directives. 5. Channel Layer Dedicated to coexistence mode with kernel drivers. When a BDF device is shared between two drivers (with the kernel driver as primary), all hardware operations from DPDK are forwarded through this layer to the kernel driver. Exceptions include performance-sensitive operations (e.g., doorbell ringing) handled directly in userspace. Architecture Flow Summary Our top-down architecture varies by driver mode: 1. UIO/VFIO Mode (e.g., configuring a hardware queue) Dev Layer → Dispatch Layer → Resource Layer → PHY Layer The Dispatch Layer routes tasks to the Resource Layer, which interacts with the PHY Layer for hardware writes. 2. Coexistence Mode Dev Layer → Dispatch Layer → Channel Layer The Dispatch Layer redirects hooks to the Channel Layer, which communicates with the kernel driver to configure hardware. This layered approach ensures flexibility across driver types and hardware variants. My subsequent patches will iteratively define and implement each layer’s functionality. Let me know if further clarification would be helpful for the review process. Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 30 ++ drivers/net/nbl/nbl_core.h| 40 drivers/net/nbl/nbl_ethdev.c | 113 ++ drivers/net/nbl/nbl_ethdev.h | 13 +++ drivers/net/nbl/nbl_include/nbl_include.h | 43 drivers/net/nbl/nbl_include/nbl_logs.h| 25 + 7 files changed, 267 insertions(+) create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_include.h create mode 100644 drivers/net/nbl/nbl_include/nbl_logs.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4cfbdb023f..013a4126f6 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -6,6 +6,9 @@ if not is_linux reason = 'only supported on Linux' endif +includes += include_directories('nbl_include') + sources = files( 'nbl_ethdev.c', +'nbl_core.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c new file mode 100644 index 00..63b707f0ba --- /dev/null +++ b/drivers/net/nbl/nbl_core.c @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_core.h" + +int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +{ + RTE_SET_USED(adapter); + RTE_SET_USED(eth_dev); + + return 0; +} + +void nbl_core_remove(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} + +int nbl_core_start(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); + + return 0; +} + +void nbl_core_stop(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h new file mode 100644 index 00..4ba13e5bd7 --- /dev/null +++ b/drivers/net/nbl/nbl_core.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_CORE_H_ +#define _NBL_CORE_H_ + +#include "nbl_include.h" + +#define NBL_VENDOR_ID (0x1F0F)
[PATCH v2 04/16] net/nbl: add Channel layer definitions and implementation
add Channel layer related definitions and nbl_thread for mbx interact Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_common/nbl_common.c | 47 ++ drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 +++ drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 6 + drivers/net/nbl/nbl_hw/nbl_channel.c | 672 ++ drivers/net/nbl/nbl_hw/nbl_channel.h | 116 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 124 .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 43 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 326 + drivers/net/nbl/nbl_include/nbl_def_common.h | 40 ++ drivers/net/nbl/nbl_include/nbl_include.h | 8 + 13 files changed, 1492 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_common.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4ec1273100..c849cab185 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,5 +12,8 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_common/nbl_common.c', +'nbl_common/nbl_thread.c', +'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_common/nbl_common.c b/drivers/net/nbl/nbl_common/nbl_common.c new file mode 100644 index 00..9fcf03b015 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.c @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +/** + * @brief: used to alloc continuous dma memory region for cmd buffer + * @mem: output, the memory object containing va, pa and size of memory + * @size: input, memory size in bytes + * @return: memory virtual address for cpu usage + */ +void *nbl_alloc_dma_mem(struct nbl_dma_mem *mem, uint32_t size) +{ + static uint64_t nbl_dma_memzone_id; + const struct rte_memzone *mz = NULL; + char z_name[RTE_MEMZONE_NAMESIZE]; + + if (!mem) + return NULL; + + snprintf(z_name, sizeof(z_name), "nbl_dma_%" NBL_PRIU64 "", + rte_atomic_fetch_add_explicit(&nbl_dma_memzone_id, 1, rte_memory_order_relaxed)); + mz = rte_memzone_reserve_bounded(z_name, size, SOCKET_ID_ANY, 0, +0, RTE_PGSIZE_2M); + if (!mz) + return NULL; + + mem->size = size; + mem->va = mz->addr; + mem->pa = mz->iova; + mem->zone = (const void *)mz; + + return mem->va; +} + +/** + * @brief: used to free dma memory region + * @mem: input, the memory object + */ +void nbl_free_dma_mem(struct nbl_dma_mem *mem) +{ + rte_memzone_free((const struct rte_memzone *)mem->zone); + mem->zone = NULL; + mem->va = NULL; + mem->pa = (uint64_t)0; +} diff --git a/drivers/net/nbl/nbl_common/nbl_common.h b/drivers/net/nbl/nbl_common/nbl_common.h new file mode 100644 index 00..7ff028f5a9 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_COMMON_H_ +#define _NBL_COMMON_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_common/nbl_thread.c b/drivers/net/nbl/nbl_common/nbl_thread.c new file mode 100644 index 00..b6a2f97fad --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_thread.c @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +static rte_spinlock_t nbl_work_list_lock = RTE_SPINLOCK_INITIALIZER; +TAILQ_HEAD(nbl_work_list_head, nbl_work); +rte_thread_t nbl_work_tid; +static bool thread_exit; + +static struct nbl_work_list_head nbl_work_list = TAILQ_HEAD_INITIALIZER(nbl_work_list); + +static uint32_t nbl_thread_polling_task(__rte_unused void *param) +{ + struct timespec time; + struct nbl_work *work; + struct nbl_work *work_tmp; + int i = 0; + + time.tv_sec = 0; + time.tv_nsec = 10; + + while (true) { + i++; + rte_spinlock_lock(&nbl_work_list_lock); + RTE_TAILQ_FOREACH_SA
[PATCH v2 00/16] NBL PMD for Nebulamatrix NICs
Features: - - MTU update - promisc mode set - xstats - Basic stats Support NICs: - - S1205CQ-A00CHT - S1105AS-A00CHT - S1055AS-A00CHT - S1052AS-A00CHT - S1051AS-A00CHT - S1045XS-A00CHT - S1205CQ-A00CSP - S1055AS-A00CSP - S1052AS-A00CSP Dimon Zhao (16): net/nbl: add doc and minimum nbl build framework net/nbl: add simple probe/remove and log module net/nbl: add PHY layer definitions and implementation net/nbl: add Channel layer definitions and implementation net/nbl: add Resource layer definitions and implementation net/nbl: add Dispatch layer definitions and implementation net/nbl: add Dev layer definitions and implementation net/nbl: add complete device init and uninit functionality net/nbl: add UIO and VFIO mode for nbl net/nbl: add nbl coexistence mode for nbl net/nbl: add nbl ethdev configuration net/nbl: add nbl device rxtx queue setup and release ops net/nbl: add nbl device start and stop ops net/nbl: add nbl device Tx and Rx burst net/nbl: add nbl device xstats and stats net/nbl: nbl device support set MTU and promisc .mailmap |5 + MAINTAINERS |9 + doc/guides/nics/features/nbl.ini |9 + doc/guides/nics/index.rst |1 + doc/guides/nics/nbl.rst | 42 + drivers/net/meson.build |1 + drivers/net/nbl/meson.build | 26 + drivers/net/nbl/nbl_common/nbl_common.c | 47 + drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 ++ drivers/net/nbl/nbl_common/nbl_userdev.c | 743 ++ drivers/net/nbl/nbl_common/nbl_userdev.h | 21 + drivers/net/nbl/nbl_core.c| 100 ++ drivers/net/nbl/nbl_core.h| 98 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 1007 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 65 + drivers/net/nbl/nbl_dispatch.c| 1227 + drivers/net/nbl/nbl_dispatch.h| 31 + drivers/net/nbl/nbl_ethdev.c | 161 +++ drivers/net/nbl/nbl_ethdev.h | 32 + drivers/net/nbl/nbl_hw/nbl_channel.c | 853 drivers/net/nbl/nbl_hw/nbl_channel.h | 127 ++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 230 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 53 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 253 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 + drivers/net/nbl/nbl_hw/nbl_phy.h | 28 + drivers/net/nbl/nbl_hw/nbl_resource.c |5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 153 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 907 drivers/net/nbl/nbl_hw/nbl_txrx.h | 136 ++ drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 434 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 128 ++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 ++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 95 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 + .../net/nbl/nbl_include/nbl_def_resource.h| 87 ++ drivers/net/nbl/nbl_include/nbl_include.h | 203 +++ drivers/net/nbl/nbl_include/nbl_logs.h| 25 + .../net/nbl/nbl_include/nbl_product_base.h| 37 + 41 files changed, 7720 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_ethdev.c create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nb
[PATCH v2 05/16] net/nbl: add Resource layer definitions and implementation
add Resource layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 4 + drivers/net/nbl/nbl_hw/nbl_channel.h | 2 +- .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 137 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_resource.c | 5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 51 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 148 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 10 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 47 ++ drivers/net/nbl/nbl_include/nbl_include.h | 20 +++ 12 files changed, 445 insertions(+), 3 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_resource.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index c849cab185..f34121260e 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -15,5 +15,8 @@ sources = files( 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', +'nbl_hw/nbl_resource.c', +'nbl_hw/nbl_txrx.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', +'nbl_hw/nbl_hw_leonis/nbl_res_leonis.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index f4388fe3b5..70600401fe 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -8,8 +8,8 @@ static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { { .phy_init = nbl_phy_init_leonis_snic, .phy_remove = nbl_phy_remove_leonis_snic, - .res_init = NULL, - .res_remove = NULL, + .res_init = nbl_res_init_leonis, + .res_remove = nbl_res_remove_leonis, .chan_init = nbl_chan_init_leonis, .chan_remove= nbl_chan_remove_leonis, }, @@ -46,8 +46,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto chan_init_fail; + ret = product_base_ops->res_init(adapter, eth_dev); + if (ret) + goto res_init_fail; + return 0; +res_init_fail: + product_base_ops->chan_remove(adapter); chan_init_fail: product_base_ops->phy_remove(adapter); phy_init_fail: @@ -60,6 +66,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index a6c1103c77..f693913b47 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -9,6 +9,7 @@ #include "nbl_def_common.h" #include "nbl_def_phy.h" #include "nbl_def_channel.h" +#include "nbl_def_resource.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -33,9 +34,11 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) +#define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) +#define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) struct nbl_core { void *phy_mgt; @@ -48,6 +51,7 @@ struct nbl_core { struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; + struct nbl_resource_ops_tbl *resource_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_hw/nbl_channel.h b/drivers/net/nbl/nbl_hw/nbl_channel.h index dfd995..59e8dfc800 100644 --- a/drivers/net/nbl/nbl_hw/nbl_channel.h +++ b/drivers/net/nbl/nbl_hw/nbl_channel.h @@ -106,7 +106,7 @@ struct nbl_channel_mgt { }; /* Mgt structure for each product. - * Every indivisual mgt must have the common mgt as its first member, and contains its unique + * Every individual mgt must have t
[PATCH v2 10/16] net/nbl: add nbl coexistence mode for nbl
NBL device support coexistence mode Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_common/nbl_userdev.c | 729 +- drivers/net/nbl/nbl_common/nbl_userdev.h | 11 + drivers/net/nbl/nbl_core.c| 3 +- drivers/net/nbl/nbl_core.h| 1 - drivers/net/nbl/nbl_hw/nbl_channel.c | 185 - drivers/net/nbl/nbl_hw/nbl_channel.h | 11 + .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 2 +- drivers/net/nbl/nbl_include/nbl_def_common.h | 63 ++ drivers/net/nbl/nbl_include/nbl_include.h | 2 + 9 files changed, 997 insertions(+), 10 deletions(-) diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c index 87b943ccd7..284a5b19c9 100644 --- a/drivers/net/nbl/nbl_common/nbl_userdev.c +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -3,15 +3,720 @@ */ #include "nbl_userdev.h" +#include -int nbl_pci_map_device(struct nbl_adapter *adapter) +#define NBL_USERDEV_EVENT_CLB_NAME "nbl_userspace_mem_event_clb" +#define NBL_USERDEV_BAR0_SIZE 65536 +#define NBL_USERDEV_DMA_LIMIT 0x + +/* Size of the buffer to receive kernel messages */ +#define NBL_NL_BUF_SIZE (32 * 1024) +/* Send buffer size for the Netlink socket */ +#define NBL_SEND_BUF_SIZE 32768 +/* Receive buffer size for the Netlink socket */ +#define NBL_RECV_BUF_SIZE 32768 + +struct nbl_userdev_map_record { + TAILQ_ENTRY(nbl_userdev_map_record) next; + u64 vaddr; + u64 iova; + u64 len; +}; + +static int nbl_default_container = -1; +static int nbl_group_count; + +TAILQ_HEAD(nbl_adapter_list_head, nbl_adapter); +static struct nbl_adapter_list_head nbl_adapter_list = + TAILQ_HEAD_INITIALIZER(nbl_adapter_list); + +TAILQ_HEAD(nbl_userdev_map_record_head, nbl_userdev_map_record); +static struct nbl_userdev_map_record_head nbl_map_list = + TAILQ_HEAD_INITIALIZER(nbl_map_list); + +static int +nbl_userdev_dma_mem_map(int devfd, uint64_t vaddr, uint64_t iova, uint64_t len) { - struct rte_pci_device *pci_dev = adapter->pci_dev; + struct nbl_dev_user_dma_map dma_map; int ret = 0; - ret = rte_pci_map_device(pci_dev); + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct nbl_dev_user_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = iova; + dma_map.flags = NBL_DEV_USER_DMA_MAP_FLAG_READ | + NBL_DEV_USER_DMA_MAP_FLAG_WRITE; + + ret = ioctl(devfd, NBL_DEV_USER_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "nbl container Memory segment is already mapped,skipping"); + ret = 0; + } else { + NBL_LOG(ERR, + "nbl container cannot set up DMA remapping,error %i (%s), ret %d", + errno, strerror(errno), ret); + } + } + + return ret; +} + +static int +nbl_vfio_dma_mem_map(int vfio_container_fd, uint64_t vaddr, uint64_t len, int do_map) +{ + struct vfio_iommu_type1_dma_map dma_map; + struct vfio_iommu_type1_dma_unmap dma_unmap; + int ret; + + if (do_map != 0) { + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = vaddr; + dma_map.flags = VFIO_DMA_MAP_FLAG_READ | + VFIO_DMA_MAP_FLAG_WRITE; + + ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "Memory segment is already mapped, skipping"); + } else { + NBL_LOG(ERR, + "cannot set up DMA remapping,error %i (%s)", + errno, strerror(errno)); + return -1; + } + } + } else { + memset(&dma_unmap, 0, sizeof(dma_unmap)); + dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap); + dma_unmap.size = len; + dma_unmap.iova = vaddr; + + ret = i
[PATCH v2 12/16] net/nbl: add nbl device rxtx queue setup and release ops
Implement NBL device Rx and Tx queue setup & release functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 81 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 2 + drivers/net/nbl/nbl_hw/nbl_resource.h | 99 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 287 -- drivers/net/nbl/nbl_hw/nbl_txrx.h | 99 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 5 + drivers/net/nbl/nbl_include/nbl_include.h | 1 + 7 files changed, 552 insertions(+), 22 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4eea07c1ff..4faa58ace8 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -57,11 +57,92 @@ static int nbl_dev_close(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_tx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_txconf *conf) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *tx_ring = &ring_mgt->tx_rings[queue_idx]; + struct nbl_start_tx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.product = adapter->caps.product_type; + param.bond_broadcast_check = NULL; + ret = disp_ops->start_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &tx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_tx_ring failed %d", ret); + return ret; + } + + tx_ring->desc_num = nb_desc; + + return ret; +} + +static int nbl_rx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_rxconf *conf, + struct rte_mempool *mempool) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *rx_ring = &ring_mgt->rx_rings[queue_idx]; + struct nbl_start_rx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.mempool = mempool; + param.product = adapter->caps.product_type; + ret = disp_ops->start_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &rx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_rx_ring failed %d", ret); + return ret; + } + + rx_ring->desc_num = nb_desc; + + return ret; +} + +static void nbl_tx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + +static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, .dev_stop = nbl_dev_port_stop, .dev_close = nbl_dev_close, + .tx_queue_setup = nbl_tx_queue_setup, + .rx_queue_setup = nbl_rx_queue_setup, + .tx_queue_release = nbl_tx_queues_release, + .rx_queue_release = nbl_rx_queues_release, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c index 6327aa55b4..b785774f67 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c @@ -53,6 +53,8 @@ static int nbl_res_start(struct nbl_resource_mgt_leonis *res_mgt_leonis) struct nbl_resource_mgt *res_mgt = &a
[PATCH v2 06/16] net/nbl: add Dispatch layer definitions and implementation
add Dispatch layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_core.c| 7 + drivers/net/nbl/nbl_core.h| 4 + drivers/net/nbl/nbl_dispatch.c| 466 ++ drivers/net/nbl/nbl_dispatch.h| 29 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 18 + drivers/net/nbl/nbl_include/nbl_def_common.h | 4 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 77 +++ .../net/nbl/nbl_include/nbl_def_resource.h| 5 + drivers/net/nbl/nbl_include/nbl_include.h | 17 + 10 files changed, 628 insertions(+) create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dispatch.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index f34121260e..23601727ef 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,6 +12,7 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 70600401fe..548eb3a2fd 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -50,8 +50,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto res_init_fail; + ret = nbl_disp_init(adapter); + if (ret) + goto disp_init_fail; + return 0; +disp_init_fail: + product_base_ops->res_remove(adapter); res_init_fail: product_base_ops->chan_remove(adapter); chan_init_fail: @@ -66,6 +72,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index f693913b47..2730539050 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -10,6 +10,7 @@ #include "nbl_def_phy.h" #include "nbl_def_channel.h" #include "nbl_def_resource.h" +#include "nbl_def_dispatch.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -35,10 +36,12 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) +#define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) +#define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) struct nbl_core { void *phy_mgt; @@ -52,6 +55,7 @@ struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; + struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c new file mode 100644 index 00..ffeeba3048 --- /dev/null +++ b/drivers/net/nbl/nbl_dispatch.c @@ -0,0 +1,466 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_dispatch.h" + +static int nbl_disp_alloc_txrx_queues(void *priv, u16 vsi_id, u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_resource_ops *res_ops; + + res_ops = NBL_DISP_MGT_TO_RES_OPS(disp_mgt); + return res_ops->alloc_txrx_queues(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt), + vsi_id, queue_num); +} + +static int nbl_disp_chan_alloc_txrx_queues_req(void *priv, u16 vsi_id, + u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_channel_ops *chan_ops; + struct nbl_chan_param_alloc_txrx_queues param = {0}; + struct nbl_chan_param_alloc_txrx_queues result = {0}; + struct nbl_chan_send_info chan_send; + + chan_ops = NBL_DISP_MGT_TO_CHAN_OPS(disp_mgt); + + param.vsi_id
[PATCH v2 07/16] net/nbl: add Dev layer definitions and implementation
add Dev layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 14 +- drivers/net/nbl/nbl_core.h| 16 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 200 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 24 +++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 6 files changed, 360 insertions(+), 3 deletions(-) create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 23601727ef..7f4abd3db0 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -8,6 +8,7 @@ endif includes += include_directories('nbl_include') includes += include_directories('nbl_hw') +includes += include_directories('nbl_common') sources = files( 'nbl_ethdev.c', @@ -15,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', +'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', 'nbl_hw/nbl_txrx.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 548eb3a2fd..1a6a6bc11d 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -54,8 +54,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto disp_init_fail; + ret = nbl_dev_init(adapter, eth_dev); + if (ret) + goto dev_init_fail; + return 0; +dev_init_fail: + nbl_disp_remove(adapter); disp_init_fail: product_base_ops->res_remove(adapter); res_init_fail: @@ -72,6 +78,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_dev_remove(adapter); nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); @@ -80,12 +87,13 @@ void nbl_core_remove(struct nbl_adapter *adapter) int nbl_core_start(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + int ret = 0; - return 0; + ret = nbl_dev_start(adapter); + return ret; } void nbl_core_stop(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + nbl_dev_stop(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 2730539050..9a05bbee48 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -11,6 +11,7 @@ #include "nbl_def_channel.h" #include "nbl_def_resource.h" #include "nbl_def_dispatch.h" +#include "nbl_def_dev.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -37,11 +38,13 @@ #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) +#define NBL_ADAPTER_TO_DEV_MGT(adapter) ((adapter)->core.dev_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) +#define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) struct nbl_core { void *phy_mgt; @@ -51,11 +54,23 @@ struct nbl_core { void *dev_mgt; }; +enum nbl_ethdev_state { + NBL_ETHDEV_UNINITIALIZED = 0, + NBL_ETHDEV_INITIALIZED, + NBL_ETHDEV_CONFIGURING, + NBL_ETHDEV_CONFIGURED, + NBL_ETHDEV_CLOSING, + NBL_ETHDEV_STARTING, + NBL_ETHDEV_STARTED, + NBL_ETHDEV_STOPPING, +}; + struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; + struct nbl_dev_ops_tbl *dev_ops_tbl; }; struct nbl_adapter { @@ -64,6 +79,7 @@ struct nbl_adapter { struct nbl_core core; struct nbl_interface intf; struct nbl_func_caps caps; + enum nbl_ethdev_state state; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c new file mode 100644 index 00..86006d6762 --- /
[PATCH v2 08/16] net/nbl: add complete device init and uninit functionality
NBL device is a concept of low level device which used to manage hw resource and to interact with fw Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.c| 8 +- drivers/net/nbl/nbl_core.h| 7 + drivers/net/nbl/nbl_dev/nbl_dev.c | 248 +++- drivers/net/nbl/nbl_dev/nbl_dev.h | 32 + drivers/net/nbl/nbl_dispatch.c| 548 +++--- drivers/net/nbl/nbl_ethdev.c | 26 + drivers/net/nbl/nbl_hw/nbl_resource.h | 1 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 30 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 51 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 7 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 7 +- .../net/nbl/nbl_include/nbl_def_resource.h| 18 + drivers/net/nbl/nbl_include/nbl_include.h | 61 ++ 13 files changed, 955 insertions(+), 89 deletions(-) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 1a6a6bc11d..f4ddc9e219 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -20,7 +20,7 @@ static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_ty return &nbl_product_core_ops[product_type]; } -static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +static void nbl_init_func_caps(const struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) { if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) @@ -29,8 +29,8 @@ static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_c int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) { - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); - struct nbl_product_core_ops *product_base_ops = NULL; + const struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + const struct nbl_product_core_ops *product_base_ops = NULL; int ret = 0; nbl_init_func_caps(pci_dev, &adapter->caps); @@ -74,7 +74,7 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) void nbl_core_remove(struct nbl_adapter *adapter) { - struct nbl_product_core_ops *product_base_ops = NULL; + const struct nbl_product_core_ops *product_base_ops = NULL; product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 9a05bbee48..bdf31e15da 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -46,6 +46,12 @@ #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) #define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) +#define NBL_ADAPTER_TO_COMMON(adapter) (&((adapter)->common)) + +#define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ + _common->nl_socket_route < 0 || \ + _common->ifindex < 0; }) + struct nbl_core { void *phy_mgt; void *res_mgt; @@ -80,6 +86,7 @@ struct nbl_adapter { struct nbl_interface intf; struct nbl_func_caps caps; enum nbl_ethdev_state state; + struct nbl_common_info common; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 86006d6762..f02ed7f94e 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,7 +38,7 @@ struct nbl_dev_ops dev_ops = { static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->setup_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -49,7 +49,7 @@ static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) static int nbl_dev_teardown_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->teardown_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -67,15 +67,67 @@ static void nbl_dev_leonis_uninit(void *adapter) nbl_dev_teardown_chan_queue((struct nbl_adapter *)adapter); } +static int nbl_dev_common_start(struct nbl_dev_mgt *dev_mgt) +{ + const struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + s
[PATCH v2 03/16] net/nbl: add PHY layer definitions and implementation
add PHY layer related definitions and product ops Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 54 -- drivers/net/nbl/nbl_core.h| 30 +- drivers/net/nbl/nbl_ethdev.c | 4 +- .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 99 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_phy.h | 28 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 +++ drivers/net/nbl/nbl_include/nbl_include.h | 15 +++ .../net/nbl/nbl_include/nbl_product_base.h| 37 +++ 10 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_product_base.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 013a4126f6..4ec1273100 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -7,8 +7,10 @@ if not is_linux endif includes += include_directories('nbl_include') +includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 63b707f0ba..fc7222d526 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -4,27 +4,67 @@ #include "nbl_core.h" -int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { + { + .phy_init = nbl_phy_init_leonis_snic, + .phy_remove = nbl_phy_remove_leonis_snic, + .res_init = NULL, + .res_remove = NULL, + .chan_init = NULL, + .chan_remove= NULL, + }, +}; + +static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_type product_type) { - RTE_SET_USED(adapter); - RTE_SET_USED(eth_dev); + return &nbl_product_core_ops[product_type]; +} + +static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +{ + if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && + pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) + caps->product_type = NBL_LEONIS_TYPE; +} + +int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + struct nbl_product_core_ops *product_base_ops = NULL; + int ret = 0; + + nbl_init_func_caps(pci_dev, &adapter->caps); + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + /* every product's phy/chan/res layer has a great difference, so call their own init ops */ + ret = product_base_ops->phy_init(adapter); + if (ret) + goto phy_init_fail; return 0; + +phy_init_fail: + return -EINVAL; } -void nbl_core_remove(const struct nbl_adapter *adapter) +void nbl_core_remove(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + struct nbl_product_core_ops *product_base_ops = NULL; + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + product_base_ops->phy_remove(adapter); } -int nbl_core_start(const struct nbl_adapter *adapter) +int nbl_core_start(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); return 0; } -void nbl_core_stop(const struct nbl_adapter *adapter) +void nbl_core_stop(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 4ba13e5bd7..2d0e39afa2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -5,7 +5,8 @@ #ifndef _NBL_CORE_H_ #define _NBL_CORE_H_ -#include "nbl_include.h" +#include "nbl_product_base.h" +#include "nbl_def_phy.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -27,14 +28,33 @@ #define NBL_DEVICE_ID_M18100_VF(0x3413) #define NBL_MAX_INSTANCE_CNT 516 + +#define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) +#define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) + +struct nbl_core { + void *phy_mgt; + void *res_mgt; + void *disp_mgt; + void *chan_mgt; + void *dev_mgt; +}; + +st
[PATCH v2 01/16] net/nbl: add doc and minimum nbl build framework
add minimum PMD code, doc and build infrastructure for nbl driver. Signed-off-by: dimon.zhao --- .mailmap | 5 MAINTAINERS | 9 +++ doc/guides/nics/features/nbl.ini | 9 +++ doc/guides/nics/index.rst| 1 + doc/guides/nics/nbl.rst | 42 drivers/net/meson.build | 1 + drivers/net/nbl/meson.build | 11 + drivers/net/nbl/nbl_ethdev.c | 3 +++ 8 files changed, 81 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_ethdev.c diff --git a/.mailmap b/.mailmap index 8483d96ec5..c46d273447 100644 --- a/.mailmap +++ b/.mailmap @@ -362,6 +362,7 @@ Diana Wang Didier Pallard Dilshod Urazov Dima Ruinskiy +Dimon Zhao Ding Zhi Diogo Behrens Dirk-Holger Lenz @@ -833,6 +834,7 @@ Kumar Amber Kumara Parameshwaran Kumar Sanghvi Kyle Larose +Kyo Liu Lance Richardson Laszlo Ersek Laura Stroe @@ -847,6 +849,7 @@ Lei Gong Lei Ji Lei Yao Leonid Myravjev +Leon Yu Leo Xu Leszek Zygo Levend Sayar @@ -1352,6 +1355,7 @@ Saikrishna Edupuganti Saleh Alsouqi Salem Sol Sam Andrew +Sam Chen Sameh Gobriel Sam Grove Samik Gupta @@ -1850,3 +1854,4 @@ Ziye Yang Zoltan Kiss Zorik Machulsky Zyta Szpak +Leon Yu diff --git a/MAINTAINERS b/MAINTAINERS index 0e9357f3a3..5d0ff04999 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1010,6 +1010,15 @@ F: drivers/net/rnp/ F: doc/guides/nics/rnp.rst F: doc/guides/nics/features/rnp.ini +nebulamatrix nbl +M: Dimon Zhao +M: Kyo Liu +M: Leon Yu +M: Sam Chen +F: drivers/net/nbl +F: doc/guides/nics/nbl.rst +F: doc/guides/nics/features/nbl.ini + Realtek r8169 M: Howard Wang M: Chunhao Lin diff --git a/doc/guides/nics/features/nbl.ini b/doc/guides/nics/features/nbl.ini new file mode 100644 index 00..6daabe6ed3 --- /dev/null +++ b/doc/guides/nics/features/nbl.ini @@ -0,0 +1,9 @@ +; +; Supported features of the 'nbl' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Linux= Y +ARMv8= Y +x86-64 = Y diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst index 57d161c526..84d4ece101 100644 --- a/doc/guides/nics/index.rst +++ b/doc/guides/nics/index.rst @@ -50,6 +50,7 @@ Network Interface Controller Drivers mvneta mvpp2 netvsc +nbl nfb nfp ngbe diff --git a/doc/guides/nics/nbl.rst b/doc/guides/nics/nbl.rst new file mode 100644 index 00..6cd09fe97f --- /dev/null +++ b/doc/guides/nics/nbl.rst @@ -0,0 +1,42 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2025 Nebulamatrix Technology Co., Ltd + +NBL Poll Mode Driver + + +The NBL PMD (**librte_net_nbl**) provides poll mode driver support for +10/25/50/100/200 Gbps Nebulamatrix Series Network Adapters. + + +Supported NICs +-- + +The following Nebulamatrix device models are supported by the same nbl driver: + + - S1205CQ-A00CHT + - S1105AS-A00CHT + - S1055AS-A00CHT + - S1052AS-A00CHT + - S1051AS-A00CHT + - S1045XS-A00CHT + - S1205CQ-A00CSP + - S1055AS-A00CSP + - S1052AS-A00CSP + + +Prerequisites +- + +- Follow the DPDK :ref:`Getting Started Guide for Linux ` + to setup the basic DPDK environment. + +- Learn about `Nebulamatrix Series NICs + <https://www.nebula-matrix.com/main>`_. + + +Limitations or Known Issues +--- + +32-bit architectures are not supported. + +Windows and BSD are not supported yet. diff --git a/drivers/net/meson.build b/drivers/net/meson.build index 61f8cddb30..517e78d18b 100644 --- a/drivers/net/meson.build +++ b/drivers/net/meson.build @@ -40,6 +40,7 @@ drivers = [ 'mlx5', 'mvneta', 'mvpp2', +'nbl', 'netvsc', 'nfb', 'nfp', diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build new file mode 100644 index 00..4cfbdb023f --- /dev/null +++ b/drivers/net/nbl/meson.build @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2025 NebulaMatrix Technology Co., Ltd. + +if not is_linux +build = false +reason = 'only supported on Linux' +endif + +sources = files( +'nbl_ethdev.c', +) diff --git a/drivers/net/nbl/nbl_ethdev.c b/drivers/net/nbl/nbl_ethdev.c new file mode 100644 index 00..3ad8e4033a --- /dev/null +++ b/drivers/net/nbl/nbl_ethdev.c @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ -- 2.34.1
[PATCH v2 09/16] net/nbl: add UIO and VFIO mode for nbl
NBL device support UIO/VFIO Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_common/nbl_userdev.c | 24 +++ drivers/net/nbl/nbl_common/nbl_userdev.h | 10 .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 7 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 4 5 files changed, 46 insertions(+) create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 7f4abd3db0..a3e700d93d 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -16,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', + 'nbl_common/nbl_userdev.c', 'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c new file mode 100644 index 00..87b943ccd7 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_userdev.h" + +int nbl_pci_map_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + int ret = 0; + + ret = rte_pci_map_device(pci_dev); + if (ret) + NBL_LOG(ERR, "device %s uio or vfio map failed", pci_dev->device.name); + + return ret; +} + +void nbl_pci_unmap_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + + return rte_pci_unmap_device(pci_dev); +} diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.h b/drivers/net/nbl/nbl_common/nbl_userdev.h new file mode 100644 index 00..11cc2c --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_USERDEV_H_ +#define _NBL_USERDEV_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c index 49ada3b525..9ed375bc1e 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c @@ -183,6 +183,11 @@ int nbl_phy_init_leonis_snic(void *p) phy_mgt_leonis_snic = (struct nbl_phy_mgt_leonis_snic **)&NBL_ADAPTER_TO_PHY_MGT(adapter); phy_ops_tbl = &NBL_ADAPTER_TO_PHY_OPS_TBL(adapter); + /* map device */ + ret = nbl_pci_map_device(adapter); + if (ret) + return ret; + *phy_mgt_leonis_snic = rte_zmalloc("nbl_phy_mgt", sizeof(struct nbl_phy_mgt_leonis_snic), 0); if (!*phy_mgt_leonis_snic) { @@ -205,6 +210,7 @@ int nbl_phy_init_leonis_snic(void *p) setup_ops_failed: rte_free(*phy_mgt_leonis_snic); alloc_phy_mgt_failed: + nbl_pci_unmap_device(adapter); return ret; } @@ -220,4 +226,5 @@ void nbl_phy_remove_leonis_snic(void *p) rte_free(*phy_mgt_leonis_snic); nbl_phy_remove_ops(phy_ops_tbl); + nbl_pci_unmap_device(adapter); } diff --git a/drivers/net/nbl/nbl_include/nbl_def_common.h b/drivers/net/nbl/nbl_include/nbl_def_common.h index b7955abfab..0b87c3003d 100644 --- a/drivers/net/nbl/nbl_include/nbl_def_common.h +++ b/drivers/net/nbl/nbl_include/nbl_def_common.h @@ -48,4 +48,8 @@ void nbl_free_dma_mem(struct nbl_dma_mem *mem); int nbl_thread_add_work(struct nbl_work *work); void nbl_thread_del_work(struct nbl_work *work); +struct nbl_adapter; +int nbl_pci_map_device(struct nbl_adapter *adapter); +void nbl_pci_unmap_device(struct nbl_adapter *adapter); + #endif -- 2.34.1
[PATCH v2 15/16] net/nbl: add nbl device xstats and stats
Implement NBL device xstats and stats functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 148 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 2 + drivers/net/nbl/nbl_dispatch.c| 111 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 113 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 113 - drivers/net/nbl/nbl_include/nbl_def_channel.h | 5 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 9 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 12 +- drivers/net/nbl/nbl_include/nbl_include.h | 4 + 9 files changed, 511 insertions(+), 6 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 949d42506d..4fa132ae1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -384,6 +384,129 @@ static int nbl_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_ return disp_ops->get_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), rte_stats); } +static int nbl_stats_reset(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + return disp_ops->reset_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt)); +} + +static int nbl_dev_update_hw_xstats(struct nbl_dev_mgt *dev_mgt, struct rte_eth_xstat *xstats, + u16 hw_xstats_cnt, u16 *xstats_cnt) +{ + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u64 *hw_stats; + int i; + u16 count = *xstats_cnt; + + hw_stats = rte_zmalloc("nbl_xstats_cnt", hw_xstats_cnt * sizeof(u64), 0); + if (!hw_stats) + return -ENOMEM; + + disp_ops->get_private_stat_data(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + common->eth_id, hw_stats, hw_xstats_cnt * sizeof(u64)); + for (i = 0; i < hw_xstats_cnt; i++) { + xstats[count].value = hw_stats[i] - dev_mgt->net_dev->hw_xstats_offset[i]; + xstats[count].id = count; + count++; + } + + *xstats_cnt = count; + rte_free(hw_stats); + return 0; +} + +static int nbl_xstats_get(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat *xstats, unsigned int n) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + int ret = 0; + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + + if (!xstats) + return 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (n < (txrx_xstats_cnt + hw_xstats_cnt)) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) + ret = disp_ops->get_txrx_xstats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + xstats, &xstats_cnt); + if (hw_xstats_cnt) + ret |= nbl_dev_update_hw_xstats(dev_mgt, xstats, hw_xstats_cnt, &xstats_cnt); + + if (ret) + return -EIO; + + return xstats_cnt; +} + +static int nbl_xstats_get_names(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat_name *xstats_names, + __rte_unused unsigned int limit) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + int ret = 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (!xstats_names) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) +
[PATCH v2 14/16] net/nbl: add nbl device Tx and Rx burst
Implement NBL device Tx and Rx burst Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 108 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 5 + drivers/net/nbl/nbl_dispatch.c| 62 drivers/net/nbl/nbl_ethdev.c | 7 + drivers/net/nbl/nbl_ethdev.h | 19 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 1 + drivers/net/nbl/nbl_hw/nbl_resource.h | 2 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 325 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 19 +- drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 + drivers/net/nbl/nbl_include/nbl_def_channel.h | 4 + drivers/net/nbl/nbl_include/nbl_def_common.h | 1 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 3 + .../net/nbl/nbl_include/nbl_def_resource.h| 7 + drivers/net/nbl/nbl_include/nbl_include.h | 31 ++ 15 files changed, 683 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx_ops.h diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index bdd06613e6..949d42506d 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -291,6 +291,99 @@ static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); } +static int nbl_dev_infos_get(struct rte_eth_dev *eth_dev __rte_unused, +struct rte_eth_dev_info *dev_info) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_board_port_info *board_info = &dev_mgt->common->board_info; + u8 speed_mode = board_info->speed; + + dev_info->min_mtu = RTE_ETHER_MIN_MTU; + dev_info->max_mtu = NBL_MAX_JUMBO_FRAME_SIZE - NBL_PKT_HDR_PAD; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + dev_info->max_mac_addrs = dev_mgt->net_dev->max_mac_num; + dev_info->max_rx_queues = ring_mgt->rx_ring_num; + dev_info->max_tx_queues = ring_mgt->tx_ring_num; + /* rx buffer size must be 2KB, 4KB, 8KB or 16KB */ + dev_info->min_rx_bufsize = NBL_DEV_MIN_RX_BUFSIZE; + dev_info->flow_type_rss_offloads = NBL_RSS_OFFLOAD_TYPE; + + dev_info->hash_key_size = NBL_EPRO_RSS_SK_SIZE; + + dev_info->tx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->rx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->speed_capa = RTE_ETH_LINK_SPEED_10G; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + + dev_info->default_rxportconf.nb_queues = ring_mgt->rx_ring_num; + dev_info->default_txportconf.nb_queues = ring_mgt->tx_ring_num; + dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_UDP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_TSO | + RTE_ETH_TX_OFFLOAD_UDP_TSO | + RTE_ETH_TX_OFFLOAD_MULTI_SEGS; + dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM | + RTE_ETH_RX_OFFLOAD_SCATTER; + + switch (speed_mode) { + case NBL_FW_PORT_SPEED_100G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_50G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_50G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_25G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_25G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_10G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_10G; + break; + default: + dev_info->speed_capa = RTE_ETH_LINK_SPEED_25G; + } + + return 0; +} + +static int nbl_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct rte_eth_link link = { 0 }; + + link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; + link.link_status = !!dev_mgt->net_dev->eth_link_info.link_status; + if (link.link_status) + link.link_speed = dev_mgt->net_dev-&g
[PATCH v2 16/16] net/nbl: nbl device support set MTU and promisc
Implement NBL device set MTU and promisc functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.h| 2 + drivers/net/nbl/nbl_dev/nbl_dev.c | 60 +++ drivers/net/nbl/nbl_dev/nbl_dev.h | 4 +- drivers/net/nbl/nbl_dispatch.c| 77 +++ drivers/net/nbl/nbl_dispatch.h| 2 + drivers/net/nbl/nbl_ethdev.c | 31 +--- drivers/net/nbl/nbl_include/nbl_def_channel.h | 10 +++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 1 + .../net/nbl/nbl_include/nbl_def_resource.h| 2 + 9 files changed, 176 insertions(+), 13 deletions(-) diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 997544b112..d3fe1d02d2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -51,6 +51,8 @@ #define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ _common->nl_socket_route < 0 || \ _common->ifindex < 0; }) +#define NBL_IS_COEXISTENCE(common) ((common)->devfd != -1) + struct nbl_core { void *phy_mgt; void *res_mgt; diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4fa132ae1c..6e26989e1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -507,6 +507,63 @@ static int nbl_xstats_reset(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + uint32_t frame_size = mtu + NBL_ETH_OVERHEAD; + int ret; + + /* check if mtu is within the allowed range */ + if (mtu < RTE_ETHER_MIN_MTU || frame_size > NBL_FRAME_SIZE_MAX) + return -EINVAL; + + /* mtu setting is forbidden if port is start */ + if (dev_data->dev_started) { + NBL_LOG(ERR, "port %d must be stopped before configuration", dev_data->port_id); + return -EBUSY; + } + + dev_data->dev_conf.rxmode.mtu = frame_size; + ret = disp_ops->set_mtu(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, mtu); + if (ret) + return ret; + + return 0; +} + +static int nbl_promiscuous_enable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 1); + dev_mgt->net_dev->promisc = 1; + + return 0; +} + +static int nbl_promiscuous_disable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 0); + dev_mgt->net_dev->promisc = 0; + + return 0; +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, @@ -523,6 +580,9 @@ struct nbl_dev_ops dev_ops = { .xstats_get = nbl_xstats_get, .xstats_get_names = nbl_xstats_get_names, .xstats_reset = nbl_xstats_reset, + .promiscuous_disable = nbl_promiscuous_disable, + .promiscuous_enable = nbl_promiscuous_enable, + .mtu_set = nbl_mtu_set, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.h b/drivers/net/nbl/nbl_dev/nbl_dev.h index 1541aebba5..a97a53bc02 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.h +++ b/drivers/net/nbl/nbl_dev/nbl_dev.h @@ -47,7 +47,9 @@ struct nbl_dev_net_mgt { u8 eth_mode; u8 eth_id; u16 max_mac_num; - bool trust; + u8 trust:1; + u8 promisc:1; + u8 rsv:6; }; struct nbl_dev_mgt { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c index a9a23f8083..9eb868f504 100644 --- a/drivers/net/nbl/nbl_dispatch.c +++ b/drivers/net/nbl/nbl_dispa
[PATCH v2 13/16] net/nbl: add nbl device start and stop ops
Implement NBL device start and stop functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 173 +- drivers/net/nbl/nbl_dispatch.c| 121 +++- drivers/net/nbl/nbl_ethdev.c | 5 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 72 +++- drivers/net/nbl/nbl_hw/nbl_txrx.h | 14 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 20 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 6 +- .../net/nbl/nbl_include/nbl_def_dispatch.h| 2 +- .../net/nbl/nbl_include/nbl_def_resource.h| 4 + drivers/net/nbl/nbl_include/nbl_include.h | 6 +- 10 files changed, 392 insertions(+), 31 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4faa58ace8..bdd06613e6 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,22 +38,179 @@ static int nbl_dev_configure(struct rte_eth_dev *eth_dev) return ret; } +static int nbl_dev_txrx_start(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_txrx_queue_param param = {0}; + struct nbl_dev_ring *ring; + int ret = 0; + int i; + + eth_dev->data->scattered_rx = 0; + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + ring = &ring_mgt->tx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.extend_header = 1; + param.split = 0; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, true); + if (ret) { + NBL_LOG(ERR, "setup_tx_queue failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + eth_dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + ring = &ring_mgt->rx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.half_offload_en = 1; + param.extend_header = 1; + param.split = 0; + param.rxcsum = 1; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, false); + if (ret) { + NBL_LOG(ERR, "setup_rx_queue failed %d", ret); + return ret; + } + + ret = disp_ops->alloc_rx_bufs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + if (ret) { + NBL_LOG(ERR, "alloc_rx_bufs failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + disp_ops->update_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + eth_dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + ret = disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, true); + if (ret) { + NBL_LOG(ERR, "cfg_dsch failed %d", ret); + goto cfg_dsch_fail; + } + ret = disp_ops->setup_cqs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, eth_dev->data->nb_rx_queues, true); + if (ret) + goto setup_cqs_fail; + + return ret; + +setup_cqs_fail: + disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, false); +cfg_dsch_fail: + disp_ops->remove_all_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id); + + return ret; +} + static int nbl_dev_port_start(struct rte_e
[PATCH v2 11/16] net/nbl: add nbl ethdev configuration
NBL device add ethdev configuration Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 33 +-- drivers/net/nbl/nbl_include/nbl_include.h | 3 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index f02ed7f94e..4eea07c1ff 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -4,15 +4,44 @@ #include "nbl_dev.h" -static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +static int nbl_dev_port_configure(struct nbl_adapter *adapter) { - RTE_SET_USED(eth_dev); + adapter->state = NBL_ETHDEV_CONFIGURED; + return 0; } +static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + int ret; + + NBL_LOG(INFO, "Begin to configure the device, state: %d", adapter->state); + + if (dev_data == NULL || adapter == NULL) + return -EINVAL; + + dev_data->dev_conf.intr_conf.lsc = 0; + + switch (adapter->state) { + case NBL_ETHDEV_CONFIGURED: + case NBL_ETHDEV_INITIALIZED: + ret = nbl_dev_port_configure(adapter); + break; + default: + ret = -EINVAL; + break; + } + + NBL_LOG(INFO, "configure the device done %d", ret); + return ret; +} + static int nbl_dev_port_start(struct rte_eth_dev *eth_dev) { RTE_SET_USED(eth_dev); + return 0; } diff --git a/drivers/net/nbl/nbl_include/nbl_include.h b/drivers/net/nbl/nbl_include/nbl_include.h index 2f5e426c91..33b2c25684 100644 --- a/drivers/net/nbl/nbl_include/nbl_include.h +++ b/drivers/net/nbl/nbl_include/nbl_include.h @@ -131,9 +131,10 @@ struct nbl_common_info { /* curr_network 0 means kernel network, 1 means user network */ u8 curr_network:1; u8 is_vf:1; + u8 pf_start:1; u8 specific_dma:1; u8 dma_set_msb:1; - u8 rsv:3; + u8 rsv:2; struct nbl_board_port_info board_info; }; -- 2.34.1
[PATCH v2 00/16] NBL PMD for Nebulamatrix NICs
Features: - - MTU update - promisc mode set - xstats - Basic stats Support NICs: - - S1205CQ-A00CHT - S1105AS-A00CHT - S1055AS-A00CHT - S1052AS-A00CHT - S1051AS-A00CHT - S1045XS-A00CHT - S1205CQ-A00CSP - S1055AS-A00CSP - S1052AS-A00CSP Dimon Zhao (16): net/nbl: add doc and minimum nbl build framework net/nbl: add simple probe/remove and log module net/nbl: add PHY layer definitions and implementation net/nbl: add Channel layer definitions and implementation net/nbl: add Resource layer definitions and implementation net/nbl: add Dispatch layer definitions and implementation net/nbl: add Dev layer definitions and implementation net/nbl: add complete device init and uninit functionality net/nbl: add UIO and VFIO mode for nbl net/nbl: add nbl coexistence mode for nbl net/nbl: add nbl ethdev configuration net/nbl: add nbl device rxtx queue setup and release ops net/nbl: add nbl device start and stop ops net/nbl: add nbl device Tx and Rx burst net/nbl: add nbl device xstats and stats net/nbl: nbl device support set MTU and promisc .mailmap |5 + MAINTAINERS |9 + doc/guides/nics/features/nbl.ini |9 + doc/guides/nics/index.rst |1 + doc/guides/nics/nbl.rst | 42 + drivers/net/meson.build |1 + drivers/net/nbl/meson.build | 26 + drivers/net/nbl/nbl_common/nbl_common.c | 47 + drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 ++ drivers/net/nbl/nbl_common/nbl_userdev.c | 743 ++ drivers/net/nbl/nbl_common/nbl_userdev.h | 21 + drivers/net/nbl/nbl_core.c| 100 ++ drivers/net/nbl/nbl_core.h| 98 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 1007 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 65 + drivers/net/nbl/nbl_dispatch.c| 1227 + drivers/net/nbl/nbl_dispatch.h| 31 + drivers/net/nbl/nbl_ethdev.c | 161 +++ drivers/net/nbl/nbl_ethdev.h | 32 + drivers/net/nbl/nbl_hw/nbl_channel.c | 853 drivers/net/nbl/nbl_hw/nbl_channel.h | 127 ++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 230 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 53 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 253 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 + drivers/net/nbl/nbl_hw/nbl_phy.h | 28 + drivers/net/nbl/nbl_hw/nbl_resource.c |5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 153 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 907 drivers/net/nbl/nbl_hw/nbl_txrx.h | 136 ++ drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 434 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 128 ++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 ++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 95 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 + .../net/nbl/nbl_include/nbl_def_resource.h| 87 ++ drivers/net/nbl/nbl_include/nbl_include.h | 203 +++ drivers/net/nbl/nbl_include/nbl_logs.h| 25 + .../net/nbl/nbl_include/nbl_product_base.h| 37 + 41 files changed, 7720 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_ethdev.c create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nb
[PATCH v3 04/16] net/nbl: add Channel layer definitions and implementation
add Channel layer related definitions and nbl_thread for mbx interact Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_common/nbl_common.c | 47 ++ drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 +++ drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 6 + drivers/net/nbl/nbl_hw/nbl_channel.c | 672 ++ drivers/net/nbl/nbl_hw/nbl_channel.h | 116 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 124 .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 43 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 326 + drivers/net/nbl/nbl_include/nbl_def_common.h | 40 ++ drivers/net/nbl/nbl_include/nbl_include.h | 8 + 13 files changed, 1492 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_channel.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_common.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4ec1273100..c849cab185 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,5 +12,8 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_common/nbl_common.c', +'nbl_common/nbl_thread.c', +'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_common/nbl_common.c b/drivers/net/nbl/nbl_common/nbl_common.c new file mode 100644 index 00..bcd82578ac --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.c @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +/** + * @brief: used to alloc continuous dma memory region for cmd buffer + * @mem: output, the memory object containing va, pa and size of memory + * @size: input, memory size in bytes + * @return: memory virtual address for cpu usage + */ +void *nbl_alloc_dma_mem(struct nbl_dma_mem *mem, uint32_t size) +{ + uint64_t __rte_atomic nbl_dma_memzone_id; + const struct rte_memzone *mz = NULL; + char z_name[RTE_MEMZONE_NAMESIZE]; + + if (!mem) + return NULL; + + snprintf(z_name, sizeof(z_name), "nbl_dma_%" NBL_PRIU64 "", + rte_atomic_fetch_add_explicit(&nbl_dma_memzone_id, 1, rte_memory_order_relaxed)); + mz = rte_memzone_reserve_bounded(z_name, size, SOCKET_ID_ANY, 0, +0, RTE_PGSIZE_2M); + if (!mz) + return NULL; + + mem->size = size; + mem->va = mz->addr; + mem->pa = mz->iova; + mem->zone = (const void *)mz; + + return mem->va; +} + +/** + * @brief: used to free dma memory region + * @mem: input, the memory object + */ +void nbl_free_dma_mem(struct nbl_dma_mem *mem) +{ + rte_memzone_free((const struct rte_memzone *)mem->zone); + mem->zone = NULL; + mem->va = NULL; + mem->pa = (uint64_t)0; +} diff --git a/drivers/net/nbl/nbl_common/nbl_common.h b/drivers/net/nbl/nbl_common/nbl_common.h new file mode 100644 index 00..7ff028f5a9 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_common.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_COMMON_H_ +#define _NBL_COMMON_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_common/nbl_thread.c b/drivers/net/nbl/nbl_common/nbl_thread.c new file mode 100644 index 00..b6a2f97fad --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_thread.c @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_common.h" + +static rte_spinlock_t nbl_work_list_lock = RTE_SPINLOCK_INITIALIZER; +TAILQ_HEAD(nbl_work_list_head, nbl_work); +rte_thread_t nbl_work_tid; +static bool thread_exit; + +static struct nbl_work_list_head nbl_work_list = TAILQ_HEAD_INITIALIZER(nbl_work_list); + +static uint32_t nbl_thread_polling_task(__rte_unused void *param) +{ + struct timespec time; + struct nbl_work *work; + struct nbl_work *work_tmp; + int i = 0; + + time.tv_sec = 0; + time.tv_nsec = 10; + + while (true) { + i++; + rte_spinlock_lock(&nbl_work_list_lock); + RTE_TAILQ_FORE
[PATCH v3 08/16] net/nbl: add complete device init and uninit functionality
NBL device is a concept of low level device which used to manage hw resource and to interact with fw Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.c| 8 +- drivers/net/nbl/nbl_core.h| 7 + drivers/net/nbl/nbl_dev/nbl_dev.c | 248 +++- drivers/net/nbl/nbl_dev/nbl_dev.h | 32 + drivers/net/nbl/nbl_dispatch.c| 548 +++--- drivers/net/nbl/nbl_ethdev.c | 26 + drivers/net/nbl/nbl_hw/nbl_resource.h | 1 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 30 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 51 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 7 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 7 +- .../net/nbl/nbl_include/nbl_def_resource.h| 18 + drivers/net/nbl/nbl_include/nbl_include.h | 61 ++ 13 files changed, 955 insertions(+), 89 deletions(-) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 1a6a6bc11d..f4ddc9e219 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -20,7 +20,7 @@ static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_ty return &nbl_product_core_ops[product_type]; } -static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +static void nbl_init_func_caps(const struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) { if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) @@ -29,8 +29,8 @@ static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_c int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) { - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); - struct nbl_product_core_ops *product_base_ops = NULL; + const struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + const struct nbl_product_core_ops *product_base_ops = NULL; int ret = 0; nbl_init_func_caps(pci_dev, &adapter->caps); @@ -74,7 +74,7 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) void nbl_core_remove(struct nbl_adapter *adapter) { - struct nbl_product_core_ops *product_base_ops = NULL; + const struct nbl_product_core_ops *product_base_ops = NULL; product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 9a05bbee48..bdf31e15da 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -46,6 +46,12 @@ #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) #define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) +#define NBL_ADAPTER_TO_COMMON(adapter) (&((adapter)->common)) + +#define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ + _common->nl_socket_route < 0 || \ + _common->ifindex < 0; }) + struct nbl_core { void *phy_mgt; void *res_mgt; @@ -80,6 +86,7 @@ struct nbl_adapter { struct nbl_interface intf; struct nbl_func_caps caps; enum nbl_ethdev_state state; + struct nbl_common_info common; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 86006d6762..f02ed7f94e 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,7 +38,7 @@ struct nbl_dev_ops dev_ops = { static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->setup_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -49,7 +49,7 @@ static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) static int nbl_dev_teardown_chan_queue(struct nbl_adapter *adapter) { struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); - struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); + const struct nbl_channel_ops *chan_ops = NBL_DEV_MGT_TO_CHAN_OPS(dev_mgt); int ret = 0; ret = chan_ops->teardown_queue(NBL_DEV_MGT_TO_CHAN_PRIV(dev_mgt)); @@ -67,15 +67,67 @@ static void nbl_dev_leonis_uninit(void *adapter) nbl_dev_teardown_chan_queue((struct nbl_adapter *)adapter); } +static int nbl_dev_common_start(struct nbl_dev_mgt *dev_mgt) +{ + const struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + s
[PATCH v3 06/16] net/nbl: add Dispatch layer definitions and implementation
add Dispatch layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_core.c| 7 + drivers/net/nbl/nbl_core.h| 4 + drivers/net/nbl/nbl_dispatch.c| 466 ++ drivers/net/nbl/nbl_dispatch.h| 29 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 18 + drivers/net/nbl/nbl_include/nbl_def_common.h | 4 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 77 +++ .../net/nbl/nbl_include/nbl_def_resource.h| 5 + drivers/net/nbl/nbl_include/nbl_include.h | 17 + 10 files changed, 628 insertions(+) create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dispatch.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index f34121260e..23601727ef 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -12,6 +12,7 @@ includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 70600401fe..548eb3a2fd 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -50,8 +50,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto res_init_fail; + ret = nbl_disp_init(adapter); + if (ret) + goto disp_init_fail; + return 0; +disp_init_fail: + product_base_ops->res_remove(adapter); res_init_fail: product_base_ops->chan_remove(adapter); chan_init_fail: @@ -66,6 +72,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index f693913b47..2730539050 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -10,6 +10,7 @@ #include "nbl_def_phy.h" #include "nbl_def_channel.h" #include "nbl_def_resource.h" +#include "nbl_def_dispatch.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -35,10 +36,12 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) +#define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) +#define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) struct nbl_core { void *phy_mgt; @@ -52,6 +55,7 @@ struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; + struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c new file mode 100644 index 00..10a95da6bc --- /dev/null +++ b/drivers/net/nbl/nbl_dispatch.c @@ -0,0 +1,466 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_dispatch.h" + +static int nbl_disp_alloc_txrx_queues(void *priv, u16 vsi_id, u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_resource_ops *res_ops; + + res_ops = NBL_DISP_MGT_TO_RES_OPS(disp_mgt); + return res_ops->alloc_txrx_queues(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt), + vsi_id, queue_num); +} + +static int nbl_disp_chan_alloc_txrx_queues_req(void *priv, u16 vsi_id, + u16 queue_num) +{ + struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv; + struct nbl_channel_ops *chan_ops; + struct nbl_chan_param_alloc_txrx_queues param = {0}; + struct nbl_chan_param_alloc_txrx_queues result = {0}; + struct nbl_chan_send_info chan_send; + + chan_ops = NBL_DISP_MGT_TO_CHAN_OPS(disp_mgt); + + param.vsi_id
[PATCH v3 07/16] net/nbl: add Dev layer definitions and implementation
add Dev layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 14 +- drivers/net/nbl/nbl_core.h| 16 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 200 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 24 +++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 6 files changed, 360 insertions(+), 3 deletions(-) create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_dev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 23601727ef..7f4abd3db0 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -8,6 +8,7 @@ endif includes += include_directories('nbl_include') includes += include_directories('nbl_hw') +includes += include_directories('nbl_common') sources = files( 'nbl_ethdev.c', @@ -15,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', +'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', 'nbl_hw/nbl_txrx.c', diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 548eb3a2fd..1a6a6bc11d 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -54,8 +54,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto disp_init_fail; + ret = nbl_dev_init(adapter, eth_dev); + if (ret) + goto dev_init_fail; + return 0; +dev_init_fail: + nbl_disp_remove(adapter); disp_init_fail: product_base_ops->res_remove(adapter); res_init_fail: @@ -72,6 +78,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + nbl_dev_remove(adapter); nbl_disp_remove(adapter); product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); @@ -80,12 +87,13 @@ void nbl_core_remove(struct nbl_adapter *adapter) int nbl_core_start(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + int ret = 0; - return 0; + ret = nbl_dev_start(adapter); + return ret; } void nbl_core_stop(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + nbl_dev_stop(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 2730539050..9a05bbee48 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -11,6 +11,7 @@ #include "nbl_def_channel.h" #include "nbl_def_resource.h" #include "nbl_def_dispatch.h" +#include "nbl_def_dev.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -37,11 +38,13 @@ #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) #define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_DISP_MGT(adapter) ((adapter)->core.disp_mgt) +#define NBL_ADAPTER_TO_DEV_MGT(adapter) ((adapter)->core.dev_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) #define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) #define NBL_ADAPTER_TO_DISP_OPS_TBL(adapter) ((adapter)->intf.dispatch_ops_tbl) +#define NBL_ADAPTER_TO_DEV_OPS_TBL(adapter)((adapter)->intf.dev_ops_tbl) struct nbl_core { void *phy_mgt; @@ -51,11 +54,23 @@ struct nbl_core { void *dev_mgt; }; +enum nbl_ethdev_state { + NBL_ETHDEV_UNINITIALIZED = 0, + NBL_ETHDEV_INITIALIZED, + NBL_ETHDEV_CONFIGURING, + NBL_ETHDEV_CONFIGURED, + NBL_ETHDEV_CLOSING, + NBL_ETHDEV_STARTING, + NBL_ETHDEV_STARTED, + NBL_ETHDEV_STOPPING, +}; + struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; struct nbl_resource_ops_tbl *resource_ops_tbl; struct nbl_dispatch_ops_tbl *dispatch_ops_tbl; + struct nbl_dev_ops_tbl *dev_ops_tbl; }; struct nbl_adapter { @@ -64,6 +79,7 @@ struct nbl_adapter { struct nbl_core core; struct nbl_interface intf; struct nbl_func_caps caps; + enum nbl_ethdev_state state; }; int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev); diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c new file mode 100644 index 00..86006d6762 --- /
[PATCH v3 05/16] net/nbl: add Resource layer definitions and implementation
add Resource layer related definitions Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 11 +- drivers/net/nbl/nbl_core.h| 4 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 137 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_resource.c | 5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 51 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 148 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 10 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 47 ++ drivers/net/nbl/nbl_include/nbl_include.h | 20 +++ 11 files changed, 444 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_resource.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index c849cab185..f34121260e 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -15,5 +15,8 @@ sources = files( 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', 'nbl_hw/nbl_channel.c', +'nbl_hw/nbl_resource.c', +'nbl_hw/nbl_txrx.c', 'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', +'nbl_hw/nbl_hw_leonis/nbl_res_leonis.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index f4388fe3b5..70600401fe 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -8,8 +8,8 @@ static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { { .phy_init = nbl_phy_init_leonis_snic, .phy_remove = nbl_phy_remove_leonis_snic, - .res_init = NULL, - .res_remove = NULL, + .res_init = nbl_res_init_leonis, + .res_remove = nbl_res_remove_leonis, .chan_init = nbl_chan_init_leonis, .chan_remove= nbl_chan_remove_leonis, }, @@ -46,8 +46,14 @@ int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) if (ret) goto chan_init_fail; + ret = product_base_ops->res_init(adapter, eth_dev); + if (ret) + goto res_init_fail; + return 0; +res_init_fail: + product_base_ops->chan_remove(adapter); chan_init_fail: product_base_ops->phy_remove(adapter); phy_init_fail: @@ -60,6 +66,7 @@ void nbl_core_remove(struct nbl_adapter *adapter) product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + product_base_ops->res_remove(adapter); product_base_ops->chan_remove(adapter); product_base_ops->phy_remove(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index a6c1103c77..f693913b47 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -9,6 +9,7 @@ #include "nbl_def_common.h" #include "nbl_def_phy.h" #include "nbl_def_channel.h" +#include "nbl_def_resource.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -33,9 +34,11 @@ #define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) #define NBL_ADAPTER_TO_CHAN_MGT(adapter) ((adapter)->core.chan_mgt) +#define NBL_ADAPTER_TO_RES_MGT(adapter) ((adapter)->core.res_mgt) #define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) #define NBL_ADAPTER_TO_CHAN_OPS_TBL(adapter) ((adapter)->intf.channel_ops_tbl) +#define NBL_ADAPTER_TO_RES_OPS_TBL(adapter) ((adapter)->intf.resource_ops_tbl) struct nbl_core { void *phy_mgt; @@ -48,6 +51,7 @@ struct nbl_core { struct nbl_interface { struct nbl_phy_ops_tbl *phy_ops_tbl; struct nbl_channel_ops_tbl *channel_ops_tbl; + struct nbl_resource_ops_tbl *resource_ops_tbl; }; struct nbl_adapter { diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c new file mode 100644 index 00..6327aa55b4 --- /dev/null +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c @@ -0,0 +1,137 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_res_leonis.h" + +static struct nbl_resource_ops res_ops = { +}; + +static bool is_ops_inited
[PATCH v3 02/16] net/nbl: add simple probe/remove and log module
Our driver architecture is relatively complex because the code is highly reusable and designed to support multiple features. For example, our driver can support open-source UIO/VFIO drivers while also coexisting with kernel drivers. Additionally, the codebase supports multiple chip variants, each with distinct hardware-software interactions. To ensure compatibility, our architecture is divided into the following layers: 1. Dev Layer (Device Layer) The top-level business logic layer where all DPDK operations are device-centric. Every operation is performed relative to the device context. 2. Dispatch Layer The dispatching layer determines whether tasks from the Dev Layer should be routed to the Resource Layer or Channel Layer based on two criteria: 2.1 The driver type in use (UIO/VFIO vs. vendor-specific driver) 2.2 Whether the task requires hardware access 3. Resource Layer Handles tasks dispatched from the Dev Layer (via Dispatch Layer) in userspace. These tasks fall into two categories: 3.1 Hardware control in userspace (common with UIO/VFIO drivers): The Resource Layer further invokes the PHY Layer when hardware access is needed, as only the PHY Layer has OS-level privileges. 3.2 Software resource management: Operations like packet statistics collection that don't require hardware access. 4. PHY Layer (Physical Layer) Serves the Resource Layer by interacting with different hardware chipsets.Writes to hardware registers to drive the hardware based on Resource Layer directives. 5. Channel Layer Dedicated to coexistence mode with kernel drivers. When a BDF device is shared between two drivers (with the kernel driver as primary), all hardware operations from DPDK are forwarded through this layer to the kernel driver. Exceptions include performance-sensitive operations (e.g., doorbell ringing) handled directly in userspace. Architecture Flow Summary Our top-down architecture varies by driver mode: 1. UIO/VFIO Mode (e.g., configuring a hardware queue) Dev Layer → Dispatch Layer → Resource Layer → PHY Layer The Dispatch Layer routes tasks to the Resource Layer, which interacts with the PHY Layer for hardware writes. 2. Coexistence Mode Dev Layer → Dispatch Layer → Channel Layer The Dispatch Layer redirects hooks to the Channel Layer, which communicates with the kernel driver to configure hardware. This layered approach ensures flexibility across driver types and hardware variants. My subsequent patches will iteratively define and implement each layer’s functionality. Let me know if further clarification would be helpful for the review process. Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 3 + drivers/net/nbl/nbl_core.c| 30 ++ drivers/net/nbl/nbl_core.h| 40 drivers/net/nbl/nbl_ethdev.c | 113 ++ drivers/net/nbl/nbl_ethdev.h | 13 +++ drivers/net/nbl/nbl_include/nbl_include.h | 43 drivers/net/nbl/nbl_include/nbl_logs.h| 25 + 7 files changed, 267 insertions(+) create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_include/nbl_include.h create mode 100644 drivers/net/nbl/nbl_include/nbl_logs.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 4cfbdb023f..013a4126f6 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -6,6 +6,9 @@ if not is_linux reason = 'only supported on Linux' endif +includes += include_directories('nbl_include') + sources = files( 'nbl_ethdev.c', +'nbl_core.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c new file mode 100644 index 00..63b707f0ba --- /dev/null +++ b/drivers/net/nbl/nbl_core.c @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_core.h" + +int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +{ + RTE_SET_USED(adapter); + RTE_SET_USED(eth_dev); + + return 0; +} + +void nbl_core_remove(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} + +int nbl_core_start(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); + + return 0; +} + +void nbl_core_stop(const struct nbl_adapter *adapter) +{ + RTE_SET_USED(adapter); +} diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h new file mode 100644 index 00..4ba13e5bd7 --- /dev/null +++ b/drivers/net/nbl/nbl_core.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_CORE_H_ +#define _NBL_CORE_H_ + +#include "nbl_include.h" + +#define NBL_VENDOR_ID (0x1F0F)
[PATCH v3 01/16] net/nbl: add doc and minimum nbl build framework
add minimum PMD code, doc and build infrastructure for nbl driver. Signed-off-by: dimon.zhao --- .mailmap | 4 +++ MAINTAINERS | 9 +++ doc/guides/nics/features/nbl.ini | 9 +++ doc/guides/nics/index.rst| 1 + doc/guides/nics/nbl.rst | 42 drivers/net/meson.build | 1 + drivers/net/nbl/meson.build | 11 + drivers/net/nbl/nbl_ethdev.c | 3 +++ 8 files changed, 80 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_ethdev.c diff --git a/.mailmap b/.mailmap index 8483d96ec5..406ea0621f 100644 --- a/.mailmap +++ b/.mailmap @@ -362,6 +362,7 @@ Diana Wang Didier Pallard Dilshod Urazov Dima Ruinskiy +Dimon Zhao Ding Zhi Diogo Behrens Dirk-Holger Lenz @@ -833,6 +834,7 @@ Kumar Amber Kumara Parameshwaran Kumar Sanghvi Kyle Larose +Kyo Liu Lance Richardson Laszlo Ersek Laura Stroe @@ -847,6 +849,7 @@ Lei Gong Lei Ji Lei Yao Leonid Myravjev +Leon Yu Leo Xu Leszek Zygo Levend Sayar @@ -1352,6 +1355,7 @@ Saikrishna Edupuganti Saleh Alsouqi Salem Sol Sam Andrew +Sam Chen Sameh Gobriel Sam Grove Samik Gupta diff --git a/MAINTAINERS b/MAINTAINERS index 0e9357f3a3..ee043e29ea 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1010,6 +1010,15 @@ F: drivers/net/rnp/ F: doc/guides/nics/rnp.rst F: doc/guides/nics/features/rnp.ini +Nebulamatrix nbl +M: Dimon Zhao +M: Kyo Liu +M: Leon Yu +M: Sam Chen +F: drivers/net/nbl +F: doc/guides/nics/nbl.rst +F: doc/guides/nics/features/nbl.ini + Realtek r8169 M: Howard Wang M: Chunhao Lin diff --git a/doc/guides/nics/features/nbl.ini b/doc/guides/nics/features/nbl.ini new file mode 100644 index 00..6daabe6ed3 --- /dev/null +++ b/doc/guides/nics/features/nbl.ini @@ -0,0 +1,9 @@ +; +; Supported features of the 'nbl' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Linux= Y +ARMv8= Y +x86-64 = Y diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst index 57d161c526..84d4ece101 100644 --- a/doc/guides/nics/index.rst +++ b/doc/guides/nics/index.rst @@ -50,6 +50,7 @@ Network Interface Controller Drivers mvneta mvpp2 netvsc +nbl nfb nfp ngbe diff --git a/doc/guides/nics/nbl.rst b/doc/guides/nics/nbl.rst new file mode 100644 index 00..6cd09fe97f --- /dev/null +++ b/doc/guides/nics/nbl.rst @@ -0,0 +1,42 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2025 Nebulamatrix Technology Co., Ltd + +NBL Poll Mode Driver + + +The NBL PMD (**librte_net_nbl**) provides poll mode driver support for +10/25/50/100/200 Gbps Nebulamatrix Series Network Adapters. + + +Supported NICs +-- + +The following Nebulamatrix device models are supported by the same nbl driver: + + - S1205CQ-A00CHT + - S1105AS-A00CHT + - S1055AS-A00CHT + - S1052AS-A00CHT + - S1051AS-A00CHT + - S1045XS-A00CHT + - S1205CQ-A00CSP + - S1055AS-A00CSP + - S1052AS-A00CSP + + +Prerequisites +- + +- Follow the DPDK :ref:`Getting Started Guide for Linux ` + to setup the basic DPDK environment. + +- Learn about `Nebulamatrix Series NICs + <https://www.nebula-matrix.com/main>`_. + + +Limitations or Known Issues +--- + +32-bit architectures are not supported. + +Windows and BSD are not supported yet. diff --git a/drivers/net/meson.build b/drivers/net/meson.build index 61f8cddb30..517e78d18b 100644 --- a/drivers/net/meson.build +++ b/drivers/net/meson.build @@ -40,6 +40,7 @@ drivers = [ 'mlx5', 'mvneta', 'mvpp2', +'nbl', 'netvsc', 'nfb', 'nfp', diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build new file mode 100644 index 00..4cfbdb023f --- /dev/null +++ b/drivers/net/nbl/meson.build @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2025 NebulaMatrix Technology Co., Ltd. + +if not is_linux +build = false +reason = 'only supported on Linux' +endif + +sources = files( +'nbl_ethdev.c', +) diff --git a/drivers/net/nbl/nbl_ethdev.c b/drivers/net/nbl/nbl_ethdev.c new file mode 100644 index 00..3ad8e4033a --- /dev/null +++ b/drivers/net/nbl/nbl_ethdev.c @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ -- 2.34.1
[PATCH v3 00/16] NBL PMD for Nebulamatrix NICs
Features: - - MTU update - promisc mode set - xstats - Basic stats Support NICs: - - S1205CQ-A00CHT - S1105AS-A00CHT - S1055AS-A00CHT - S1052AS-A00CHT - S1051AS-A00CHT - S1045XS-A00CHT - S1205CQ-A00CSP - S1055AS-A00CSP - S1052AS-A00CSP Dimon Zhao (16): net/nbl: add doc and minimum nbl build framework net/nbl: add simple probe/remove and log module net/nbl: add PHY layer definitions and implementation net/nbl: add Channel layer definitions and implementation net/nbl: add Resource layer definitions and implementation net/nbl: add Dispatch layer definitions and implementation net/nbl: add Dev layer definitions and implementation net/nbl: add complete device init and uninit functionality net/nbl: add UIO and VFIO mode for nbl net/nbl: add nbl coexistence mode for nbl net/nbl: add nbl ethdev configuration net/nbl: add nbl device rxtx queue setup and release ops net/nbl: add nbl device start and stop ops net/nbl: add nbl device Tx and Rx burst net/nbl: add nbl device xstats and stats net/nbl: nbl device support set MTU and promisc .mailmap |4 + MAINTAINERS |9 + doc/guides/nics/features/nbl.ini |9 + doc/guides/nics/index.rst |1 + doc/guides/nics/nbl.rst | 42 + drivers/net/meson.build |1 + drivers/net/nbl/meson.build | 26 + drivers/net/nbl/nbl_common/nbl_common.c | 47 + drivers/net/nbl/nbl_common/nbl_common.h | 10 + drivers/net/nbl/nbl_common/nbl_thread.c | 88 ++ drivers/net/nbl/nbl_common/nbl_userdev.c | 743 ++ drivers/net/nbl/nbl_common/nbl_userdev.h | 21 + drivers/net/nbl/nbl_core.c| 100 ++ drivers/net/nbl/nbl_core.h| 98 ++ drivers/net/nbl/nbl_dev/nbl_dev.c | 1007 ++ drivers/net/nbl/nbl_dev/nbl_dev.h | 65 + drivers/net/nbl/nbl_dispatch.c| 1227 + drivers/net/nbl/nbl_dispatch.h| 31 + drivers/net/nbl/nbl_ethdev.c | 161 +++ drivers/net/nbl/nbl_ethdev.h | 32 + drivers/net/nbl/nbl_hw/nbl_channel.c | 853 drivers/net/nbl/nbl_hw/nbl_channel.h | 127 ++ .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 230 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 53 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 253 .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h | 10 + drivers/net/nbl/nbl_hw/nbl_phy.h | 28 + drivers/net/nbl/nbl_hw/nbl_resource.c |5 + drivers/net/nbl/nbl_hw/nbl_resource.h | 153 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 907 drivers/net/nbl/nbl_hw/nbl_txrx.h | 136 ++ drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 ++ drivers/net/nbl/nbl_include/nbl_def_channel.h | 434 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 128 ++ drivers/net/nbl/nbl_include/nbl_def_dev.h | 107 ++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 95 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 + .../net/nbl/nbl_include/nbl_def_resource.h| 87 ++ drivers/net/nbl/nbl_include/nbl_include.h | 203 +++ drivers/net/nbl/nbl_include/nbl_logs.h| 25 + .../net/nbl/nbl_include/nbl_product_base.h| 37 + 41 files changed, 7719 insertions(+) create mode 100644 doc/guides/nics/features/nbl.ini create mode 100644 doc/guides/nics/nbl.rst create mode 100644 drivers/net/nbl/meson.build create mode 100644 drivers/net/nbl/nbl_common/nbl_common.c create mode 100644 drivers/net/nbl/nbl_common/nbl_common.h create mode 100644 drivers/net/nbl/nbl_common/nbl_thread.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h create mode 100644 drivers/net/nbl/nbl_core.c create mode 100644 drivers/net/nbl/nbl_core.h create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.c create mode 100644 drivers/net/nbl/nbl_dev/nbl_dev.h create mode 100644 drivers/net/nbl/nbl_dispatch.c create mode 100644 drivers/net/nbl/nbl_dispatch.h create mode 100644 drivers/net/nbl/nbl_ethdev.c create mode 100644 drivers/net/nbl/nbl_ethdev.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_channel.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_resource.h create mode 100644 drivers/net/nbl/nbl_hw/nb
[PATCH v3 13/16] net/nbl: add nbl device start and stop ops
Implement NBL device start and stop functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 173 +- drivers/net/nbl/nbl_dispatch.c| 121 +++- drivers/net/nbl/nbl_ethdev.c | 5 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 72 +++- drivers/net/nbl/nbl_hw/nbl_txrx.h | 14 +- drivers/net/nbl/nbl_include/nbl_def_channel.h | 20 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 6 +- .../net/nbl/nbl_include/nbl_def_dispatch.h| 2 +- .../net/nbl/nbl_include/nbl_def_resource.h| 4 + drivers/net/nbl/nbl_include/nbl_include.h | 6 +- 10 files changed, 392 insertions(+), 31 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4faa58ace8..bdd06613e6 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -38,22 +38,179 @@ static int nbl_dev_configure(struct rte_eth_dev *eth_dev) return ret; } +static int nbl_dev_txrx_start(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_txrx_queue_param param = {0}; + struct nbl_dev_ring *ring; + int ret = 0; + int i; + + eth_dev->data->scattered_rx = 0; + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + ring = &ring_mgt->tx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.extend_header = 1; + param.split = 0; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, true); + if (ret) { + NBL_LOG(ERR, "setup_tx_queue failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + eth_dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + ring = &ring_mgt->rx_rings[i]; + param.desc_num = ring->desc_num; + param.vsi_id = dev_mgt->net_dev->vsi_id; + param.dma = ring->dma; + param.local_queue_id = i + ring_mgt->queue_offset; + param.intr_en = 0; + param.intr_mask = 0; + param.half_offload_en = 1; + param.extend_header = 1; + param.split = 0; + param.rxcsum = 1; + + ret = disp_ops->setup_queue(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, false); + if (ret) { + NBL_LOG(ERR, "setup_rx_queue failed %d", ret); + return ret; + } + + ret = disp_ops->alloc_rx_bufs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + if (ret) { + NBL_LOG(ERR, "alloc_rx_bufs failed %d", ret); + return ret; + } + + ring->global_queue_id = + disp_ops->get_vsi_global_qid(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), +param.vsi_id, param.local_queue_id); + disp_ops->update_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), i); + eth_dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED; + } + + ret = disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, true); + if (ret) { + NBL_LOG(ERR, "cfg_dsch failed %d", ret); + goto cfg_dsch_fail; + } + ret = disp_ops->setup_cqs(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, eth_dev->data->nb_rx_queues, true); + if (ret) + goto setup_cqs_fail; + + return ret; + +setup_cqs_fail: + disp_ops->cfg_dsch(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, false); +cfg_dsch_fail: + disp_ops->remove_all_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id); + + return ret; +} + static int nbl_dev_port_start(struct rte_e
[PATCH v3 10/16] net/nbl: add nbl coexistence mode for nbl
NBL device support coexistence mode Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_common/nbl_userdev.c | 729 +- drivers/net/nbl/nbl_common/nbl_userdev.h | 11 + drivers/net/nbl/nbl_core.c| 3 +- drivers/net/nbl/nbl_core.h| 1 - drivers/net/nbl/nbl_hw/nbl_channel.c | 185 - drivers/net/nbl/nbl_hw/nbl_channel.h | 11 + .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 2 +- drivers/net/nbl/nbl_include/nbl_def_common.h | 63 ++ drivers/net/nbl/nbl_include/nbl_include.h | 2 + 9 files changed, 997 insertions(+), 10 deletions(-) diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c index 87b943ccd7..284a5b19c9 100644 --- a/drivers/net/nbl/nbl_common/nbl_userdev.c +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -3,15 +3,720 @@ */ #include "nbl_userdev.h" +#include -int nbl_pci_map_device(struct nbl_adapter *adapter) +#define NBL_USERDEV_EVENT_CLB_NAME "nbl_userspace_mem_event_clb" +#define NBL_USERDEV_BAR0_SIZE 65536 +#define NBL_USERDEV_DMA_LIMIT 0x + +/* Size of the buffer to receive kernel messages */ +#define NBL_NL_BUF_SIZE (32 * 1024) +/* Send buffer size for the Netlink socket */ +#define NBL_SEND_BUF_SIZE 32768 +/* Receive buffer size for the Netlink socket */ +#define NBL_RECV_BUF_SIZE 32768 + +struct nbl_userdev_map_record { + TAILQ_ENTRY(nbl_userdev_map_record) next; + u64 vaddr; + u64 iova; + u64 len; +}; + +static int nbl_default_container = -1; +static int nbl_group_count; + +TAILQ_HEAD(nbl_adapter_list_head, nbl_adapter); +static struct nbl_adapter_list_head nbl_adapter_list = + TAILQ_HEAD_INITIALIZER(nbl_adapter_list); + +TAILQ_HEAD(nbl_userdev_map_record_head, nbl_userdev_map_record); +static struct nbl_userdev_map_record_head nbl_map_list = + TAILQ_HEAD_INITIALIZER(nbl_map_list); + +static int +nbl_userdev_dma_mem_map(int devfd, uint64_t vaddr, uint64_t iova, uint64_t len) { - struct rte_pci_device *pci_dev = adapter->pci_dev; + struct nbl_dev_user_dma_map dma_map; int ret = 0; - ret = rte_pci_map_device(pci_dev); + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct nbl_dev_user_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = iova; + dma_map.flags = NBL_DEV_USER_DMA_MAP_FLAG_READ | + NBL_DEV_USER_DMA_MAP_FLAG_WRITE; + + ret = ioctl(devfd, NBL_DEV_USER_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "nbl container Memory segment is already mapped,skipping"); + ret = 0; + } else { + NBL_LOG(ERR, + "nbl container cannot set up DMA remapping,error %i (%s), ret %d", + errno, strerror(errno), ret); + } + } + + return ret; +} + +static int +nbl_vfio_dma_mem_map(int vfio_container_fd, uint64_t vaddr, uint64_t len, int do_map) +{ + struct vfio_iommu_type1_dma_map dma_map; + struct vfio_iommu_type1_dma_unmap dma_unmap; + int ret; + + if (do_map != 0) { + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); + dma_map.vaddr = vaddr; + dma_map.size = len; + dma_map.iova = vaddr; + dma_map.flags = VFIO_DMA_MAP_FLAG_READ | + VFIO_DMA_MAP_FLAG_WRITE; + + ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map); + if (ret) { + /** +* In case the mapping was already done EEXIST will be +* returned from kernel. +*/ + if (errno == EEXIST) { + NBL_LOG(ERR, + "Memory segment is already mapped, skipping"); + } else { + NBL_LOG(ERR, + "cannot set up DMA remapping,error %i (%s)", + errno, strerror(errno)); + return -1; + } + } + } else { + memset(&dma_unmap, 0, sizeof(dma_unmap)); + dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap); + dma_unmap.size = len; + dma_unmap.iova = vaddr; + + ret = i
[PATCH v3 14/16] net/nbl: add nbl device Tx and Rx burst
Implement NBL device Tx and Rx burst Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 108 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 5 + drivers/net/nbl/nbl_dispatch.c| 62 drivers/net/nbl/nbl_ethdev.c | 7 + drivers/net/nbl/nbl_ethdev.h | 19 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 1 + drivers/net/nbl/nbl_hw/nbl_resource.h | 2 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 325 ++ drivers/net/nbl/nbl_hw/nbl_txrx.h | 19 +- drivers/net/nbl/nbl_hw/nbl_txrx_ops.h | 91 + drivers/net/nbl/nbl_include/nbl_def_channel.h | 4 + drivers/net/nbl/nbl_include/nbl_def_common.h | 1 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 3 + .../net/nbl/nbl_include/nbl_def_resource.h| 7 + drivers/net/nbl/nbl_include/nbl_include.h | 31 ++ 15 files changed, 683 insertions(+), 2 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_txrx_ops.h diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index bdd06613e6..949d42506d 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -291,6 +291,99 @@ static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); } +static int nbl_dev_infos_get(struct rte_eth_dev *eth_dev __rte_unused, +struct rte_eth_dev_info *dev_info) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_board_port_info *board_info = &dev_mgt->common->board_info; + u8 speed_mode = board_info->speed; + + dev_info->min_mtu = RTE_ETHER_MIN_MTU; + dev_info->max_mtu = NBL_MAX_JUMBO_FRAME_SIZE - NBL_PKT_HDR_PAD; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + dev_info->max_mac_addrs = dev_mgt->net_dev->max_mac_num; + dev_info->max_rx_queues = ring_mgt->rx_ring_num; + dev_info->max_tx_queues = ring_mgt->tx_ring_num; + /* rx buffer size must be 2KB, 4KB, 8KB or 16KB */ + dev_info->min_rx_bufsize = NBL_DEV_MIN_RX_BUFSIZE; + dev_info->flow_type_rss_offloads = NBL_RSS_OFFLOAD_TYPE; + + dev_info->hash_key_size = NBL_EPRO_RSS_SK_SIZE; + + dev_info->tx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->rx_desc_lim = (struct rte_eth_desc_lim) { + .nb_max = 32768, + .nb_min = 128, + .nb_align = 1, + .nb_seg_max = 128, + .nb_mtu_seg_max = 128, + }; + + dev_info->speed_capa = RTE_ETH_LINK_SPEED_10G; + dev_info->max_rx_pktlen = NBL_FRAME_SIZE_MAX; + + dev_info->default_rxportconf.nb_queues = ring_mgt->rx_ring_num; + dev_info->default_txportconf.nb_queues = ring_mgt->tx_ring_num; + dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_UDP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_TSO | + RTE_ETH_TX_OFFLOAD_UDP_TSO | + RTE_ETH_TX_OFFLOAD_MULTI_SEGS; + dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM | + RTE_ETH_RX_OFFLOAD_SCATTER; + + switch (speed_mode) { + case NBL_FW_PORT_SPEED_100G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_50G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_50G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_25G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_25G; + /* FALLTHROUGH */ + case NBL_FW_PORT_SPEED_10G: + dev_info->speed_capa |= RTE_ETH_LINK_SPEED_10G; + break; + default: + dev_info->speed_capa = RTE_ETH_LINK_SPEED_25G; + } + + return 0; +} + +static int nbl_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct rte_eth_link link = { 0 }; + + link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; + link.link_status = !!dev_mgt->net_dev->eth_link_info.link_status; + if (link.link_status) + link.link_speed = dev_mgt->net_dev-&g
[PATCH v3 12/16] net/nbl: add nbl device rxtx queue setup and release ops
Implement NBL device Rx and Tx queue setup & release functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 81 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 2 + drivers/net/nbl/nbl_hw/nbl_resource.h | 99 ++ drivers/net/nbl/nbl_hw/nbl_txrx.c | 287 -- drivers/net/nbl/nbl_hw/nbl_txrx.h | 99 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 5 + drivers/net/nbl/nbl_include/nbl_include.h | 1 + 7 files changed, 552 insertions(+), 22 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4eea07c1ff..4faa58ace8 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -57,11 +57,92 @@ static int nbl_dev_close(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_tx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_txconf *conf) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *tx_ring = &ring_mgt->tx_rings[queue_idx]; + struct nbl_start_tx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.product = adapter->caps.product_type; + param.bond_broadcast_check = NULL; + ret = disp_ops->start_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &tx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_tx_ring failed %d", ret); + return ret; + } + + tx_ring->desc_num = nb_desc; + + return ret; +} + +static int nbl_rx_queue_setup(struct rte_eth_dev *eth_dev, u16 queue_idx, + u16 nb_desc, unsigned int socket_id, + const struct rte_eth_rxconf *conf, + struct rte_mempool *mempool) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_dev_ring_mgt *ring_mgt = &dev_mgt->net_dev->ring_mgt; + struct nbl_dev_ring *rx_ring = &ring_mgt->rx_rings[queue_idx]; + struct nbl_start_rx_ring_param param = { 0 }; + int ret; + + param.queue_idx = queue_idx; + param.nb_desc = nb_desc; + param.socket_id = socket_id; + param.conf = conf; + param.mempool = mempool; + param.product = adapter->caps.product_type; + ret = disp_ops->start_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), ¶m, &rx_ring->dma); + if (ret) { + NBL_LOG(ERR, "start_rx_ring failed %d", ret); + return ret; + } + + rx_ring->desc_num = nb_desc; + + return ret; +} + +static void nbl_tx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_tx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + +static void nbl_rx_queues_release(struct rte_eth_dev *eth_dev, uint16_t queue_id) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + disp_ops->release_rx_ring(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), queue_id); +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, .dev_stop = nbl_dev_port_stop, .dev_close = nbl_dev_close, + .tx_queue_setup = nbl_tx_queue_setup, + .rx_queue_setup = nbl_rx_queue_setup, + .tx_queue_release = nbl_tx_queues_release, + .rx_queue_release = nbl_rx_queues_release, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c index 6327aa55b4..b785774f67 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c @@ -53,6 +53,8 @@ static int nbl_res_start(struct nbl_resource_mgt_leonis *res_mgt_leonis) struct nbl_resource_mgt *res_mgt = &a
[PATCH v3 11/16] net/nbl: add nbl ethdev configuration
NBL device add ethdev configuration Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 33 +-- drivers/net/nbl/nbl_include/nbl_include.h | 3 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index f02ed7f94e..4eea07c1ff 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -4,15 +4,44 @@ #include "nbl_dev.h" -static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +static int nbl_dev_port_configure(struct nbl_adapter *adapter) { - RTE_SET_USED(eth_dev); + adapter->state = NBL_ETHDEV_CONFIGURED; + return 0; } +static int nbl_dev_configure(struct rte_eth_dev *eth_dev) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + int ret; + + NBL_LOG(INFO, "Begin to configure the device, state: %d", adapter->state); + + if (dev_data == NULL || adapter == NULL) + return -EINVAL; + + dev_data->dev_conf.intr_conf.lsc = 0; + + switch (adapter->state) { + case NBL_ETHDEV_CONFIGURED: + case NBL_ETHDEV_INITIALIZED: + ret = nbl_dev_port_configure(adapter); + break; + default: + ret = -EINVAL; + break; + } + + NBL_LOG(INFO, "configure the device done %d", ret); + return ret; +} + static int nbl_dev_port_start(struct rte_eth_dev *eth_dev) { RTE_SET_USED(eth_dev); + return 0; } diff --git a/drivers/net/nbl/nbl_include/nbl_include.h b/drivers/net/nbl/nbl_include/nbl_include.h index 2f5e426c91..33b2c25684 100644 --- a/drivers/net/nbl/nbl_include/nbl_include.h +++ b/drivers/net/nbl/nbl_include/nbl_include.h @@ -131,9 +131,10 @@ struct nbl_common_info { /* curr_network 0 means kernel network, 1 means user network */ u8 curr_network:1; u8 is_vf:1; + u8 pf_start:1; u8 specific_dma:1; u8 dma_set_msb:1; - u8 rsv:3; + u8 rsv:2; struct nbl_board_port_info board_info; }; -- 2.34.1
[PATCH v3 09/16] net/nbl: add UIO and VFIO mode for nbl
NBL device support UIO/VFIO Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 1 + drivers/net/nbl/nbl_common/nbl_userdev.c | 24 +++ drivers/net/nbl/nbl_common/nbl_userdev.h | 10 .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 7 ++ drivers/net/nbl/nbl_include/nbl_def_common.h | 4 5 files changed, 46 insertions(+) create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.c create mode 100644 drivers/net/nbl/nbl_common/nbl_userdev.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 7f4abd3db0..8be3100369 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -16,6 +16,7 @@ sources = files( 'nbl_dispatch.c', 'nbl_common/nbl_common.c', 'nbl_common/nbl_thread.c', +'nbl_common/nbl_userdev.c', 'nbl_dev/nbl_dev.c', 'nbl_hw/nbl_channel.c', 'nbl_hw/nbl_resource.c', diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c b/drivers/net/nbl/nbl_common/nbl_userdev.c new file mode 100644 index 00..87b943ccd7 --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#include "nbl_userdev.h" + +int nbl_pci_map_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + int ret = 0; + + ret = rte_pci_map_device(pci_dev); + if (ret) + NBL_LOG(ERR, "device %s uio or vfio map failed", pci_dev->device.name); + + return ret; +} + +void nbl_pci_unmap_device(struct nbl_adapter *adapter) +{ + struct rte_pci_device *pci_dev = adapter->pci_dev; + + return rte_pci_unmap_device(pci_dev); +} diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.h b/drivers/net/nbl/nbl_common/nbl_userdev.h new file mode 100644 index 00..11cc2c --- /dev/null +++ b/drivers/net/nbl/nbl_common/nbl_userdev.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2025 Nebulamatrix Technology Co., Ltd. + */ + +#ifndef _NBL_USERDEV_H_ +#define _NBL_USERDEV_H_ + +#include "nbl_ethdev.h" + +#endif diff --git a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c index 49ada3b525..9ed375bc1e 100644 --- a/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c +++ b/drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c @@ -183,6 +183,11 @@ int nbl_phy_init_leonis_snic(void *p) phy_mgt_leonis_snic = (struct nbl_phy_mgt_leonis_snic **)&NBL_ADAPTER_TO_PHY_MGT(adapter); phy_ops_tbl = &NBL_ADAPTER_TO_PHY_OPS_TBL(adapter); + /* map device */ + ret = nbl_pci_map_device(adapter); + if (ret) + return ret; + *phy_mgt_leonis_snic = rte_zmalloc("nbl_phy_mgt", sizeof(struct nbl_phy_mgt_leonis_snic), 0); if (!*phy_mgt_leonis_snic) { @@ -205,6 +210,7 @@ int nbl_phy_init_leonis_snic(void *p) setup_ops_failed: rte_free(*phy_mgt_leonis_snic); alloc_phy_mgt_failed: + nbl_pci_unmap_device(adapter); return ret; } @@ -220,4 +226,5 @@ void nbl_phy_remove_leonis_snic(void *p) rte_free(*phy_mgt_leonis_snic); nbl_phy_remove_ops(phy_ops_tbl); + nbl_pci_unmap_device(adapter); } diff --git a/drivers/net/nbl/nbl_include/nbl_def_common.h b/drivers/net/nbl/nbl_include/nbl_def_common.h index b7955abfab..0b87c3003d 100644 --- a/drivers/net/nbl/nbl_include/nbl_def_common.h +++ b/drivers/net/nbl/nbl_include/nbl_def_common.h @@ -48,4 +48,8 @@ void nbl_free_dma_mem(struct nbl_dma_mem *mem); int nbl_thread_add_work(struct nbl_work *work); void nbl_thread_del_work(struct nbl_work *work); +struct nbl_adapter; +int nbl_pci_map_device(struct nbl_adapter *adapter); +void nbl_pci_unmap_device(struct nbl_adapter *adapter); + #endif -- 2.34.1
[PATCH v3 15/16] net/nbl: add nbl device xstats and stats
Implement NBL device xstats and stats functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_dev/nbl_dev.c | 148 +- drivers/net/nbl/nbl_dev/nbl_dev.h | 2 + drivers/net/nbl/nbl_dispatch.c| 111 + .../nbl/nbl_hw/nbl_hw_leonis/nbl_res_leonis.c | 113 + drivers/net/nbl/nbl_hw/nbl_txrx.c | 113 - drivers/net/nbl/nbl_include/nbl_def_channel.h | 5 + .../net/nbl/nbl_include/nbl_def_dispatch.h| 9 ++ .../net/nbl/nbl_include/nbl_def_resource.h| 12 +- drivers/net/nbl/nbl_include/nbl_include.h | 4 + 9 files changed, 511 insertions(+), 6 deletions(-) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 949d42506d..4fa132ae1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -384,6 +384,129 @@ static int nbl_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_ return disp_ops->get_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), rte_stats); } +static int nbl_stats_reset(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + + return disp_ops->reset_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt)); +} + +static int nbl_dev_update_hw_xstats(struct nbl_dev_mgt *dev_mgt, struct rte_eth_xstat *xstats, + u16 hw_xstats_cnt, u16 *xstats_cnt) +{ + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u64 *hw_stats; + int i; + u16 count = *xstats_cnt; + + hw_stats = rte_zmalloc("nbl_xstats_cnt", hw_xstats_cnt * sizeof(u64), 0); + if (!hw_stats) + return -ENOMEM; + + disp_ops->get_private_stat_data(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + common->eth_id, hw_stats, hw_xstats_cnt * sizeof(u64)); + for (i = 0; i < hw_xstats_cnt; i++) { + xstats[count].value = hw_stats[i] - dev_mgt->net_dev->hw_xstats_offset[i]; + xstats[count].id = count; + count++; + } + + *xstats_cnt = count; + rte_free(hw_stats); + return 0; +} + +static int nbl_xstats_get(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat *xstats, unsigned int n) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + int ret = 0; + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + + if (!xstats) + return 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (n < (txrx_xstats_cnt + hw_xstats_cnt)) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) + ret = disp_ops->get_txrx_xstats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + xstats, &xstats_cnt); + if (hw_xstats_cnt) + ret |= nbl_dev_update_hw_xstats(dev_mgt, xstats, hw_xstats_cnt, &xstats_cnt); + + if (ret) + return -EIO; + + return xstats_cnt; +} + +static int nbl_xstats_get_names(struct rte_eth_dev *eth_dev, + struct rte_eth_xstat_name *xstats_names, + __rte_unused unsigned int limit) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + u16 txrx_xstats_cnt = 0, hw_xstats_cnt = 0, xstats_cnt = 0; + int ret = 0; + + ret = disp_ops->get_txrx_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), &txrx_xstats_cnt); + if (!common->is_vf) + ret |= disp_ops->get_hw_xstats_cnt(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + &hw_xstats_cnt); + if (ret) + return -EIO; + + if (!xstats_names) + return txrx_xstats_cnt + hw_xstats_cnt; + + if (txrx_xstats_cnt) +
[PATCH v3 16/16] net/nbl: nbl device support set MTU and promisc
Implement NBL device set MTU and promisc functions Signed-off-by: dimon.zhao --- drivers/net/nbl/nbl_core.h| 2 + drivers/net/nbl/nbl_dev/nbl_dev.c | 60 +++ drivers/net/nbl/nbl_dev/nbl_dev.h | 4 +- drivers/net/nbl/nbl_dispatch.c| 77 +++ drivers/net/nbl/nbl_dispatch.h| 2 + drivers/net/nbl/nbl_ethdev.c | 31 +--- drivers/net/nbl/nbl_include/nbl_def_channel.h | 10 +++ .../net/nbl/nbl_include/nbl_def_dispatch.h| 1 + .../net/nbl/nbl_include/nbl_def_resource.h| 2 + 9 files changed, 176 insertions(+), 13 deletions(-) diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 997544b112..d3fe1d02d2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -51,6 +51,8 @@ #define NBL_IS_NOT_COEXISTENCE(common) ({ typeof(common) _common = (common); \ _common->nl_socket_route < 0 || \ _common->ifindex < 0; }) +#define NBL_IS_COEXISTENCE(common) ((common)->devfd != -1) + struct nbl_core { void *phy_mgt; void *res_mgt; diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c b/drivers/net/nbl/nbl_dev/nbl_dev.c index 4fa132ae1c..6e26989e1c 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.c +++ b/drivers/net/nbl/nbl_dev/nbl_dev.c @@ -507,6 +507,63 @@ static int nbl_xstats_reset(struct rte_eth_dev *eth_dev) return 0; } +static int nbl_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) +{ + struct rte_eth_dev_data *dev_data = eth_dev->data; + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + uint32_t frame_size = mtu + NBL_ETH_OVERHEAD; + int ret; + + /* check if mtu is within the allowed range */ + if (mtu < RTE_ETHER_MIN_MTU || frame_size > NBL_FRAME_SIZE_MAX) + return -EINVAL; + + /* mtu setting is forbidden if port is start */ + if (dev_data->dev_started) { + NBL_LOG(ERR, "port %d must be stopped before configuration", dev_data->port_id); + return -EBUSY; + } + + dev_data->dev_conf.rxmode.mtu = frame_size; + ret = disp_ops->set_mtu(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id, mtu); + if (ret) + return ret; + + return 0; +} + +static int nbl_promiscuous_enable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 1); + dev_mgt->net_dev->promisc = 1; + + return 0; +} + +static int nbl_promiscuous_disable(struct rte_eth_dev *eth_dev) +{ + struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev); + struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter); + struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt); + struct nbl_common_info *common = &adapter->common; + + if (!common->is_vf) + disp_ops->set_promisc_mode(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), + dev_mgt->net_dev->vsi_id, 0); + dev_mgt->net_dev->promisc = 0; + + return 0; +} + struct nbl_dev_ops dev_ops = { .dev_configure = nbl_dev_configure, .dev_start = nbl_dev_port_start, @@ -523,6 +580,9 @@ struct nbl_dev_ops dev_ops = { .xstats_get = nbl_xstats_get, .xstats_get_names = nbl_xstats_get_names, .xstats_reset = nbl_xstats_reset, + .promiscuous_disable = nbl_promiscuous_disable, + .promiscuous_enable = nbl_promiscuous_enable, + .mtu_set = nbl_mtu_set, }; static int nbl_dev_setup_chan_queue(struct nbl_adapter *adapter) diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.h b/drivers/net/nbl/nbl_dev/nbl_dev.h index 1541aebba5..a97a53bc02 100644 --- a/drivers/net/nbl/nbl_dev/nbl_dev.h +++ b/drivers/net/nbl/nbl_dev/nbl_dev.h @@ -47,7 +47,9 @@ struct nbl_dev_net_mgt { u8 eth_mode; u8 eth_id; u16 max_mac_num; - bool trust; + u8 trust:1; + u8 promisc:1; + u8 rsv:6; }; struct nbl_dev_mgt { diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c index 068eb12944..c0bbbc2717 100644 --- a/drivers/net/nbl/nbl_dispatch.c +++ b/drivers/net/nbl/nbl_dispa
[PATCH v3 03/16] net/nbl: add PHY layer definitions and implementation
add PHY layer related definitions and product ops Signed-off-by: dimon.zhao --- drivers/net/nbl/meson.build | 2 + drivers/net/nbl/nbl_core.c| 54 -- drivers/net/nbl/nbl_core.h| 30 +- drivers/net/nbl/nbl_ethdev.c | 4 +- .../nbl_hw_leonis/nbl_phy_leonis_snic.c | 99 +++ .../nbl_hw_leonis/nbl_phy_leonis_snic.h | 10 ++ drivers/net/nbl/nbl_hw/nbl_phy.h | 28 ++ drivers/net/nbl/nbl_include/nbl_def_phy.h | 35 +++ drivers/net/nbl/nbl_include/nbl_include.h | 15 +++ .../net/nbl/nbl_include/nbl_product_base.h| 37 +++ 10 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c create mode 100644 drivers/net/nbl/nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.h create mode 100644 drivers/net/nbl/nbl_hw/nbl_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_def_phy.h create mode 100644 drivers/net/nbl/nbl_include/nbl_product_base.h diff --git a/drivers/net/nbl/meson.build b/drivers/net/nbl/meson.build index 013a4126f6..4ec1273100 100644 --- a/drivers/net/nbl/meson.build +++ b/drivers/net/nbl/meson.build @@ -7,8 +7,10 @@ if not is_linux endif includes += include_directories('nbl_include') +includes += include_directories('nbl_hw') sources = files( 'nbl_ethdev.c', 'nbl_core.c', +'nbl_hw/nbl_hw_leonis/nbl_phy_leonis_snic.c', ) diff --git a/drivers/net/nbl/nbl_core.c b/drivers/net/nbl/nbl_core.c index 63b707f0ba..fc7222d526 100644 --- a/drivers/net/nbl/nbl_core.c +++ b/drivers/net/nbl/nbl_core.c @@ -4,27 +4,67 @@ #include "nbl_core.h" -int nbl_core_init(const struct nbl_adapter *adapter, const struct rte_eth_dev *eth_dev) +static struct nbl_product_core_ops nbl_product_core_ops[NBL_PRODUCT_MAX] = { + { + .phy_init = nbl_phy_init_leonis_snic, + .phy_remove = nbl_phy_remove_leonis_snic, + .res_init = NULL, + .res_remove = NULL, + .chan_init = NULL, + .chan_remove= NULL, + }, +}; + +static struct nbl_product_core_ops *nbl_core_get_product_ops(enum nbl_product_type product_type) { - RTE_SET_USED(adapter); - RTE_SET_USED(eth_dev); + return &nbl_product_core_ops[product_type]; +} + +static void nbl_init_func_caps(struct rte_pci_device *pci_dev, struct nbl_func_caps *caps) +{ + if (pci_dev->id.device_id >= NBL_DEVICE_ID_M18110 && + pci_dev->id.device_id <= NBL_DEVICE_ID_M18100_VF) + caps->product_type = NBL_LEONIS_TYPE; +} + +int nbl_core_init(struct nbl_adapter *adapter, struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + struct nbl_product_core_ops *product_base_ops = NULL; + int ret = 0; + + nbl_init_func_caps(pci_dev, &adapter->caps); + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + /* every product's phy/chan/res layer has a great difference, so call their own init ops */ + ret = product_base_ops->phy_init(adapter); + if (ret) + goto phy_init_fail; return 0; + +phy_init_fail: + return -EINVAL; } -void nbl_core_remove(const struct nbl_adapter *adapter) +void nbl_core_remove(struct nbl_adapter *adapter) { - RTE_SET_USED(adapter); + struct nbl_product_core_ops *product_base_ops = NULL; + + product_base_ops = nbl_core_get_product_ops(adapter->caps.product_type); + + product_base_ops->phy_remove(adapter); } -int nbl_core_start(const struct nbl_adapter *adapter) +int nbl_core_start(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); return 0; } -void nbl_core_stop(const struct nbl_adapter *adapter) +void nbl_core_stop(struct nbl_adapter *adapter) { RTE_SET_USED(adapter); } diff --git a/drivers/net/nbl/nbl_core.h b/drivers/net/nbl/nbl_core.h index 4ba13e5bd7..2d0e39afa2 100644 --- a/drivers/net/nbl/nbl_core.h +++ b/drivers/net/nbl/nbl_core.h @@ -5,7 +5,8 @@ #ifndef _NBL_CORE_H_ #define _NBL_CORE_H_ -#include "nbl_include.h" +#include "nbl_product_base.h" +#include "nbl_def_phy.h" #define NBL_VENDOR_ID (0x1F0F) #define NBL_DEVICE_ID_M18110 (0x3403) @@ -27,14 +28,33 @@ #define NBL_DEVICE_ID_M18100_VF(0x3413) #define NBL_MAX_INSTANCE_CNT 516 + +#define NBL_ADAPTER_TO_PHY_MGT(adapter) ((adapter)->core.phy_mgt) +#define NBL_ADAPTER_TO_PHY_OPS_TBL(adapter)((adapter)->intf.phy_ops_tbl) + +struct nbl_core { + void *phy_mgt; + void *res_mgt; + void *disp_mgt; + void *chan_mgt; + void *dev_mgt; +}; + +st