eal: fix debug macro redefinition
[dpdk.git] / lib / librte_eventdev / rte_eventdev_pmd.h
index 40552aa..f898ea7 100644 (file)
 extern "C" {
 #endif
 
+#include <string.h>
+
+#include <rte_dev.h>
+#include <rte_pci.h>
+#include <rte_malloc.h>
+#include <rte_log.h>
+#include <rte_common.h>
+
 #include "rte_eventdev.h"
 
+/* Logging Macros */
+#define RTE_EDEV_LOG_ERR(fmt, args...) \
+       RTE_LOG(ERR, EVENTDEV, "%s() line %u: " fmt "\n",  \
+                       __func__, __LINE__, ## args)
+
+#ifdef RTE_LIBRTE_EVENTDEV_DEBUG
+#define RTE_EDEV_LOG_DEBUG(fmt, args...) \
+       RTE_LOG(DEBUG, EVENTDEV, "%s() line %u: " fmt "\n",  \
+                       __func__, __LINE__, ## args)
+#else
+#define RTE_EDEV_LOG_DEBUG(fmt, args...) (void)0
+#endif
+
+/* Macros to check for valid device */
+#define RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, retval) do { \
+       if (!rte_event_pmd_is_valid_dev((dev_id))) { \
+               RTE_EDEV_LOG_ERR("Invalid dev_id=%d\n", dev_id); \
+               return retval; \
+       } \
+} while (0)
+
+#define RTE_EVENTDEV_VALID_DEVID_OR_RET(dev_id) do { \
+       if (!rte_event_pmd_is_valid_dev((dev_id))) { \
+               RTE_EDEV_LOG_ERR("Invalid dev_id=%d\n", dev_id); \
+               return; \
+       } \
+} while (0)
+
+#define RTE_EVENTDEV_DETACHED  (0)
+#define RTE_EVENTDEV_ATTACHED  (1)
+
+/**
+ * Initialisation function of a event driver invoked for each matching
+ * event PCI device detected during the PCI probing phase.
+ *
+ * @param dev
+ *   The dev pointer is the address of the *rte_eventdev* structure associated
+ *   with the matching device and which has been [automatically] allocated in
+ *   the *rte_event_devices* array.
+ *
+ * @return
+ *   - 0: Success, the device is properly initialised by the driver.
+ *        In particular, the driver MUST have set up the *dev_ops* pointer
+ *        of the *dev* structure.
+ *   - <0: Error code of the device initialisation failure.
+ */
+typedef int (*eventdev_init_t)(struct rte_eventdev *dev);
+
+/**
+ * Finalisation function of a driver invoked for each matching
+ * PCI device detected during the PCI closing phase.
+ *
+ * @param dev
+ *   The dev pointer is the address of the *rte_eventdev* structure associated
+ *   with the matching device and which        has been [automatically] allocated in
+ *   the *rte_event_devices* array.
+ *
+ * @return
+ *   - 0: Success, the device is properly finalised by the driver.
+ *        In particular, the driver MUST free the *dev_ops* pointer
+ *        of the *dev* structure.
+ *   - <0: Error code of the device initialisation failure.
+ */
+typedef int (*eventdev_uninit_t)(struct rte_eventdev *dev);
+
+/**
+ * The structure associated with a PMD driver.
+ *
+ * Each driver acts as a PCI driver and is represented by a generic
+ * *event_driver* structure that holds:
+ *
+ * - An *rte_pci_driver* structure (which must be the first field).
+ *
+ * - The *eventdev_init* function invoked for each matching PCI device.
+ *
+ * - The size of the private data to allocate for each matching device.
+ */
+struct rte_eventdev_driver {
+       struct rte_pci_driver pci_drv;  /**< The PMD is also a PCI driver. */
+       unsigned int dev_private_size;  /**< Size of device private data. */
+
+       eventdev_init_t eventdev_init;  /**< Device init function. */
+       eventdev_uninit_t eventdev_uninit; /**< Device uninit function. */
+};
+
+/** Global structure used for maintaining state of allocated event devices */
+struct rte_eventdev_global {
+       uint8_t nb_devs;        /**< Number of devices found */
+};
+
+extern struct rte_eventdev_global *rte_eventdev_globals;
+/** Pointer to global event devices data structure. */
+extern struct rte_eventdev *rte_eventdevs;
+/** The pool of rte_eventdev structures. */
+
+/**
+ * Get the rte_eventdev structure device pointer for the named device.
+ *
+ * @param name
+ *   device name to select the device structure.
+ *
+ * @return
+ *   - The rte_eventdev structure pointer for the given device ID.
+ */
+static inline struct rte_eventdev *
+rte_event_pmd_get_named_dev(const char *name)
+{
+       struct rte_eventdev *dev;
+       unsigned int i;
+
+       if (name == NULL)
+               return NULL;
+
+       for (i = 0; i < RTE_EVENT_MAX_DEVS; i++) {
+               dev = &rte_eventdevs[i];
+               if ((dev->attached == RTE_EVENTDEV_ATTACHED) &&
+                               (strcmp(dev->data->name, name) == 0))
+                       return dev;
+       }
+
+       return NULL;
+}
+
+/**
+ * Validate if the event device index is valid attached event device.
+ *
+ * @param dev_id
+ *   Event device index.
+ *
+ * @return
+ *   - If the device index is valid (1) or not (0).
+ */
+static inline unsigned
+rte_event_pmd_is_valid_dev(uint8_t dev_id)
+{
+       struct rte_eventdev *dev;
+
+       if (dev_id >= RTE_EVENT_MAX_DEVS)
+               return 0;
+
+       dev = &rte_eventdevs[dev_id];
+       if (dev->attached != RTE_EVENTDEV_ATTACHED)
+               return 0;
+       else
+               return 1;
+}
+
 /**
  * Definitions of all functions exported by a driver through the
  * the generic structure of type *event_dev_ops* supplied in the
@@ -194,6 +349,8 @@ typedef void (*eventdev_port_release_t)(void *port);
 /**
  * Link multiple source event queues to destination event port.
  *
+ * @param dev
+ *   Event device pointer
  * @param port
  *   Event port pointer
  * @param link
@@ -209,13 +366,15 @@ typedef void (*eventdev_port_release_t)(void *port);
  *   Returns 0 on success.
  *
  */
-typedef int (*eventdev_port_link_t)(void *port,
+typedef int (*eventdev_port_link_t)(struct rte_eventdev *dev, void *port,
                const uint8_t queues[], const uint8_t priorities[],
                uint16_t nb_links);
 
 /**
  * Unlink multiple source event queues from destination event port.
  *
+ * @param dev
+ *   Event device pointer
  * @param port
  *   Event port pointer
  * @param queues
@@ -227,7 +386,7 @@ typedef int (*eventdev_port_link_t)(void *port,
  *   Returns 0 on success.
  *
  */
-typedef int (*eventdev_port_unlink_t)(void *port,
+typedef int (*eventdev_port_unlink_t)(struct rte_eventdev *dev, void *port,
                uint8_t queues[], uint16_t nb_unlinks);
 
 /**
@@ -240,8 +399,11 @@ typedef int (*eventdev_port_unlink_t)(void *port,
  * @param[out] timeout_ticks
  *   Value for the *timeout_ticks* parameter in rte_event_dequeue() function
  *
+ * @return
+ *   Returns 0 on success.
+ *
  */
-typedef void (*eventdev_dequeue_timeout_ticks_t)(struct rte_eventdev *dev,
+typedef int (*eventdev_dequeue_timeout_ticks_t)(struct rte_eventdev *dev,
                uint64_t ns, uint64_t *timeout_ticks);
 
 /**
@@ -255,6 +417,71 @@ typedef void (*eventdev_dequeue_timeout_ticks_t)(struct rte_eventdev *dev,
  */
 typedef void (*eventdev_dump_t)(struct rte_eventdev *dev, FILE *f);
 
+/**
+ * Retrieve a set of statistics from device
+ *
+ * @param dev
+ *   Event device pointer
+ * @param ids
+ *   The stat ids to retrieve
+ * @param values
+ *   The returned stat values
+ * @param n
+ *   The number of id values and entries in the values array
+ * @return
+ *   The number of stat values successfully filled into the values array
+ */
+typedef int (*eventdev_xstats_get_t)(const struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
+               const unsigned int ids[], uint64_t values[], unsigned int n);
+
+/**
+ * Resets the statistic values in xstats for the device, based on mode.
+ */
+typedef int (*eventdev_xstats_reset_t)(struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode,
+               int16_t queue_port_id,
+               const uint32_t ids[],
+               uint32_t nb_ids);
+
+/**
+ * Get names of extended stats of an event device
+ *
+ * @param dev
+ *   Event device pointer
+ * @param xstats_names
+ *   Array of name values to be filled in
+ * @param size
+ *   Number of values in the xstats_names array
+ * @return
+ *   When size >= the number of stats, return the number of stat values filled
+ *   into the array.
+ *   When size < the number of available stats, return the number of stats
+ *   values, and do not fill in any data into xstats_names.
+ */
+typedef int (*eventdev_xstats_get_names_t)(const struct rte_eventdev *dev,
+               enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
+               struct rte_event_dev_xstats_name *xstats_names,
+               unsigned int *ids, unsigned int size);
+
+/**
+ * Get value of one stats and optionally return its id
+ *
+ * @param dev
+ *   Event device pointer
+ * @param name
+ *   The name of the stat to retrieve
+ * @param id
+ *   Pointer to an unsigned int where we store the stat-id for future reference.
+ *   This pointer may be null if the id is not required.
+ * @return
+ *   The value of the stat, or (uint64_t)-1 if the stat is not found.
+ *   If the stat is not found, the id value will be returned as (unsigned)-1,
+ *   if id pointer is non-NULL
+ */
+typedef uint64_t (*eventdev_xstats_get_by_name)(const struct rte_eventdev *dev,
+               const char *name, unsigned int *id);
+
 /** Event device operations function pointer table */
 struct rte_eventdev_ops {
        eventdev_info_get_t dev_infos_get;      /**< Get device info. */
@@ -285,8 +512,84 @@ struct rte_eventdev_ops {
        /**< Converts ns to *timeout_ticks* value for rte_event_dequeue() */
        eventdev_dump_t dump;
        /* Dump internal information */
+
+       eventdev_xstats_get_t xstats_get;
+       /**< Get extended device statistics. */
+       eventdev_xstats_get_names_t xstats_get_names;
+       /**< Get names of extended stats. */
+       eventdev_xstats_get_by_name xstats_get_by_name;
+       /**< Get one value by name. */
+       eventdev_xstats_reset_t xstats_reset;
+       /**< Reset the statistics values in xstats. */
 };
 
+/**
+ * Allocates a new eventdev slot for an event device and returns the pointer
+ * to that slot for the driver to use.
+ *
+ * @param name
+ *   Unique identifier name for each device
+ * @param socket_id
+ *   Socket to allocate resources on.
+ * @return
+ *   - Slot in the rte_dev_devices array for a new device;
+ */
+struct rte_eventdev *
+rte_event_pmd_allocate(const char *name, int socket_id);
+
+/**
+ * Release the specified eventdev device.
+ *
+ * @param eventdev
+ * The *eventdev* pointer is the address of the *rte_eventdev* structure.
+ * @return
+ *   - 0 on success, negative on error
+ */
+int
+rte_event_pmd_release(struct rte_eventdev *eventdev);
+
+/**
+ * Creates a new virtual event device and returns the pointer to that device.
+ *
+ * @param name
+ *   PMD type name
+ * @param dev_private_size
+ *   Size of event PMDs private data
+ * @param socket_id
+ *   Socket to allocate resources on.
+ *
+ * @return
+ *   - Eventdev pointer if device is successfully created.
+ *   - NULL if device cannot be created.
+ */
+struct rte_eventdev *
+rte_event_pmd_vdev_init(const char *name, size_t dev_private_size,
+               int socket_id);
+
+/**
+ * Destroy the given virtual event device
+ *
+ * @param name
+ *   PMD type name
+ * @return
+ *   - 0 on success, negative on error
+ */
+int
+rte_event_pmd_vdev_uninit(const char *name);
+
+/**
+ * Wrapper for use by pci drivers as a .probe function to attach to a event
+ * interface.
+ */
+int rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
+                           struct rte_pci_device *pci_dev);
+
+/**
+ * Wrapper for use by pci drivers as a .remove function to detach a event
+ * interface.
+ */
+int rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev);
+
 #ifdef __cplusplus
 }
 #endif