Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
rte_eventdev.h(3)		      DPDK		       rte_eventdev.h(3)

NAME
     rte_eventdev.h

SYNOPSIS
     #include <rte_bitops.h>
     #include <rte_common.h>
     #include <rte_compat.h>
     #include <rte_errno.h>
     #include <rte_mbuf_pool_ops.h>
     #include <rte_mempool.h>
     #include 'rte_eventdev_trace_fp.h'
     #include <rte_eventdev_core.h>

   Data Structures
     struct rte_event_dev_info
     struct rte_event_dev_config
     struct rte_event_queue_conf
     struct rte_event_port_conf
     struct rte_event
     struct rte_event_dev_xstats_name

   Macros
     #define RTE_EVENT_DEV_CAP_QUEUE_QOS   RTE_BIT32(0)
     #define RTE_EVENT_DEV_CAP_EVENT_QOS   RTE_BIT32(1)
     #define RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED   RTE_BIT32(2)
     #define RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES	 RTE_BIT32(3)
     #define RTE_EVENT_DEV_CAP_BURST_MODE   RTE_BIT32(4)
     #define RTE_EVENT_DEV_CAP_IMPLICIT_RELEASE_DISABLE   RTE_BIT32(5)
     #define RTE_EVENT_DEV_CAP_NONSEQ_MODE   RTE_BIT32(6)
     #define RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK   RTE_BIT32(7)
     #define RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT   RTE_BIT32(8)
     #define RTE_EVENT_DEV_CAP_CARRY_FLOW_ID   RTE_BIT32(9)
     #define RTE_EVENT_DEV_CAP_MAINTENANCE_FREE   RTE_BIT32(10)
     #define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR   RTE_BIT32(11)
     #define RTE_EVENT_DEV_CAP_PROFILE_LINK   RTE_BIT32(12)
     #define RTE_EVENT_DEV_CAP_ATOMIC	RTE_BIT32(13)
     #define RTE_EVENT_DEV_CAP_ORDERED	 RTE_BIT32(14)
     #define RTE_EVENT_DEV_CAP_PARALLEL   RTE_BIT32(15)
     #define RTE_EVENT_DEV_CAP_INDEPENDENT_ENQ	 RTE_BIT32(16)
     #define RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE   RTE_BIT32(17)
     #define RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE_ADAPTIVE   RTE_BIT32(18)
     #define RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE   RTE_BIT32(19)
     #define RTE_EVENT_DEV_CAP_PRESCHEDULE_EXPLICIT   RTE_BIT32(20)
     #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
     #define RTE_EVENT_DEV_PRIORITY_NORMAL   128
     #define RTE_EVENT_DEV_PRIORITY_LOWEST   255
     #define RTE_EVENT_QUEUE_WEIGHT_HIGHEST   255
     #define RTE_EVENT_QUEUE_WEIGHT_LOWEST   0
     #define RTE_EVENT_QUEUE_AFFINITY_HIGHEST	255
     #define RTE_EVENT_QUEUE_AFFINITY_LOWEST   0
     #define RTE_EVENT_DEV_ATTR_PORT_COUNT   0
     #define RTE_EVENT_DEV_ATTR_QUEUE_COUNT   1
     #define RTE_EVENT_DEV_ATTR_STARTED   2
     #define RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT   RTE_BIT32(0)
     #define RTE_EVENT_QUEUE_CFG_ALL_TYPES   RTE_BIT32(0)
     #define RTE_EVENT_QUEUE_CFG_SINGLE_LINK   RTE_BIT32(1)
     #define RTE_EVENT_QUEUE_ATTR_PRIORITY   0
     #define RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_FLOWS   1
     #define RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_ORDER_SEQUENCES   2
     #define RTE_EVENT_QUEUE_ATTR_EVENT_QUEUE_CFG   3
     #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE   4
     #define RTE_EVENT_QUEUE_ATTR_WEIGHT   5
     #define RTE_EVENT_QUEUE_ATTR_AFFINITY   6
     #define RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL   RTE_BIT32(0)
     #define RTE_EVENT_PORT_CFG_SINGLE_LINK   RTE_BIT32(1)
     #define RTE_EVENT_PORT_CFG_HINT_PRODUCER	RTE_BIT32(2)
     #define RTE_EVENT_PORT_CFG_HINT_CONSUMER	RTE_BIT32(3)
     #define RTE_EVENT_PORT_CFG_HINT_WORKER   RTE_BIT32(4)
     #define RTE_EVENT_PORT_CFG_INDEPENDENT_ENQ   RTE_BIT32(5)
     #define RTE_EVENT_PORT_ATTR_ENQ_DEPTH   0
     #define RTE_EVENT_PORT_ATTR_DEQ_DEPTH   1
     #define RTE_EVENT_PORT_ATTR_NEW_EVENT_THRESHOLD   2
     #define RTE_EVENT_PORT_ATTR_IMPLICIT_RELEASE_DISABLE   3
     #define RTE_EVENT_PORT_ATTR_INDEPENDENT_ENQ   4
     #define RTE_SCHED_TYPE_ORDERED   0
     #define RTE_SCHED_TYPE_ATOMIC   1
     #define RTE_SCHED_TYPE_PARALLEL   2
     #define RTE_EVENT_TYPE_ETHDEV   0x0
     #define RTE_EVENT_TYPE_CRYPTODEV	0x1
     #define RTE_EVENT_TYPE_TIMER   0x2
     #define RTE_EVENT_TYPE_CPU   0x3
     #define RTE_EVENT_TYPE_ETH_RX_ADAPTER   0x4
     #define RTE_EVENT_TYPE_DMADEV   0x5
     #define RTE_EVENT_TYPE_VECTOR   0x8
     #define	 RTE_EVENT_TYPE_ETHDEV_VECTOR	     (RTE_EVENT_TYPE_VECTOR    |
	 RTE_EVENT_TYPE_ETHDEV)
     #define	  RTE_EVENT_TYPE_CPU_VECTOR	   (RTE_EVENT_TYPE_VECTOR      |
	 RTE_EVENT_TYPE_CPU)
     #define  RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR	(RTE_EVENT_TYPE_VECTOR |
	 RTE_EVENT_TYPE_ETH_RX_ADAPTER)
     #define   RTE_EVENT_TYPE_CRYPTODEV_VECTOR	      (RTE_EVENT_TYPE_VECTOR   |
	 RTE_EVENT_TYPE_CRYPTODEV)
     #define RTE_EVENT_TYPE_MAX   0x10
     #define RTE_EVENT_OP_NEW	0
     #define RTE_EVENT_OP_FORWARD   1
     #define RTE_EVENT_OP_RELEASE   2
     #define RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT   0x1
     #define RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ	 0x2
     #define RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID   0x4
     #define RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR	 0x8
     #define RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT	 RTE_BIT32(0)
     #define RTE_EVENT_TIMER_ADAPTER_CAP_PERIODIC   RTE_BIT32(1)
     #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW	 0x1
     #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD	 0x2
     #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND   0x4
     #define RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA	 0x8
     #define RTE_EVENT_CRYPTO_ADAPTER_CAP_EVENT_VECTOR	 0x10
     #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_NEW   0x1
     #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD   0x2
     #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND   0x4
     #define RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT   0x1
     #define RTE_EVENT_ETH_TX_ADAPTER_CAP_EVENT_VECTOR	 0x2
     #define RTE_EVENT_VECTOR_ADAPTER_CAP_INTERNAL_PORT   0x1
     #define RTE_EVENT_DEV_XSTATS_NAME_SIZE   64
     #define RTE_EVENT_DEV_MAINT_OP_FLUSH   (1 << 0)

   Typedefs
     typedef void(* rte_eventdev_port_flush_t) (uint8_t dev_id, struct rte_event
	 event, void *arg)
     typedef void(* rte_eventdev_stop_flush_t) (uint8_t dev_id, struct rte_event
	 event, void *arg)

   Enumerations
     enum     rte_event_dev_preschedule_type	{    RTE_EVENT_PRESCHEDULE_NONE,
	 RTE_EVENT_PRESCHEDULE, RTE_EVENT_PRESCHEDULE_ADAPTIVE }
     enum rte_event_dev_xstats_mode

   Functions
     uint8_t rte_event_dev_count (void)
     int rte_event_dev_get_dev_id (const char *name)
     int rte_event_dev_socket_id (uint8_t dev_id)
     int  rte_event_dev_info_get  (uint8_t  dev_id,  struct   rte_event_dev_info
	 *dev_info)
     int  rte_event_dev_attr_get  (uint8_t  dev_id,  uint32_t  attr_id, uint32_t
	 *attr_value)
     int    rte_event_dev_configure    (uint8_t     dev_id,	const	  struct
	 rte_event_dev_config *dev_conf)
     int  rte_event_queue_default_conf_get  (uint8_t  dev_id,  uint8_t queue_id,
	 struct rte_event_queue_conf *queue_conf)
     int rte_event_queue_setup (uint8_t dev_id, uint8_t queue_id,  const  struct
	 rte_event_queue_conf *queue_conf)
     int  rte_event_queue_attr_get  (uint8_t  dev_id, uint8_t queue_id, uint32_t
	 attr_id, uint32_t *attr_value)
     int rte_event_queue_attr_set (uint8_t dev_id,  uint8_t  queue_id,	uint32_t
	 attr_id, uint64_t attr_value)
     int   rte_event_port_default_conf_get  (uint8_t  dev_id,  uint8_t	port_id,
	 struct rte_event_port_conf *port_conf)
     int rte_event_port_setup (uint8_t dev_id,	uint8_t  port_id,  const  struct
	 rte_event_port_conf *port_conf)
     void  rte_event_port_quiesce  (uint8_t  dev_id, uint8_t port_id, rte_event-
	 dev_port_flush_t release_cb, void *args)
     int rte_event_port_attr_get  (uint8_t  dev_id,  uint8_t  port_id,	uint32_t
	 attr_id, uint32_t *attr_value)
     int rte_event_dev_start (uint8_t dev_id)
     void rte_event_dev_stop (uint8_t dev_id)
     int  rte_event_dev_stop_flush_callback_register (uint8_t dev_id, rte_event-
	 dev_stop_flush_t callback, void *userdata)
     int rte_event_dev_close (uint8_t dev_id)
     struct __rte_aligned (16) rte_event_vector
     int    rte_event_eth_rx_adapter_caps_get	 (uint8_t    dev_id,	uint16_t
	 eth_port_id, uint32_t *caps)
     int rte_event_timer_adapter_caps_get (uint8_t dev_id, uint32_t *caps)
     int  rte_event_crypto_adapter_caps_get  (uint8_t  dev_id,	uint8_t cdev_id,
	 uint32_t *caps)
     __rte_experimental  int  rte_event_dma_adapter_caps_get  (uint8_t	 dev_id,
	 uint8_t dmadev_id, uint32_t *caps)
     int    rte_event_eth_tx_adapter_caps_get	 (uint8_t    dev_id,	uint16_t
	 eth_port_id, uint32_t *caps)
     int rte_event_dequeue_timeout_ticks (uint8_t dev_id, uint64_t ns,	uint64_t
	 *timeout_ticks)
     int  rte_event_port_link  (uint8_t  dev_id,  uint8_t port_id, const uint8_t
	 queues[], const uint8_t priorities[], uint16_t nb_links)
     int  rte_event_port_unlink  (uint8_t  dev_id,  uint8_t   port_id,	 uint8_t
	 queues[], uint16_t nb_unlinks)
     __rte_experimental  int  rte_event_port_profile_links_set	(uint8_t dev_id,
	 uint8_t port_id, const uint8_t queues[],  const  uint8_t  priorities[],
	 uint16_t nb_links, uint8_t profile_id)
     __rte_experimental   int	rte_event_port_profile_unlink  (uint8_t  dev_id,
	 uint8_t port_id, uint8_t queues[], uint16_t  nb_unlinks,  uint8_t  pro-
	 file_id)
     int rte_event_port_unlinks_in_progress (uint8_t dev_id, uint8_t port_id)
     int  rte_event_port_links_get  (uint8_t  dev_id,  uint8_t	port_id, uint8_t
	 queues[], uint8_t priorities[])
     __rte_experimental int  rte_event_port_profile_links_get  (uint8_t  dev_id,
	 uint8_t  port_id,  uint8_t queues[], uint8_t priorities[], uint8_t pro-
	 file_id)
     int rte_event_dev_service_id_get (uint8_t dev_id, uint32_t *service_id)
     int rte_event_dev_dump (uint8_t dev_id, FILE *f)
     int rte_event_dev_xstats_names_get (uint8_t dev_id, enum  rte_event_dev_xs-
	 tats_mode mode, uint8_t queue_port_id, struct rte_event_dev_xstats_name
	 *xstats_names, uint64_t *ids, unsigned int size)
     int   rte_event_dev_xstats_get   (uint8_t	dev_id,  enum  rte_event_dev_xs-
	 tats_mode mode, uint8_t queue_port_id, const uint64_t	ids[],	uint64_t
	 values[], unsigned int n)
     uint64_t	rte_event_dev_xstats_by_name_get  (uint8_t  dev_id,  const  char
	 *name, uint64_t *id)
     int  rte_event_dev_xstats_reset  (uint8_t	dev_id,  enum  rte_event_dev_xs-
	 tats_mode  mode,  int16_t queue_port_id, const uint64_t ids[], uint32_t
	 nb_ids)
     int rte_event_dev_selftest (uint8_t dev_id)
     struct rte_mempool * rte_event_vector_pool_create (const  char  *name,  un-
	 signed int n, unsigned int cache_size, uint16_t nb_elem, int socket_id)
     static  uint16_t  rte_event_enqueue_burst (uint8_t dev_id, uint8_t port_id,
	 const struct rte_event ev[], uint16_t nb_events)
     static  uint16_t  rte_event_enqueue_new_burst  (uint8_t   dev_id,	 uint8_t
	 port_id, const struct rte_event ev[], uint16_t nb_events)
     static  uint16_t  rte_event_enqueue_forward_burst	(uint8_t dev_id, uint8_t
	 port_id, const struct rte_event ev[], uint16_t nb_events)
     static uint16_t rte_event_dequeue_burst (uint8_t dev_id,  uint8_t	port_id,
	 struct rte_event ev[], uint16_t nb_events, uint64_t timeout_ticks)
     static int rte_event_maintain (uint8_t dev_id, uint8_t port_id, int op)
     static   uint8_t  rte_event_port_profile_switch  (uint8_t	dev_id,  uint8_t
	 port_id, uint8_t profile_id)
     static __rte_experimental	int  rte_event_port_preschedule_modify	(uint8_t
	 dev_id, uint8_t port_id, enum rte_event_dev_preschedule_type type)
     static  __rte_experimental void rte_event_port_preschedule (uint8_t dev_id,
	 uint8_t port_id, enum rte_event_dev_preschedule_type type)

