Add support for rawdev operations such as dev_start and dev_stop.<br /> <br />Signed-off-by: Yong Zhang <zhang.yong25@zte.com.cn> <br />---<br /> drivers/raw/gdtc/gdtc_rawdev.c | 136 ++++++++++++++++++++++++++++++++-<br /> drivers/raw/gdtc/gdtc_rawdev.h |  10 +++<br /> 2 files changed, 145 insertions(+), 1 deletion(-)<br /> <br />diff --git a/drivers/raw/gdtc/gdtc_rawdev.c b/drivers/raw/gdtc/gdtc_rawdev.c<br />index c3e59fcdab..8512bd8413 100644<br />--- a/drivers/raw/gdtc/gdtc_rawdev.c<br />+++ b/drivers/raw/gdtc/gdtc_rawdev.c<br />@@ -96,6 +96,96 @@ zxdh_gdma_write_reg(struct rte_rawdev *dev, uint16_t queue_id, uint32_t offset,<br />     *(uint32_t *)(gdmadev->base_addr + addr) = val;<br /> }<br />  <br />+static int<br />+zxdh_gdma_rawdev_info_get(struct rte_rawdev *dev,<br />+                __rte_unused rte_rawdev_obj_t dev_info,<br />+                __rte_unused size_t dev_info_size)<br />+{<br />+    if (dev == NULL)<br />+        return -EINVAL;<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zxdh_gdma_rawdev_configure(const struct rte_rawdev *dev,<br />+                rte_rawdev_obj_t config,<br />+                size_t config_size)<br />+{<br />+    struct zxdh_gdma_config *gdma_config = NULL;<br />+<br />+    if ((dev == NULL) ||<br />+        (config == NULL) ||<br />+        (config_size != sizeof(struct zxdh_gdma_config)))<br />+        return -EINVAL;<br />+<br />+    gdma_config = (struct zxdh_gdma_config *)config;<br />+    if (gdma_config->max_vqs > ZXDH_GDMA_TOTAL_CHAN_NUM) {<br />+        ZXDH_PMD_LOG(ERR, "gdma supports up to %d queues", ZXDH_GDMA_TOTAL_CHAN_NUM);<br />+        return -EINVAL;<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zxdh_gdma_rawdev_start(struct rte_rawdev *dev)<br />+{<br />+    struct zxdh_gdma_rawdev *gdmadev = NULL;<br />+<br />+    if (dev == NULL)<br />+        return -EINVAL;<br />+<br />+    gdmadev = zxdh_gdma_rawdev_get_priv(dev);<br />+    gdmadev->device_state = ZXDH_GDMA_DEV_RUNNING;<br />+<br />+    return 0;<br />+}<br />+<br />+static void<br />+zxdh_gdma_rawdev_stop(struct rte_rawdev *dev)<br />+{<br />+    struct zxdh_gdma_rawdev *gdmadev = NULL;<br />+<br />+    if (dev == NULL)<br />+        return;<br />+<br />+    gdmadev = zxdh_gdma_rawdev_get_priv(dev);<br />+    gdmadev->device_state = ZXDH_GDMA_DEV_STOPPED;<br />+}<br />+<br />+static int<br />+zxdh_gdma_rawdev_reset(struct rte_rawdev *dev)<br />+{<br />+    if (dev == NULL)<br />+        return -EINVAL;<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zxdh_gdma_rawdev_close(struct rte_rawdev *dev)<br />+{<br />+    struct zxdh_gdma_rawdev *gdmadev = NULL;<br />+    struct zxdh_gdma_queue *queue = NULL;<br />+    uint16_t queue_id = 0;<br />+<br />+    if (dev == NULL)<br />+        return -EINVAL;<br />+<br />+    for (queue_id = 0; queue_id < ZXDH_GDMA_TOTAL_CHAN_NUM; queue_id++) {<br />+        queue = zxdh_gdma_get_queue(dev, queue_id);<br />+        if ((queue == NULL) || (queue->enable == 0))<br />+            continue;<br />+<br />+        zxdh_gdma_queue_free(dev, queue_id);<br />+    }<br />+    gdmadev = zxdh_gdma_rawdev_get_priv(dev);<br />+    gdmadev->device_state = ZXDH_GDMA_DEV_STOPPED;<br />+<br />+    return 0;<br />+}<br />+<br /> static int<br /> zxdh_gdma_rawdev_queue_setup(struct rte_rawdev *dev,<br />                 uint16_t queue_id,<br />@@ -177,8 +267,52 @@ zxdh_gdma_rawdev_queue_setup(struct rte_rawdev *dev,<br />     return queue_id;<br /> }<br />  <br />+static int<br />+zxdh_gdma_rawdev_queue_release(struct rte_rawdev *dev, uint16_t queue_id)<br />+{<br />+    struct zxdh_gdma_queue *queue = NULL;<br />+<br />+    if (dev == NULL)<br />+        return -EINVAL;<br />+<br />+    queue = zxdh_gdma_get_queue(dev, queue_id);<br />+    if ((queue == NULL) || (queue->enable == 0))<br />+        return -EINVAL;<br />+<br />+    zxdh_gdma_queue_free(dev, queue_id);<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zxdh_gdma_rawdev_get_attr(struct rte_rawdev *dev,<br />+                __rte_unused const char *attr_name,<br />+                uint64_t *attr_value)<br />+{<br />+    struct zxdh_gdma_rawdev *gdmadev = NULL;<br />+    struct zxdh_gdma_attr *gdma_attr = NULL;<br />+<br />+    if ((dev == NULL) || (attr_value == NULL))<br />+        return -EINVAL;<br />+<br />+    gdmadev   = zxdh_gdma_rawdev_get_priv(dev);<br />+    gdma_attr = (struct zxdh_gdma_attr *)attr_value;<br />+    gdma_attr->num_hw_queues = gdmadev->used_num;<br />+<br />+    return 0;<br />+}<br /> static const struct rte_rawdev_ops zxdh_gdma_rawdev_ops = {<br />+    .dev_info_get = zxdh_gdma_rawdev_info_get,<br />+    .dev_configure = zxdh_gdma_rawdev_configure,<br />+    .dev_start = zxdh_gdma_rawdev_start,<br />+    .dev_stop = zxdh_gdma_rawdev_stop,<br />+    .dev_close = zxdh_gdma_rawdev_close,<br />+    .dev_reset = zxdh_gdma_rawdev_reset,<br />+<br />     .queue_setup = zxdh_gdma_rawdev_queue_setup,<br />+    .queue_release = zxdh_gdma_rawdev_queue_release,<br />+<br />+    .attr_get = zxdh_gdma_rawdev_get_attr,<br /> };<br />  <br /> static int<br />@@ -237,7 +371,7 @@ zxdh_gdma_queue_init(struct rte_rawdev *dev, uint16_t queue_id)<br />     ZXDH_PMD_LOG(INFO, "queue%u ring phy addr:0x%"PRIx64" virt addr:%p",<br />                         queue_id, mz->iova, mz->addr);<br />  <br />-    /* Initialize the hardware channel */<br />+    /* Configure the hardware channel to the initial state */<br />     zxdh_gdma_write_reg(dev, queue_id, ZXDH_GDMA_CONTROL_OFFSET,<br />         ZXDH_GDMA_CHAN_FORCE_CLOSE);<br />     zxdh_gdma_write_reg(dev, queue_id, ZXDH_GDMA_TC_CNT_OFFSET,<br />diff --git a/drivers/raw/gdtc/gdtc_rawdev.h b/drivers/raw/gdtc/gdtc_rawdev.h<br />index 29b169d079..92b35fcf14 100644<br />--- a/drivers/raw/gdtc/gdtc_rawdev.h<br />+++ b/drivers/raw/gdtc/gdtc_rawdev.h<br />@@ -100,6 +100,12 @@ struct zxdh_gdma_rawdev {<br />     struct zxdh_gdma_queue vqs[ZXDH_GDMA_TOTAL_CHAN_NUM];<br /> };<br />  <br />+struct zxdh_gdma_config {<br />+    uint16_t max_hw_queues_per_core;<br />+    uint16_t max_vqs;<br />+    int queue_pool_cnt;<br />+};<br />+<br /> struct zxdh_gdma_rbp {<br />     uint32_t use_ultrashort:1;<br />     uint32_t enable:1;<br />@@ -119,4 +125,8 @@ struct zxdh_gdma_queue_config {<br />     struct zxdh_gdma_rbp *rbp;<br /> };<br />  <br />+struct zxdh_gdma_attr {<br />+    uint16_t num_hw_queues;<br />+};<br />+<br /> #endif /* __GDTC_RAWDEV_H__ */<br />--  <br />2.43.0<br />