xref: /dpdk/drivers/event/opdl/opdl_evdev.c (revision 8b565b3445b67567a459d48e64ba5700320fc852)
1e07a3ed7SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2e07a3ed7SBruce Richardson  * Copyright(c) 2017 Intel Corporation
33c7f3dcfSLiang Ma  */
43c7f3dcfSLiang Ma 
53c7f3dcfSLiang Ma #include <inttypes.h>
672b452c5SDmitry Kozlyuk #include <stdlib.h>
73c7f3dcfSLiang Ma #include <string.h>
83c7f3dcfSLiang Ma 
94851ef2bSDavid Marchand #include <bus_vdev_driver.h>
103c7f3dcfSLiang Ma #include <rte_lcore.h>
113c7f3dcfSLiang Ma #include <rte_memzone.h>
123c7f3dcfSLiang Ma #include <rte_kvargs.h>
133c7f3dcfSLiang Ma #include <rte_errno.h>
143c7f3dcfSLiang Ma #include <rte_cycles.h>
153c7f3dcfSLiang Ma 
163c7f3dcfSLiang Ma #include "opdl_evdev.h"
173c7f3dcfSLiang Ma #include "opdl_ring.h"
183c7f3dcfSLiang Ma #include "opdl_log.h"
193c7f3dcfSLiang Ma 
203c7f3dcfSLiang Ma #define EVENTDEV_NAME_OPDL_PMD event_opdl
213c7f3dcfSLiang Ma #define NUMA_NODE_ARG "numa_node"
223c7f3dcfSLiang Ma #define DO_VALIDATION_ARG "do_validation"
233c7f3dcfSLiang Ma #define DO_TEST_ARG "self_test"
243c7f3dcfSLiang Ma 
253c7f3dcfSLiang Ma 
263c7f3dcfSLiang Ma static void
273c7f3dcfSLiang Ma opdl_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info);
283c7f3dcfSLiang Ma 
298ca5fad5SLiang Ma uint16_t
308ca5fad5SLiang Ma opdl_event_enqueue_burst(void *port,
318ca5fad5SLiang Ma 			 const struct rte_event ev[],
328ca5fad5SLiang Ma 			 uint16_t num)
338ca5fad5SLiang Ma {
348ca5fad5SLiang Ma 	struct opdl_port *p = port;
358ca5fad5SLiang Ma 
368ca5fad5SLiang Ma 	if (unlikely(!p->opdl->data->dev_started))
378ca5fad5SLiang Ma 		return 0;
388ca5fad5SLiang Ma 
398ca5fad5SLiang Ma 
408ca5fad5SLiang Ma 	/* either rx_enqueue or disclaim*/
418ca5fad5SLiang Ma 	return p->enq(p, ev, num);
428ca5fad5SLiang Ma }
438ca5fad5SLiang Ma 
448ca5fad5SLiang Ma uint16_t
458ca5fad5SLiang Ma opdl_event_enqueue(void *port, const struct rte_event *ev)
468ca5fad5SLiang Ma {
478ca5fad5SLiang Ma 	struct opdl_port *p = port;
488ca5fad5SLiang Ma 
498ca5fad5SLiang Ma 	if (unlikely(!p->opdl->data->dev_started))
508ca5fad5SLiang Ma 		return 0;
518ca5fad5SLiang Ma 
528ca5fad5SLiang Ma 
538ca5fad5SLiang Ma 	return p->enq(p, ev, 1);
548ca5fad5SLiang Ma }
558ca5fad5SLiang Ma 
568ca5fad5SLiang Ma uint16_t
578ca5fad5SLiang Ma opdl_event_dequeue_burst(void *port,
588ca5fad5SLiang Ma 			 struct rte_event *ev,
598ca5fad5SLiang Ma 			 uint16_t num,
608ca5fad5SLiang Ma 			 uint64_t wait)
618ca5fad5SLiang Ma {
628ca5fad5SLiang Ma 	struct opdl_port *p = (void *)port;
638ca5fad5SLiang Ma 
648ca5fad5SLiang Ma 	RTE_SET_USED(wait);
658ca5fad5SLiang Ma 
668ca5fad5SLiang Ma 	if (unlikely(!p->opdl->data->dev_started))
678ca5fad5SLiang Ma 		return 0;
688ca5fad5SLiang Ma 
698ca5fad5SLiang Ma 	/* This function pointer can point to tx_dequeue or claim*/
708ca5fad5SLiang Ma 	return p->deq(p, ev, num);
718ca5fad5SLiang Ma }
728ca5fad5SLiang Ma 
738ca5fad5SLiang Ma uint16_t
748ca5fad5SLiang Ma opdl_event_dequeue(void *port,
758ca5fad5SLiang Ma 		   struct rte_event *ev,
768ca5fad5SLiang Ma 		   uint64_t wait)
778ca5fad5SLiang Ma {
788ca5fad5SLiang Ma 	struct opdl_port *p = (void *)port;
798ca5fad5SLiang Ma 
808ca5fad5SLiang Ma 	if (unlikely(!p->opdl->data->dev_started))
818ca5fad5SLiang Ma 		return 0;
828ca5fad5SLiang Ma 
838ca5fad5SLiang Ma 	RTE_SET_USED(wait);
848ca5fad5SLiang Ma 
858ca5fad5SLiang Ma 	return p->deq(p, ev, 1);
868ca5fad5SLiang Ma }
878ca5fad5SLiang Ma 
880bf298e3SLiang Ma static int
890bf298e3SLiang Ma opdl_port_link(struct rte_eventdev *dev,
900bf298e3SLiang Ma 	       void *port,
910bf298e3SLiang Ma 	       const uint8_t queues[],
920bf298e3SLiang Ma 	       const uint8_t priorities[],
930bf298e3SLiang Ma 	       uint16_t num)
940bf298e3SLiang Ma {
950bf298e3SLiang Ma 	struct opdl_port *p = port;
960bf298e3SLiang Ma 
970bf298e3SLiang Ma 	RTE_SET_USED(priorities);
980bf298e3SLiang Ma 	RTE_SET_USED(dev);
990bf298e3SLiang Ma 
1000bf298e3SLiang Ma 	if (unlikely(dev->data->dev_started)) {
1010bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
102*f665790aSDavid Marchand 			     "Attempt to link queue (%u) to port %d while device started",
1030bf298e3SLiang Ma 			     dev->data->dev_id,
1040bf298e3SLiang Ma 				queues[0],
1050bf298e3SLiang Ma 				p->id);
106db8bdaecSDilshod Urazov 		rte_errno = EINVAL;
1070bf298e3SLiang Ma 		return 0;
1080bf298e3SLiang Ma 	}
1090bf298e3SLiang Ma 
1100bf298e3SLiang Ma 	/* Max of 1 queue per port */
1110bf298e3SLiang Ma 	if (num > 1) {
1120bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
113*f665790aSDavid Marchand 			     "Attempt to link more than one queue (%u) to port %d requested",
1140bf298e3SLiang Ma 			     dev->data->dev_id,
1150bf298e3SLiang Ma 				num,
1160bf298e3SLiang Ma 				p->id);
117db8bdaecSDilshod Urazov 		rte_errno = EDQUOT;
1180bf298e3SLiang Ma 		return 0;
1190bf298e3SLiang Ma 	}
1200bf298e3SLiang Ma 
1210bf298e3SLiang Ma 	if (!p->configured) {
1220bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
123*f665790aSDavid Marchand 			     "port %d not configured, cannot link to %u",
1240bf298e3SLiang Ma 			     dev->data->dev_id,
1250bf298e3SLiang Ma 				p->id,
1260bf298e3SLiang Ma 				queues[0]);
127db8bdaecSDilshod Urazov 		rte_errno = EINVAL;
1280bf298e3SLiang Ma 		return 0;
1290bf298e3SLiang Ma 	}
1300bf298e3SLiang Ma 
1310bf298e3SLiang Ma 	if (p->external_qid != OPDL_INVALID_QID) {
1320bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
133*f665790aSDavid Marchand 			     "port %d already linked to queue %u, cannot link to %u",
1340bf298e3SLiang Ma 			     dev->data->dev_id,
1350bf298e3SLiang Ma 				p->id,
1360bf298e3SLiang Ma 				p->external_qid,
1370bf298e3SLiang Ma 				queues[0]);
138db8bdaecSDilshod Urazov 		rte_errno = EINVAL;
1390bf298e3SLiang Ma 		return 0;
1400bf298e3SLiang Ma 	}
1410bf298e3SLiang Ma 
1420bf298e3SLiang Ma 	p->external_qid = queues[0];
1430bf298e3SLiang Ma 
1440bf298e3SLiang Ma 	return 1;
1450bf298e3SLiang Ma }
1460bf298e3SLiang Ma 
1470bf298e3SLiang Ma static int
1480bf298e3SLiang Ma opdl_port_unlink(struct rte_eventdev *dev,
1490bf298e3SLiang Ma 		 void *port,
1500bf298e3SLiang Ma 		 uint8_t queues[],
1510bf298e3SLiang Ma 		 uint16_t nb_unlinks)
1520bf298e3SLiang Ma {
1530bf298e3SLiang Ma 	struct opdl_port *p = port;
1540bf298e3SLiang Ma 
1550bf298e3SLiang Ma 	RTE_SET_USED(queues);
1560bf298e3SLiang Ma 	RTE_SET_USED(nb_unlinks);
1570bf298e3SLiang Ma 
1580bf298e3SLiang Ma 	if (unlikely(dev->data->dev_started)) {
1590bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
160*f665790aSDavid Marchand 			     "Attempt to unlink queue (%u) to port %d while device started",
1610bf298e3SLiang Ma 			     dev->data->dev_id,
1620bf298e3SLiang Ma 			     queues[0],
1630bf298e3SLiang Ma 			     p->id);
164db8bdaecSDilshod Urazov 		rte_errno = EINVAL;
1650bf298e3SLiang Ma 		return 0;
1660bf298e3SLiang Ma 	}
1670bf298e3SLiang Ma 	RTE_SET_USED(nb_unlinks);
1680bf298e3SLiang Ma 
1690bf298e3SLiang Ma 	/* Port Stuff */
1700bf298e3SLiang Ma 	p->queue_id = OPDL_INVALID_QID;
1710bf298e3SLiang Ma 	p->p_type = OPDL_INVALID_PORT;
1720bf298e3SLiang Ma 	p->external_qid = OPDL_INVALID_QID;
1730bf298e3SLiang Ma 
1740bf298e3SLiang Ma 	/* always unlink 0 queue due to statice pipeline */
1750bf298e3SLiang Ma 	return 0;
1760bf298e3SLiang Ma }
1770bf298e3SLiang Ma 
1780bf298e3SLiang Ma static int
1790bf298e3SLiang Ma opdl_port_setup(struct rte_eventdev *dev,
1800bf298e3SLiang Ma 		uint8_t port_id,
1810bf298e3SLiang Ma 		const struct rte_event_port_conf *conf)
1820bf298e3SLiang Ma {
1830bf298e3SLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
1840bf298e3SLiang Ma 	struct opdl_port *p = &device->ports[port_id];
1850bf298e3SLiang Ma 
1860bf298e3SLiang Ma 	RTE_SET_USED(conf);
1870bf298e3SLiang Ma 
1880bf298e3SLiang Ma 	/* Check if port already configured */
1890bf298e3SLiang Ma 	if (p->configured) {
1900bf298e3SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
191*f665790aSDavid Marchand 			     "Attempt to setup port %d which is already setup",
1920bf298e3SLiang Ma 			     dev->data->dev_id,
1930bf298e3SLiang Ma 			     p->id);
1940bf298e3SLiang Ma 		return -EDQUOT;
1950bf298e3SLiang Ma 	}
1960bf298e3SLiang Ma 
1970bf298e3SLiang Ma 	*p = (struct opdl_port){0}; /* zero entire structure */
1980bf298e3SLiang Ma 	p->id = port_id;
1990bf298e3SLiang Ma 	p->opdl = device;
2000bf298e3SLiang Ma 	p->queue_id = OPDL_INVALID_QID;
2010bf298e3SLiang Ma 	p->external_qid = OPDL_INVALID_QID;
2020bf298e3SLiang Ma 	dev->data->ports[port_id] = p;
2030bf298e3SLiang Ma 	rte_smp_wmb();
2040bf298e3SLiang Ma 	p->configured = 1;
2050bf298e3SLiang Ma 	device->nb_ports++;
2060bf298e3SLiang Ma 	return 0;
2070bf298e3SLiang Ma }
2080bf298e3SLiang Ma 
2090bf298e3SLiang Ma static void
2100bf298e3SLiang Ma opdl_port_release(void *port)
2110bf298e3SLiang Ma {
2120bf298e3SLiang Ma 	struct opdl_port *p = (void *)port;
2130bf298e3SLiang Ma 
2140bf298e3SLiang Ma 	if (p == NULL ||
2150bf298e3SLiang Ma 	    p->opdl->data->dev_started) {
2160bf298e3SLiang Ma 		return;
2170bf298e3SLiang Ma 	}
2180bf298e3SLiang Ma 
2190bf298e3SLiang Ma 	p->configured = 0;
2200bf298e3SLiang Ma 	p->initialized = 0;
2210bf298e3SLiang Ma }
2220bf298e3SLiang Ma 
2230bf298e3SLiang Ma static void
2240bf298e3SLiang Ma opdl_port_def_conf(struct rte_eventdev *dev, uint8_t port_id,
2250bf298e3SLiang Ma 		struct rte_event_port_conf *port_conf)
2260bf298e3SLiang Ma {
2270bf298e3SLiang Ma 	RTE_SET_USED(dev);
2280bf298e3SLiang Ma 	RTE_SET_USED(port_id);
2290bf298e3SLiang Ma 
2300bf298e3SLiang Ma 	port_conf->new_event_threshold = MAX_OPDL_CONS_Q_DEPTH;
2310bf298e3SLiang Ma 	port_conf->dequeue_depth = MAX_OPDL_CONS_Q_DEPTH;
2320bf298e3SLiang Ma 	port_conf->enqueue_depth = MAX_OPDL_CONS_Q_DEPTH;
2330bf298e3SLiang Ma }
2343c7f3dcfSLiang Ma 
2358ca8e3b4SLiang Ma static int
2368ca8e3b4SLiang Ma opdl_queue_setup(struct rte_eventdev *dev,
2378ca8e3b4SLiang Ma 		 uint8_t queue_id,
2388ca8e3b4SLiang Ma 		 const struct rte_event_queue_conf *conf)
2398ca8e3b4SLiang Ma {
2408ca8e3b4SLiang Ma 	enum queue_type type;
2418ca8e3b4SLiang Ma 
2428ca8e3b4SLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
2438ca8e3b4SLiang Ma 
2448ca8e3b4SLiang Ma 	/* Extra sanity check, probably not needed */
2458ca8e3b4SLiang Ma 	if (queue_id == OPDL_INVALID_QID) {
2468ca8e3b4SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
247*f665790aSDavid Marchand 			     "Invalid queue id %u requested",
2488ca8e3b4SLiang Ma 			     dev->data->dev_id,
2498ca8e3b4SLiang Ma 			     queue_id);
2508ca8e3b4SLiang Ma 		return -EINVAL;
2518ca8e3b4SLiang Ma 	}
2528ca8e3b4SLiang Ma 
2538ca8e3b4SLiang Ma 	if (device->nb_q_md > device->max_queue_nb) {
2548ca8e3b4SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
255*f665790aSDavid Marchand 			     "Max number of queues %u exceeded by request %u",
2568ca8e3b4SLiang Ma 			     dev->data->dev_id,
2578ca8e3b4SLiang Ma 			     device->max_queue_nb,
2588ca8e3b4SLiang Ma 			     device->nb_q_md);
2598ca8e3b4SLiang Ma 		return -EINVAL;
2608ca8e3b4SLiang Ma 	}
2618ca8e3b4SLiang Ma 
2628ca8e3b4SLiang Ma 	if (RTE_EVENT_QUEUE_CFG_ALL_TYPES
2638ca8e3b4SLiang Ma 	    & conf->event_queue_cfg) {
2648ca8e3b4SLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
265*f665790aSDavid Marchand 			     "QUEUE_CFG_ALL_TYPES not supported",
2668ca8e3b4SLiang Ma 			     dev->data->dev_id);
2678ca8e3b4SLiang Ma 		return -ENOTSUP;
2688ca8e3b4SLiang Ma 	} else if (RTE_EVENT_QUEUE_CFG_SINGLE_LINK
2698ca8e3b4SLiang Ma 		   & conf->event_queue_cfg) {
2708ca8e3b4SLiang Ma 		type = OPDL_Q_TYPE_SINGLE_LINK;
2718ca8e3b4SLiang Ma 	} else {
2728ca8e3b4SLiang Ma 		switch (conf->schedule_type) {
2738ca8e3b4SLiang Ma 		case RTE_SCHED_TYPE_ORDERED:
2748ca8e3b4SLiang Ma 			type = OPDL_Q_TYPE_ORDERED;
2758ca8e3b4SLiang Ma 			break;
2768ca8e3b4SLiang Ma 		case RTE_SCHED_TYPE_ATOMIC:
2778ca8e3b4SLiang Ma 			type = OPDL_Q_TYPE_ATOMIC;
2788ca8e3b4SLiang Ma 			break;
2798ca8e3b4SLiang Ma 		case RTE_SCHED_TYPE_PARALLEL:
2808ca8e3b4SLiang Ma 			type = OPDL_Q_TYPE_ORDERED;
2818ca8e3b4SLiang Ma 			break;
2828ca8e3b4SLiang Ma 		default:
2838ca8e3b4SLiang Ma 			PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
284*f665790aSDavid Marchand 				     "Unknown queue type %d requested",
2858ca8e3b4SLiang Ma 				     dev->data->dev_id,
2868ca8e3b4SLiang Ma 				     conf->event_queue_cfg);
2878ca8e3b4SLiang Ma 			return -EINVAL;
2888ca8e3b4SLiang Ma 		}
2898ca8e3b4SLiang Ma 	}
2908ca8e3b4SLiang Ma 	/* Check if queue id has been setup already */
291be455196SHarry van Haaren 	uint32_t i;
292be455196SHarry van Haaren 	for (i = 0; i < device->nb_q_md; i++) {
2938ca8e3b4SLiang Ma 		if (device->q_md[i].ext_id == queue_id) {
2948ca8e3b4SLiang Ma 			PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
295*f665790aSDavid Marchand 				     "queue id %u already setup",
2968ca8e3b4SLiang Ma 				     dev->data->dev_id,
2978ca8e3b4SLiang Ma 				     queue_id);
2988ca8e3b4SLiang Ma 			return -EINVAL;
2998ca8e3b4SLiang Ma 		}
3008ca8e3b4SLiang Ma 	}
3018ca8e3b4SLiang Ma 
3028ca8e3b4SLiang Ma 	device->q_md[device->nb_q_md].ext_id = queue_id;
3038ca8e3b4SLiang Ma 	device->q_md[device->nb_q_md].type = type;
3048ca8e3b4SLiang Ma 	device->q_md[device->nb_q_md].setup = 1;
3058ca8e3b4SLiang Ma 	device->nb_q_md++;
3068ca8e3b4SLiang Ma 
3078ca8e3b4SLiang Ma 	return 1;
3088ca8e3b4SLiang Ma }
3098ca8e3b4SLiang Ma 
3108ca8e3b4SLiang Ma static void
3118ca8e3b4SLiang Ma opdl_queue_release(struct rte_eventdev *dev, uint8_t queue_id)
3128ca8e3b4SLiang Ma {
3138ca8e3b4SLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
3148ca8e3b4SLiang Ma 
3158ca8e3b4SLiang Ma 	RTE_SET_USED(queue_id);
3168ca8e3b4SLiang Ma 
3178ca8e3b4SLiang Ma 	if (device->data->dev_started)
3188ca8e3b4SLiang Ma 		return;
3198ca8e3b4SLiang Ma 
3208ca8e3b4SLiang Ma }
3218ca8e3b4SLiang Ma 
3228ca8e3b4SLiang Ma static void
3238ca8e3b4SLiang Ma opdl_queue_def_conf(struct rte_eventdev *dev,
3248ca8e3b4SLiang Ma 		    uint8_t queue_id,
3258ca8e3b4SLiang Ma 		    struct rte_event_queue_conf *conf)
3268ca8e3b4SLiang Ma {
3278ca8e3b4SLiang Ma 	RTE_SET_USED(dev);
3288ca8e3b4SLiang Ma 	RTE_SET_USED(queue_id);
3298ca8e3b4SLiang Ma 
3308ca8e3b4SLiang Ma 	static const struct rte_event_queue_conf default_conf = {
3318ca8e3b4SLiang Ma 		.nb_atomic_flows = 1024,
3328ca8e3b4SLiang Ma 		.nb_atomic_order_sequences = 1,
3338ca8e3b4SLiang Ma 		.event_queue_cfg = 0,
3348ca8e3b4SLiang Ma 		.schedule_type = RTE_SCHED_TYPE_ORDERED,
3358ca8e3b4SLiang Ma 		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
3368ca8e3b4SLiang Ma 	};
3378ca8e3b4SLiang Ma 
3388ca8e3b4SLiang Ma 	*conf = default_conf;
3398ca8e3b4SLiang Ma }
3403c7f3dcfSLiang Ma 
3413c7f3dcfSLiang Ma 
3423c7f3dcfSLiang Ma static int
3433c7f3dcfSLiang Ma opdl_dev_configure(const struct rte_eventdev *dev)
3443c7f3dcfSLiang Ma {
3453c7f3dcfSLiang Ma 	struct opdl_evdev *opdl = opdl_pmd_priv(dev);
3463c7f3dcfSLiang Ma 	const struct rte_eventdev_data *data = dev->data;
3473c7f3dcfSLiang Ma 	const struct rte_event_dev_config *conf = &data->dev_conf;
3483c7f3dcfSLiang Ma 
3493c7f3dcfSLiang Ma 	opdl->max_queue_nb = conf->nb_event_queues;
3503c7f3dcfSLiang Ma 	opdl->max_port_nb = conf->nb_event_ports;
3513c7f3dcfSLiang Ma 	opdl->nb_events_limit = conf->nb_events_limit;
3523c7f3dcfSLiang Ma 
3533c7f3dcfSLiang Ma 	if (conf->event_dev_cfg & RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT) {
3543c7f3dcfSLiang Ma 		PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : "
355*f665790aSDavid Marchand 			     "DEQUEUE_TIMEOUT not supported",
3563c7f3dcfSLiang Ma 			     dev->data->dev_id);
3573c7f3dcfSLiang Ma 		return -ENOTSUP;
3583c7f3dcfSLiang Ma 	}
3593c7f3dcfSLiang Ma 
3603c7f3dcfSLiang Ma 	return 0;
3613c7f3dcfSLiang Ma }
3623c7f3dcfSLiang Ma 
3633c7f3dcfSLiang Ma static void
3643c7f3dcfSLiang Ma opdl_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info)
3653c7f3dcfSLiang Ma {
3663c7f3dcfSLiang Ma 	RTE_SET_USED(dev);
3673c7f3dcfSLiang Ma 
3683c7f3dcfSLiang Ma 	static const struct rte_event_dev_info evdev_opdl_info = {
3693c7f3dcfSLiang Ma 		.driver_name = OPDL_PMD_NAME,
3703c7f3dcfSLiang Ma 		.max_event_queues = RTE_EVENT_MAX_QUEUES_PER_DEV,
3713c7f3dcfSLiang Ma 		.max_event_queue_flows = OPDL_QID_NUM_FIDS,
3723c7f3dcfSLiang Ma 		.max_event_queue_priority_levels = OPDL_Q_PRIORITY_MAX,
3733c7f3dcfSLiang Ma 		.max_event_priority_levels = OPDL_IQS_MAX,
3743c7f3dcfSLiang Ma 		.max_event_ports = OPDL_PORTS_MAX,
3753c7f3dcfSLiang Ma 		.max_event_port_dequeue_depth = MAX_OPDL_CONS_Q_DEPTH,
3763c7f3dcfSLiang Ma 		.max_event_port_enqueue_depth = MAX_OPDL_CONS_Q_DEPTH,
3773c7f3dcfSLiang Ma 		.max_num_events = OPDL_INFLIGHT_EVENTS_TOTAL,
37875d11313STimothy McDaniel 		.event_dev_cap = RTE_EVENT_DEV_CAP_BURST_MODE |
3798eb01fb9SBruce Richardson 				 RTE_EVENT_DEV_CAP_ORDERED |
3808eb01fb9SBruce Richardson 				 RTE_EVENT_DEV_CAP_ATOMIC |
3818eb01fb9SBruce Richardson 				 RTE_EVENT_DEV_CAP_PARALLEL |
382bd991897SMattias Rönnblom 				 RTE_EVENT_DEV_CAP_CARRY_FLOW_ID |
383bd991897SMattias Rönnblom 				 RTE_EVENT_DEV_CAP_MAINTENANCE_FREE,
384d007a7f3SPavan Nikhilesh 		.max_profiles_per_port = 1,
3853c7f3dcfSLiang Ma 	};
3863c7f3dcfSLiang Ma 
3873c7f3dcfSLiang Ma 	*info = evdev_opdl_info;
3883c7f3dcfSLiang Ma }
3893c7f3dcfSLiang Ma 
3903c7f3dcfSLiang Ma static void
3913c7f3dcfSLiang Ma opdl_dump(struct rte_eventdev *dev, FILE *f)
3923c7f3dcfSLiang Ma {
3933c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
3943c7f3dcfSLiang Ma 
3953c7f3dcfSLiang Ma 	if (!device->do_validation)
3963c7f3dcfSLiang Ma 		return;
3973c7f3dcfSLiang Ma 
3983c7f3dcfSLiang Ma 	fprintf(f,
3993c7f3dcfSLiang Ma 		"\n\n -- RING STATISTICS --\n");
400be455196SHarry van Haaren 	uint32_t i;
401be455196SHarry van Haaren 	for (i = 0; i < device->nb_opdls; i++)
4023c7f3dcfSLiang Ma 		opdl_ring_dump(device->opdl[i], f);
4033c7f3dcfSLiang Ma 
4043c7f3dcfSLiang Ma 	fprintf(f,
4053c7f3dcfSLiang Ma 		"\n\n -- PORT STATISTICS --\n"
4063c7f3dcfSLiang Ma 		"Type Port Index  Port Id  Queue Id     Av. Req Size  "
4073c7f3dcfSLiang Ma 		"Av. Grant Size     Av. Cycles PP"
4083c7f3dcfSLiang Ma 		"      Empty DEQs   Non Empty DEQs   Pkts Processed\n");
4093c7f3dcfSLiang Ma 
410be455196SHarry van Haaren 	for (i = 0; i < device->max_port_nb; i++) {
4113c7f3dcfSLiang Ma 		char queue_id[64];
4123c7f3dcfSLiang Ma 		char total_cyc[64];
4133c7f3dcfSLiang Ma 		const char *p_type;
4143c7f3dcfSLiang Ma 
4153c7f3dcfSLiang Ma 		uint64_t cne, cpg;
4163c7f3dcfSLiang Ma 		struct opdl_port *port = &device->ports[i];
4173c7f3dcfSLiang Ma 
4183c7f3dcfSLiang Ma 		if (port->initialized) {
4193c7f3dcfSLiang Ma 			cne = port->port_stat[claim_non_empty];
4203c7f3dcfSLiang Ma 			cpg = port->port_stat[claim_pkts_granted];
4213c7f3dcfSLiang Ma 			if (port->p_type == OPDL_REGULAR_PORT)
4223c7f3dcfSLiang Ma 				p_type = "REG";
4233c7f3dcfSLiang Ma 			else if (port->p_type == OPDL_PURE_RX_PORT)
4243c7f3dcfSLiang Ma 				p_type = "  RX";
4253c7f3dcfSLiang Ma 			else if (port->p_type == OPDL_PURE_TX_PORT)
4263c7f3dcfSLiang Ma 				p_type = "  TX";
4273c7f3dcfSLiang Ma 			else if (port->p_type == OPDL_ASYNC_PORT)
4283c7f3dcfSLiang Ma 				p_type = "SYNC";
4293c7f3dcfSLiang Ma 			else
4303c7f3dcfSLiang Ma 				p_type = "????";
4313c7f3dcfSLiang Ma 
43257362ddfSPallantla Poornima 			snprintf(queue_id, sizeof(queue_id), "%02u",
43357362ddfSPallantla Poornima 					port->external_qid);
4343c7f3dcfSLiang Ma 			if (port->p_type == OPDL_REGULAR_PORT ||
4353c7f3dcfSLiang Ma 					port->p_type == OPDL_ASYNC_PORT)
43657362ddfSPallantla Poornima 				snprintf(total_cyc, sizeof(total_cyc),
4373c7f3dcfSLiang Ma 					" %'16"PRIu64"",
4383c7f3dcfSLiang Ma 					(cpg != 0 ?
4393c7f3dcfSLiang Ma 					 port->port_stat[total_cycles] / cpg
4403c7f3dcfSLiang Ma 					 : 0));
4413c7f3dcfSLiang Ma 			else
44257362ddfSPallantla Poornima 				snprintf(total_cyc, sizeof(total_cyc),
4433c7f3dcfSLiang Ma 					"             ----");
4443c7f3dcfSLiang Ma 			fprintf(f,
4453c7f3dcfSLiang Ma 				"%4s %10u %8u %9s %'16"PRIu64" %'16"PRIu64" %s "
4463c7f3dcfSLiang Ma 				"%'16"PRIu64" %'16"PRIu64" %'16"PRIu64"\n",
4473c7f3dcfSLiang Ma 				p_type,
4483c7f3dcfSLiang Ma 				i,
4493c7f3dcfSLiang Ma 				port->id,
4503c7f3dcfSLiang Ma 				(port->external_qid == OPDL_INVALID_QID ? "---"
4513c7f3dcfSLiang Ma 				 : queue_id),
4523c7f3dcfSLiang Ma 				(cne != 0 ?
4533c7f3dcfSLiang Ma 				 port->port_stat[claim_pkts_requested] / cne
4543c7f3dcfSLiang Ma 				 : 0),
4553c7f3dcfSLiang Ma 				(cne != 0 ?
4563c7f3dcfSLiang Ma 				 port->port_stat[claim_pkts_granted] / cne
4573c7f3dcfSLiang Ma 				 : 0),
4583c7f3dcfSLiang Ma 				total_cyc,
4593c7f3dcfSLiang Ma 				port->port_stat[claim_empty],
4603c7f3dcfSLiang Ma 				port->port_stat[claim_non_empty],
4613c7f3dcfSLiang Ma 				port->port_stat[claim_pkts_granted]);
4623c7f3dcfSLiang Ma 		}
4633c7f3dcfSLiang Ma 	}
4643c7f3dcfSLiang Ma 	fprintf(f, "\n");
4653c7f3dcfSLiang Ma }
4663c7f3dcfSLiang Ma 
4673c7f3dcfSLiang Ma 
4683c7f3dcfSLiang Ma static void
4693c7f3dcfSLiang Ma opdl_stop(struct rte_eventdev *dev)
4703c7f3dcfSLiang Ma {
4713c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
4723c7f3dcfSLiang Ma 
4733c7f3dcfSLiang Ma 	opdl_xstats_uninit(dev);
4743c7f3dcfSLiang Ma 
4753c7f3dcfSLiang Ma 	destroy_queues_and_rings(dev);
4763c7f3dcfSLiang Ma 
4773c7f3dcfSLiang Ma 
4783c7f3dcfSLiang Ma 	device->started = 0;
4793c7f3dcfSLiang Ma 
4803c7f3dcfSLiang Ma 	rte_smp_wmb();
4813c7f3dcfSLiang Ma }
4823c7f3dcfSLiang Ma 
4833c7f3dcfSLiang Ma static int
4843c7f3dcfSLiang Ma opdl_start(struct rte_eventdev *dev)
4853c7f3dcfSLiang Ma {
4863c7f3dcfSLiang Ma 	int err = 0;
4873c7f3dcfSLiang Ma 
4883c7f3dcfSLiang Ma 	if (!err)
4893c7f3dcfSLiang Ma 		err = create_queues_and_rings(dev);
4903c7f3dcfSLiang Ma 
4913c7f3dcfSLiang Ma 
4923c7f3dcfSLiang Ma 	if (!err)
4933c7f3dcfSLiang Ma 		err = assign_internal_queue_ids(dev);
4943c7f3dcfSLiang Ma 
4953c7f3dcfSLiang Ma 
4963c7f3dcfSLiang Ma 	if (!err)
4973c7f3dcfSLiang Ma 		err = initialise_queue_zero_ports(dev);
4983c7f3dcfSLiang Ma 
4993c7f3dcfSLiang Ma 
5003c7f3dcfSLiang Ma 	if (!err)
5013c7f3dcfSLiang Ma 		err = initialise_all_other_ports(dev);
5023c7f3dcfSLiang Ma 
5033c7f3dcfSLiang Ma 
5043c7f3dcfSLiang Ma 	if (!err)
5053c7f3dcfSLiang Ma 		err = check_queues_linked(dev);
5063c7f3dcfSLiang Ma 
5073c7f3dcfSLiang Ma 
5083c7f3dcfSLiang Ma 	if (!err)
5093c7f3dcfSLiang Ma 		err = opdl_add_event_handlers(dev);
5103c7f3dcfSLiang Ma 
5113c7f3dcfSLiang Ma 
5123c7f3dcfSLiang Ma 	if (!err)
5133c7f3dcfSLiang Ma 		err = build_all_dependencies(dev);
5143c7f3dcfSLiang Ma 
5153c7f3dcfSLiang Ma 	if (!err) {
5163c7f3dcfSLiang Ma 		opdl_xstats_init(dev);
5173c7f3dcfSLiang Ma 
5183c7f3dcfSLiang Ma 		struct opdl_evdev *device = opdl_pmd_priv(dev);
5193c7f3dcfSLiang Ma 
5203c7f3dcfSLiang Ma 		PMD_DRV_LOG(INFO, "DEV_ID:[%02d] : "
5213c7f3dcfSLiang Ma 			      "SUCCESS : Created %u total queues (%u ex, %u in),"
5223c7f3dcfSLiang Ma 			      " %u opdls, %u event_dev ports, %u input ports",
5233c7f3dcfSLiang Ma 			      opdl_pmd_dev_id(device),
5243c7f3dcfSLiang Ma 			      device->nb_queues,
5253c7f3dcfSLiang Ma 			      (device->nb_queues - device->nb_opdls),
5263c7f3dcfSLiang Ma 			      device->nb_opdls,
5273c7f3dcfSLiang Ma 			      device->nb_opdls,
5283c7f3dcfSLiang Ma 			      device->nb_ports,
5293c7f3dcfSLiang Ma 			      device->queue[0].nb_ports);
5303c7f3dcfSLiang Ma 	} else
5313c7f3dcfSLiang Ma 		opdl_stop(dev);
5323c7f3dcfSLiang Ma 
5333c7f3dcfSLiang Ma 	return err;
5343c7f3dcfSLiang Ma }
5353c7f3dcfSLiang Ma 
5363c7f3dcfSLiang Ma static int
5373c7f3dcfSLiang Ma opdl_close(struct rte_eventdev *dev)
5383c7f3dcfSLiang Ma {
5393c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
5403c7f3dcfSLiang Ma 	uint32_t i;
5413c7f3dcfSLiang Ma 
5423c7f3dcfSLiang Ma 	for (i = 0; i < device->max_port_nb; i++) {
5433c7f3dcfSLiang Ma 		memset(&device->ports[i],
5443c7f3dcfSLiang Ma 		       0,
5453c7f3dcfSLiang Ma 		       sizeof(struct opdl_port));
5463c7f3dcfSLiang Ma 	}
5473c7f3dcfSLiang Ma 
5483c7f3dcfSLiang Ma 	memset(&device->s_md,
5493c7f3dcfSLiang Ma 			0x0,
5503c7f3dcfSLiang Ma 			sizeof(struct opdl_stage_meta_data)*OPDL_PORTS_MAX);
5513c7f3dcfSLiang Ma 
5523c7f3dcfSLiang Ma 	memset(&device->q_md,
5533c7f3dcfSLiang Ma 			0xFF,
5543c7f3dcfSLiang Ma 			sizeof(struct opdl_queue_meta_data)*OPDL_MAX_QUEUES);
5553c7f3dcfSLiang Ma 
5563c7f3dcfSLiang Ma 
5573c7f3dcfSLiang Ma 	memset(device->q_map_ex_to_in,
5583c7f3dcfSLiang Ma 			0,
5593c7f3dcfSLiang Ma 			sizeof(uint8_t)*OPDL_INVALID_QID);
5603c7f3dcfSLiang Ma 
5613c7f3dcfSLiang Ma 	opdl_xstats_uninit(dev);
5623c7f3dcfSLiang Ma 
5633c7f3dcfSLiang Ma 	device->max_port_nb = 0;
5643c7f3dcfSLiang Ma 
5653c7f3dcfSLiang Ma 	device->max_queue_nb = 0;
5663c7f3dcfSLiang Ma 
5673c7f3dcfSLiang Ma 	device->nb_opdls = 0;
5683c7f3dcfSLiang Ma 
5693c7f3dcfSLiang Ma 	device->nb_queues   = 0;
5703c7f3dcfSLiang Ma 
5713c7f3dcfSLiang Ma 	device->nb_ports    = 0;
5723c7f3dcfSLiang Ma 
5733c7f3dcfSLiang Ma 	device->nb_q_md     = 0;
5743c7f3dcfSLiang Ma 
5753c7f3dcfSLiang Ma 	dev->data->nb_queues = 0;
5763c7f3dcfSLiang Ma 
5773c7f3dcfSLiang Ma 	dev->data->nb_ports = 0;
5783c7f3dcfSLiang Ma 
5793c7f3dcfSLiang Ma 
5803c7f3dcfSLiang Ma 	return 0;
5813c7f3dcfSLiang Ma }
5823c7f3dcfSLiang Ma 
5833c7f3dcfSLiang Ma static int
5843c7f3dcfSLiang Ma assign_numa_node(const char *key __rte_unused, const char *value, void *opaque)
5853c7f3dcfSLiang Ma {
5863c7f3dcfSLiang Ma 	int *socket_id = opaque;
5873c7f3dcfSLiang Ma 	*socket_id = atoi(value);
5883c7f3dcfSLiang Ma 	if (*socket_id >= RTE_MAX_NUMA_NODES)
5893c7f3dcfSLiang Ma 		return -1;
5903c7f3dcfSLiang Ma 	return 0;
5913c7f3dcfSLiang Ma }
5923c7f3dcfSLiang Ma 
5933c7f3dcfSLiang Ma static int
5943c7f3dcfSLiang Ma set_do_validation(const char *key __rte_unused, const char *value, void *opaque)
5953c7f3dcfSLiang Ma {
5963c7f3dcfSLiang Ma 	int *do_val = opaque;
5973c7f3dcfSLiang Ma 	*do_val = atoi(value);
5983c7f3dcfSLiang Ma 	if (*do_val != 0)
5993c7f3dcfSLiang Ma 		*do_val = 1;
6003c7f3dcfSLiang Ma 
6013c7f3dcfSLiang Ma 	return 0;
6023c7f3dcfSLiang Ma }
6033c7f3dcfSLiang Ma static int
6043c7f3dcfSLiang Ma set_do_test(const char *key __rte_unused, const char *value, void *opaque)
6053c7f3dcfSLiang Ma {
6063c7f3dcfSLiang Ma 	int *do_test = opaque;
6073c7f3dcfSLiang Ma 
6083c7f3dcfSLiang Ma 	*do_test = atoi(value);
6093c7f3dcfSLiang Ma 
6103c7f3dcfSLiang Ma 	if (*do_test != 0)
6113c7f3dcfSLiang Ma 		*do_test = 1;
6123c7f3dcfSLiang Ma 	return 0;
6133c7f3dcfSLiang Ma }
6143c7f3dcfSLiang Ma 
6153c7f3dcfSLiang Ma static int
6163c7f3dcfSLiang Ma opdl_probe(struct rte_vdev_device *vdev)
6173c7f3dcfSLiang Ma {
61823d06e37SPavan Nikhilesh 	static struct eventdev_ops evdev_opdl_ops = {
6193c7f3dcfSLiang Ma 		.dev_configure = opdl_dev_configure,
6203c7f3dcfSLiang Ma 		.dev_infos_get = opdl_info_get,
6213c7f3dcfSLiang Ma 		.dev_close = opdl_close,
6223c7f3dcfSLiang Ma 		.dev_start = opdl_start,
6233c7f3dcfSLiang Ma 		.dev_stop = opdl_stop,
6243c7f3dcfSLiang Ma 		.dump = opdl_dump,
6253c7f3dcfSLiang Ma 
6268ca8e3b4SLiang Ma 		.queue_def_conf = opdl_queue_def_conf,
6278ca8e3b4SLiang Ma 		.queue_setup = opdl_queue_setup,
6288ca8e3b4SLiang Ma 		.queue_release = opdl_queue_release,
6290bf298e3SLiang Ma 		.port_def_conf = opdl_port_def_conf,
6300bf298e3SLiang Ma 		.port_setup = opdl_port_setup,
6310bf298e3SLiang Ma 		.port_release = opdl_port_release,
6320bf298e3SLiang Ma 		.port_link = opdl_port_link,
6330bf298e3SLiang Ma 		.port_unlink = opdl_port_unlink,
6340bf298e3SLiang Ma 
6358ca8e3b4SLiang Ma 
6363c7f3dcfSLiang Ma 		.xstats_get = opdl_xstats_get,
6373c7f3dcfSLiang Ma 		.xstats_get_names = opdl_xstats_get_names,
6383c7f3dcfSLiang Ma 		.xstats_get_by_name = opdl_xstats_get_by_name,
6393c7f3dcfSLiang Ma 		.xstats_reset = opdl_xstats_reset,
6403c7f3dcfSLiang Ma 	};
6413c7f3dcfSLiang Ma 
6423c7f3dcfSLiang Ma 	static const char *const args[] = {
6433c7f3dcfSLiang Ma 		NUMA_NODE_ARG,
6443c7f3dcfSLiang Ma 		DO_VALIDATION_ARG,
6453c7f3dcfSLiang Ma 		DO_TEST_ARG,
6463c7f3dcfSLiang Ma 		NULL
6473c7f3dcfSLiang Ma 	};
6483c7f3dcfSLiang Ma 	const char *name;
6493c7f3dcfSLiang Ma 	const char *params;
6503c7f3dcfSLiang Ma 	struct rte_eventdev *dev;
6513c7f3dcfSLiang Ma 	struct opdl_evdev *opdl;
6523c7f3dcfSLiang Ma 	int socket_id = rte_socket_id();
6533c7f3dcfSLiang Ma 	int do_validation = 0;
6543c7f3dcfSLiang Ma 	int do_test = 0;
6553c7f3dcfSLiang Ma 	int str_len;
6563c7f3dcfSLiang Ma 	int test_result = 0;
6573c7f3dcfSLiang Ma 
6583c7f3dcfSLiang Ma 	name = rte_vdev_device_name(vdev);
6593c7f3dcfSLiang Ma 	params = rte_vdev_device_args(vdev);
6603c7f3dcfSLiang Ma 	if (params != NULL && params[0] != '\0') {
6613c7f3dcfSLiang Ma 		struct rte_kvargs *kvlist = rte_kvargs_parse(params, args);
6623c7f3dcfSLiang Ma 
6633c7f3dcfSLiang Ma 		if (!kvlist) {
6643c7f3dcfSLiang Ma 			PMD_DRV_LOG(INFO,
665*f665790aSDavid Marchand 					"Ignoring unsupported parameters when creating device '%s'",
6663c7f3dcfSLiang Ma 					name);
6673c7f3dcfSLiang Ma 		} else {
6683c7f3dcfSLiang Ma 			int ret = rte_kvargs_process(kvlist, NUMA_NODE_ARG,
6693c7f3dcfSLiang Ma 					assign_numa_node, &socket_id);
6703c7f3dcfSLiang Ma 			if (ret != 0) {
6713c7f3dcfSLiang Ma 				PMD_DRV_LOG(ERR,
6723c7f3dcfSLiang Ma 						"%s: Error parsing numa node parameter",
6733c7f3dcfSLiang Ma 						name);
6743c7f3dcfSLiang Ma 
6753c7f3dcfSLiang Ma 				rte_kvargs_free(kvlist);
6763c7f3dcfSLiang Ma 				return ret;
6773c7f3dcfSLiang Ma 			}
6783c7f3dcfSLiang Ma 
6793c7f3dcfSLiang Ma 			ret = rte_kvargs_process(kvlist, DO_VALIDATION_ARG,
6803c7f3dcfSLiang Ma 					set_do_validation, &do_validation);
6813c7f3dcfSLiang Ma 			if (ret != 0) {
6823c7f3dcfSLiang Ma 				PMD_DRV_LOG(ERR,
6833c7f3dcfSLiang Ma 					"%s: Error parsing do validation parameter",
6843c7f3dcfSLiang Ma 					name);
6853c7f3dcfSLiang Ma 				rte_kvargs_free(kvlist);
6863c7f3dcfSLiang Ma 				return ret;
6873c7f3dcfSLiang Ma 			}
6883c7f3dcfSLiang Ma 
6893c7f3dcfSLiang Ma 			ret = rte_kvargs_process(kvlist, DO_TEST_ARG,
6903c7f3dcfSLiang Ma 					set_do_test, &do_test);
6913c7f3dcfSLiang Ma 			if (ret != 0) {
6923c7f3dcfSLiang Ma 				PMD_DRV_LOG(ERR,
6933c7f3dcfSLiang Ma 					"%s: Error parsing do test parameter",
6943c7f3dcfSLiang Ma 					name);
6953c7f3dcfSLiang Ma 				rte_kvargs_free(kvlist);
6963c7f3dcfSLiang Ma 				return ret;
6973c7f3dcfSLiang Ma 			}
6983c7f3dcfSLiang Ma 
6993c7f3dcfSLiang Ma 			rte_kvargs_free(kvlist);
7003c7f3dcfSLiang Ma 		}
7013c7f3dcfSLiang Ma 	}
7023c7f3dcfSLiang Ma 	dev = rte_event_pmd_vdev_init(name,
703928b5c70SBruce Richardson 			sizeof(struct opdl_evdev), socket_id, vdev);
7043c7f3dcfSLiang Ma 
7053c7f3dcfSLiang Ma 	if (dev == NULL) {
7063c7f3dcfSLiang Ma 		PMD_DRV_LOG(ERR, "eventdev vdev init() failed");
7073c7f3dcfSLiang Ma 		return -EFAULT;
7083c7f3dcfSLiang Ma 	}
7093c7f3dcfSLiang Ma 
7103c7f3dcfSLiang Ma 	PMD_DRV_LOG(INFO, "DEV_ID:[%02d] : "
7117be78d02SJosh Soref 		      "Success - creating eventdev device %s, numa_node:[%d], do_validation:[%s]"
712*f665790aSDavid Marchand 			  " , self_test:[%s]",
7133c7f3dcfSLiang Ma 		      dev->data->dev_id,
7143c7f3dcfSLiang Ma 		      name,
7153c7f3dcfSLiang Ma 		      socket_id,
7163c7f3dcfSLiang Ma 		      (do_validation ? "true" : "false"),
7173c7f3dcfSLiang Ma 			  (do_test ? "true" : "false"));
7183c7f3dcfSLiang Ma 
7193c7f3dcfSLiang Ma 	dev->dev_ops = &evdev_opdl_ops;
7203c7f3dcfSLiang Ma 
7218ca5fad5SLiang Ma 	dev->enqueue_burst = opdl_event_enqueue_burst;
7228ca5fad5SLiang Ma 	dev->enqueue_new_burst = opdl_event_enqueue_burst;
7238ca5fad5SLiang Ma 	dev->enqueue_forward_burst = opdl_event_enqueue_burst;
7248ca5fad5SLiang Ma 	dev->dequeue_burst = opdl_event_dequeue_burst;
7258ca5fad5SLiang Ma 
7263c7f3dcfSLiang Ma 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
72785be9971SPavan Nikhilesh 		goto done;
7283c7f3dcfSLiang Ma 
7293c7f3dcfSLiang Ma 	opdl = dev->data->dev_private;
7303c7f3dcfSLiang Ma 	opdl->data = dev->data;
7313c7f3dcfSLiang Ma 	opdl->socket = socket_id;
7323c7f3dcfSLiang Ma 	opdl->do_validation = do_validation;
7333c7f3dcfSLiang Ma 	opdl->do_test = do_test;
7343c7f3dcfSLiang Ma 	str_len = strlen(name);
7353c7f3dcfSLiang Ma 	memcpy(opdl->service_name, name, str_len);
7363c7f3dcfSLiang Ma 
737d548ef51SLiang Ma 	if (do_test == 1)
738d548ef51SLiang Ma 		test_result =  opdl_selftest();
739d548ef51SLiang Ma 
74085be9971SPavan Nikhilesh done:
74185be9971SPavan Nikhilesh 	event_dev_probing_finish(dev);
7423c7f3dcfSLiang Ma 	return test_result;
7433c7f3dcfSLiang Ma }
7443c7f3dcfSLiang Ma 
7453c7f3dcfSLiang Ma static int
7463c7f3dcfSLiang Ma opdl_remove(struct rte_vdev_device *vdev)
7473c7f3dcfSLiang Ma {
7483c7f3dcfSLiang Ma 	const char *name;
7493c7f3dcfSLiang Ma 
7503c7f3dcfSLiang Ma 	name = rte_vdev_device_name(vdev);
7513c7f3dcfSLiang Ma 	if (name == NULL)
7523c7f3dcfSLiang Ma 		return -EINVAL;
7533c7f3dcfSLiang Ma 
754*f665790aSDavid Marchand 	PMD_DRV_LOG(INFO, "Closing eventdev opdl device %s", name);
7553c7f3dcfSLiang Ma 
7563c7f3dcfSLiang Ma 	return rte_event_pmd_vdev_uninit(name);
7573c7f3dcfSLiang Ma }
7583c7f3dcfSLiang Ma 
7593c7f3dcfSLiang Ma static struct rte_vdev_driver evdev_opdl_pmd_drv = {
7603c7f3dcfSLiang Ma 	.probe = opdl_probe,
7613c7f3dcfSLiang Ma 	.remove = opdl_remove
7623c7f3dcfSLiang Ma };
7633c7f3dcfSLiang Ma 
764eeded204SDavid Marchand RTE_LOG_REGISTER_SUFFIX(opdl_logtype_driver, driver, INFO);
7653c7f3dcfSLiang Ma 
7663c7f3dcfSLiang Ma RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_OPDL_PMD, evdev_opdl_pmd_drv);
7673c7f3dcfSLiang Ma RTE_PMD_REGISTER_PARAM_STRING(event_opdl, NUMA_NODE_ARG "=<int>"
7683c7f3dcfSLiang Ma 			      DO_VALIDATION_ARG "=<int>" DO_TEST_ARG "=<int>");
769