Add support for zsdadev operations such as dev_start and dev_stop.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> config/rte_config.h               |   4 +<br /> drivers/common/zsda/meson.build   |   1 +<br /> drivers/common/zsda/zsda_device.c | 444 ++++++++++++++++++++++++++++++<br /> drivers/common/zsda/zsda_device.h | 117 ++++++++<br /> 4 files changed, 566 insertions(+)<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/config/rte_config.h b/config/rte_config.h<br />index dd7bb0d35b..e1e85b3291 100644<br />--- a/config/rte_config.h<br />+++ b/config/rte_config.h<br />@@ -117,6 +117,10 @@<br /> #define RTE_PMD_QAT_COMP_SGL_MAX_SEGMENTS 16<br /> #define RTE_PMD_QAT_COMP_IM_BUFFER_SIZE 65536<br />  <br />+/* ZSDA device */<br />+/* Max. number of ZSDA devices which can be attached */<br />+#define RTE_PMD_ZSDA_MAX_PCI_DEVICES 256<br />+<br /> /* virtio crypto defines */<br /> #define RTE_MAX_VIRTIO_CRYPTO 32<br />  <br />diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build<br />index 8971289080..44f2375d8d 100644<br />--- a/drivers/common/zsda/meson.build<br />+++ b/drivers/common/zsda/meson.build<br />@@ -11,4 +11,5 @@ deps += ['bus_pci']<br /> sources += files(<br />         'zsda_common.c',<br />         'zsda_logs.c',<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..4ddc97e564<br />--- /dev/null<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -0,0 +1,444 @@<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 "zsda_device.h" <br />+#include "zsda_qp.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 />+uint8_t zsda_num_used_qps;<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 int<br />+zsda_check_write(uint8_t *addr, const uint32_t dst_value)<br />+{<br />+    int times = ZSDA_TIME_NUM;<br />+    uint32_t val;<br />+<br />+    val = ZSDA_CSR_READ32(addr);<br />+<br />+    while ((val != dst_value) && times--) {<br />+        val = ZSDA_CSR_READ32(addr);<br />+        rte_delay_us_sleep(ZSDA_TIME_SLEEP_US);<br />+    }<br />+    if (val == dst_value)<br />+        return ZSDA_SUCCESS;<br />+    else<br />+        return ZSDA_FAILED;<br />+}<br />+<br />+static uint8_t<br />+zsda_get_num_used_qps(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t num_used_qps;<br />+<br />+    num_used_qps = ZSDA_CSR_READ8(mmio_base + 0);<br />+<br />+    return num_used_qps;<br />+}<br />+<br />+int<br />+zsda_admin_q_start(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    int ret = 0;<br />+<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, 0);<br />+<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START);<br />+    ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_START, ZSDA_Q_START);<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_admin_q_stop(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    int ret = 0;<br />+<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP_RESP, ZSDA_RESP_INVALID);<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_STOP, ZSDA_Q_STOP);<br />+<br />+    ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_STOP_RESP,<br />+                   ZSDA_RESP_VALID);<br />+<br />+    if (ret)<br />+        ZSDA_LOG(INFO, "Failed! zsda_admin q stop");<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_admin_q_clear(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    int ret = 0;<br />+<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR_RESP, ZSDA_RESP_INVALID);<br />+    ZSDA_CSR_WRITE32(mmio_base + ZSDA_ADMIN_Q_CLR, ZSDA_RESP_VALID);<br />+<br />+    ret = zsda_check_write(mmio_base + ZSDA_ADMIN_Q_CLR_RESP,<br />+                   ZSDA_RESP_VALID);<br />+<br />+    if (ret)<br />+        ZSDA_LOG(INFO, "Failed! zsda_admin q clear");<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_queue_stop_single(uint8_t *mmio_base, const uint8_t id)<br />+{<br />+    int ret = 0;<br />+    uint8_t *addr_stop = mmio_base + ZSDA_IO_Q_STOP + (4 * id);<br />+    uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_STOP_RESP + (4 * id);<br />+<br />+    ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID);<br />+    ZSDA_CSR_WRITE32(addr_stop, ZSDA_Q_STOP);<br />+<br />+    ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID);<br />+    ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID);<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_queue_stop(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t id;<br />+    int ret = 0;<br />+<br />+    for (id = 0; id < zsda_num_used_qps; id++)<br />+        ret |= zsda_queue_stop_single(mmio_base, id);<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_queue_start_single(uint8_t *mmio_base, const uint8_t id)<br />+{<br />+    uint8_t *addr_start = mmio_base + ZSDA_IO_Q_START + (4 * id);<br />+<br />+    ZSDA_CSR_WRITE32(addr_start, ZSDA_Q_START);<br />+    return zsda_check_write(addr_start, ZSDA_Q_START);<br />+}<br />+<br />+int<br />+zsda_queue_start(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t id;<br />+    int ret = 0;<br />+<br />+    for (id = 0; id < zsda_num_used_qps; id++)<br />+        ret |= zsda_queue_start_single(mmio_base, id);<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_queue_clear_single(uint8_t *mmio_base, const uint8_t id)<br />+{<br />+    int ret = 0;<br />+    uint8_t *addr_clear = mmio_base + ZSDA_IO_Q_CLR + (4 * id);<br />+    uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_CLR_RESP + (4 * id);<br />+<br />+    ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID);<br />+    ZSDA_CSR_WRITE32(addr_clear, ZSDA_CLEAR_VALID);<br />+    ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID);<br />+    ZSDA_CSR_WRITE32(addr_clear, ZSDA_CLEAR_INVALID);<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_queue_clear(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t id;<br />+    int ret = 0;<br />+<br />+    for (id = 0; id < zsda_num_used_qps; id++)<br />+        ret |= zsda_queue_clear_single(mmio_base, id);<br />+<br />+    return ret;<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 />+        ZSDA_LOG(ERR, E_NULL);<br />+        return NULL;<br />+    }<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 />+<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 />+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 />+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 />+<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 />+            ZSDA_LOG(ERR, "Secondary can't find %s mz", name);<br />+            return NULL;<br />+        }<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 />+        ZSDA_LOG(ERR, E_CONFIG);<br />+        return NULL;<br />+    }<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 />+        ZSDA_LOG(ERR, "Reached maximum number of ZSDA devices");<br />+        return NULL;<br />+    }<br />+<br />+    unsigned int socket_id = rte_socket_id();<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 />+        ZSDA_LOG(ERR, E_MALLOC);<br />+        return NULL;<br />+    }<br />+<br />+    zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr;<br />+    memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev));<br />+    strlcpy(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 />+    rte_spinlock_init(&zsda_pci_dev->arb_csr_lock);<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 />+            if ((zsda_pci_dev->sym_dev != NULL) ||<br />+                (zsda_pci_dev->comp_dev != NULL)) {<br />+                ZSDA_LOG(DEBUG, "ZSDA device %s is busy", name);<br />+                return -EBUSY;<br />+            }<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(struct zsda_pci_device *zsda_pci_dev,<br />+             const struct rte_pci_device *pci_dev)<br />+{<br />+    zsda_sym_dev_destroy(zsda_pci_dev);<br />+    zsda_comp_dev_destroy(zsda_pci_dev);<br />+<br />+    return zsda_pci_device_release(pci_dev);<br />+}<br />+<br />+static int<br />+zsda_unmask_flr(const struct zsda_pci_device *zsda_pci_dev)<br />+{<br />+    struct zsda_admin_req_qcfg req = {0};<br />+    struct zsda_admin_resp_qcfg resp = {0};<br />+<br />+    int ret = 0;<br />+    struct rte_pci_device *pci_dev =<br />+        zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev;<br />+<br />+    zsda_admin_msg_init(pci_dev);<br />+<br />+    req.msg_type = ZSDA_FLR_SET_FUNCTION;<br />+<br />+    ret = zsda_send_admin_msg(pci_dev, &req, sizeof(req));<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! Send msg");<br />+        return ret;<br />+    }<br />+<br />+    ret = zsda_recv_admin_msg(pci_dev, &resp, sizeof(resp));<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! Receive msg");<br />+        return ret;<br />+    }<br />+<br />+    return ZSDA_SUCCESS;<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 />+        ZSDA_LOG(ERR, E_NULL);<br />+        return -ENODEV;<br />+    }<br />+<br />+    zsda_num_used_qps = zsda_get_num_used_qps(zsda_pci_dev->pci_dev);<br />+    zsda_num_used_qps++;<br />+<br />+    ret = zsda_admin_q_start(zsda_pci_dev->pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! admin q start");<br />+        return ret;<br />+    }<br />+<br />+    ret = zsda_queue_clear(zsda_pci_dev->pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! used zsda_io q clear");<br />+        return ret;<br />+    }<br />+<br />+    ret = zsda_unmask_flr(zsda_pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! flr close");<br />+        return ret;<br />+    }<br />+<br />+    ret = zsda_get_queue_cfg(zsda_pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! zsda_get_queue_cfg");<br />+        return ret;<br />+    }<br />+<br />+    ret |= zsda_sym_dev_create(zsda_pci_dev);<br />+    ret |= zsda_comp_dev_create(zsda_pci_dev);<br />+<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! dev create");<br />+        zsda_pci_dev_destroy(zsda_pci_dev, pci_dev);<br />+        return ret;<br />+    }<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 />+    if (zsda_admin_q_clear(zsda_pci_dev->pci_dev) == ZSDA_FAILED)<br />+        ZSDA_LOG(ERR, "Failed! q clear");<br />+<br />+    if (zsda_admin_q_stop(zsda_pci_dev->pci_dev) == ZSDA_FAILED)<br />+        ZSDA_LOG(ERR, "Failed! q stop");<br />+<br />+    return zsda_pci_dev_destroy(zsda_pci_dev, 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..a6c3f016ea<br />--- /dev/null<br />+++ b/drivers/common/zsda/zsda_device.h<br />@@ -0,0 +1,117 @@<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 "bus_pci_driver.h" <br />+<br />+#include "zsda_common.h" <br />+#include "zsda_logs.h" <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 />+    struct rte_device sym_rte_dev;<br />+    /**< This represents the crypto sym subset of this pci device.<br />+     * Register with this rather than with the one in<br />+     * pci_dev so that its driver can have a crypto-specific name<br />+     */<br />+<br />+    struct rte_device comp_rte_dev;<br />+    /**< This represents the compression subset of this pci device.<br />+     * Register with this rather than with the one in<br />+     * pci_dev so that its driver can have a compression-specific name<br />+     */<br />+};<br />+<br />+extern struct zsda_device_info zsda_devs[];<br />+<br />+struct zsda_sym_dev_private;<br />+struct zsda_comp_dev_private;<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 />+/*<br />+ * This struct holds all the data about a ZSDA pci device<br />+ * including data about all services it supports.<br />+ * It contains<br />+ *  - hw_data<br />+ *  - config data<br />+ *  - runtime data<br />+ * Note: as this data can be shared in a multi-process scenario,<br />+ * any pointers in it must also point to shared memory.<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 />+    rte_spinlock_t arb_csr_lock;<br />+    /**< lock to protect accesses to the arbiter CSR */<br />+<br />+    struct rte_pci_device *pci_dev;<br />+<br />+    /* Data relating to symmetric crypto service */<br />+    struct zsda_sym_dev_private *sym_dev;<br />+    /**< link back to cryptodev private data */<br />+<br />+    /* Data relating to compression service */<br />+    struct zsda_comp_dev_private *comp_dev;<br />+    /**< link back to compressdev private data */<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 />+struct zsda_pci_device *<br />+zsda_pci_device_allocate(struct rte_pci_device *pci_dev);<br />+<br />+struct zsda_pci_device *<br />+zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev);<br />+<br />+__rte_weak int<br />+zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+__rte_weak int<br />+zsda_sym_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+__rte_weak int<br />+zsda_sym_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+__rte_weak int<br />+zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+__rte_weak int<br />+zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+int zsda_queue_start(const struct rte_pci_device *pci_dev);<br />+int zsda_queue_stop(const struct rte_pci_device *pci_dev);<br />+int zsda_queue_clear(const struct rte_pci_device *pci_dev);<br />+<br />+int zsda_admin_q_start(const struct rte_pci_device *pci_dev);<br />+int zsda_admin_q_stop(const struct rte_pci_device *pci_dev);<br />+int zsda_admin_q_clear(const struct rte_pci_device *pci_dev);<br />+<br />+int zsda_set_cycle_head_tail(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+#endif /* _ZSDA_DEVICE_H_ */<br />--  <br />2.27.0<br />