bus/pci: fix VFIO device reset
[dpdk.git] / lib / librte_eventdev / rte_eventdev.h
index 1dbc872..f1949ff 100644 (file)
  * (each worker thread schedules events to its own port) or centralized
  * (a dedicated thread schedules to all ports). Distributed software schedulers
  * perform the scheduling in rte_event_dequeue_burst(), whereas centralized
- * scheduler logic is located in rte_event_schedule().
+ * scheduler logic need a dedicated service core for scheduling.
  * The RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED capability flag is not set
  * indicates the device is centralized and thus needs a dedicated scheduling
- * thread that repeatedly calls rte_event_schedule().
+ * thread that repeatedly calls software specific scheduling function.
  *
  * An event driven worker thread has following typical workflow on fastpath:
  * \code{.c}
@@ -263,16 +263,16 @@ struct rte_mbuf; /* we just use mbuf pointers; no need to include rte_mbuf.h */
  * In distributed scheduling mode, event scheduling happens in HW or
  * rte_event_dequeue_burst() or the combination of these two.
  * If the flag is not set then eventdev is centralized and thus needs a
- * dedicated scheduling thread that repeatedly calls rte_event_schedule().
+ * dedicated service core that acts as a scheduling thread .
  *
- * @see rte_event_schedule(), rte_event_dequeue_burst()
+ * @see rte_event_dequeue_burst()
  */
 #define RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES     (1ULL << 3)
 /**< Event device is capable of enqueuing events of any type to any queue.
  * If this capability is not set, the queue only supports events of the
- *  *RTE_EVENT_QUEUE_CFG_* type that it was created with.
+ *  *RTE_SCHED_TYPE_* type that it was created with.
  *
- * @see RTE_EVENT_QUEUE_CFG_* values
+ * @see RTE_SCHED_TYPE_* values
  */
 #define RTE_EVENT_DEV_CAP_BURST_MODE          (1ULL << 4)
 /**< Event device is capable of operating in burst mode for enqueue(forward,
@@ -515,39 +515,13 @@ rte_event_dev_configure(uint8_t dev_id,
 /* Event queue specific APIs */
 
 /* Event queue configuration bitmap flags */
-#define RTE_EVENT_QUEUE_CFG_TYPE_MASK          (3ULL << 0)
-/**< Mask for event queue schedule type configuration request */
-#define RTE_EVENT_QUEUE_CFG_ALL_TYPES          (0ULL << 0)
+#define RTE_EVENT_QUEUE_CFG_ALL_TYPES          (1ULL << 0)
 /**< Allow ATOMIC,ORDERED,PARALLEL schedule type enqueue
  *
  * @see RTE_SCHED_TYPE_ORDERED, RTE_SCHED_TYPE_ATOMIC, RTE_SCHED_TYPE_PARALLEL
  * @see rte_event_enqueue_burst()
  */
-#define RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY        (1ULL << 0)
-/**< Allow only ATOMIC schedule type enqueue
- *
- * The rte_event_enqueue_burst() result is undefined if the queue configured
- * with ATOMIC only and sched_type != RTE_SCHED_TYPE_ATOMIC
- *
- * @see RTE_SCHED_TYPE_ATOMIC, rte_event_enqueue_burst()
- */
-#define RTE_EVENT_QUEUE_CFG_ORDERED_ONLY       (2ULL << 0)
-/**< Allow only ORDERED schedule type enqueue
- *
- * The rte_event_enqueue_burst() result is undefined if the queue configured
- * with ORDERED only and sched_type != RTE_SCHED_TYPE_ORDERED
- *
- * @see RTE_SCHED_TYPE_ORDERED, rte_event_enqueue_burst()
- */
-#define RTE_EVENT_QUEUE_CFG_PARALLEL_ONLY      (3ULL << 0)
-/**< Allow only PARALLEL schedule type enqueue
- *
- * The rte_event_enqueue_burst() result is undefined if the queue configured
- * with PARALLEL only and sched_type != RTE_SCHED_TYPE_PARALLEL
- *
- * @see RTE_SCHED_TYPE_PARALLEL, rte_event_enqueue_burst()
- */
-#define RTE_EVENT_QUEUE_CFG_SINGLE_LINK        (1ULL << 2)
+#define RTE_EVENT_QUEUE_CFG_SINGLE_LINK        (1ULL << 1)
 /**< This event queue links only to a single event port.
  *
  *  @see rte_event_port_setup(), rte_event_port_link()
@@ -558,8 +532,8 @@ struct rte_event_queue_conf {
        uint32_t nb_atomic_flows;
        /**< The maximum number of active flows this queue can track at any
         * given time. If the queue is configured for atomic scheduling (by
-        * applying the RTE_EVENT_QUEUE_CFG_ALL_TYPES or
-        * RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY flags to event_queue_cfg), then the
+        * applying the RTE_EVENT_QUEUE_CFG_ALL_TYPES flag to event_queue_cfg
+        * or RTE_SCHED_TYPE_ATOMIC flag to schedule_type), then the
         * value must be in the range of [1, nb_event_queue_flows], which was
         * previously provided in rte_event_dev_configure().
         */
