dpdk/lib/librte_eal/include/rte_eal_interrupts.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2010-2014 Intel Corporation
   3 */
   4
   5#ifndef _RTE_INTERRUPTS_H_
   6#error "don't include this file directly, please include generic <rte_interrupts.h>"
   7#endif
   8
   9/**
  10 * @file rte_eal_interrupts.h
  11 * @internal
  12 *
  13 * Contains function prototypes exposed by the EAL for interrupt handling by
  14 * drivers and other DPDK internal consumers.
  15 */
  16
  17#ifndef _RTE_EAL_INTERRUPTS_H_
  18#define _RTE_EAL_INTERRUPTS_H_
  19
  20#define RTE_MAX_RXTX_INTR_VEC_ID      512
  21#define RTE_INTR_VEC_ZERO_OFFSET      0
  22#define RTE_INTR_VEC_RXTX_OFFSET      1
  23
  24/**
  25 * The interrupt source type, e.g. UIO, VFIO, ALARM etc.
  26 */
  27enum rte_intr_handle_type {
  28        RTE_INTR_HANDLE_UNKNOWN = 0,  /**< generic unknown handle */
  29        RTE_INTR_HANDLE_UIO,          /**< uio device handle */
  30        RTE_INTR_HANDLE_UIO_INTX,     /**< uio generic handle */
  31        RTE_INTR_HANDLE_VFIO_LEGACY,  /**< vfio device handle (legacy) */
  32        RTE_INTR_HANDLE_VFIO_MSI,     /**< vfio device handle (MSI) */
  33        RTE_INTR_HANDLE_VFIO_MSIX,    /**< vfio device handle (MSIX) */
  34        RTE_INTR_HANDLE_ALARM,        /**< alarm handle */
  35        RTE_INTR_HANDLE_EXT,          /**< external handler */
  36        RTE_INTR_HANDLE_VDEV,         /**< virtual device */
  37        RTE_INTR_HANDLE_DEV_EVENT,    /**< device event handle */
  38        RTE_INTR_HANDLE_VFIO_REQ,     /**< VFIO request handle */
  39        RTE_INTR_HANDLE_MAX           /**< count of elements */
  40};
  41
  42#define RTE_INTR_EVENT_ADD            1UL
  43#define RTE_INTR_EVENT_DEL            2UL
  44
  45typedef void (*rte_intr_event_cb_t)(int fd, void *arg);
  46
  47struct rte_epoll_data {
  48        uint32_t event;               /**< event type */
  49        void *data;                   /**< User data */
  50        rte_intr_event_cb_t cb_fun;   /**< IN: callback fun */
  51        void *cb_arg;                 /**< IN: callback arg */
  52};
  53
  54enum {
  55        RTE_EPOLL_INVALID = 0,
  56        RTE_EPOLL_VALID,
  57        RTE_EPOLL_EXEC,
  58};
  59
  60/** interrupt epoll event obj, taken by epoll_event.ptr */
  61struct rte_epoll_event {
  62        uint32_t status;           /**< OUT: event status */
  63        int fd;                    /**< OUT: event fd */
  64        int epfd;       /**< OUT: epoll instance the ev associated with */
  65        struct rte_epoll_data epdata;
  66};
  67
  68/** Handle for interrupts. */
  69struct rte_intr_handle {
  70        RTE_STD_C11
  71        union {
  72                struct {
  73                        RTE_STD_C11
  74                        union {
  75                                /** VFIO device file descriptor */
  76                                int vfio_dev_fd;
  77                                /** UIO cfg file desc for uio_pci_generic */
  78                                int uio_cfg_fd;
  79                        };
  80                        int fd; /**< interrupt event file descriptor */
  81                };
  82                void *handle; /**< device driver handle (Windows) */
  83        };
  84        enum rte_intr_handle_type type;  /**< handle type */
  85        uint32_t max_intr;             /**< max interrupt requested */
  86        uint32_t nb_efd;               /**< number of available efd(event fd) */
  87        uint8_t efd_counter_size;      /**< size of efd counter, used for vdev */
  88        int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
  89        struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
  90                                       /**< intr vector epoll event */
  91        int *intr_vec;                 /**< intr vector number array */
  92};
  93
  94#define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
  95
  96/**
  97 * It waits for events on the epoll instance.
  98 * Retries if signal received.
  99 *
 100 * @param epfd
 101 *   Epoll instance fd on which the caller wait for events.
 102 * @param events
 103 *   Memory area contains the events that will be available for the caller.
 104 * @param maxevents
 105 *   Up to maxevents are returned, must greater than zero.
 106 * @param timeout
 107 *   Specifying a timeout of -1 causes a block indefinitely.
 108 *   Specifying a timeout equal to zero cause to return immediately.
 109 * @return
 110 *   - On success, returns the number of available event.
 111 *   - On failure, a negative value.
 112 */
 113int
 114rte_epoll_wait(int epfd, struct rte_epoll_event *events,
 115               int maxevents, int timeout);
 116
 117/**
 118 * It waits for events on the epoll instance.
 119 * Does not retry if signal received.
 120 *
 121 * @param epfd
 122 *   Epoll instance fd on which the caller wait for events.
 123 * @param events
 124 *   Memory area contains the events that will be available for the caller.
 125 * @param maxevents
 126 *   Up to maxevents are returned, must greater than zero.
 127 * @param timeout
 128 *   Specifying a timeout of -1 causes a block indefinitely.
 129 *   Specifying a timeout equal to zero cause to return immediately.
 130 * @return
 131 *   - On success, returns the number of available event.
 132 *   - On failure, a negative value.
 133 */
 134__rte_experimental
 135int
 136rte_epoll_wait_interruptible(int epfd, struct rte_epoll_event *events,
 137               int maxevents, int timeout);
 138
 139/**
 140 * It performs control operations on epoll instance referred by the epfd.
 141 * It requests that the operation op be performed for the target fd.
 142 *
 143 * @param epfd
 144 *   Epoll instance fd on which the caller perform control operations.
 145 * @param op
 146 *   The operation be performed for the target fd.
 147 * @param fd
 148 *   The target fd on which the control ops perform.
 149 * @param event
 150 *   Describes the object linked to the fd.
 151 *   Note: The caller must take care the object deletion after CTL_DEL.
 152 * @return
 153 *   - On success, zero.
 154 *   - On failure, a negative value.
 155 */
 156int
 157rte_epoll_ctl(int epfd, int op, int fd,
 158              struct rte_epoll_event *event);
 159
 160/**
 161 * The function returns the per thread epoll instance.
 162 *
 163 * @return
 164 *   epfd the epoll instance referred to.
 165 */
 166int
 167rte_intr_tls_epfd(void);
 168
 169/**
 170 * @param intr_handle
 171 *   Pointer to the interrupt handle.
 172 * @param epfd
 173 *   Epoll instance fd which the intr vector associated to.
 174 * @param op
 175 *   The operation be performed for the vector.
 176 *   Operation type of {ADD, DEL}.
 177 * @param vec
 178 *   RX intr vector number added to the epoll instance wait list.
 179 * @param data
 180 *   User raw data.
 181 * @return
 182 *   - On success, zero.
 183 *   - On failure, a negative value.
 184 */
 185int
 186rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
 187                int epfd, int op, unsigned int vec, void *data);
 188
 189/**
 190 * It deletes registered eventfds.
 191 *
 192 * @param intr_handle
 193 *   Pointer to the interrupt handle.
 194 */
 195void
 196rte_intr_free_epoll_fd(struct rte_intr_handle *intr_handle);
 197
 198/**
 199 * It enables the packet I/O interrupt event if it's necessary.
 200 * It creates event fd for each interrupt vector when MSIX is used,
 201 * otherwise it multiplexes a single event fd.
 202 *
 203 * @param intr_handle
 204 *   Pointer to the interrupt handle.
 205 * @param nb_efd
 206 *   Number of interrupt vector trying to enable.
 207 *   The value 0 is not allowed.
 208 * @return
 209 *   - On success, zero.
 210 *   - On failure, a negative value.
 211 */
 212int
 213rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
 214
 215/**
 216 * It disables the packet I/O interrupt event.
 217 * It deletes registered eventfds and closes the open fds.
 218 *
 219 * @param intr_handle
 220 *   Pointer to the interrupt handle.
 221 */
 222void
 223rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
 224
 225/**
 226 * The packet I/O interrupt on datapath is enabled or not.
 227 *
 228 * @param intr_handle
 229 *   Pointer to the interrupt handle.
 230 */
 231int
 232rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
 233
 234/**
 235 * The interrupt handle instance allows other causes or not.
 236 * Other causes stand for any none packet I/O interrupts.
 237 *
 238 * @param intr_handle
 239 *   Pointer to the interrupt handle.
 240 */
 241int
 242rte_intr_allow_others(struct rte_intr_handle *intr_handle);
 243
 244/**
 245 * The multiple interrupt vector capability of interrupt handle instance.
 246 * It returns zero if no multiple interrupt vector support.
 247 *
 248 * @param intr_handle
 249 *   Pointer to the interrupt handle.
 250 */
 251int
 252rte_intr_cap_multiple(struct rte_intr_handle *intr_handle);
 253
 254/**
 255 * @warning
 256 * @b EXPERIMENTAL: this API may change without prior notice
 257 *
 258 * @internal
 259 * Check if currently executing in interrupt context
 260 *
 261 * @return
 262 *  - non zero in case of interrupt context
 263 *  - zero in case of process context
 264 */
 265__rte_experimental
 266int
 267rte_thread_is_intr(void);
 268
 269#endif /* _RTE_EAL_INTERRUPTS_H_ */
 270