Detailed Description
RTE Event Device API
     In a traditional DPDK application model, the application polls Ethdev  port
     RX  queues  to look for work, and processing is done in a run-to-completion
     manner, after which the packets are transmitted on a Ethdev TX queue.  Load
     is  distributed by statically assigning ports and queues to lcores, and NIC
     receive-side scaling (RSS), or similar, is employed to  distribute  network
     flows (and thus work) on the same port across multiple RX queues.

     In  contrast, in an event-driven model, as supported by this 'eventdev' li-
     brary, incoming packets (or other input events) are fed into an  event  de-
     vice,  which schedules those packets across the available lcores, in accor-
     dance with its configuration. This event-driven  programming  model  offers
     applications  automatic multicore scaling, dynamic load balancing, pipelin-
     ing, packet order maintenance, synchronization, and  prioritization/quality
     of service.

     The Event Device API is composed of two parts:

     * The  application-oriented  Event  API that includes functions to setup an
       event device (configure it, setup its queues, ports and start it), to es-
       tablish the links between queues and ports to receive events, and so on.

     * The driver-oriented Event API that exports a function allowing  an  event
       poll Mode Driver (PMD) to register itself as an event device driver.

   Application-oriented Event API
     Event device components:

		     +-----------------+
		     | +-------------+ |
	+-------+    | |    flow 0   | |
	|Packet |    | +-------------+ |
	|event	|    | +-------------+ |
	|	|    | |    flow 1   | |port_link(port0, queue0)
	+-------+    | +-------------+ |     |	   +--------+
	+-------+    | +-------------+ o-----v-----o	    |dequeue +------+
	|Crypto |    | |    flow n   | |	   | event  +------->|Core 0|
	|work	|    | +-------------+ o----+	   | port 0 |	     |	    |
	|done ev|    |	event queue 0  |    |	   +--------+	     +------+
	+-------+    +-----------------+    |
	+-------+			    |
	|Timer	|    +-----------------+    |	   +--------+
	|expiry |    | +-------------+ |    +------o	    |dequeue +------+
	|event	|    | |    flow 0   | o-----------o event  +------->|Core 1|
	+-------+    | +-------------+ |      +----o port 1 |	     |	    |
       Event enqueue | +-------------+ |      |    +--------+	     +------+
     o-------------> | |    flow 1   | |      |
	enqueue(     | +-------------+ |      |
	queue_id,    |		       |      |    +--------+	     +------+
	flow_id,     | +-------------+ |      |    |	    |dequeue |Core 2|
	sched_type,  | |    flow n   | o-----------o event  +------->|	    |
	event_type,  | +-------------+ |      |    | port 2 |	     +------+
	subev_type,  |	event queue 1  |      |    +--------+
	event)	     +-----------------+      |    +--------+
					      |    |	    |dequeue +------+
	+-------+    +-----------------+      |    | event  +------->|Core n|
	|Core	|    | +-------------+ o-----------o port n |	     |	    |
	|(SW)	|    | |    flow 0   | |      |    +--------+	     +--+---+
	|event	|    | +-------------+ |      | 			|
	+-------+    | +-------------+ |      | 			|
	    ^	     | |    flow 1   | |      | 			|
	    |	     | +-------------+ o------+ 			|
	    |	     | +-------------+ |				|
	    |	     | |    flow n   | |				|
	    |	     | +-------------+ |				|
	    |	     |	event queue n  |				|
	    |	     +-----------------+				|
	    |								|
	    +-----------------------------------------------------------+

      Event device: A hardware or software-based event scheduler.

     Event:  Represents  an item of work and is the smallest unit of scheduling.
     An event carries metadata, such as queue ID,  scheduling  type,  and  event
     priority,	and  data such as one or more packets or other kinds of buffers.
     Some examples of events are:

     * a software-generated item of work originating from a lcore, perhaps  car-
       rying a packet to be processed.

     * a crypto work completion notification.

     * a timer expiry notification.

     Event  queue:  A  queue  containing  events that are to be scheduled by the
     event device. An event queue contains events of different flows  associated
     with  scheduling  types,  such  as atomic, ordered, or parallel. Each event
     given to an event device must have a valid event  queue  id  field  in  the
     metadata,	to  specify on which event queue in the device the event must be
     placed, for later scheduling.

     Event port: An application's interface into the event dev for  enqueue  and
     dequeue  operations.  Each  event port can be linked with one or more event
     queues for dequeue operations. Enqueue and  dequeue  from	a  port  is  not
     thread-safe,  and the expected use-case is that each port is polled by only
     a single lcore. [If this is not the case, a suitable synchronization mecha-
     nism should be used to prevent simultaneous access from  multiple	lcores.]
     To  schedule events to an lcore, the event device will schedule them to the
     event port(s) being polled by that lcore.

     NOTE: By default, all the functions of the Event Device API exported  by  a
     PMD  are  non-thread-safe	functions, which must not be invoked on the same
     object in parallel on different logical cores. For  instance,  the  dequeue
     function of a PMD cannot be invoked in parallel on two logical cores to op-
     erate on same event port. Of course, this function can be invoked in paral-
     lel by different logical cores on different ports. It is the responsibility
     of the upper level application to enforce this rule.

     In all functions of the Event API, the Event device is designated by an in-
     teger >= 0 named the device identifier dev_id

     The  functions exported by the application Event API to setup a device must
     be invoked in the following order:

     * rte_event_dev_configure()

     * rte_event_queue_setup()

     * rte_event_port_setup()

     * rte_event_port_link()

     * rte_event_dev_start()

     Then, the application can invoke, in any order, the functions  exported  by
     the  Event API to dequeue events, enqueue events, and link and unlink event
     queue(s) to event ports.

     Before   configuring    a	  device,    an    application	  should    call
     rte_event_dev_info_get() to determine the capabilities of the event device,
     and any queue or port limits of that device. The parameters set in the var-
     ious  device  configuration structures may need to be adjusted based on the
     max values provided in the device information structure returned  from  the
     rte_event_dev_info_get()  API.  An  application may use rte_event_queue_de-
     fault_conf_get() or rte_event_port_default_conf_get() to  get  the  default
     configuration  to set up an event queue or event port by overriding few de-
     fault values.

     If  the  application  wants  to  change  the   configuration   (i.e.   call
     rte_event_dev_configure(), 	   rte_event_queue_setup(),	      or
     rte_event_port_setup()), it must call rte_event_dev_stop()  first	to  stop
     the    device    and   then   do	the   reconfiguration	before	 calling
     rte_event_dev_start() again. The schedule, enqueue  and  dequeue  functions
     should not be invoked when the device is stopped.

     Finally,  an  application	can  close  an	Event  device  by  invoking  the
     rte_event_dev_close() function. Once closed, a device cannot  be  reconfig-
     ured or restarted.

   Driver-Oriented Event API
     At  the Event driver level, Event devices are represented by a generic data
     structure of type rte_event_dev.

     Event devices are dynamically registered during the PCI/SoC device  probing
     phase  performed  at EAL initialization time. When an Event device is being
     probed,  an  rte_event_dev  structure  is	allocated   for   it   and   the
     event_dev_init()  function supplied by the Event driver is invoked to prop-
     erly initialize the device.

     The role of the device init function is to reset the device hardware or  to
     initialize the software event driver implementation.

     If the device init operation is successful, the device is assigned a device
     id  (dev_id) for application use. Otherwise, the rte_event_dev structure is
     freed.

     Each function of the application Event API invokes a specific  function  of
     the  PMD  that  controls the target device designated by its device identi-
     fier.

     For this purpose, all device-specific functions of an Event driver are sup-
     plied through a set of pointers contained in a generic  structure	of  type
     event_dev_ops.  The address of the event_dev_ops structure is stored in the
     rte_event_dev structure by the device init function of  the  Event  driver,
     which is invoked during the PCI/SoC device probing phase, as explained ear-
     lier.

     In  other	words,	each  function	of  the  Event	API simply retrieves the
     rte_event_dev structure associated with the device identifier and	performs
     an indirect invocation of the corresponding driver function supplied in the
     event_dev_ops structure of the rte_event_dev structure.

     For  performance  reasons,  the addresses of the fast-path functions of the
     event driver are not contained in	the  event_dev_ops  structure.	Instead,
     they are directly stored at the beginning of the rte_event_dev structure to
     avoid an extra indirect memory access during their invocation.

   Event Enqueue, Dequeue and Scheduling
     RTE event device drivers do not use interrupts for enqueue or dequeue oper-
     ation.  Instead,  Event  drivers export Poll-Mode enqueue and dequeue func-
     tions to applications.

     The events are injected to event device through enqueue operation by  event
     producers	in  the system. The typical event producers are ethdev subsystem
     for generating packet events, CPU(SW) for generating events based	on  dif-
     ferent  stages  of  application processing, cryptodev for generating crypto
     work completion notification etc

     The dequeue operation gets one or more events from the event ports. The ap-
     plication processes the events and sends them to a downstream  event  queue
     through  rte_event_enqueue_burst(), if it is an intermediate stage of event
     processing. On the final stage of processing, the application may	use  the
     Tx  adapter  API  for maintaining the event ingress order while sending the
     packet/event on the wire via NIC Tx.

     The point at which events are scheduled to ports depends on the device. For
     hardware devices, scheduling occurs asynchronously without any software in-
     tervention. Software schedulers can  either  be  distributed  (each  worker
     thread schedules events to its own port) or centralized (a dedicated thread
     schedules to all ports). Distributed software schedulers perform the sched-
     uling inside the enqueue or dequeue functions, whereas centralized software
     schedulers need a dedicated service core for scheduling. The absence of the
     RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED  capability flag indicates that the de-
     vice is centralized and thus needs a dedicated scheduling thread (generally
     an RTE service that should be mapped to one or more service cores) that re-
     peatedly calls the software specific scheduling function.

     An event driven worker thread has following typical workflow on fastpath:

     while (1) {
	rte_event_dequeue_burst(...);
	(event processing)
	rte_event_enqueue_burst(...);
     }

     Definition in file rte_eventdev.h.

