Signed-off-by: Hemant Agrawal <hemant.agra...@nxp.com>
---
 drivers/net/dpaa2/Makefile       |   2 +
 drivers/net/dpaa2/dpaa2_ethdev.c | 121 +++++++++++++++++++++++++++++++++++++++
 drivers/net/dpaa2/dpaa2_ethdev.h |   3 +
 3 files changed, 126 insertions(+)

diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile
index 5a1db74..4425b76 100644
--- a/drivers/net/dpaa2/Makefile
+++ b/drivers/net/dpaa2/Makefile
@@ -46,7 +46,9 @@ endif
 
 CFLAGS += -I$(RTE_SDK)/drivers/net/dpaa2
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
+CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
 CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include
+CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/dpio
 CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
 
 # versioning export map
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index a0e842c..c0ace68 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -47,20 +47,141 @@
 
 #include <fslmc_logs.h>
 #include <fslmc_vfio.h>
+#include <dpaa2_hw_pvt.h>
+
 #include "dpaa2_ethdev.h"
 
 /* Name of the DPAA2 Net PMD */
 static const char *drivername = "DPAA2 PMD";
 
 static int
+dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
+{
+       struct rte_eth_dev_data *data = dev->data;
+       struct rte_eth_conf *eth_conf = &data->dev_conf;
+
+       PMD_INIT_FUNC_TRACE();
+
+       /* Check for correct configuration */
+       if (eth_conf->rxmode.mq_mode != ETH_MQ_RX_RSS &&
+           data->nb_rx_queues > 1) {
+               PMD_INIT_LOG(ERR, "Distribution is not enabled, "
+                           "but Rx queues more than 1\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+static int
+dpaa2_dev_start(struct rte_eth_dev *dev)
+{
+       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+       int ret;
+
+       PMD_INIT_FUNC_TRACE();
+
+       ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n",
+                            ret, priv->hw_id);
+               return ret;
+       }
+
+       return 0;
+}
+
+/**
+ *  This routine disables all traffic on the adapter by issuing a
+ *  global reset on the MAC.
+ */
+static void
+dpaa2_dev_stop(struct rte_eth_dev *dev)
+{
+       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+       int ret;
+
+       PMD_INIT_FUNC_TRACE();
+
+       ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n",
+                            ret, priv->hw_id);
+               return;
+       }
+}
+
+static void
+dpaa2_dev_close(struct rte_eth_dev *dev)
+{
+       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+       int ret;
+
+       PMD_INIT_FUNC_TRACE();
+
+       /* Clean the device first */
+       ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failure cleaning dpni device with"
+                            " error code %d\n", ret);
+               return;
+       }
+}
+
+static struct eth_dev_ops dpaa2_ethdev_ops = {
+       .dev_configure    = dpaa2_eth_dev_configure,
+       .dev_start            = dpaa2_dev_start,
+       .dev_stop             = dpaa2_dev_stop,
+       .dev_close            = dpaa2_dev_close,
+};
+
+static int
 dpaa2_dev_init(struct rte_eth_dev *eth_dev)
 {
+       struct rte_device *dev = eth_dev->device;
+       struct rte_dpaa2_device *dpaa2_dev;
+       struct fsl_mc_io *dpni_dev;
+       struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
+       int ret, hw_id;
+
        PMD_INIT_FUNC_TRACE();
 
        /* For secondary processes, the primary has done all the work */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
 
+       dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
+
+       hw_id = dpaa2_dev->object_id;
+
+       dpni_dev = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io));
+       if (!dpni_dev) {
+               PMD_INIT_LOG(ERR, "malloc failed for dpni device\n");
+               return -1;
+       }
+
+       dpni_dev->regs = mcp_ptr_list[0];
+       ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failure in opening dpni@%d device with"
+                       " error code %d\n", hw_id, ret);
+               return -1;
+       }
+
+       /* Clean the device first */
+       ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failure cleaning dpni@%d device with"
+                       " error code %d\n", hw_id, ret);
+               return -1;
+       }
+
+       priv->hw = dpni_dev;
+       priv->hw_id = hw_id;
+       eth_dev->dev_ops = &dpaa2_ethdev_ops;
        eth_dev->data->drv_name = drivername;
 
        return 0;
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h
index 5778780..840b688 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.h
+++ b/drivers/net/dpaa2/dpaa2_ethdev.h
@@ -34,6 +34,9 @@
 #ifndef _DPAA2_ETHDEV_H
 #define _DPAA2_ETHDEV_H
 
+#include <mc/fsl_dpni.h>
+#include <mc/fsl_mc_sys.h>
+
 struct dpaa2_dev_priv {
        void *hw;
        int32_t hw_id;
-- 
1.9.1

Reply via email to