@@ -572,12 +546,18 @@ struct rte_event_queue_conf {
         * event will be returned from dequeue until one or more entries are
         * freed up/released.
         * If the queue is configured for ordered scheduling (by applying the
-        * RTE_EVENT_QUEUE_CFG_ALL_TYPES or RTE_EVENT_QUEUE_CFG_ORDERED_ONLY
-        * flags to event_queue_cfg), then the value must be in the range of
-        * [1, nb_event_queue_flows], which was previously supplied to
-        * rte_event_dev_configure().
+        * RTE_EVENT_QUEUE_CFG_ALL_TYPES flag to event_queue_cfg or
+        * RTE_SCHED_TYPE_ORDERED flag to schedule_type), then the value must
+        * be in the range of [1, nb_event_queue_flows], which was
+        * previously supplied to rte_event_dev_configure().
+        */
+       uint32_t event_queue_cfg;
+       /**< Queue cfg flags(EVENT_QUEUE_CFG_) */
+       uint8_t schedule_type;
+       /**< Queue schedule type(RTE_SCHED_TYPE_*).
+        * Valid when RTE_EVENT_QUEUE_CFG_ALL_TYPES bit is not set in
+        * event_queue_cfg.
         */
-       uint32_t event_queue_cfg; /**< Queue cfg flags(EVENT_QUEUE_CFG_) */
        uint8_t priority;
        /**< Priority for this event queue relative to other event queues.
         * The requested priority should in the range of
@@ -652,6 +632,10 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id,
  * The cfg flags for the queue.
  */
 #define RTE_EVENT_QUEUE_ATTR_EVENT_QUEUE_CFG 3
+/**
+ * The schedule type of the queue.
+ */
+#define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE 4
 
 /**
  * Get an attribute from a queue.
@@ -665,6 +649,9 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id,
  * @retval 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 event_queue_cfg is set to
+ *         RTE_EVENT_QUEUE_CFG_ALL_TYPES
  */
 int
 rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
@@ -1065,9 +1052,6 @@ struct rte_eventdev_driver;
 struct rte_eventdev_ops;
 struct rte_eventdev;
 
-typedef void (*event_schedule_t)(struct rte_eventdev *dev);
-/**< @internal Schedule one or more events in the event dev. */
-
 typedef uint16_t (*event_enqueue_t)(void *port, const struct rte_event *ev);
 /**< @internal Enqueue event on port of a device */
 
@@ -1116,6 +1100,10 @@ struct rte_eventdev_data {
        /**< Event device capabilities(RTE_EVENT_DEV_CAP_)*/
        struct rte_event_dev_config dev_conf;
        /**< Configuration applied to device. */
+       uint8_t service_inited;
+       /* Service initialization state */
+       uint32_t service_id;
+       /* Service ID*/
 
        RTE_STD_C11
        uint8_t dev_started : 1;
@@ -1127,8 +1115,6 @@ struct rte_eventdev_data {
 
 /** @internal The data structure associated with each event device. */
 struct rte_eventdev {
-       event_schedule_t schedule;
-       /**< Pointer to PMD schedule function. */
        event_enqueue_t enqueue;
        /**< Pointer to PMD enqueue function. */
        event_enqueue_burst_t enqueue_burst;
@@ -1157,24 +1143,6 @@ struct rte_eventdev {
 extern struct rte_eventdev *rte_eventdevs;
 /** @internal The pool of rte_eventdev structures. */
 
-
-/**
- * Schedule one or more events in the event dev.
- *
- * An event dev implementation may define this is a NOOP, for instance if
- * the event dev performs its scheduling in hardware.
- *
- * @param dev_id
- *   The identifier of the device.
- */
-static inline void
-rte_event_schedule(uint8_t dev_id)
-{
-       struct rte_eventdev *dev = &rte_eventdevs[dev_id];
-       if (*dev->schedule)
-               (*dev->schedule)(dev);
-}
-
 static __rte_always_inline uint16_t
 __rte_event_enqueue_burst(uint8_t dev_id, uint8_t port_id,
                        const struct rte_event ev[], uint16_t nb_events,
@@ -1618,6 +1586,24 @@ int
 rte_event_port_links_get(uint8_t dev_id, uint8_t port_id,
                         uint8_t queues[], uint8_t priorities[]);
 
+/**
+ * Retrieve the service ID of the event dev. If the adapter doesn't use
+ * a rte_service function, this function returns -ESRCH.
+ *
+ * @param dev_id
+ *   The identifier of the device.
+ *
+ * @param [out] service_id
+ *   A pointer to a uint32_t, to be filled in with the service id.
+ *
+ * @return
+ *   - 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_service_id_get(uint8_t dev_id, uint32_t *service_id);
+
 /**
  * Dump internal information about *dev_id* to the FILE* provided in *f*.
  *