Macro Definition Documentation
   #define RTE_EVENT_DEV_CAP_QUEUE_QOS	 RTE_BIT32(0)
     Event scheduling prioritization is based on the priority and weight associ-
     ated with each event queue.

     Events from a queue with highest  priority  are  scheduled  first.  If  the
     queues  are of same priority, weight of the queues are considered to select
     a queue in a weighted round robin fashion. Subsequent dequeue calls from an
     event port could see events from the same event queue, if the queue is con-
     figured with an affinity count. Affinity count is the number of  subsequent
     dequeue  calls,  in  which an event port should use the same event queue if
     the queue is non-empty

     NOTE: A device may use both queue prioritization and  event  prioritization
     (RTE_EVENT_DEV_CAP_EVENT_QOS  capability) when making packet scheduling de-
     cisions.

     See also
	 rte_event_queue_setup()

	 rte_event_queue_attr_set()

     Definition at line 270 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_EVENT_QOS	 RTE_BIT32(1)
     Event scheduling prioritization is based on the  priority	associated  with
     each event.

     Priority  of  each event is supplied in rte_event structure on each enqueue
     operation. If this capability is not set, the priority field of  the  event
     structure is ignored for each event.

     NOTE:     A     device	may	use	both	 queue	  prioritization
     (RTE_EVENT_DEV_CAP_QUEUE_QOS capability) and event prioritization when mak-
     ing packet scheduling decisions.

     See also
	 rte_event_enqueue_burst()

     Definition at line 284 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED	 RTE_BIT32(2)
     Event device operates in distributed scheduling mode.

     In  distributed  scheduling  mode,  event	scheduling  happens  in  HW   or
     rte_event_dequeue_burst() / rte_event_enqueue_burst() or the combination of
     these  two.  If  the  flag is not set then eventdev is centralized and thus
     needs a dedicated service core that acts as a scheduling thread.

     See also
	 rte_event_dev_service_id_get()

     Definition at line 294 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES   RTE_BIT32(3)
     Event device is capable of accepting enqueued events, of  any  type  adver-
     tised as supported by the device, to all destination queues.

     When  this capability is set, and RTE_EVENT_QUEUE_CFG_ALL_TYPES flag is set
     in rte_event_queue_conf::event_queue_cfg, the 'schedule_type' field of  the
     rte_event_queue_conf structure is ignored when a queue is being configured.
     Instead the 'sched_type' field of each event enqueued is used to select the
     scheduling to be performed on that event.

     If  this  capability  is not set, or the configuration flag is not set, the
     queue only supports events of the RTE_SCHED_TYPE_	type  specified  in  the
     rte_event_queue_conf structure at time of configuration. The behaviour when
     events of other scheduling types are sent to the queue is undefined.

     See also
	 RTE_EVENT_QUEUE_CFG_ALL_TYPES

	 RTE_SCHED_TYPE_ATOMIC

	 RTE_SCHED_TYPE_ORDERED

	 RTE_SCHED_TYPE_PARALLEL

	 rte_event_queue_conf.event_queue_cfg

	 rte_event_queue_conf.schedule_type

	 rte_event_enqueue_burst()

     Definition at line 318 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_BURST_MODE   RTE_BIT32(4)
     Event device is capable of operating in burst mode for enqueue(forward, re-
     lease) and dequeue operation.

     If  this capability is not set, application can still use the rte_event_de-
     queue_burst() and rte_event_enqueue_burst() but PMD accepts or returns only
     one event at a time.

     See also
	 rte_event_dequeue_burst()

	 rte_event_enqueue_burst()

     Definition at line 329 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_IMPLICIT_RELEASE_DISABLE	RTE_BIT32(5)
     Event device ports support disabling the implicit release feature, in which
     the port will release all unreleased events in its dequeue operation.

     If this capability is set and the port is configured with implicit  release
     disabled,	the  application  is responsible for explicitly releasing events
     using either the RTE_EVENT_OP_FORWARD or the RTE_EVENT_OP_RELEASE event en-
     queue operations.

     See also
	 rte_event_dequeue_burst()

	 rte_event_enqueue_burst()

     Definition at line 341 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_NONSEQ_MODE   RTE_BIT32(6)
     Event device is capable of operating in non-sequential mode.

     The path of the event is not necessary to be  sequential.	Application  can
     change the path of event at runtime and events may be sent to queues in any
     order.

     If the flag is not set, then event each event will follow a path from queue
     0 to queue 1 to queue 2 etc. The eventdev will return an error when the ap-
     plication	enqueues  an  event  for  a qid which is not the next in the se-
     quence.

     Definition at line 353 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK	 RTE_BIT32(7)
     Event device is capable of reconfiguring the queue/port link at runtime.

     If the flag is not set, the eventdev queue/port link is only can be config-
     ured during initialization, or  by  stopping  the	device	and  then  later
     restarting it after reconfiguration.

     See also
	 rte_event_port_link()

	 rte_event_port_unlink()

     Definition at line 364 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT   RTE_BIT32(8)
     Event  device  is capable of setting up links between multiple queues and a
     single port.

     If the flag is not set, each port may only be linked to a single queue, and
     so can only receive events from that queue.  However,  each  queue  may  be
     linked to multiple ports.

     See also
	 rte_event_port_link()

     Definition at line 374 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_CARRY_FLOW_ID   RTE_BIT32(9)
     Event  device preserves the flow ID from the enqueued event to the dequeued
     event.

     If this flag is not set, the content  of  the  flow-id  field  in	dequeued
     events is implementation dependent.

     See also
	 rte_event_dequeue_burst()

     Definition at line 383 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_MAINTENANCE_FREE	RTE_BIT32(10)
     Event device does not require calls to rte_event_maintain().

     An   event   device   that  does  not  set  this  flag  requires  calls  to
     rte_event_maintain() during periods when neither  rte_event_dequeue_burst()
     nor  rte_event_enqueue_burst()  are  called  on a port. This will allow the
     event device to perform internal  processing,  such  as  flushing	buffered
     events,  return  credits  to a global pool, or process signaling related to
     load balancing.

     See also
	 rte_event_maintain()

     Definition at line 396 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR   RTE_BIT32(11)
     Event device is capable of changing the queue attributes at runtime i.e af-
     ter rte_event_queue_setup() or rte_event_dev_start() call sequence.

     If this flag is not set, event queue attributes can only be configured dur-
     ing rte_event_queue_setup().

     See also
	 rte_event_queue_setup()

     Definition at line 406 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_PROFILE_LINK   RTE_BIT32(12)
     Event device is capable of supporting  multiple  link  profiles  per  event
     port.

     When set, the value of rte_event_dev_info::max_profiles_per_port is greater
     than one, and multiple profiles may be configured and then switched at run-
     time. If not set, only a single profile may be configured, which may itself
     be runtime adjustable (if RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK is set).

     See also
	 rte_event_port_profile_links_set()

	 rte_event_port_profile_links_get()

	 rte_event_port_profile_switch()

	 RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK

     Definition at line 420 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_ATOMIC   RTE_BIT32(13)
     Event  device  is	capable of atomic scheduling. When this flag is set, the
     application can configure queues with scheduling type atomic on this  event
     device.

     See also
	 RTE_SCHED_TYPE_ATOMIC

     Definition at line 428 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_ORDERED   RTE_BIT32(14)
     Event  device  is capable of ordered scheduling. When this flag is set, the
     application can configure queues with scheduling type ordered on this event
     device.

     See also
	 RTE_SCHED_TYPE_ORDERED

     Definition at line 436 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_PARALLEL	RTE_BIT32(15)
     Event device is capable of parallel scheduling. When this flag is set,  the
     application  can  configure  queues  with	scheduling type parallel on this
     event device.

     See also
	 RTE_SCHED_TYPE_PARALLEL

     Definition at line 444 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_INDEPENDENT_ENQ   RTE_BIT32(16)
     Event  device  is	capable  of  independent  enqueue.  A  new   capability,
     RTE_EVENT_DEV_CAP_INDEPENDENT_ENQ, will indicate that Eventdev supports the
     enqueue in any order or specifically in a different order than the dequeue.
     Eventdev  PMD  can either dequeue events in the changed order in which they
     are enqueued or restore the original order before sending them to	the  un-
     derlying  hardware device. A flag is provided during the port configuration
     to inform Eventdev PMD that the application intends to use  an  independent
     enqueue  order on a particular port. Note that this capability only matters
     for eventdevs supporting burst mode.

     When an implicit release is enabled on a port, Eventdev PMD will also  han-
     dle  the  insertion of RELEASE events in place of dropped events. The inde-
     pendent enqueue feature only applies to FORWARD  and  RELEASE  events.  New
     events  (op=RTE_EVENT_OP_NEW) will be dequeued in the order the application
     enqueues them and do not maintain any  order  relative  to  FORWARD/RELEASE
     events. FORWARD vs NEW relaxed ordering only applies to ports that have en-
     abled independent enqueue feature.

     Definition at line 463 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE	 RTE_BIT32(17)
     Event device supports event pre-scheduling.

     When  this  capability  is available, the application can enable event pre-
     scheduling on the event device to pre-schedule events to a event port  when
     rte_event_dequeue_burst()	is  issued. The pre-schedule process starts with
     the rte_event_dequeue_burst() call and the  pre-scheduled	events	are  re-
     turned on the next rte_event_dequeue_burst() call.

     See also
	 rte_event_dev_configure()

     Definition at line 475 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE_ADAPTIVE   RTE_BIT32(18)
     Event device supports adaptive event pre-scheduling.

     When this capability is available, the application can enable adaptive pre-
     scheduling  on  the  event  device  where the events are pre-scheduled when
     there are no forward progress constraints with the currently held flow con-
     texts. The pre-schedule process starts with  the  rte_event_dequeue_burst()
     call  and	the  pre-scheduled events are returned on the next rte_event_de-
     queue_burst() call.

     See also
	 rte_event_dev_configure()

     Definition at line 487 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE   RTE_BIT32(19)
     Event device supports event pre-scheduling per event port.

     When this flag is set, the event device allows controlling the  event  pre-
     scheduling at a event port granularity.

     See also
	 rte_event_dev_configure()

	 rte_event_port_preschedule_modify()

     Definition at line 497 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CAP_PRESCHEDULE_EXPLICIT   RTE_BIT32(20)
     Event device supports explicit pre-scheduling.

     When  this flag is set, the application can issue pre-schedule request on a
     event port.

     See also
	 rte_event_port_preschedule()

     Definition at line 506 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
     Highest priority level for events and queues.

     See also
	 rte_event_queue_setup()

	 rte_event_enqueue_burst()

	 rte_event_port_link()

     Definition at line 515 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_PRIORITY_NORMAL   128
     Normal priority level for events and queues.

     See also
	 rte_event_queue_setup()

	 rte_event_enqueue_burst()

	 rte_event_port_link()

     Definition at line 522 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_PRIORITY_LOWEST   255
     Lowest priority level for events and queues.

     See also
	 rte_event_queue_setup()

	 rte_event_enqueue_burst()

	 rte_event_port_link()

     Definition at line 529 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_WEIGHT_HIGHEST   255
     Highest weight of an event queue.

     See also
	 rte_event_queue_attr_get()

	 rte_event_queue_attr_set()

     Definition at line 537 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_WEIGHT_LOWEST   0
     Lowest weight of an event queue.

     See also
	 rte_event_queue_attr_get()

	 rte_event_queue_attr_set()

     Definition at line 543 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_AFFINITY_HIGHEST   255
     Highest scheduling affinity of an event queue.

     See also
	 rte_event_queue_attr_get()

	 rte_event_queue_attr_set()

     Definition at line 551 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_AFFINITY_LOWEST   0
     Lowest scheduling affinity of an event queue.

     See also
	 rte_event_queue_attr_get()

	 rte_event_queue_attr_set()

     Definition at line 557 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_ATTR_PORT_COUNT   0
     The count of ports.

     Definition at line 709 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_ATTR_QUEUE_COUNT   1
     The count of queues.

     Definition at line 713 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_ATTR_STARTED	2
     The status of the device, zero for stopped, non-zero for started.

     Definition at line 717 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT   RTE_BIT32(0)
     Override the global dequeue_timeout_ns and use per dequeue timeout in ns.

     See also
	 rte_event_dequeue_timeout_ticks(), rte_event_dequeue_burst()

     Definition at line 740 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_CFG_ALL_TYPES   RTE_BIT32(0)
     Allow events with schedule types ATOMIC, ORDERED, and PARALLEL  to  be  en-
     queued to this queue.

     The  scheduling type to be used is that specified in each individual event.
     This flag can only be set when configuring queues on devices reporting  the
     RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES capability.

     Without this flag, only events with the specific scheduling type configured
     at queue setup can be sent to the queue.

     See also
	 RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES

	 RTE_SCHED_TYPE_ORDERED, RTE_SCHED_TYPE_ATOMIC, RTE_SCHED_TYPE_PARALLEL

	 rte_event_enqueue_burst()

     Definition at line 890 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_CFG_SINGLE_LINK   RTE_BIT32(1)
     This event queue links only to a single event port.

     No  load-balancing of events is performed, as all events sent to this queue
     end up at the same event port. The number of queues on which this	flag  is
     to  be  set  must	be  configured	at device configuration time, by setting
     rte_event_dev_config::nb_single_link_event_port_queues parameter  appropri-
     ately.

     This  flag  serves as a hint only, any devices without specific support for
     single-link queues can fall-back automatically to using regular queues with
     a single destination port.

     See also
	 rte_event_dev_info.max_single_link_event_port_queue_pairs

	 rte_event_dev_config.nb_single_link_event_port_queues

	 rte_event_port_setup(), rte_event_port_link()

     Definition at line 908 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_PRIORITY   0
     Queue attribute id for the priority of the queue.

     Definition at line 1041 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_FLOWS   1
     Queue attribute id for the number of atomic flows configured for the queue.

     Definition at line 1045 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_ORDER_SEQUENCES   2
     Queue attribute id for the number of atomic order sequences configured  for
     the queue.

     Definition at line 1049 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_EVENT_QUEUE_CFG   3
     Queue attribute id for the configuration flags for the queue.

     Definition at line 1053 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE	4
     Queue attribute id for the schedule type of the queue.

     Definition at line 1057 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_WEIGHT	 5
     Queue attribute id for the weight of the queue.

     Definition at line 1061 of file rte_eventdev.h.

   #define RTE_EVENT_QUEUE_ATTR_AFFINITY   6
     Queue attribute id for the affinity of the queue.

     Definition at line 1065 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL	 RTE_BIT32(0)
     Configure	the  port not to release outstanding events in rte_event_dev_de-
     queue_burst(). If set, all events received through the port must be explic-
     itly released with RTE_EVENT_OP_RELEASE or  RTE_EVENT_OP_FORWARD.	Must  be
     unset if the device is not RTE_EVENT_DEV_CAP_IMPLICIT_RELEASE_DISABLE capa-
     ble.

     Definition at line 1123 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_SINGLE_LINK   RTE_BIT32(1)
     This event port links only to a single event queue. The queue it links with
     should  be  similarly  configured	with the RTE_EVENT_QUEUE_CFG_SINGLE_LINK
     flag.

     See also
	 RTE_EVENT_QUEUE_CFG_SINGLE_LINK

	 rte_event_port_setup(), rte_event_port_link()

     Definition at line 1131 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_HINT_PRODUCER   RTE_BIT32(2)
     Hint that this event port will primarily enqueue events to  the  system.  A
     PMD  can  optimize its internal workings by assuming that this port is pri-
     marily going to enqueue NEW events.

     Note that this flag is only a hint, so PMDs must operate under the  assump-
     tion that any port can enqueue an event with any type of op.

     See also
	 rte_event_port_setup()

     Definition at line 1141 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_HINT_CONSUMER   RTE_BIT32(3)
     Hint  that this event port will primarily dequeue events from the system. A
     PMD can optimize its internal workings by assuming that this port	is  pri-
     marily going to consume events, and not enqueue NEW or FORWARD events.

     Note  that this flag is only a hint, so PMDs must operate under the assump-
     tion that any port can enqueue an event with any type of op.

     See also
	 rte_event_port_setup()

     Definition at line 1152 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_HINT_WORKER   RTE_BIT32(4)
     Hint that this event port will primarily pass existing  events  through.  A
     PMD  can  optimize its internal workings by assuming that this port is pri-
     marily going to FORWARD events, and not enqueue NEW or RELEASE  events  of-
     ten.

     Note  that this flag is only a hint, so PMDs must operate under the assump-
     tion that any port can enqueue an event with any type of op.

     See also
	 rte_event_port_setup()

     Definition at line 1163 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_CFG_INDEPENDENT_ENQ	RTE_BIT32(5)
     Flag to enable independent enqueue. Must not be set if the  device  is  not
     RTE_EVENT_DEV_CAP_INDEPENDENT_ENQ	capable. This feature allows an applica-
     tion to enqueue RTE_EVENT_OP_FORWARD or RTE_EVENT_OP_RELEASE  in  an  order
     different	than  the  order the events were dequeued from the event device,
     while maintaining RTE_SCHED_TYPE_ATOMIC  or  RTE_SCHED_TYPE_ORDERED  seman-
     tics.

     Note that this flag only matters for Eventdevs supporting burst mode.

     See also
	 rte_event_port_setup()

     Definition at line 1175 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_ATTR_ENQ_DEPTH   0
     Port  attribute  id  for the maximum size of a burst enqueue operation sup-
     ported on a port.

     Definition at line 1307 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_ATTR_DEQ_DEPTH   1
     Port attribute id for the maximum size of a dequeue burst which can be  re-
     turned from a port.

     Definition at line 1311 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_ATTR_NEW_EVENT_THRESHOLD   2
     Port  attribute id for the new event threshold of the port. Once the number
     of events in the system exceeds this threshold,  the  enqueue  of	NEW-type
     events will fail.

     Definition at line 1317 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_ATTR_IMPLICIT_RELEASE_DISABLE   3
     Port attribute id for the implicit release disable attribute of the port.

     Definition at line 1321 of file rte_eventdev.h.

   #define RTE_EVENT_PORT_ATTR_INDEPENDENT_ENQ	 4
     Port attribute id for the Independent Enqueue feature.

     Definition at line 1325 of file rte_eventdev.h.

   #define RTE_SCHED_TYPE_ORDERED   0
     Ordered scheduling

     Events  from an ordered flow of an event queue can be scheduled to multiple
     ports for concurrent processing while maintaining the original event order,
     i.e. the order in which they were first enqueued to that queue. This scheme
     allows events pertaining  to  the	same,  potentially  large,  flow  to  be
     processed	in parallel on multiple cores without incurring any application-
     level order restoration logic overhead.

     After events are dequeued from a set of ports, as those events  are  re-en-
     queued  to  another  queue (with the op field set to RTE_EVENT_OP_FORWARD),
     the event device restores the original event order - including  events  re-
     turned from all ports in the set - before the events are placed on the des-
     tination queue, for subsequent scheduling to ports.

     Any  events not forwarded i.e. dropped explicitly via RELEASE or implicitly
     released by the next dequeue operation on a port, are skipped  by	the  re-
     ordering stage and do not affect the reordering of other returned events.

     Any  NEW  events  sent  on  a  port are not ordered with respect to FORWARD
     events sent on the same port, since they have no original event order. They
     also are not ordered with respect to NEW events enqueued  on  other  ports.
     However,  NEW  events  to the same destination queue from the same port are
     guaranteed  to  be  enqueued  in  the  order  they   were	 submitted   via
     rte_event_enqueue_burst().

     NOTE:  In restoring event order of forwarded events, the eventdev API guar-
     antees that all events from the same flow	(i.e.  same  rte_event::flow_id,
     rte_event::priority  and  rte_event::queue_id)  will be put in the original
     order before being forwarded to the destination queue. Some  eventdevs  may
     implement stricter ordering to achieve this aim, for example, restoring the
     order across all flows dequeued from the same ORDERED queue.

     See also
	 rte_event_queue_setup(),   rte_event_dequeue_burst(),	RTE_EVENT_OP_RE-
	 LEASE

     Definition at line 1535 of file rte_eventdev.h.

   #define RTE_SCHED_TYPE_ATOMIC   1
     Atomic scheduling

     Events  from   an	 atomic   flow,   identified   by   a	combination   of
     rte_event::flow_id,  rte_event::queue_id  and  rte_event::priority,  can be
     scheduled only to a single port at a time. The port is guaranteed	to  have
     exclusive (atomic) access to the associated flow context, which enables the
     user to avoid SW synchronization. Atomic flows also maintain event ordering
     since only one port at a time can process events from each flow of an event
     queue, and events within a flow are not reordered within the scheduler.

     An  atomic  flow  is  locked to a port when events from that flow are first
     scheduled to that port. That lock remains in place  until	the  application
     calls  rte_event_dequeue_burst()  from  the same port, which implicitly re-
     leases the lock (if RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL flag is  not  set).
     User  may	allow the scheduler to release the lock earlier than that by in-
     voking rte_event_enqueue_burst() with  RTE_EVENT_OP_RELEASE  operation  for
     each event from that flow.

     NOTE:  Where multiple events from the same queue and atomic flow are sched-
     uled to a port, the lock for that flow is only released once the last event
     from the flow is released, or forwarded to another queue. So long as  there
     is at least one event from an atomic flow scheduled to a port/core (includ-
     ing  any  events  in the port's dequeue queue, not yet read by the applica-
     tion), that port will hold the synchronization lock for that flow.

     See also
	 rte_event_queue_setup(),  rte_event_dequeue_burst(),	RTE_EVENT_OP_RE-
	 LEASE

     Definition at line 1562 of file rte_eventdev.h.

   #define RTE_SCHED_TYPE_PARALLEL   2
     Parallel scheduling

     The  scheduler performs priority scheduling, load balancing, etc. functions
     but does not provide additional event synchronization or  ordering.  It  is
     free  to  schedule  events from a single parallel flow of an event queue to
     multiple events ports for concurrent processing. The application is respon-
     sible for flow context synchronization and event ordering (SW  synchroniza-
     tion).

     See also
	 rte_event_queue_setup(), rte_event_dequeue_burst()

     Definition at line 1575 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_ETHDEV   0x0
     The event generated from ethdev subsystem

     Definition at line 1579 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_CRYPTODEV   0x1
     The event generated from crypodev subsystem

     Definition at line 1581 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_TIMER   0x2
     The event generated from event timer adapter

     Definition at line 1583 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_CPU	0x3
     The   event   generated  from  cpu  for  pipelining.  Application	may  use
     sub_event_type to further classify the event

     Definition at line 1587 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_ETH_RX_ADAPTER   0x4
     The event generated from event eth Rx adapter

     Definition at line 1589 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_DMADEV   0x5
     The event generated from dma subsystem

     Definition at line 1591 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_VECTOR   0x8
     Indicates that event is a vector. All vector event types should be a  logi-
     cal OR of EVENT_TYPE_VECTOR. This simplifies the pipeline design as one can
     split  processing	the events between vector events and normal event across
     event types. Example: if (ev.event_type & RTE_EVENT_TYPE_VECTOR) { // Clas-
     sify and handle vector event. } else { // Classify and handle event. }

     Definition at line 1603 of file rte_eventdev.h.

   #define     RTE_EVENT_TYPE_ETHDEV_VECTOR	   (RTE_EVENT_TYPE_VECTOR      |
     RTE_EVENT_TYPE_ETHDEV)
     The event vector generated from ethdev subsystem

     Definition at line 1606 of file rte_eventdev.h.

   #define	 RTE_EVENT_TYPE_CPU_VECTOR	   (RTE_EVENT_TYPE_VECTOR      |
     RTE_EVENT_TYPE_CPU)
     The event vector generated from cpu for pipelining.

     Definition at line 1608 of file rte_eventdev.h.

   #define  RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR       (RTE_EVENT_TYPE_VECTOR  |
     RTE_EVENT_TYPE_ETH_RX_ADAPTER)
     The event vector generated from eth Rx adapter.

     Definition at line 1611 of file rte_eventdev.h.

   #define    RTE_EVENT_TYPE_CRYPTODEV_VECTOR	      (RTE_EVENT_TYPE_VECTOR   |
     RTE_EVENT_TYPE_CRYPTODEV)
     The event vector generated from cryptodev adapter.

     Definition at line 1614 of file rte_eventdev.h.

   #define RTE_EVENT_TYPE_MAX	0x10
     Maximum number of event types

     Definition at line 1617 of file rte_eventdev.h.

   #define RTE_EVENT_OP_NEW   0
     The rte_event::op field must be set to this operation type to inject a  new
     event,  i.e.  one	not  previously  dequeued,  into the event device, to be
     scheduled for processing.

     Definition at line 1624 of file rte_eventdev.h.

   #define RTE_EVENT_OP_FORWARD   1
     The application must set the rte_event::op field to this operation type  to
     return  a previously dequeued event to the event device to be scheduled for
     further processing.

     This event must be enqueued to the same port that the event to be forwarded
     was dequeued from.

     The event's fields, including (but  not  limited  to)  flow_id,  scheduling
     type,  destination  queue,  and event payload e.g. mbuf pointer, may all be
     updated as desired by the application, but the rte_event::impl_opaque field
     must be kept to the same value as was present when the event was dequeued.

     Definition at line 1636 of file rte_eventdev.h.

   #define RTE_EVENT_OP_RELEASE   2
     Release the flow context associated with the schedule type.

     If current flow's scheduler type method is RTE_SCHED_TYPE_ATOMIC then  this
     operation	type  hints  the  scheduler that the user has completed critical
     section processing for this event in the current atomic context,  and  that
     the  scheduler  may unlock any atomic locks held for this event. If this is
     the last event from an atomic flow, i.e. all flow locks are  released  (see
     RTE_SCHED_TYPE_ATOMIC  for details), the scheduler is now allowed to sched-
     ule events from that flow from to another port. However, the  atomic  locks
     may  be still held until the next rte_event_dequeue_burst() call; enqueuing
     an event with opt type RTE_EVENT_OP_RELEASE is a hint  only,  allowing  the
     scheduler to release the atomic locks early, but not requiring it to do so.

     Early  atomic lock release may increase parallelism and thus system perfor-
     mance, but the user needs to design carefully the split  into  critical  vs
     non-critical sections.

     If current flow's scheduler type method is RTE_SCHED_TYPE_ORDERED then this
     operation	type  informs the scheduler that the current event has completed
     processing and will not be returned to the  scheduler,  i.e.  it  has  been
     dropped,  and so the reordering context for that event should be considered
     filled.

     Events with this operation type must only be enqueued to the same port that
     the event to be released  was  dequeued  from.  The  rte_event::impl_opaque
     field in the release event must have the same value as that in the original
     dequeued event.

     If  a dequeued event is re-enqueued with operation type of RTE_EVENT_OP_RE-
     LEASE, then any subsequent enqueue of that event - or a copy of it  -  must
     be  done  as event of type RTE_EVENT_OP_NEW, not RTE_EVENT_OP_FORWARD. This
     is because any context for  the  originally  dequeued  event,  i.e.  atomic
     locks,  or reorder buffer entries, will have been removed or invalidated by
     the release operation.

     Definition at line 1670 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT	0x1
     This flag is sent when the packet transfer mechanism is in HW.  Ethdev  can
     send packets to the event device using internal event port.

     Definition at line 1806 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ   0x2
     Adapter  supports	multiple  event queues per ethdev. Every ethdev Rx queue
     can be connected to a unique event queue.

     Definition at line 1810 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_RX_ADAPTER_CAP_OVERRIDE_FLOW_ID   0x4
     The application can override the adapter generated flow ID  in  the  event.
     This flow ID can be specified when adding an ethdev Rx queue to the adapter
     using the ev.flow_id member.

     See also
	 struct rte_event_eth_rx_adapter_queue_conf::ev

	 struct rte_event_eth_rx_adapter_queue_conf::rx_queue_flags

     Definition at line 1817 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR   0x8
     Adapter supports event vectorization per ethdev.

     Definition at line 1819 of file rte_eventdev.h.

   #define RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT   RTE_BIT32(0)
     This flag is set when the timer mechanism is in HW.

     Definition at line 1844 of file rte_eventdev.h.

   #define RTE_EVENT_TIMER_ADAPTER_CAP_PERIODIC   RTE_BIT32(1)
     This flag is set if periodic mode is supported.

     Definition at line 1847 of file rte_eventdev.h.

   #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW   0x1
     Flag  indicates  HW is capable of generating events in RTE_EVENT_OP_NEW en-
     queue operation. Cryptodev will send packets to the  event  device  as  new
     events using an internal event port.

     Definition at line 1871 of file rte_eventdev.h.

   #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD   0x2
     Flag  indicates  HW is capable of generating events in RTE_EVENT_OP_FORWARD
     enqueue operation. Cryptodev will send packets to the event device as  for-
     warded event using an internal event port.

     Definition at line 1878 of file rte_eventdev.h.

   #define RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND   0x4
     Flag indicates HW is capable of mapping crypto queue pair to event queue.

     Definition at line 1883 of file rte_eventdev.h.

   #define RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA   0x8
     Flag indicates HW/SW supports a mechanism to store and retrieve the private
     data information along with the crypto session.

     Definition at line 1888 of file rte_eventdev.h.

   #define RTE_EVENT_CRYPTO_ADAPTER_CAP_EVENT_VECTOR   0x10
     Flag  indicates  HW  is  capable of aggregating processed crypto operations
     into rte_event_vector.

     Definition at line 1893 of file rte_eventdev.h.

   #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_NEW   0x1
     Flag indicates HW is capable of generating events in  RTE_EVENT_OP_NEW  en-
     queue operation. DMADEV will send packets to the event device as new events
     using an internal event port.

     Definition at line 1924 of file rte_eventdev.h.

   #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD   0x2
     Flag  indicates  HW is capable of generating events in RTE_EVENT_OP_FORWARD
     enqueue operation. DMADEV will send packets to the  event	device	as  for-
     warded event using an internal event port.

     Definition at line 1931 of file rte_eventdev.h.

   #define RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND   0x4
     Flag indicates HW is capable of mapping DMA vchan to event queue.

     Definition at line 1934 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT	0x1
     This flag is sent when the PMD supports a packet transmit callback

     Definition at line 1963 of file rte_eventdev.h.

   #define RTE_EVENT_ETH_TX_ADAPTER_CAP_EVENT_VECTOR   0x2
     Indicates that the Tx adapter is capable of handling event vector of mbufs.

     Definition at line 1967 of file rte_eventdev.h.

   #define RTE_EVENT_VECTOR_ADAPTER_CAP_INTERNAL_PORT	0x1
     This  flag  is  set when the vector adapter is capable of generating events
     using an internal event port.

     Definition at line 1993 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_XSTATS_NAME_SIZE   64
     Maximum name length for extended statistics counters

     Definition at line 2397 of file rte_eventdev.h.

   #define RTE_EVENT_DEV_MAINT_OP_FLUSH   (1 << 0)
     Force an immediately flush of any buffered events in the port,  potentially
     at the cost of additional overhead.

     See also
	 rte_event_maintain()

     Definition at line 2873 of file rte_eventdev.h.

