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