-----Original Message----- > Date: Thu, 25 May 2017 23:37:41 +0530 > From: Nipun Gupta <nipun.gu...@nxp.com> > To: dev@dpdk.org > CC: hemant.agra...@nxp.com, jerin.ja...@caviumnetworks.com, > harry.van.haa...@intel.com, bruce.richard...@intel.com, > gage.e...@intel.com, shreyansh.j...@nxp.com, Nipun Gupta > <nipun.gu...@nxp.com> > Subject: [PATCH 10/20] event/dpaa2: add initialization of event device > X-Mailer: git-send-email 1.9.1 > > Signed-off-by: Nipun Gupta <nipun.gu...@nxp.com> > --- > drivers/event/dpaa2/dpaa2_eventdev.c | 153 > ++++++++++++++++++++++++++++++++++- > drivers/event/dpaa2/dpaa2_eventdev.h | 22 +++++ > 2 files changed, 171 insertions(+), 4 deletions(-) > > diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c > b/drivers/event/dpaa2/dpaa2_eventdev.c > index 191901e..7fa17f2 100644 > --- a/drivers/event/dpaa2/dpaa2_eventdev.c > +++ b/drivers/event/dpaa2/dpaa2_eventdev.c > @@ -30,17 +30,164 @@ > * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > */ > > +#include <assert.h> > +#include <stdio.h> > +#include <stdbool.h> > +#include <errno.h> > +#include <stdint.h> > +#include <string.h> > +#include <stdint.h> > +#include <sys/epoll.h> > + > +#include <rte_byteorder.h> > +#include <rte_common.h> > +#include <rte_debug.h> > +#include <rte_dev.h> > #include <rte_eal.h> > +#include <rte_log.h> > +#include <rte_memory.h> > +#include <rte_memzone.h> > +#include <rte_malloc.h> > +#include <rte_pci.h> > +#include <rte_lcore.h> > #include <rte_vdev.h> > +#include <rte_fslmc.h> > +#include <rte_atomic.h>
Maintain alphabetical order in header inclusion. > > +#include <fslmc_vfio.h> > +#include <dpaa2_hw_pvt.h> > +#include <dpaa2_hw_mempool.h> > +#include <dpaa2_hw_dpio.h> > #include "dpaa2_eventdev.h" > +#include <portal/dpaa2_hw_pvt.h> > +#include <mc/fsl_dpci.h> > + > +/* Clarifications > + * Evendev = SoC Instance > + * Eventport = DPIO Instance > + * Eventqueue = DPCON Instance > + * 1 Eventdev can have N Eventqueue > + * Soft Event Flow is DPCI Instance > + */ > + > +static uint16_t > +dpaa2_eventdev_enqueue_burst(void *port, const struct rte_event ev[], > + uint16_t nb_events) > +{ > + RTE_SET_USED(port); > + RTE_SET_USED(ev); > + RTE_SET_USED(nb_events); > + > + return 0; > +} > + > +static uint16_t > +dpaa2_eventdev_enqueue(void *port, const struct rte_event *ev) > +{ > + return dpaa2_eventdev_enqueue_burst(port, ev, 1); > +} > + > +static uint16_t > +dpaa2_eventdev_dequeue_burst(void *port, struct rte_event ev[], > + uint16_t nb_events, uint64_t timeout_ticks) > +{ > + RTE_SET_USED(port); > + RTE_SET_USED(ev); > + RTE_SET_USED(nb_events); > + RTE_SET_USED(timeout_ticks); > + > + return 0; > +} > + > +static uint16_t > +dpaa2_eventdev_dequeue(void *port, struct rte_event *ev, > + uint64_t timeout_ticks) > +{ > + return dpaa2_eventdev_dequeue_burst(port, ev, 1, timeout_ticks); > +} > + > +static const struct rte_eventdev_ops dpaa2_eventdev_ops; > + > +static int > +dpaa2_eventdev_setup_dpci(struct dpaa2_dpci_dev *dpci_dev, > + struct dpaa2_dpcon_dev *dpcon_dev) > +{ > + struct dpci_rx_queue_cfg rx_queue_cfg; > + int ret, i; > + > + /*Do settings to get the frame on a DPCON object*/ > + rx_queue_cfg.options = DPCI_QUEUE_OPT_DEST; > + rx_queue_cfg.dest_cfg.dest_type = DPCI_DEST_DPCON; > + rx_queue_cfg.dest_cfg.dest_id = dpcon_dev->dpcon_id; > + rx_queue_cfg.dest_cfg.priority = DPAA2_EVENT_DEFAULT_DPCI_PRIO; > + > + for (i = 0 ; i < DPAA2_EVENT_DPCI_MAX_QUEUES; i++) { > + rx_queue_cfg.user_ctx = (uint64_t)(&dpci_dev->queue[i]); > + ret = dpci_set_rx_queue(&dpci_dev->dpci, > + CMD_PRI_LOW, > + dpci_dev->token, i, > + &rx_queue_cfg); > + if (ret) { > + PMD_DRV_LOG(ERR, PMD, > + "set_rx_q failed with err code: %d", ret); > + return ret; > + } > + } > + return 0; > +} > > static int > dpaa2_eventdev_create(const char *name) > { > - RTE_SET_USED(name); > + struct rte_eventdev *eventdev; > + struct dpaa2_eventdev *priv; > + struct dpaa2_dpcon_dev *dpcon_dev = NULL; > + struct dpaa2_dpci_dev *dpci_dev = NULL; > + int ret; > + > + eventdev = rte_event_pmd_vdev_init(name, > + sizeof(struct dpaa2_eventdev), > + rte_socket_id()); > + if (eventdev == NULL) { > + PMD_DRV_ERR("Failed to create eventdev vdev %s", name); > + goto fail; > + } > + > + eventdev->dev_ops = &dpaa2_eventdev_ops; > + eventdev->schedule = NULL; > + eventdev->enqueue = dpaa2_eventdev_enqueue; > + eventdev->enqueue_burst = dpaa2_eventdev_enqueue_burst; > + eventdev->dequeue = dpaa2_eventdev_dequeue; > + eventdev->dequeue_burst = dpaa2_eventdev_dequeue_burst; If it makes senses, you can return from here if its in multi process mode. > + > + priv = eventdev->data->dev_private; > + priv->max_event_queues = 0; > + > + do { > + dpcon_dev = rte_dpaa2_alloc_dpcon_dev(); > + if (!dpcon_dev) > + break; > + priv->evq_info[priv->max_event_queues].dpcon = dpcon_dev; > + > + dpci_dev = rte_dpaa2_alloc_dpci_dev(); > + if (!dpci_dev) { > + rte_dpaa2_free_dpcon_dev(dpcon_dev); > + break; > + } > + priv->evq_info[priv->max_event_queues].dpci = dpci_dev; > + > + ret = dpaa2_eventdev_setup_dpci(dpci_dev, dpcon_dev); > + if (ret) { > + PMD_DRV_LOG(ERR, PMD, > + "dpci setup failed with err code: %d", ret); > + return ret; > + } > + priv->max_event_queues++; > + } while (dpcon_dev && dpci_dev); > > return 0; > +fail: > + return -EFAULT; > } > > static int > @@ -61,9 +208,7 @@ > name = rte_vdev_device_name(vdev); > PMD_DRV_LOG(INFO, "Closing %s", name); > > - RTE_SET_USED(name); > - > - return 0; > + return rte_event_pmd_vdev_uninit(name); > }