Typedef Documentation
   typedef  void(*  rte_eventdev_port_flush_t) (uint8_t dev_id, struct rte_event
     event, void *arg)
     Callback function prototype that can be  passed  during  rte_event_port_re-
     lease(), invoked once per a released event.

     Definition at line 1269 of file rte_eventdev.h.

   typedef  void(*  rte_eventdev_stop_flush_t) (uint8_t dev_id, struct rte_event
     event, void *arg)
     Callback function called  during  rte_event_dev_stop(),  invoked  once  per
     flushed event.

     Definition at line 1390 of file rte_eventdev.h.

Enumeration Type Documentation
   enum rte_event_dev_preschedule_type
     Event device pre-schedule type enumeration.

     Enumerator

     RTE_EVENT_PRESCHEDULE_NONE
	    Disable  pre-schedule  across  the	event device or on a given event
	    port.			  rte_event_dev_config::preschedule_type
	    rte_event_port_preschedule_modify()

     RTE_EVENT_PRESCHEDULE
	    Enable  pre-schedule always across the event device or a given event
	    port.			  rte_event_dev_config::preschedule_type
	    rte_event_port_preschedule_modify()

     See also
	 RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE

	 RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE

     RTE_EVENT_PRESCHEDULE_ADAPTIVE
	    Enable  adaptive  pre-schedule  across  the  event device or a given
	    event port. Delay issuing pre-schedule until there	are  no  forward
	    progress constraints with the held flow contexts. rte_event_dev_con-
	    fig::preschedule_type rte_event_port_preschedule_modify()

     See also
	 RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE_ADAPTIVE

	 RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE

     Definition at line 743 of file rte_eventdev.h.

   enum rte_event_dev_xstats_mode
     Selects the component of the eventdev to retrieve statistics from.

     Definition at line 2402 of file rte_eventdev.h.

