Add basic zxdh ethdev init and register PCI probe functions Update doc files. Signed-off-by: Junlong Wang --- MAINTAINERS | 7 ++ doc/guides/nics/features/zxdh.ini | 9 +++ doc/guides/nics/index.rst | 1 + doc/guides/nics/zxdh.rst | 33 +++++++++ doc/guides/rel_notes/release_24_11.rst | 6 ++ drivers/net/meson.build | 1 + drivers/net/zxdh/meson.build | 18 +++++ drivers/net/zxdh/zxdh_ethdev.c | 97 ++++++++++++++++++++++++++ drivers/net/zxdh/zxdh_ethdev.h | 44 ++++++++++++ 9 files changed, 216 insertions(+) create mode 100644 doc/guides/nics/features/zxdh.ini create mode 100644 doc/guides/nics/zxdh.rst create mode 100644 drivers/net/zxdh/meson.build create mode 100644 drivers/net/zxdh/zxdh_ethdev.c create mode 100644 drivers/net/zxdh/zxdh_ethdev.h diff --git a/MAINTAINERS b/MAINTAINERS index 8919d78919..9a812b3632 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1058,6 +1058,13 @@ F: drivers/net/avp/ F: doc/guides/nics/avp.rst F: doc/guides/nics/features/avp.ini +ZTE zxdh +M: Junlong Wang +M: Lijie Shan +F: drivers/net/zxdh/ +F: doc/guides/nics/zxdh.rst +F: doc/guides/nics/features/zxdh.ini + PCAP PMD F: drivers/net/pcap/ F: doc/guides/nics/pcap_ring.rst diff --git a/doc/guides/nics/features/zxdh.ini b/doc/guides/nics/features/zxdh.ini new file mode 100644 index 0000000000..05c8091ed7 --- /dev/null +++ b/doc/guides/nics/features/zxdh.ini @@ -0,0 +1,9 @@ +; +; Supported features of the 'zxdh' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Linux = Y +x86-64 = Y +ARMv8 = Y diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst index c14bc7988a..8e371ac4a5 100644 --- a/doc/guides/nics/index.rst +++ b/doc/guides/nics/index.rst @@ -69,3 +69,4 @@ Network Interface Controller Drivers vhost virtio vmxnet3 + zxdh diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst new file mode 100644 index 0000000000..1167d4c6be --- /dev/null +++ b/doc/guides/nics/zxdh.rst @@ -0,0 +1,33 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2024 ZTE Corporation. + +ZXDH Poll Mode Driver +====================== + +The ZXDH PMD (**librte_net_zxdh**) provides poll mode driver support +for 25/100 Gbps ZXDH NX Series Ethernet Controller based on +the ZTE Ethernet Controller E310/E312. + +- Learn about ZXDH NX Series Ethernet Controller NICs using + ``_. + + +Features +-------- + +Features of the ZXDH PMD are: + +- Multi arch support: x86_64, ARMv8. + + +Driver compilation and testing +------------------------------ + +Refer to the document :ref:`compiling and testing a PMD for a NIC ` +for details. + +Limitations or Known issues +--------------------------- + +Datapath and some eth_dev_ops are not supported and will be provided later. +X86-32, Power8, ARMv7, RISC-V, Windows and BSD are not supported yet. diff --git a/doc/guides/rel_notes/release_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index 517085f0b3..66b970e036 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -170,6 +170,12 @@ New Features * Added asynchronous flow support * Added MTU update +* **Updated ZTE zxdh net driver [EXPERIMENTAL].** + + * Added ethdev driver support for zxdh NX Series Ethernet Controller. + - Ability to initialize the NIC + - Does not support datapath + * **Added cryptodev queue pair reset support.** A new API ``rte_cryptodev_queue_pair_reset`` is added diff --git a/drivers/net/meson.build b/drivers/net/meson.build index fb6d34b782..0a12914534 100644 --- a/drivers/net/meson.build +++ b/drivers/net/meson.build @@ -62,6 +62,7 @@ drivers = [ 'vhost', 'virtio', 'vmxnet3', + 'zxdh', ] std_deps = ['ethdev', 'kvargs'] # 'ethdev' also pulls in mbuf, net, eal etc std_deps += ['bus_pci'] # very many PMDs depend on PCI, so make std diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build new file mode 100644 index 0000000000..932fb1c835 --- /dev/null +++ b/drivers/net/zxdh/meson.build @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2024 ZTE Corporation + +if not is_linux + build = false + reason = 'only supported on Linux' + subdir_done() +endif + +if not dpdk_conf.has('RTE_ARCH_X86_64') or not dpdk_conf.get('RTE_ARCH_64') + build = false + reason = 'only supported on x86_64 and aarch64' + subdir_done() +endif + +sources = files( + 'zxdh_ethdev.c', +) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c new file mode 100644 index 0000000000..8689e56309 --- /dev/null +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#include +#include +#include + +#include "zxdh_ethdev.h" + +static int +zxdh_eth_dev_init(struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + struct zxdh_hw *hw = eth_dev->data->dev_private; + int ret = 0; + + eth_dev->dev_ops = NULL; + + /* Allocate memory for storing MAC addresses */ + eth_dev->data->mac_addrs = rte_zmalloc("zxdh_mac", + ZXDH_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN, 0); + if (eth_dev->data->mac_addrs == NULL) + return -ENOMEM; + + memset(hw, 0, sizeof(*hw)); + hw->bar_addr[0] = (uint64_t)pci_dev->mem_resource[0].addr; + if (hw->bar_addr[0] == 0) + return -EIO; + + hw->device_id = pci_dev->id.device_id; + hw->port_id = eth_dev->data->port_id; + hw->eth_dev = eth_dev; + hw->speed = RTE_ETH_SPEED_NUM_UNKNOWN; + hw->duplex = RTE_ETH_LINK_FULL_DUPLEX; + hw->is_pf = 0; + + if (pci_dev->id.device_id == ZXDH_E310_PF_DEVICEID || + pci_dev->id.device_id == ZXDH_E312_PF_DEVICEID) { + hw->is_pf = 1; + } + + return ret; +} + +static int +zxdh_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + return rte_eth_dev_pci_generic_probe(pci_dev, + sizeof(struct zxdh_hw), + zxdh_eth_dev_init); +} + +static int +zxdh_dev_close(struct rte_eth_dev *dev __rte_unused) +{ + int ret = 0; + + return ret; +} + +static int +zxdh_eth_dev_uninit(struct rte_eth_dev *eth_dev) +{ + int ret = 0; + + ret = zxdh_dev_close(eth_dev); + + return ret; +} + +static int +zxdh_eth_pci_remove(struct rte_pci_device *pci_dev) +{ + int ret = rte_eth_dev_pci_generic_remove(pci_dev, zxdh_eth_dev_uninit); + + return ret; +} + +static const struct rte_pci_id pci_id_zxdh_map[] = { + {RTE_PCI_DEVICE(ZXDH_PCI_VENDOR_ID, ZXDH_E310_PF_DEVICEID)}, + {RTE_PCI_DEVICE(ZXDH_PCI_VENDOR_ID, ZXDH_E310_VF_DEVICEID)}, + {RTE_PCI_DEVICE(ZXDH_PCI_VENDOR_ID, ZXDH_E312_PF_DEVICEID)}, + {RTE_PCI_DEVICE(ZXDH_PCI_VENDOR_ID, ZXDH_E312_VF_DEVICEID)}, + {.vendor_id = 0, /* sentinel */ }, +}; +static struct rte_pci_driver zxdh_pmd = { + .id_table = pci_id_zxdh_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, + .probe = zxdh_eth_pci_probe, + .remove = zxdh_eth_pci_remove, +}; + +RTE_PMD_REGISTER_PCI(net_zxdh, zxdh_pmd); +RTE_PMD_REGISTER_PCI_TABLE(net_zxdh, pci_id_zxdh_map); +RTE_PMD_REGISTER_KMOD_DEP(net_zxdh, "* vfio-pci"); diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h new file mode 100644 index 0000000000..a11e3624a9 --- /dev/null +++ b/drivers/net/zxdh/zxdh_ethdev.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 ZTE Corporation + */ + +#ifndef ZXDH_ETHDEV_H +#define ZXDH_ETHDEV_H + +#include "ethdev_driver.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ZXDH PCI vendor/device ID. */ +#define ZXDH_PCI_VENDOR_ID 0x1cf2 + +#define ZXDH_E310_PF_DEVICEID 0x8061 +#define ZXDH_E310_VF_DEVICEID 0x8062 +#define ZXDH_E312_PF_DEVICEID 0x8049 +#define ZXDH_E312_VF_DEVICEID 0x8060 + +#define ZXDH_MAX_UC_MAC_ADDRS 32 +#define ZXDH_MAX_MC_MAC_ADDRS 32 +#define ZXDH_MAX_MAC_ADDRS (ZXDH_MAX_UC_MAC_ADDRS + ZXDH_MAX_MC_MAC_ADDRS) + +#define ZXDH_NUM_BARS 2 + +struct zxdh_hw { + struct rte_eth_dev *eth_dev; + uint64_t bar_addr[ZXDH_NUM_BARS]; + + uint32_t speed; + uint16_t device_id; + uint16_t port_id; + + uint8_t duplex; + uint8_t is_pf; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* ZXDH_ETHDEV_H */ -- 2.27.0