Add basic zsdadev init and register PCI probe functions<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> MAINTAINERS                       |   3 +<br /> drivers/common/zsda/meson.build   |  13 ++<br /> drivers/common/zsda/zsda_device.c | 191 ++++++++++++++++++++++++++++++<br /> drivers/common/zsda/zsda_device.h |  53 +++++++++<br /> drivers/meson.build               |   1 +<br /> 5 files changed, 261 insertions(+)<br /> create mode 100644 drivers/common/zsda/meson.build<br /> create mode 100644 drivers/common/zsda/zsda_device.c<br /> create mode 100644 drivers/common/zsda/zsda_device.h<br /> <br />diff --git a/MAINTAINERS b/MAINTAINERS<br />index c5a703b5c0..0318d7357c 100644<br />--- a/MAINTAINERS<br />+++ b/MAINTAINERS<br />@@ -1268,6 +1268,9 @@ F: drivers/compress/zlib/<br /> F: doc/guides/compressdevs/zlib.rst<br /> F: doc/guides/compressdevs/features/zlib.ini<br />  <br />+ZTE Storage Data Accelerator(ZSDA)<br />+M: Hanxiao Li <li.hanxiao@zte.com.cn> <br />+F: drivers/common/zsda/<br />  <br /> DMAdev Drivers<br /> --------------<br />diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build<br />new file mode 100644<br />index 0000000000..68bc549c27<br />--- /dev/null<br />+++ b/drivers/common/zsda/meson.build<br />@@ -0,0 +1,13 @@<br />+# SPDX-License-Identifier: BSD-3-Clause<br />+# Copyright(c) 2024 ZTE Corporation<br />+<br />+if is_windows<br />+    build = false<br />+    reason = 'not supported on Windows' <br />+    subdir_done()<br />+endif<br />+<br />+deps += ['bus_pci', 'mbuf']<br />+sources += files(<br />+        'zsda_device.c',<br />+        )<br />diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c<br />new file mode 100644<br />index 0000000000..8d691b3bb8<br />--- /dev/null<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -0,0 +1,191 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+<br />+#include <errno.h> <br />+#include <stdint.h> <br />+<br />+#include <rte_bus_pci.h> <br />+<br />+#include "zsda_device.h" <br />+<br />+/* per-process array of device data */<br />+struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES];<br />+static int zsda_nb_pci_devices;<br />+<br />+/*<br />+ * The set of PCI devices this driver supports<br />+ */<br />+static const struct rte_pci_id pci_id_zsda_map[] = {<br />+    {<br />+        RTE_PCI_DEVICE(0x1cf2, 0x8050),<br />+    },<br />+    {<br />+        RTE_PCI_DEVICE(0x1cf2, 0x8051),<br />+    },<br />+    {.device_id = 0},<br />+};<br />+<br />+static struct zsda_pci_device *<br />+zsda_pci_get_named_dev(const char *name)<br />+{<br />+    unsigned int i;<br />+<br />+    if (name == NULL)<br />+        return NULL;<br />+<br />+    for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) {<br />+        if (zsda_devs[i].mz && <br />+            (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr)<br />+                    ->name,<br />+                name) == 0))<br />+            return (struct zsda_pci_device *)zsda_devs[i].mz->addr;<br />+    }<br />+<br />+    return NULL;<br />+}<br />+static uint8_t<br />+zsda_pci_find_free_device_index(void)<br />+{<br />+    uint32_t dev_id;<br />+<br />+    for (dev_id = 0; dev_id < RTE_PMD_ZSDA_MAX_PCI_DEVICES; dev_id++)<br />+        if (zsda_devs[dev_id].mz == NULL)<br />+            break;<br />+<br />+    return dev_id & (ZSDA_MAX_DEV - 1);<br />+}<br />+<br />+static struct zsda_pci_device *<br />+zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev)<br />+{<br />+    char name[ZSDA_DEV_NAME_MAX_LEN];<br />+<br />+    rte_pci_device_name(&pci_dev->addr, name, sizeof(name));<br />+<br />+    return zsda_pci_get_named_dev(name);<br />+}<br />+<br />+static struct zsda_pci_device *<br />+zsda_pci_device_allocate(struct rte_pci_device *pci_dev)<br />+{<br />+    struct zsda_pci_device *zsda_pci_dev;<br />+    uint8_t zsda_dev_id;<br />+    char name[ZSDA_DEV_NAME_MAX_LEN];<br />+    unsigned int socket_id = rte_socket_id();<br />+<br />+    rte_pci_device_name(&pci_dev->addr, name, sizeof(name));<br />+    snprintf(name + strlen(name), (ZSDA_DEV_NAME_MAX_LEN - strlen(name)),<br />+         "_zsda");<br />+    if (rte_eal_process_type() == RTE_PROC_SECONDARY) {<br />+        const struct rte_memzone *mz = rte_memzone_lookup(name);<br />+<br />+        if (mz == NULL)<br />+            return NULL;<br />+        zsda_pci_dev = mz->addr;<br />+        zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz;<br />+        zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev;<br />+        zsda_nb_pci_devices++;<br />+        return zsda_pci_dev;<br />+    }<br />+<br />+    if (zsda_pci_get_named_dev(name) != NULL)<br />+        return NULL;<br />+<br />+    zsda_dev_id = zsda_pci_find_free_device_index();<br />+<br />+    if (zsda_dev_id == (RTE_PMD_ZSDA_MAX_PCI_DEVICES - 1))<br />+        return NULL;<br />+<br />+    zsda_devs[zsda_dev_id].mz =<br />+        rte_memzone_reserve(name, sizeof(struct zsda_pci_device),<br />+                    (int)(socket_id & 0xfff), 0);<br />+<br />+    if (zsda_devs[zsda_dev_id].mz == NULL)<br />+        return NULL;<br />+<br />+    zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr;<br />+    memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev));<br />+    memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN);<br />+    zsda_pci_dev->zsda_dev_id = zsda_dev_id;<br />+    zsda_pci_dev->pci_dev = pci_dev;<br />+    zsda_devs[zsda_dev_id].pci_dev = pci_dev;<br />+<br />+    zsda_nb_pci_devices++;<br />+<br />+    return zsda_pci_dev;<br />+}<br />+<br />+static int<br />+zsda_pci_device_release(const struct rte_pci_device *pci_dev)<br />+{<br />+    struct zsda_pci_device *zsda_pci_dev;<br />+    struct zsda_device_info *inst;<br />+    char name[ZSDA_DEV_NAME_MAX_LEN];<br />+<br />+    if (pci_dev == NULL)<br />+        return -EINVAL;<br />+<br />+    rte_pci_device_name(&pci_dev->addr, name, sizeof(name));<br />+<br />+    snprintf(name + strlen(name),<br />+         ZSDA_DEV_NAME_MAX_LEN - (strlen(name) - 1), "_zsda");<br />+    zsda_pci_dev = zsda_pci_get_named_dev(name);<br />+    if (zsda_pci_dev != NULL) {<br />+        inst = &zsda_devs[zsda_pci_dev->zsda_dev_id];<br />+<br />+        if (rte_eal_process_type() == RTE_PROC_PRIMARY)<br />+            rte_memzone_free(inst->mz);<br />+<br />+        memset(inst, 0, sizeof(struct zsda_device_info));<br />+        zsda_nb_pci_devices--;<br />+    }<br />+    return 0;<br />+}<br />+<br />+static int<br />+zsda_pci_dev_destroy(const struct rte_pci_device *pci_dev)<br />+{<br />+    return zsda_pci_device_release(pci_dev);<br />+}<br />+<br />+static int<br />+zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,<br />+           struct rte_pci_device *pci_dev)<br />+{<br />+    int ret = 0;<br />+    struct zsda_pci_device *zsda_pci_dev;<br />+<br />+    zsda_pci_dev = zsda_pci_device_allocate(pci_dev);<br />+    if (zsda_pci_dev == NULL)<br />+        return -ENODEV;<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_pci_remove(struct rte_pci_device *pci_dev)<br />+{<br />+    struct zsda_pci_device *zsda_pci_dev;<br />+<br />+    if (pci_dev == NULL)<br />+        return -EINVAL;<br />+<br />+    zsda_pci_dev = zsda_get_zsda_dev_from_pci_dev(pci_dev);<br />+    if (zsda_pci_dev == NULL)<br />+        return 0;<br />+<br />+    return zsda_pci_dev_destroy(pci_dev);<br />+}<br />+<br />+static struct rte_pci_driver rte_zsda_pmd = {<br />+    .id_table = pci_id_zsda_map,<br />+    .drv_flags = RTE_PCI_DRV_NEED_MAPPING,<br />+    .probe = zsda_pci_probe,<br />+    .remove = zsda_pci_remove };<br />+<br />+RTE_PMD_REGISTER_PCI(ZSDA_PCI_NAME, rte_zsda_pmd);<br />+RTE_PMD_REGISTER_PCI_TABLE(ZSDA_PCI_NAME, pci_id_zsda_map);<br />+RTE_PMD_REGISTER_KMOD_DEP(ZSDA_PCI_NAME,<br />+              "* igb_uio | uio_pci_generic | vfio-pci");<br />diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h<br />new file mode 100644<br />index 0000000000..33a7fb0d9c<br />--- /dev/null<br />+++ b/drivers/common/zsda/zsda_device.h<br />@@ -0,0 +1,53 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#ifndef _ZSDA_DEVICE_H_<br />+#define _ZSDA_DEVICE_H_<br />+<br />+#include <rte_memzone.h> <br />+#include "bus_pci_driver.h" <br />+<br />+#define MAX_QPS_ON_FUNCTION        128<br />+#define ZSDA_DEV_NAME_MAX_LEN    64<br />+#define ZSDA_MAX_SERVICES (0)<br />+#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES<br />+<br />+struct zsda_device_info {<br />+    const struct rte_memzone *mz;<br />+    /**< mz to store the:  struct zsda_pci_device ,    so it can be<br />+     * shared across processes<br />+     */<br />+<br />+    struct rte_pci_device *pci_dev;<br />+};<br />+<br />+extern struct zsda_device_info zsda_devs[];<br />+<br />+struct zsda_qp_hw_data {<br />+    bool used;<br />+<br />+    uint8_t tx_ring_num;<br />+    uint8_t rx_ring_num;<br />+    uint16_t tx_msg_size;<br />+    uint16_t rx_msg_size;<br />+};<br />+<br />+struct zsda_qp_hw {<br />+    struct zsda_qp_hw_data data[MAX_QPS_ON_FUNCTION];<br />+};<br />+<br />+struct zsda_pci_device {<br />+    /* Data used by all services */<br />+    char name[ZSDA_DEV_NAME_MAX_LEN];<br />+    /**< Name of zsda pci device */<br />+    uint8_t zsda_dev_id;<br />+    /**< Id of device instance for this zsda pci device */<br />+<br />+    struct rte_pci_device *pci_dev;<br />+<br />+    struct zsda_qp_hw zsda_hw_qps[ZSDA_MAX_SERVICES];<br />+    uint16_t zsda_qp_hw_num[ZSDA_MAX_SERVICES];<br />+};<br />+<br />+#endif /* _ZSDA_DEVICE_H_ */<br />diff --git a/drivers/meson.build b/drivers/meson.build<br />index 66931d4241..cdbd3b1c17 100644<br />--- a/drivers/meson.build<br />+++ b/drivers/meson.build<br />@@ -17,6 +17,7 @@ subdirs = [<br />         'common/nitrox',  # depends on bus.<br />         'common/qat',     # depends on bus.<br />         'common/sfc_efx', # depends on bus.<br />+        'common/zsda',    # depends on bus.<br />         'mempool',        # depends on common and bus.<br />         'dma',            # depends on common and bus.<br />         'net',            # depends on common, bus, mempool<br />--  <br />2.27.0<br />