Function Documentation
   uint8_t rte_event_dev_count (void)
     Get the total number of event devices.

     Returns
	 The total number of usable event devices.

   int rte_event_dev_get_dev_id (const char * name)
     Get the device identifier for the named event device.

     Parameters
	 name Event device name to select the event device identifier.

     Returns
	 Event	device	identifier (dev_id >= 0) on success. Negative error code
	 on failure:

	 * -EINVAL - input name parameter is invalid.

	 * -ENODEV - no event device found with that name.

   int rte_event_dev_socket_id (uint8_t dev_id)
     Return the NUMA socket to which a device is connected.

     Parameters
	 dev_id The identifier of the device.

     Returns
	 The NUMA socket id to which the device is connected  or  a  default  of
	 zero if the socket could not be determined. -EINVAL on error, where the
	 given dev_id value does not correspond to any event device.

   int	rte_event_dev_info_get	(uint8_t  dev_id,  struct  rte_event_dev_info  *
     dev_info)
     Retrieve details of an event device's capabilities and  configuration  lim-
     its.

     Parameters
	 dev_id The identifier of the device.
	 dev_info  A  pointer  to  a  structure of type rte_event_dev_info to be
	 filled with the information about the device's capabilities.

     Returns

	 * 0:  Success,  information  about  the  event  device  is  present  in
	   dev_info.

	 * <0: Failure, error code returned by the function.

	   * -EINVAL - invalid input parameters, e.g. incorrect device id.

	   * -ENOTSUP  - device does not support returning capabilities informa-
	     tion.

   int rte_event_dev_attr_get (uint8_t	dev_id,  uint32_t  attr_id,  uint32_t  *
     attr_value)
     Get an attribute from a device.

     Parameters
	 dev_id Eventdev id
	 attr_id The attribute ID to retrieve
	 attr_value A pointer that will be filled in with the attribute value if
	 successful.

     Returns

	 * 0: Successfully retrieved attribute value

	 * -EINVAL: Invalid device or attr_id provided, or attr_value is NULL

   int	rte_event_dev_configure (uint8_t dev_id, const struct rte_event_dev_con-
     fig * dev_conf)
     Configure an event device.

     This function must be invoked before any other  configuration  function  in
     the  API, when preparing an event device for application use. This function
     can also be re-invoked when a device is in the stopped state.

     The caller should use rte_event_dev_info_get() to get the capabilities  and
     resource  limits for this event device before calling this API. Many values
     in the dev_conf input parameter are subject to limits given in  the  device
     information returned from rte_event_dev_info_get().

     Parameters
	 dev_id The identifier of the device to configure.
	 dev_conf The event device configuration structure.

     Returns

	 * 0: Success, device configured.

	 * <0: Error code returned by the driver configuration function.

	   * -ENOTSUP - device does not support configuration.

	   * -EINVAL - invalid input parameter.

	   * -EBUSY - device has already been started.

   int	 rte_event_queue_default_conf_get  (uint8_t  dev_id,  uint8_t  queue_id,
     struct rte_event_queue_conf * queue_conf)
     Retrieve the default configuration information of an event queue designated
     by its queue_id from the event driver for an event device.

     This   function   intended    to	 be    used    in    conjunction    with
     rte_event_queue_setup()  where caller needs to set up the queue by overrid-
     ing few default values.

     Parameters
	 dev_id The identifier of the device.
	 queue_id The index of the event queue to get the configuration informa-
	 tion. The value must be less than rte_event_dev_config::nb_event_queues
	 previously supplied to rte_event_dev_configure().
	 queue_conf The pointer to the default event queue configuration data.

     Returns

	 * 0: Success, driver updates  the  default  event  queue  configuration
	   data.

	 * <0: Error code returned by the driver info get function.

     See also
	 rte_event_queue_setup()

   int	rte_event_queue_setup  (uint8_t  dev_id,  uint8_t queue_id, const struct
     rte_event_queue_conf * queue_conf)
     Allocate and set up an event queue for an event device.

     Parameters
	 dev_id The identifier of the device.
	 queue_id The index of the event queue to setup. The value must be  less
	 than	rte_event_dev_config::nb_event_queues	previously  supplied  to
	 rte_event_dev_configure().
	 queue_conf The pointer to the configuration data to  be  used	for  the
	 event queue. NULL value is allowed, in which case default configuration
	 used.

     See also
	 rte_event_queue_default_conf_get()

     Returns

	 * 0: Success, event queue correctly set up.

	 * <0: event queue configuration failed.

   int	rte_event_queue_attr_get  (uint8_t  dev_id,  uint8_t  queue_id, uint32_t
     attr_id, uint32_t * attr_value)
     Get an attribute of an event queue.

     Parameters
	 dev_id The identifier of the device.
	 queue_id The index of the event queue to query. The value must be  less
	 than	rte_event_dev_config::nb_event_queues	previously  supplied  to
	 rte_event_dev_configure().
	 attr_id The attribute ID to retrieve (RTE_EVENT_QUEUE_ATTR_*).
	 attr_value A pointer that will be filled in with the attribute value if
	 successful.

     Returns

	 * 0: Successfully returned value

	 * -EINVAL: invalid device, queue or attr_id provided, or attr_value was
	   NULL.

	 * -EOVERFLOW:	   returned	when	 attr_id     is      set      to
	   RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE  and RTE_EVENT_QUEUE_CFG_ALL_TYPES
	   is set in the queue configuration flags.

   int rte_event_queue_attr_set  (uint8_t  dev_id,  uint8_t  queue_id,	uint32_t
     attr_id, uint64_t attr_value)
     Set an event queue attribute.

     Parameters
	 dev_id The identifier of the device.
	 queue_id  The	index of the event queue to configure. The value must be
	 less than rte_event_dev_config::nb_event_queues previously supplied  to
	 rte_event_dev_configure().
	 attr_id The attribute ID to set (RTE_EVENT_QUEUE_ATTR_*).
	 attr_value The attribute value to set.

     Returns

	 * 0: Successfully set attribute.

	 * <0: failed to set event queue attribute.

	 * -EINVAL: invalid device, queue or attr_id.

	 * -ENOTSUP: device does not support setting the event attribute.

   int	rte_event_port_default_conf_get (uint8_t dev_id, uint8_t port_id, struct
     rte_event_port_conf * port_conf)
     Retrieve the default configuration information of an event port  designated
     by its port_id from the event driver for an event device.

     This    function	is   intended	to   be   used	 in   conjunction   with
     rte_event_port_setup() where the caller can set up the port by  just  over-
     riding few default values.

     Parameters
	 dev_id The identifier of the device.
	 port_id  The  index of the event port to get the configuration informa-
	 tion. The value must be less than  rte_event_dev_config::nb_event_ports
	 previously supplied to rte_event_dev_configure().
	 port_conf  The  pointer  to a structure to store the default event port
	 configuration data.

     Returns

	 * 0: Success, driver updates the default event port configuration data.

	 * <0: Error code returned by the driver info get function.

	   * -EINVAL - invalid input parameter.

	   * -ENOTSUP - function is not supported for this device.

     See also
	 rte_event_port_setup()

   int rte_event_port_setup  (uint8_t  dev_id,	uint8_t  port_id,  const  struct
     rte_event_port_conf * port_conf)
     Allocate and set up an event port for an event device.

     Parameters
	 dev_id The identifier of the device.
	 port_id  The  index  of the event port to setup. The value must be less
	 than  rte_event_dev_config::nb_event_ports   previously   supplied   to
	 rte_event_dev_configure().
	 port_conf  The  pointer  to  the  configuration data to be used for the
	 port. NULL value is allowed, in which case the default configuration is
	 used.

     See also
	 rte_event_port_default_conf_get()

     Returns

	 * 0: Success, event port correctly set up.

	 * <0: Port configuration failed.

	   * -EINVAL - Invalid input parameter.

	   * -EBUSY - Port already started.

	   * -ENOTSUP - Function not supported on this device, or a NULL pointer
	     passed as the port_conf parameter,  and  no  default  configuration
	     function available for this device.

	   * -EDQUOT  -  Application  tried  to  link  a  queue  configured with
	     RTE_EVENT_QUEUE_CFG_SINGLE_LINK to more than one event port.

   void rte_event_port_quiesce	(uint8_t  dev_id,  uint8_t  port_id,  rte_event-
     dev_port_flush_t release_cb, void * args)
     Quiesce any core specific resources consumed by the event port.

     Event  ports are generally coupled with lcores, and a given Hardware imple-
     mentation might require the PMD to store port specific data in  the  lcore.
     When  the application decides to migrate the event port to another lcore or
     teardown the current lcore it may to call	rte_event_port_quiesce	to  make
     sure that all the data associated with the event port are released from the
     lcore,  this  might also include any prefetched events. While releasing the
     event port from the lcore, this  function	calls  the  user-provided  flush
     callback once per event.

     Note
	 Invocation of this API does not affect the existing port configuration.

     Parameters
	 dev_id The identifier of the device.
	 port_id  The index of the event port to quiesce. The value must be less
	 than  rte_event_dev_config::nb_event_ports   previously   supplied   to
	 rte_event_dev_configure().
	 release_cb Callback function invoked once per flushed event.
	 args Argument supplied to callback.

   int	 rte_event_port_attr_get  (uint8_t  dev_id,  uint8_t  port_id,	uint32_t
     attr_id, uint32_t * attr_value)
     Get an attribute from a port.

     Parameters
	 dev_id The identifier of the device.
	 port_id The index of the event port to query. The value  must	be  less
	 than	rte_event_dev_config::nb_event_ports   previously   supplied  to
	 rte_event_dev_configure().
	 attr_id The attribute ID to retrieve (RTE_EVENT_PORT_ATTR_*)
	 attr_value A pointer that will be filled in with the attribute value if
	 successful

     Returns

	 * 0: Successfully returned value.

	 * (-EINVAL) Invalid device, port or attr_id, or attr_value was NULL.

   int rte_event_dev_start (uint8_t dev_id)
     Start an event device.

     The device start step is the last one in  device  setup,  and  enables  the
     event  ports  and	queues	to start accepting events and scheduling them to
     event ports.

     On success, all basic functions exported by the API (event  enqueue,  event
     dequeue and so on) can be invoked.

     Parameters
	 dev_id Event device identifier.

     Returns

	 * 0: Success, device started.

	 * -EINVAL: Invalid device id provided.

	 * -ENOTSUP: Device does not support this operation.

	 * -ESTALE : Not all ports of the device are configured.

	 * -ENOLINK: Not all queues are linked, which could lead to deadlock.

   void rte_event_dev_stop (uint8_t dev_id)
     Stop an event device.

     This  function  causes all queued events to be drained, including those re-
     siding in event ports. While draining events out of the device, this  func-
     tion  calls  the  user-provided flush callback (if one was registered) once
     per event.

     The device can be restarted with a call to  rte_event_dev_start().  Threads
     that  continue  to  enqueue/dequeue  while  the device is stopped, or being
     stopped, will result in undefined behavior. This includes	event  adapters,
     which must be stopped prior to stopping the eventdev.

     Parameters
	 dev_id Event device identifier.

     See also
	 rte_event_dev_stop_flush_callback_register()

   int	rte_event_dev_stop_flush_callback_register  (uint8_t  dev_id, rte_event-
     dev_stop_flush_t callback, void * userdata)
     Registers a callback function to be invoked during rte_event_dev_stop() for
     each flushed event. This function can be used to properly dispose of queued
     events, for example events containing memory pointers.

     The callback function is only registered for the calling process. The call-
     back  function  must  be  registered  in  every  process  that   can   call
     rte_event_dev_stop().

     Only  one	callback  function may be registered. Each new call replaces the
     existing registered callback function with the new function passed in.

     To unregister a callback, call this function with a NULL callback pointer.

     Parameters
	 dev_id The identifier of the device.
	 callback Callback function to be invoked once per flushed  event.  Pass
	 NULL to unset any previously-registered callback function.
	 userdata Argument supplied to callback.

     Returns

	 * 0 on success.

	 * -EINVAL if dev_id is invalid.

     See also
	 rte_event_dev_stop()

   int rte_event_dev_close (uint8_t dev_id)
     Close an event device. The device cannot be restarted!

     Parameters
	 dev_id Event device identifier.

     Returns

	 * 0 on successfully closing device

	 * <0 on failure to close device.

	   * -EINVAL - invalid device id.

	   * -ENOTSUP - operation not supported for this device.

	   * -EAGAIN - device is busy.

   struct __rte_aligned (16)
     Event vector structure. < Number of elements valid in this event vector.

     < Offset into the vector array where valid elements start from.

     < Reserved for future use

     < Indicates that the below union attributes have valid information.

     < Ethernet device port id.

     < Ethernet device queue id.

     < Union to hold common attributes of the vector array.

     <	Implementation	specific  opaque  value.  An implementation may use this
     field to hold implementation specific value to share  between  dequeue  and
     enqueue operation. The application should not modify this field.

     < Start of the vector array union. Depending upon the event type the vector
     array can be an array of mbufs or pointers or opaque u64 values.

     Definition at line 1441 of file rte_eventdev.h.

   int	rte_event_eth_rx_adapter_caps_get (uint8_t dev_id, uint16_t eth_port_id,
     uint32_t * caps)
     Retrieve the event device's ethdev Rx adapter capabilities for  the  speci-
     fied ethernet port

     Parameters
	 dev_id The identifier of the device.
	 eth_port_id The identifier of the ethernet device.
	 caps A pointer to memory filled with Rx event adapter capabilities.

     Returns

	 * 0:  Success,  driver  provides  Rx event adapter capabilities for the
	   ethernet device.

	 * <0: Error code returned by the driver function.

   int rte_event_timer_adapter_caps_get (uint8_t dev_id, uint32_t * caps)
     Retrieve the event device's timer adapter capabilities.

     Parameters
	 dev_id The identifier of the device.
	 caps A pointer to memory to be filled with event timer adapter capabil-
	 ities.

     Returns

	 * 0: Success, driver provided event timer adapter capabilities.

	 * <0: Error code returned by the driver function.

   int	rte_event_crypto_adapter_caps_get  (uint8_t  dev_id,  uint8_t	cdev_id,
     uint32_t * caps)
     Retrieve  the  event device's crypto adapter capabilities for the specified
     cryptodev device

     Parameters
	 dev_id The identifier of the device.
	 cdev_id The identifier of the cryptodev device.
	 caps A pointer to memory filled with event adapter capabilities. It  is
	 expected to be pre-allocated & initialized by caller.

     Returns

	 * 0:  Success, driver provides event adapter capabilities for the cryp-
	   todev device.

	 * <0: Error code returned by the driver function.

   __rte_experimental  int   rte_event_dma_adapter_caps_get   (uint8_t	 dev_id,
     uint8_t dmadev_id, uint32_t * caps)
     Retrieve  the  event  device's  DMA  adapter capabilities for the specified
     dmadev device

     Parameters
	 dev_id The identifier of the device.
	 dmadev_id The identifier of the dmadev device.
	 caps A pointer to memory filled with event adapter capabilities. It  is
	 expected to be pre-allocated & initialized by caller.

     Returns

	 * 0: Success, driver provides event adapter capabilities for the dmadev
	   device.

	 * <0: Error code returned by the driver function.

   int	rte_event_eth_tx_adapter_caps_get (uint8_t dev_id, uint16_t eth_port_id,
     uint32_t * caps)
     Retrieve the event device's eth Tx adapter capabilities

     Parameters
	 dev_id The identifier of the device.
	 eth_port_id The identifier of the ethernet device.
	 caps A pointer to memory filled with eth Tx adapter capabilities.

     Returns

	 * 0: Success, driver provides eth Tx adapter capabilities.

	 * <0: Error code returned by the driver function.

   int rte_event_dequeue_timeout_ticks (uint8_t dev_id, uint64_t ns, uint64_t  *
     timeout_ticks)
     Converts nanoseconds to timeout_ticks value for rte_event_dequeue_burst()

     If the device is configured with RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT flag
     then application can use this function to convert timeout value in nanosec-
     onds  to  implementations	specific timeout value supplied in rte_event_de-
     queue_burst()

     Parameters
	 dev_id The identifier of the device.
	 ns Wait time in nanosecond
	 timeout_ticks Value for the timeout_ticks  parameter  in  rte_event_de-
	 queue_burst()

     Returns

	 * 0 on success.

	 * -ENOTSUP if the device doesn't support timeouts

	 * -EINVAL if dev_id is invalid or timeout_ticks is NULL

	 * other values < 0 on failure.

     See also
	 rte_event_dequeue_burst(), RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT

	 rte_event_dev_configure()

   int	rte_event_port_link  (uint8_t  dev_id,	uint8_t  port_id,  const uint8_t
     queues[], const uint8_t priorities[], uint16_t nb_links)
     Link multiple source event queues supplied in  queues  to	the  destination
     event  port designated by its port_id with associated service priority sup-
     plied in priorities on the event device designated by its dev_id.

     The link establishment shall enable the event port port_id  from  receiving
     events from the specified event queue(s) supplied in queues

     An event queue may link to one or more event ports. The number of links can
     be established from an event queue to event port is implementation defined.

     Event  queue(s)  to event port link establishment can be changed at runtime
     without re-configuring the device to support scaling and to reduce the  la-
     tency  of	critical  work by establishing the link with more event ports at
     runtime.

     When the value of rte_event_dev_info::max_profiles_per_port is greater than
     or equal to one, this function links the event queues to the  default  pro-
     file_id i.e. profile_id 0 of the event port.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier to select the destination port to link.
	 queues  Points to an array of nb_links event queues to be linked to the
	 event port. NULL value is allowed, in which case  this  function  links
	 all  the  configured event queues nb_event_queues which previously sup-
	 plied to rte_event_dev_configure() to the event port port_id
	 priorities Points to an array of nb_links service priorities associated
	 with each event queue link to event  port.  The  priority  defines  the
	 event	port's	servicing priority for event queue, which may be ignored
	 by an implementation. The requested priority should  in  the  range  of
	 [RTE_EVENT_DEV_PRIORITY_HIGHEST,   RTE_EVENT_DEV_PRIORITY_LOWEST].  The
	 implementation shall normalize the requested priority to implementation
	 supported priority value. NULL value is allowed,  in  which  case  this
	 function links the event queues with RTE_EVENT_DEV_PRIORITY_NORMAL ser-
	 vicing priority
	 nb_links The number of links to establish. This parameter is ignored if
	 queues is NULL.

     Returns
	 The  number of links actually established. The return value can be less
	 than the value of the nb_links parameter when	the  implementation  has
	 the  limitation  on specific queue to port link establishment or if in-
	 valid parameters are specified in queues If the return  value	is  less
	 than  nb_links, the remaining links at the end of link[] are not estab-
	 lished, and the caller has to take care of them.  If  return  value  is
	 less  than  nb_links then implementation shall update the rte_errno ac-
	 cordingly, Possible rte_errno values are (EDQUOT) Quota exceeded(Appli-
	 cation tried to link the queue configured with
	  RTE_EVENT_QUEUE_CFG_SINGLE_LINK to more than one event ports) (EINVAL)
	 Invalid parameter

   int rte_event_port_unlink (uint8_t dev_id, uint8_t port_id, uint8_t queues[],
     uint16_t nb_unlinks)
     Unlink multiple source event queues supplied in queues from the destination
     event port designated by its port_id on the event device designated by  its
     dev_id.

     The  unlink  call issues an async request to disable the event port port_id
     from receiving events  from  the  specified  event  queue	queue_id.  Event
     queue(s) to event port unlink establishment can be changed at runtime with-
     out re-configuring the device.

     When the value of rte_event_dev_info::max_profiles_per_port is greater than
     or  equal	to  one, this function unlinks the event queues from the default
     profile identifier i.e. profile 0 of the event port.

     See also
	 rte_event_port_unlinks_in_progress() to poll for completed unlinks.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier to select the destination port to unlink.
	 queues Points to an array of nb_unlinks event	queues	to  be	unlinked
	 from the event port. NULL value is allowed, in which case this function
	 unlinks all the event queue(s) from the event port port_id.
	 nb_unlinks  The  number  of unlinks to establish. This parameter is ig-
	 nored if queues is NULL.

     Returns
	 The number of unlinks successfully requested. The return value  can  be
	 less than the value of the nb_unlinks parameter when the implementation
	 has the limitation on specific queue to port unlink establishment or if
	 invalid  parameters  are  specified.  If  the return value is less than
	 nb_unlinks, the remaining queues at the end of  queues[]  are	not  un-
	 linked,  and  the  caller  has to take care of them. If return value is
	 less than nb_unlinks then implementation shall update the rte_errno ac-
	 cordingly, Possible rte_errno values are (EINVAL) Invalid parameter

   __rte_experimental  int  rte_event_port_profile_links_set  (uint8_t	 dev_id,
     uint8_t  port_id,	const  uint8_t	queues[],  const  uint8_t  priorities[],
     uint16_t nb_links, uint8_t profile_id)
     Link multiple source event queues supplied in  queues  to	the  destination
     event  port  designated  by  its port_id with associated profile identifier
     supplied in profile_id with service priorities supplied  in  priorities  on
     the event device designated by its dev_id.

     If   profile_id   is  set	to  0  then,  the  links  created  by  the  call
     rte_event_port_link will be overwritten.

     Event ports by default use profile_id 0 unless it is changed using the call
     rte_event_port_profile_switch().

     The link establishment shall enable the event port port_id  from  receiving
     events from the specified event queue(s) supplied in queues

     An event queue may link to one or more event ports. The number of links can
     be established from an event queue to event port is implementation defined.

     Event  queue(s)  to event port link establishment can be changed at runtime
     without re-configuring the device to support scaling and to reduce the  la-
     tency  of	critical  work by establishing the link with more event ports at
     runtime.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier to select the destination port to link.
	 queues Points to an array of nb_links event queues to be linked to  the
	 event	port.  NULL  value is allowed, in which case this function links
	 all the configured event queues nb_event_queues which	previously  sup-
	 plied to rte_event_dev_configure() to the event port port_id
	 priorities Points to an array of nb_links service priorities associated
	 with  each  event  queue  link  to event port. The priority defines the
	 event port's servicing priority for event queue, which may  be  ignored
	 by  an  implementation.  The  requested priority should in the range of
	 [RTE_EVENT_DEV_PRIORITY_HIGHEST,  RTE_EVENT_DEV_PRIORITY_LOWEST].   The
	 implementation shall normalize the requested priority to implementation
	 supported  priority  value.  NULL  value is allowed, in which case this
	 function links the event queues with RTE_EVENT_DEV_PRIORITY_NORMAL ser-
	 vicing priority
	 nb_links The number of links to establish. This parameter is ignored if
	 queues is NULL.
	 profile_id The profile identifier associated  with  the  links  between
	 event queues and event port. Should be less than the max capability re-
	 ported by rte_event_dev_info::max_profiles_per_port

     Returns
	 The  number of links actually established. The return value can be less
	 than the value of the nb_links parameter when	the  implementation  has
	 the  limitation  on specific queue to port link establishment or if in-
	 valid parameters are specified in queues If the return  value	is  less
	 than  nb_links, the remaining links at the end of link[] are not estab-
	 lished, and the caller has to take care of them.  If  return  value  is
	 less  than  nb_links then implementation shall update the rte_errno ac-
	 cordingly, Possible rte_errno values are (EDQUOT) Quota exceeded(Appli-
	 cation tried to link the queue configured with
	  RTE_EVENT_QUEUE_CFG_SINGLE_LINK to more than one event ports) (EINVAL)
	 Invalid parameter

   __rte_experimental int rte_event_port_profile_unlink (uint8_t dev_id, uint8_t
     port_id, uint8_t queues[], uint16_t nb_unlinks, uint8_t profile_id)
     Unlink multiple source event queues supplied in queues that belong to  pro-
     file designated by profile_id from the destination event port designated by
     its port_id on the event device designated by its dev_id.

     If  profile_id  is set to 0 i.e., the default profile then, then this func-
     tion will act as rte_event_port_unlink.

     The unlink call issues an async request to disable the event  port  port_id
     from  receiving  events  from  the  specified  event  queue queue_id. Event
     queue(s) to event port unlink establishment can be changed at runtime with-
     out re-configuring the device.

     See also
	 rte_event_port_unlinks_in_progress() to poll for completed unlinks.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier to select the destination port to unlink.
	 queues Points to an array of nb_unlinks event	queues	to  be	unlinked
	 from the event port. NULL value is allowed, in which case this function
	 unlinks all the event queue(s) from the event port port_id.
	 nb_unlinks  The  number  of unlinks to establish. This parameter is ig-
	 nored if queues is NULL.
	 profile_id The profile identifier associated  with  the  links  between
	 event queues and event port. Should be less than the max capability re-
	 ported by rte_event_dev_info::max_profiles_per_port

     Returns
	 The  number  of unlinks successfully requested. The return value can be
	 less than the value of the nb_unlinks parameter when the implementation
	 has the limitation on specific queue to port unlink establishment or if
	 invalid parameters are specified. If the  return  value  is  less  than
	 nb_unlinks,  the  remaining  queues  at the end of queues[] are not un-
	 linked, and the caller has to take care of them.  If  return  value  is
	 less than nb_unlinks then implementation shall update the rte_errno ac-
	 cordingly, Possible rte_errno values are (EINVAL) Invalid parameter

   int rte_event_port_unlinks_in_progress (uint8_t dev_id, uint8_t port_id)
     Returns the number of unlinks in progress.

     This  function provides the application with a method to detect when an un-
     link has been completed by the implementation.

     See also
	 rte_event_port_unlink() to issue unlink requests.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier to select port to check	for  unlinks  in
	 progress.

     Returns
	 The  number of unlinks that are in progress. A return of zero indicates
	 that there are no outstanding unlink requests. A positive return  value
	 indicates  the  number of unlinks that are in progress, but are not yet
	 complete. A negative return value indicates an error, -EINVAL indicates
	 an invalid parameter passed for dev_id or port_id.

   int	rte_event_port_links_get  (uint8_t  dev_id,  uint8_t  port_id,	 uint8_t
     queues[], uint8_t priorities[])
     Retrieve  the list of source event queues and its associated service prior-
     ity linked to the destination event port designated by its port_id  on  the
     event device designated by its dev_id.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier.
	 queues Points to an array of queues for output. The caller has to allo-
	 cate  RTE_EVENT_MAX_QUEUES_PER_DEV  bytes  to	store the event queue(s)
	 linked with event port port_id
	 priorities Points to an array of priorities for output. The caller  has
	 to  allocate  RTE_EVENT_MAX_QUEUES_PER_DEV  bytes  to store the service
	 priority associated with each event queue linked

     Returns
	 The number of links established on the event  port  designated  by  its
	 port_id.

	 * <0 on failure.

   __rte_experimental	int  rte_event_port_profile_links_get  (uint8_t  dev_id,
     uint8_t port_id,  uint8_t	queues[],  uint8_t  priorities[],  uint8_t  pro-
     file_id)
     Retrieve  the  list of source event queues and its service priority associ-
     ated to a profile_id and linked to the destination event port designated by
     its port_id on the event device designated by its dev_id.

     Parameters
	 dev_id The identifier of the device.
	 port_id Event port identifier.
	 queues Points to an array of queues for output. The caller has to allo-
	 cate RTE_EVENT_MAX_QUEUES_PER_DEV bytes to  store  the  event	queue(s)
	 linked with event port port_id
	 priorities  Points to an array of priorities for output. The caller has
	 to allocate RTE_EVENT_MAX_QUEUES_PER_DEV bytes  to  store  the  service
	 priority associated with each event queue linked
	 profile_id  The  profile  identifier  associated with the links between
	 event queues and event port. Should be less than the max capability re-
	 ported by rte_event_dev_info::max_profiles_per_port

     Returns
	 The number of links established on the event  port  designated  by  its
	 port_id.

	 * <0 on failure.

   int rte_event_dev_service_id_get (uint8_t dev_id, uint32_t * service_id)
     Retrieve  the  service  ID  of  the event dev. If the adapter doesn't use a
     rte_service function, this function returns -ESRCH.

     Parameters
	 dev_id The identifier of the device.
	 service_id A pointer to a uint32_t, to be filled in  with  the  service
	 id.

     Returns

	 * 0: Success

	 * <0: Error code on failure, if the event dev doesn't use a rte_service
	   function, this function returns -ESRCH.

   int rte_event_dev_dump (uint8_t dev_id, FILE * f)
     Dump internal information about dev_id to the FILE* provided in f.

     Parameters
	 dev_id The identifier of the device.
	 f A pointer to a file for output

     Returns

	 * 0: on success

	 * <0: on failure.

   int	rte_event_dev_xstats_names_get	(uint8_t  dev_id, enum rte_event_dev_xs-
     tats_mode mode, uint8_t queue_port_id, struct  rte_event_dev_xstats_name  *
     xstats_names, uint64_t * ids, unsigned int size)
     Retrieve names of extended statistics of an event device.

     Parameters
	 dev_id The identifier of the event device.
	 mode  The  mode  of  statistics to retrieve. Choices include the device
	 statistics, port statistics or queue statistics.
	 queue_port_id Used to specify the port or queue number in queue or port
	 mode, and is ignored in device mode.
	 xstats_names Block of memory to insert names into.  Must  be  at  least
	 size in capacity. If set to NULL, function returns required capacity.
	 ids Block of memory to insert ids into. Must be at least size in capac-
	 ity.  If set to NULL, function returns required capacity. The id values
	 returned can be passed to rte_event_dev_xstats_get  to  select  statis-
	 tics.
	 size Capacity of xstats_names (number of names).

     Returns

	 * positive  value  lower or equal to size: success. The return value is
	   the number of entries filled in the stats table.

	 * positive value higher than size: error, the given statistics table is
	   too small. The return value corresponds to the size	that  should  be
	   given  to  succeed.	The entries in the table are not valid and shall
	   not be used by the caller.

	 * negative value on error: -ENODEV for invalid dev_id -EINVAL	for  in-
	   valid  mode,  queue	port  or  id  parameters  -ENOTSUP if the device
	   doesn't support this function.

   int rte_event_dev_xstats_get (uint8_t dev_id, enum  rte_event_dev_xstats_mode
     mode,  uint8_t  queue_port_id, const uint64_t ids[], uint64_t values[], un-
     signed int n)
     Retrieve extended statistics of an event device.

     Parameters
	 dev_id The identifier of the device.
	 mode The mode of statistics to retrieve.  Choices  include  the  device
	 statistics, port statistics or queue statistics.
	 queue_port_id Used to specify the port or queue number in queue or port
	 mode, and is ignored in device mode.
	 ids  The  id  numbers	of the stats to get. The ids can be got from the
	 stat position in the stat list  from  rte_event_dev_get_xstats_names(),
	 or by using rte_event_dev_xstats_by_name_get().
	 values The values for each stats request by ID.
	 n The number of stats requested

     Returns

	 * positive value: number of stat entries filled into the values array

	 * negative  value  on error: -ENODEV for invalid dev_id -EINVAL for in-
	   valid mode, queue port  or  id  parameters  -ENOTSUP  if  the  device
	   doesn't support this function.

   uint64_t rte_event_dev_xstats_by_name_get (uint8_t dev_id, const char * name,
     uint64_t * id)
     Retrieve the value of a single stat by requesting it by name.

     Parameters
	 dev_id The identifier of the device
	 name The stat name to retrieve
	 id  If non-NULL, the numerical id of the stat will be returned, so that
	 further requests for  the  stat  can  be  got	using  rte_event_dev_xs-
	 tats_get,  which  will  be  faster as it doesn't need to scan a list of
	 names for the stat. If the stat cannot be found, the id  returned  will
	 be (unsigned)-1.

     Returns

	 * positive value or zero: the stat value

	 * negative value: -EINVAL if stat not found, -ENOTSUP if not supported.

   int	 rte_event_dev_xstats_reset   (uint8_t	dev_id,  enum  rte_event_dev_xs-
     tats_mode mode,  int16_t  queue_port_id,  const  uint64_t	ids[],	uint32_t
     nb_ids)
     Reset the values of the xstats of the selected component in the device.

     Parameters
	 dev_id The identifier of the device
	 mode  The mode of the statistics to reset. Choose from device, queue or
	 port.
	 queue_port_id The queue or port to reset. 0 and positive values  select
	 ports and queues, while -1 indicates all ports or queues.
	 ids  Selects specific statistics to be reset. When NULL, all statistics
	 selected by mode will be reset. If non-NULL, must point to array of  at
	 least nb_ids size.
	 nb_ids The number of ids available from the ids array. Ignored when ids
	 is NULL.

     Returns

	 * zero: successfully reset the statistics to zero

	 * negative  value:  -EINVAL  invalid  parameters,  -ENOTSUP if not sup-
	   ported.

   int rte_event_dev_selftest (uint8_t dev_id)
     Trigger the eventdev self test.

     Parameters
	 dev_id The identifier of the device

     Returns

	 * 0: Selftest successful

	 * -ENOTSUP if the device doesn't support selftest

	 * other values < 0 on failure.

   struct rte_mempool * rte_event_vector_pool_create (const  char  *  name,  un-
     signed int n, unsigned int cache_size, uint16_t nb_elem, int socket_id)
     Get  the  memory  required per event vector based on the number of elements
     per vector. This should be used to create the mempool that holds the  event
     vectors.

     Parameters
	 name The name of the vector pool.
	 n The number of elements in the mbuf pool.
	 cache_size  Size of the per-core object cache. See rte_mempool_create()
	 for details.
	 nb_elem The number of elements that a single  event  vector  should  be
	 able to hold.
	 socket_id  The  socket identifier where the memory should be allocated.
	 The value can be SOCKET_ID_ANY if there is no NUMA constraint	for  the
	 reserved zone

     Returns
	 The  pointer  to the newly allocated mempool, on success. NULL on error
	 with rte_errno set appropriately. Possible rte_errno values include:

	 * E_RTE_NO_CONFIG - function could not get pointer to rte_config struc-
	   ture

	 * E_RTE_SECONDARY - function was called from a  secondary  process  in-
	   stance

	 * EINVAL  -  cache  size  provided  is  too  large, or priv_size is not
	   aligned.

	 * ENOSPC - the maximum number of memzones has already been allocated

	 * EEXIST - a memzone with the same name already exists

	 * ENOMEM - no appropriate memory area found in which to create memzone

	 * ENAMETOOLONG - mempool name requested is too long.

   static uint16_t rte_event_enqueue_burst  (uint8_t  dev_id,  uint8_t	port_id,
     const struct rte_event ev[], uint16_t nb_events) [inline],  [static]
     Enqueue  a burst of events objects or an event object supplied in rte_event
     structure on an event device designated by its  dev_id  through  the  event
     port  specified  by port_id. Each event object specifies the event queue on
     which it will be enqueued.

     The nb_events parameter is the number of event objects to enqueue which are
     supplied in the ev array of rte_event structure.

     Event operations RTE_EVENT_OP_FORWARD and RTE_EVENT_OP_RELEASE must only be
     enqueued to the same port that their associated events were dequeued from.

     The rte_event_enqueue_burst() function returns the number of events objects
     it actually enqueued. A return value equal  to  nb_events	means  that  all
     event objects have been enqueued.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 ev  Points to an array of nb_events objects of type rte_event structure
	 which contain the event object enqueue operations to be processed.
	 nb_events The number of event objects to enqueue, typically  number  of
	 rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...)  available
	 for this port.

     Returns
	 The number of event objects actually enqueued on the event device.  The
	 return value can be less than the value of the nb_events parameter when
	 the  event devices queue is full or if invalid parameters are specified
	 in a rte_event. If the return value is less than nb_events, the remain-
	 ing events at the end of ev[] are not consumed and the  caller  has  to
	 take  care  of  them,	and rte_errno is set accordingly. Possible errno
	 values include:

	 * EINVAL The port ID is invalid, device ID is invalid, an event's queue
	   ID is invalid, or an event's sched type doesn't match  the  capabili-
	   ties of the destination queue.

	 * ENOSPC  The event port was backpressured and unable to enqueue one or
	   more events. This error code is only applicable to closed systems.

     See also
	 rte_event_port_attr_get(), RTE_EVENT_PORT_ATTR_ENQ_DEPTH

     Definition at line 2662 of file rte_eventdev.h.

   static uint16_t rte_event_enqueue_new_burst (uint8_t dev_id, uint8_t port_id,
     const struct rte_event ev[], uint16_t nb_events) [inline],  [static]
     Enqueue a burst of events objects of operation type RTE_EVENT_OP_NEW on  an
     event  device  designated by its dev_id through the event port specified by
     port_id.

     Provides the same functionality as rte_event_enqueue_burst(),  expect  that
     application can use this API when the all objects in the burst contains the
     enqueue  operation  of the type RTE_EVENT_OP_NEW. This specialized function
     can provide the additional hint to the PMD and optimize if possible.

     The rte_event_enqueue_new_burst() result is undefined if the enqueue  burst
     has event object of operation type != RTE_EVENT_OP_NEW.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 ev  Points to an array of nb_events objects of type rte_event structure
	 which contain the event object enqueue operations to be processed.
	 nb_events The number of event objects to enqueue, typically  number  of
	 rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...)  available
	 for this port.

     Returns
	 The number of event objects actually enqueued on the event device.  The
	 return value can be less than the value of the nb_events parameter when
	 the  event devices queue is full or if invalid parameters are specified
	 in a rte_event. If the return value is less than nb_events, the remain-
	 ing events at the end of ev[] are not consumed and the  caller  has  to
	 take  care  of  them,	and rte_errno is set accordingly. Possible errno
	 values include:

	 * EINVAL The port ID is invalid, device ID is invalid, an event's queue
	   ID is invalid, or an event's sched type doesn't match  the  capabili-
	   ties of the destination queue.

	 * ENOSPC  The event port was backpressured and unable to enqueue one or
	   more events. This error code is only applicable to closed systems.

     See also
	 rte_event_port_attr_get(), RTE_EVENT_PORT_ATTR_ENQ_DEPTH

	 rte_event_enqueue_burst()

     Definition at line 2714 of file rte_eventdev.h.

   static  uint16_t  rte_event_enqueue_forward_burst  (uint8_t	dev_id,  uint8_t
     port_id,  const struct rte_event ev[], uint16_t nb_events) [inline],  [sta-
     tic]
     Enqueue a burst of events objects of operation type RTE_EVENT_OP_FORWARD on
     an event device designated by its dev_id through the event  port  specified
     by port_id.

     Provides  the  same functionality as rte_event_enqueue_burst(), expect that
     application can use this API when the all objects in the burst contains the
     enqueue operation of the type RTE_EVENT_OP_FORWARD. This specialized  func-
     tion can provide the additional hint to the PMD and optimize if possible.

     The  rte_event_enqueue_new_burst() result is undefined if the enqueue burst
     has event object of operation type != RTE_EVENT_OP_FORWARD.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 ev Points to an array of nb_events objects of type rte_event  structure
	 which contain the event object enqueue operations to be processed.
	 nb_events  The  number of event objects to enqueue, typically number of
	 rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...)  available
	 for this port.

     Returns
	 The  number of event objects actually enqueued on the event device. The
	 return value can be less than the value of the nb_events parameter when
	 the event devices queue is full or if invalid parameters are  specified
	 in a rte_event. If the return value is less than nb_events, the remain-
	 ing  events  at  the end of ev[] are not consumed and the caller has to
	 take care of them, and rte_errno is  set  accordingly.  Possible  errno
	 values include:

	 * EINVAL The port ID is invalid, device ID is invalid, an event's queue
	   ID  is  invalid, or an event's sched type doesn't match the capabili-
	   ties of the destination queue.

	 * ENOSPC The event port was backpressured and unable to enqueue one  or
	   more events. This error code is only applicable to closed systems.

     See also
	 rte_event_port_attr_get(), RTE_EVENT_PORT_ATTR_ENQ_DEPTH

	 rte_event_enqueue_burst()

     Definition at line 2766 of file rte_eventdev.h.

   static  uint16_t  rte_event_dequeue_burst  (uint8_t	dev_id, uint8_t port_id,
     struct rte_event ev[], uint16_t  nb_events,  uint64_t  timeout_ticks)  [in-
     line],  [static]
     Dequeue  a  burst	of events objects or an event object from the event port
     designated by its event_port_id, on  an  event  device  designated  by  its
     dev_id.

     rte_event_dequeue_burst()	does not dictate the specifics of scheduling al-
     gorithm as each eventdev driver may have different criteria to schedule  an
     event.  However,  in general, from an application perspective scheduler may
     use the following scheme to dispatch an event to the port.

     1) Selection of event queue based on a) The list of event queues are linked
     to the event port. b) If the device has  RTE_EVENT_DEV_CAP_QUEUE_QOS  capa-
     bility  then event queue selection from list is based on event queue prior-
     ity   relative   to   other   event   queue   supplied   as   priority   in
     rte_event_queue_setup()  c)  If  the device has RTE_EVENT_DEV_CAP_EVENT_QOS
     capability then event queue selection from the list is based on event  pri-
     ority  supplied  as  priority  in rte_event_enqueue_burst() 2) Selection of
     event a) The number of flows available in selected event queue. b) Schedule
     type method associated with the event

     The nb_events parameter is the maximum number of event objects  to  dequeue
     which are returned in the ev array of rte_event structure.

     The rte_event_dequeue_burst() function returns the number of events objects
     it  actually  dequeued.  A  return  value equal to nb_events means that all
     event objects have been dequeued.

     The number of events dequeued is the number of scheduler contexts	held  by
     this   port.   These  contexts  are  automatically  released  in  the  next
     rte_event_dequeue_burst() invocation if  the  port  supports  implicit  re-
     leases, or invoking rte_event_enqueue_burst() with RTE_EVENT_OP_RELEASE op-
     eration can be used to release the contexts early.

     Event operations RTE_EVENT_OP_FORWARD and RTE_EVENT_OP_RELEASE must only be
     enqueued to the same port that their associated events were dequeued from.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 ev  Points to an array of nb_events objects of type rte_event structure
	 for output to be populated with the dequeued event objects.
	 nb_events The maximum number of event	objects  to  dequeue,  typically
	 number of rte_event_port_dequeue_depth() available for this port.
	 timeout_ticks

	 * 0 no-wait, returns immediately if there is no event.

	 * >0	wait   for   the   event,  if  the  device  is	configured  with
	   RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT then this  function  will  wait
	   until  at  least one event is available or timeout_ticks time. if the
	   device is not configured  with  RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT
	   then  this  function  will  wait  until  the  event	available or de-
	   queue_timeout_ns   ns    which    was    previously	  supplied    to
	   rte_event_dev_configure()

     Returns
	 The number of event objects actually dequeued from the port. The return
	 value	can  be  less than the value of the nb_events parameter when the
	 event port's queue is not full.

     See also
	 rte_event_port_dequeue_depth()

     Definition at line 2843 of file rte_eventdev.h.

   static int rte_event_maintain (uint8_t dev_id, uint8_t port_id, int op)  [in-
     line],  [static]
     Maintain an event device.

     This  function  is  only  relevant  for event devices which do not have the
     RTE_EVENT_DEV_CAP_MAINTENANCE_FREE flag set. Such devices require an appli-
     cation thread using a particular port to periodically call  rte_event_main-
     tain()  on  that  port during periods which it is neither attempting to en-
     queue events to nor dequeue events from the port. rte_event_maintain() is a
     low-overhead function and should be called at a high rate (e.g., in the ap-
     plication's poll loop).

     No port may be left unmaintained.

     At the application thread's convenience, rte_event_maintain() may	(but  is
     not  required  to)  be  called  even during periods when enqueue or dequeue
     functions are being called, at the cost of a slight increase in overhead.

     rte_event_maintain()  may	be  called  on	event  devices	which  have  set
     RTE_EVENT_DEV_CAP_MAINTENANCE_FREE, in which case it is a no-operation.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 op 0, or RTE_EVENT_DEV_MAINT_OP_FLUSH.

     Returns

	 * 0 on success.

	 * -EINVAL if dev_id, port_id, or op is invalid.

     See also
	 RTE_EVENT_DEV_CAP_MAINTENANCE_FREE

     Definition at line 2911 of file rte_eventdev.h.

   static   uint8_t   rte_event_port_profile_switch   (uint8_t	dev_id,  uint8_t
     port_id, uint8_t profile_id) [inline],  [static]
     Change the active profile on an event port.

     This function is used to change the current active profile on an event port
     when multiple link profiles are configured on an  event  port  through  the
     function call rte_event_port_profile_links_set.

     On  the subsequent rte_event_dequeue_burst call, only the event queues that
     were associated with the newly active profile will participate in	schedul-
     ing.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 profile_id The identifier of the profile.

     Returns

	 * 0 on success.

	 * -EINVAL if dev_id, port_id, or profile_id is invalid.

     Definition at line 2959 of file rte_eventdev.h.

   static   __rte_experimental	int  rte_event_port_preschedule_modify	(uint8_t
     dev_id, uint8_t port_id,  enum  rte_event_dev_preschedule_type  type)  [in-
     line],  [static]
     Modify the pre-schedule type to use on an event port.

     This function is used to change the current pre-schedule type configured on
     an  event	port,  the  pre-schedule type can be set to none to disable pre-
     scheduling. This effects the subsequent rte_event_dequeue_burst  call.  The
     event device should support RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE capabil-
     ity.

     To  avoid	fastpath  capability  checks if an event device does not support
     RTE_EVENT_DEV_CAP_PER_PORT_PRESCHEDULE capability, then this function  will
     return -ENOTSUP.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 type The preschedule type to use on the event port.

     Returns

	 * 0 on success.

	 * -EINVAL if dev_id, port_id, or type is invalid.

	 * -ENOTSUP if the device does not support per port preschedule capabil-
	   ity.

     Definition at line 3008 of file rte_eventdev.h.

   static  __rte_experimental  void  rte_event_port_preschedule (uint8_t dev_id,
     uint8_t port_id, enum rte_event_dev_preschedule_type type) [inline],  [sta-
     tic]
     Provide a hint to the event device to pre-schedule events to event port .

     Hint the event device to pre-schedule events to the event	port.  The  call
     doesn't  not  guarantee  that  the  events will be pre-scheduleed. The call
     doesn't release the flow context currently held  by  the  event  port.  The
     event device should support RTE_EVENT_DEV_CAP_PRESCHEDULE_EXPLICIT capabil-
     ity.

     When  pre-scheduling is enabled at an event device/port level or if the ca-
     pability is not supported, then the hint is ignored.

     Subsequent calls to rte_event_dequeue_burst() will dequeue the pre-schedule
     events but pre-schedule operation is not issued again.

     Parameters
	 dev_id The identifier of the device.
	 port_id The identifier of the event port.
	 type The pre-schedule type to use on the event port.

     Definition at line 3052 of file rte_eventdev.h.

Author
     Generated automatically by Doxygen for DPDK from the source code.

Version 25.11.0 		 Thu Aug 27 2026	       rte_eventdev.h(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=rte_event_port_links_get&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help