xref: /dpdk/lib/eal/include/rte_interrupts.h (revision 2291150f11a68f90a059349d6674bd69031f2def)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_INTERRUPTS_H_
699a2dd95SBruce Richardson #define _RTE_INTERRUPTS_H_
799a2dd95SBruce Richardson 
8b7c98429SHarman Kalra #include <stdbool.h>
9b7c98429SHarman Kalra 
10b7c98429SHarman Kalra #include <rte_bitops.h>
1199a2dd95SBruce Richardson #include <rte_common.h>
1299a2dd95SBruce Richardson #include <rte_compat.h>
13b7c98429SHarman Kalra #include <rte_epoll.h>
1499a2dd95SBruce Richardson 
1599a2dd95SBruce Richardson /**
1699a2dd95SBruce Richardson  * @file
1799a2dd95SBruce Richardson  *
1899a2dd95SBruce Richardson  * The RTE interrupt interface provides functions to register/unregister
1999a2dd95SBruce Richardson  * callbacks for a specific interrupt.
2099a2dd95SBruce Richardson  */
2199a2dd95SBruce Richardson 
2299a2dd95SBruce Richardson #ifdef __cplusplus
2399a2dd95SBruce Richardson extern "C" {
2499a2dd95SBruce Richardson #endif
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson /** Interrupt handle */
2799a2dd95SBruce Richardson struct rte_intr_handle;
2899a2dd95SBruce Richardson 
29b7c98429SHarman Kalra /** Interrupt instance allocation flags
30b7c98429SHarman Kalra  * @see rte_intr_instance_alloc
31b7c98429SHarman Kalra  */
32b7c98429SHarman Kalra 
33b7c98429SHarman Kalra /** Interrupt instance will not be shared between primary and secondary processes. */
34b7c98429SHarman Kalra #define RTE_INTR_INSTANCE_F_PRIVATE     UINT32_C(0)
35b7c98429SHarman Kalra /** Interrupt instance will be shared between primary and secondary processes. */
36b7c98429SHarman Kalra #define RTE_INTR_INSTANCE_F_SHARED      RTE_BIT32(0)
37b7c98429SHarman Kalra 
3873d844fdSHarman Kalra #define RTE_MAX_RXTX_INTR_VEC_ID      512
3973d844fdSHarman Kalra #define RTE_INTR_VEC_ZERO_OFFSET      0
4073d844fdSHarman Kalra #define RTE_INTR_VEC_RXTX_OFFSET      1
4173d844fdSHarman Kalra 
4273d844fdSHarman Kalra /**
4373d844fdSHarman Kalra  * The interrupt source type, e.g. UIO, VFIO, ALARM etc.
4473d844fdSHarman Kalra  */
4573d844fdSHarman Kalra enum rte_intr_handle_type {
4673d844fdSHarman Kalra 	RTE_INTR_HANDLE_UNKNOWN = 0,  /**< generic unknown handle */
4773d844fdSHarman Kalra 	RTE_INTR_HANDLE_UIO,          /**< uio device handle */
4873d844fdSHarman Kalra 	RTE_INTR_HANDLE_UIO_INTX,     /**< uio generic handle */
4973d844fdSHarman Kalra 	RTE_INTR_HANDLE_VFIO_LEGACY,  /**< vfio device handle (legacy) */
5073d844fdSHarman Kalra 	RTE_INTR_HANDLE_VFIO_MSI,     /**< vfio device handle (MSI) */
5173d844fdSHarman Kalra 	RTE_INTR_HANDLE_VFIO_MSIX,    /**< vfio device handle (MSIX) */
5273d844fdSHarman Kalra 	RTE_INTR_HANDLE_ALARM,        /**< alarm handle */
5373d844fdSHarman Kalra 	RTE_INTR_HANDLE_EXT,          /**< external handler */
5473d844fdSHarman Kalra 	RTE_INTR_HANDLE_VDEV,         /**< virtual device */
5573d844fdSHarman Kalra 	RTE_INTR_HANDLE_DEV_EVENT,    /**< device event handle */
5673d844fdSHarman Kalra 	RTE_INTR_HANDLE_VFIO_REQ,     /**< VFIO request handle */
5773d844fdSHarman Kalra 	RTE_INTR_HANDLE_MAX           /**< count of elements */
5873d844fdSHarman Kalra };
5973d844fdSHarman Kalra 
6099a2dd95SBruce Richardson /** Function to be registered for the specific interrupt */
6199a2dd95SBruce Richardson typedef void (*rte_intr_callback_fn)(void *cb_arg);
6299a2dd95SBruce Richardson 
6399a2dd95SBruce Richardson /**
6499a2dd95SBruce Richardson  * Function to call after a callback is unregistered.
6599a2dd95SBruce Richardson  * Can be used to close fd and free cb_arg.
6699a2dd95SBruce Richardson  */
6799a2dd95SBruce Richardson typedef void (*rte_intr_unregister_callback_fn)(struct rte_intr_handle *intr_handle,
6899a2dd95SBruce Richardson 						void *cb_arg);
6999a2dd95SBruce Richardson 
7099a2dd95SBruce Richardson /**
7199a2dd95SBruce Richardson  * It registers the callback for the specific interrupt. Multiple
7299a2dd95SBruce Richardson  * callbacks can be registered at the same time.
7399a2dd95SBruce Richardson  * @param intr_handle
7499a2dd95SBruce Richardson  *  Pointer to the interrupt handle.
7599a2dd95SBruce Richardson  * @param cb
7699a2dd95SBruce Richardson  *  callback address.
7799a2dd95SBruce Richardson  * @param cb_arg
7899a2dd95SBruce Richardson  *  address of parameter for callback.
7999a2dd95SBruce Richardson  *
8099a2dd95SBruce Richardson  * @return
8199a2dd95SBruce Richardson  *  - On success, zero.
8299a2dd95SBruce Richardson  *  - On failure, a negative value.
8399a2dd95SBruce Richardson  */
8499a2dd95SBruce Richardson int rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
8599a2dd95SBruce Richardson 				rte_intr_callback_fn cb, void *cb_arg);
8699a2dd95SBruce Richardson 
8799a2dd95SBruce Richardson /**
8899a2dd95SBruce Richardson  * It unregisters the callback according to the specified interrupt handle.
8999a2dd95SBruce Richardson  *
9099a2dd95SBruce Richardson  * @param intr_handle
9199a2dd95SBruce Richardson  *  pointer to the interrupt handle.
9299a2dd95SBruce Richardson  * @param cb
9399a2dd95SBruce Richardson  *  callback address.
9499a2dd95SBruce Richardson  * @param cb_arg
9599a2dd95SBruce Richardson  *  address of parameter for callback, (void *)-1 means to remove all
9699a2dd95SBruce Richardson  *  registered which has the same callback address.
9799a2dd95SBruce Richardson  *
9899a2dd95SBruce Richardson  * @return
9999a2dd95SBruce Richardson  *  - On success, return the number of callback entities removed.
10099a2dd95SBruce Richardson  *  - On failure, a negative value.
10199a2dd95SBruce Richardson  */
10299a2dd95SBruce Richardson int rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
10399a2dd95SBruce Richardson 				rte_intr_callback_fn cb, void *cb_arg);
10499a2dd95SBruce Richardson 
10599a2dd95SBruce Richardson /**
10699a2dd95SBruce Richardson  * Unregister the callback according to the specified interrupt handle,
10799a2dd95SBruce Richardson  * after it's no longer active. Fail if source is not active.
10899a2dd95SBruce Richardson  *
10999a2dd95SBruce Richardson  * @param intr_handle
11099a2dd95SBruce Richardson  *  pointer to the interrupt handle.
11199a2dd95SBruce Richardson  * @param cb_fn
11299a2dd95SBruce Richardson  *  callback address.
11399a2dd95SBruce Richardson  * @param cb_arg
11499a2dd95SBruce Richardson  *  address of parameter for callback, (void *)-1 means to remove all
11599a2dd95SBruce Richardson  *  registered which has the same callback address.
11699a2dd95SBruce Richardson  * @param ucb_fn
11799a2dd95SBruce Richardson  *  callback to call before cb is unregistered (optional).
11899a2dd95SBruce Richardson  *  can be used to close fd and free cb_arg.
11999a2dd95SBruce Richardson  *
12099a2dd95SBruce Richardson  * @return
12199a2dd95SBruce Richardson  *  - On success, return the number of callback entities marked for remove.
12299a2dd95SBruce Richardson  *  - On failure, a negative value.
12399a2dd95SBruce Richardson  */
12499a2dd95SBruce Richardson int
12599a2dd95SBruce Richardson rte_intr_callback_unregister_pending(const struct rte_intr_handle *intr_handle,
12699a2dd95SBruce Richardson 				rte_intr_callback_fn cb_fn, void *cb_arg,
12799a2dd95SBruce Richardson 				rte_intr_unregister_callback_fn ucb_fn);
12899a2dd95SBruce Richardson 
12999a2dd95SBruce Richardson /**
13099a2dd95SBruce Richardson  * Loop until rte_intr_callback_unregister() succeeds.
13199a2dd95SBruce Richardson  * After a call to this function,
13299a2dd95SBruce Richardson  * the callback provided by the specified interrupt handle is unregistered.
13399a2dd95SBruce Richardson  *
13499a2dd95SBruce Richardson  * @param intr_handle
13599a2dd95SBruce Richardson  *  pointer to the interrupt handle.
13699a2dd95SBruce Richardson  * @param cb
13799a2dd95SBruce Richardson  *  callback address.
13899a2dd95SBruce Richardson  * @param cb_arg
13999a2dd95SBruce Richardson  *  address of parameter for callback, (void *)-1 means to remove all
14099a2dd95SBruce Richardson  *  registered which has the same callback address.
14199a2dd95SBruce Richardson  *
14299a2dd95SBruce Richardson  * @return
14399a2dd95SBruce Richardson  *  - On success, return the number of callback entities removed.
14499a2dd95SBruce Richardson  *  - On failure, a negative value.
14599a2dd95SBruce Richardson  */
14699a2dd95SBruce Richardson int
14799a2dd95SBruce Richardson rte_intr_callback_unregister_sync(const struct rte_intr_handle *intr_handle,
14899a2dd95SBruce Richardson 				rte_intr_callback_fn cb, void *cb_arg);
14999a2dd95SBruce Richardson 
15099a2dd95SBruce Richardson /**
15199a2dd95SBruce Richardson  * It enables the interrupt for the specified handle.
15299a2dd95SBruce Richardson  *
15399a2dd95SBruce Richardson  * @param intr_handle
15499a2dd95SBruce Richardson  *  pointer to the interrupt handle.
15599a2dd95SBruce Richardson  *
15699a2dd95SBruce Richardson  * @return
15799a2dd95SBruce Richardson  *  - On success, zero.
15899a2dd95SBruce Richardson  *  - On failure, a negative value.
15999a2dd95SBruce Richardson  */
16099a2dd95SBruce Richardson int rte_intr_enable(const struct rte_intr_handle *intr_handle);
16199a2dd95SBruce Richardson 
16299a2dd95SBruce Richardson /**
16399a2dd95SBruce Richardson  * It disables the interrupt for the specified handle.
16499a2dd95SBruce Richardson  *
16599a2dd95SBruce Richardson  * @param intr_handle
16699a2dd95SBruce Richardson  *  pointer to the interrupt handle.
16799a2dd95SBruce Richardson  *
16899a2dd95SBruce Richardson  * @return
16999a2dd95SBruce Richardson  *  - On success, zero.
17099a2dd95SBruce Richardson  *  - On failure, a negative value.
17199a2dd95SBruce Richardson  */
17299a2dd95SBruce Richardson int rte_intr_disable(const struct rte_intr_handle *intr_handle);
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson /**
17599a2dd95SBruce Richardson  * It acknowledges an interrupt raised for the specified handle.
17699a2dd95SBruce Richardson  *
17799a2dd95SBruce Richardson  * This function should be called at the end of each interrupt handler either
17899a2dd95SBruce Richardson  * from application or driver, so that currently raised interrupt is acked and
17999a2dd95SBruce Richardson  * further new interrupts are raised.
18099a2dd95SBruce Richardson  *
18199a2dd95SBruce Richardson  * @param intr_handle
18299a2dd95SBruce Richardson  *  pointer to the interrupt handle.
18399a2dd95SBruce Richardson  *
18499a2dd95SBruce Richardson  * @return
18599a2dd95SBruce Richardson  *  - On success, zero.
18699a2dd95SBruce Richardson  *  - On failure, a negative value.
18799a2dd95SBruce Richardson  */
18899a2dd95SBruce Richardson int rte_intr_ack(const struct rte_intr_handle *intr_handle);
18999a2dd95SBruce Richardson 
190b7c98429SHarman Kalra /**
191b7c98429SHarman Kalra  * Check if currently executing in interrupt context
192b7c98429SHarman Kalra  *
193b7c98429SHarman Kalra  * @return
194b7c98429SHarman Kalra  *  - non zero in case of interrupt context
195b7c98429SHarman Kalra  *  - zero in case of process context
196b7c98429SHarman Kalra  */
197*7f7efe82SStephen Hemminger int rte_thread_is_intr(void);
198b7c98429SHarman Kalra 
199b7c98429SHarman Kalra /**
200b7c98429SHarman Kalra  * It allocates memory for interrupt instance. API takes flag as an argument
201b7c98429SHarman Kalra  * which define from where memory should be allocated i.e. using DPDK memory
202b7c98429SHarman Kalra  * management library APIs or normal heap allocation.
203b7c98429SHarman Kalra  * Default memory allocation for event fds and event list array is done which
204b7c98429SHarman Kalra  * can be realloced later based on size of MSIX interrupts supported by a PCI
205b7c98429SHarman Kalra  * device.
206b7c98429SHarman Kalra  *
207b7c98429SHarman Kalra  * This function should be called from application or driver, before calling
208b7c98429SHarman Kalra  * any of the interrupt APIs.
209b7c98429SHarman Kalra  *
210b7c98429SHarman Kalra  * @param flags
211b7c98429SHarman Kalra  *  See RTE_INTR_INSTANCE_F_* flags definitions.
212b7c98429SHarman Kalra  *
213b7c98429SHarman Kalra  * @return
214b7c98429SHarman Kalra  *  - On success, address of interrupt handle.
215b7c98429SHarman Kalra  *  - On failure, NULL.
216b7c98429SHarman Kalra  */
217b7c98429SHarman Kalra struct rte_intr_handle *
218b7c98429SHarman Kalra rte_intr_instance_alloc(uint32_t flags);
219b7c98429SHarman Kalra 
220b7c98429SHarman Kalra /**
221cb68a563SStephen Hemminger  * Free the memory allocated for interrupt handle resources.
222b7c98429SHarman Kalra  *
223b7c98429SHarman Kalra  * @param intr_handle
224448e01f1SStephen Hemminger  *  Interrupt handle allocated with rte_intr_instance_alloc().
225448e01f1SStephen Hemminger  *  If intr_handle is NULL, no operation is performed.
226b7c98429SHarman Kalra  */
227b7c98429SHarman Kalra void
228b7c98429SHarman Kalra rte_intr_instance_free(struct rte_intr_handle *intr_handle);
229b7c98429SHarman Kalra 
230b7c98429SHarman Kalra /**
231cb68a563SStephen Hemminger  * Set the fd field of interrupt handle with user provided
232b7c98429SHarman Kalra  * file descriptor.
233b7c98429SHarman Kalra  *
234b7c98429SHarman Kalra  * @param intr_handle
235b7c98429SHarman Kalra  *  pointer to the interrupt handle.
236b7c98429SHarman Kalra  * @param fd
237b7c98429SHarman Kalra  *  file descriptor value provided by user.
238b7c98429SHarman Kalra  *
239b7c98429SHarman Kalra  * @return
240b7c98429SHarman Kalra  *  - On success, zero.
241b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
242b7c98429SHarman Kalra  */
243b7c98429SHarman Kalra int
244b7c98429SHarman Kalra rte_intr_fd_set(struct rte_intr_handle *intr_handle, int fd);
245b7c98429SHarman Kalra 
246b7c98429SHarman Kalra /**
247b7c98429SHarman Kalra  * Returns the fd field of the given interrupt handle instance.
248b7c98429SHarman Kalra  *
249b7c98429SHarman Kalra  * @param intr_handle
250b7c98429SHarman Kalra  *  pointer to the interrupt handle.
251b7c98429SHarman Kalra  *
252b7c98429SHarman Kalra  * @return
253b7c98429SHarman Kalra  *  - On success, fd field.
254b7c98429SHarman Kalra  *  - On failure, a negative value.
255b7c98429SHarman Kalra  */
256b7c98429SHarman Kalra int
257b7c98429SHarman Kalra rte_intr_fd_get(const struct rte_intr_handle *intr_handle);
258b7c98429SHarman Kalra 
259b7c98429SHarman Kalra /**
260cb68a563SStephen Hemminger  * Set the type field of interrupt handle with user provided
261b7c98429SHarman Kalra  * interrupt type.
262b7c98429SHarman Kalra  *
263b7c98429SHarman Kalra  * @param intr_handle
264b7c98429SHarman Kalra  *  pointer to the interrupt handle.
265b7c98429SHarman Kalra  * @param type
266b7c98429SHarman Kalra  *  interrupt type
267b7c98429SHarman Kalra  *
268b7c98429SHarman Kalra  * @return
269b7c98429SHarman Kalra  *  - On success, zero.
270b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
271b7c98429SHarman Kalra  */
272b7c98429SHarman Kalra int
273b7c98429SHarman Kalra rte_intr_type_set(struct rte_intr_handle *intr_handle,
274b7c98429SHarman Kalra 		  enum rte_intr_handle_type type);
275b7c98429SHarman Kalra 
276b7c98429SHarman Kalra /**
277b7c98429SHarman Kalra  * Returns the type field of the given interrupt handle instance.
278b7c98429SHarman Kalra  *
279b7c98429SHarman Kalra  * @param intr_handle
280b7c98429SHarman Kalra  *  pointer to the interrupt handle.
281b7c98429SHarman Kalra  *
282b7c98429SHarman Kalra  * @return
283b7c98429SHarman Kalra  *  - On success, interrupt type
284b7c98429SHarman Kalra  *  - On failure, RTE_INTR_HANDLE_UNKNOWN.
285b7c98429SHarman Kalra  */
286b7c98429SHarman Kalra enum rte_intr_handle_type
287b7c98429SHarman Kalra rte_intr_type_get(const struct rte_intr_handle *intr_handle);
288b7c98429SHarman Kalra 
289b7c98429SHarman Kalra /**
290b7c98429SHarman Kalra  * @internal
291b7c98429SHarman Kalra  * The function returns the per thread epoll instance.
292b7c98429SHarman Kalra  *
293b7c98429SHarman Kalra  * @return
294b7c98429SHarman Kalra  *   epfd the epoll instance referred to.
295b7c98429SHarman Kalra  */
296b7c98429SHarman Kalra __rte_internal
297b7c98429SHarman Kalra int
298b7c98429SHarman Kalra rte_intr_tls_epfd(void);
299b7c98429SHarman Kalra 
300b7c98429SHarman Kalra /**
301b7c98429SHarman Kalra  * @internal
302b7c98429SHarman Kalra  * @param intr_handle
303b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
304b7c98429SHarman Kalra  * @param epfd
305b7c98429SHarman Kalra  *   Epoll instance fd which the intr vector associated to.
306b7c98429SHarman Kalra  * @param op
307b7c98429SHarman Kalra  *   The operation be performed for the vector.
308b7c98429SHarman Kalra  *   Operation type of {ADD, DEL}.
309b7c98429SHarman Kalra  * @param vec
310b7c98429SHarman Kalra  *   RX intr vector number added to the epoll instance wait list.
311b7c98429SHarman Kalra  * @param data
312b7c98429SHarman Kalra  *   User raw data.
313b7c98429SHarman Kalra  * @return
314b7c98429SHarman Kalra  *   - On success, zero.
315b7c98429SHarman Kalra  *   - On failure, a negative value.
316b7c98429SHarman Kalra  */
317b7c98429SHarman Kalra __rte_internal
318b7c98429SHarman Kalra int
319b7c98429SHarman Kalra rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
320b7c98429SHarman Kalra 		int epfd, int op, unsigned int vec, void *data);
321b7c98429SHarman Kalra 
322b7c98429SHarman Kalra /**
323b7c98429SHarman Kalra  * @internal
324b7c98429SHarman Kalra  * It deletes registered eventfds.
325b7c98429SHarman Kalra  *
326b7c98429SHarman Kalra  * @param intr_handle
327b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
328b7c98429SHarman Kalra  */
329b7c98429SHarman Kalra __rte_internal
330b7c98429SHarman Kalra void
331b7c98429SHarman Kalra rte_intr_free_epoll_fd(struct rte_intr_handle *intr_handle);
332b7c98429SHarman Kalra 
333b7c98429SHarman Kalra /**
334b7c98429SHarman Kalra  * @internal
335b7c98429SHarman Kalra  * It enables the packet I/O interrupt event if it's necessary.
336b7c98429SHarman Kalra  * It creates event fd for each interrupt vector when MSIX is used,
337b7c98429SHarman Kalra  * otherwise it multiplexes a single event fd.
338b7c98429SHarman Kalra  *
339b7c98429SHarman Kalra  * @param intr_handle
340b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
341b7c98429SHarman Kalra  * @param nb_efd
342b7c98429SHarman Kalra  *   Number of interrupt vector trying to enable.
343b7c98429SHarman Kalra  *   The value 0 is not allowed.
344b7c98429SHarman Kalra  * @return
345b7c98429SHarman Kalra  *   - On success, zero.
346b7c98429SHarman Kalra  *   - On failure, a negative value.
347b7c98429SHarman Kalra  */
348b7c98429SHarman Kalra __rte_internal
349b7c98429SHarman Kalra int
350b7c98429SHarman Kalra rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
351b7c98429SHarman Kalra 
352b7c98429SHarman Kalra /**
353b7c98429SHarman Kalra  * @internal
354b7c98429SHarman Kalra  * It disables the packet I/O interrupt event.
355b7c98429SHarman Kalra  * It deletes registered eventfds and closes the open fds.
356b7c98429SHarman Kalra  *
357b7c98429SHarman Kalra  * @param intr_handle
358b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
359b7c98429SHarman Kalra  */
360b7c98429SHarman Kalra __rte_internal
361b7c98429SHarman Kalra void
362b7c98429SHarman Kalra rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
363b7c98429SHarman Kalra 
364b7c98429SHarman Kalra /**
365b7c98429SHarman Kalra  * @internal
366b7c98429SHarman Kalra  * The packet I/O interrupt on datapath is enabled or not.
367b7c98429SHarman Kalra  *
368b7c98429SHarman Kalra  * @param intr_handle
369b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
370b7c98429SHarman Kalra  */
371b7c98429SHarman Kalra __rte_internal
372b7c98429SHarman Kalra int
373b7c98429SHarman Kalra rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
374b7c98429SHarman Kalra 
375b7c98429SHarman Kalra /**
376b7c98429SHarman Kalra  * @internal
377b7c98429SHarman Kalra  * The interrupt handle instance allows other causes or not.
378b7c98429SHarman Kalra  * Other causes stand for any none packet I/O interrupts.
379b7c98429SHarman Kalra  *
380b7c98429SHarman Kalra  * @param intr_handle
381b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
382b7c98429SHarman Kalra  */
383b7c98429SHarman Kalra __rte_internal
384b7c98429SHarman Kalra int
385b7c98429SHarman Kalra rte_intr_allow_others(struct rte_intr_handle *intr_handle);
386b7c98429SHarman Kalra 
387b7c98429SHarman Kalra /**
388b7c98429SHarman Kalra  * @internal
389b7c98429SHarman Kalra  * The multiple interrupt vector capability of interrupt handle instance.
390b7c98429SHarman Kalra  * It returns zero if no multiple interrupt vector support.
391b7c98429SHarman Kalra  *
392b7c98429SHarman Kalra  * @param intr_handle
393b7c98429SHarman Kalra  *   Pointer to the interrupt handle.
394b7c98429SHarman Kalra  */
395b7c98429SHarman Kalra __rte_internal
396b7c98429SHarman Kalra int
397b7c98429SHarman Kalra rte_intr_cap_multiple(struct rte_intr_handle *intr_handle);
398b7c98429SHarman Kalra 
399b7c98429SHarman Kalra /**
400b7c98429SHarman Kalra  * @internal
401b7c98429SHarman Kalra  * Creates a clone of src by allocating a new handle and copying src content.
402b7c98429SHarman Kalra  *
403b7c98429SHarman Kalra  * @param src
404b7c98429SHarman Kalra  *  Source interrupt handle to be cloned.
405b7c98429SHarman Kalra  *
406b7c98429SHarman Kalra  * @return
407b7c98429SHarman Kalra  *  - On success, address of interrupt handle.
408b7c98429SHarman Kalra  *  - On failure, NULL.
409b7c98429SHarman Kalra  */
410b7c98429SHarman Kalra __rte_internal
411b7c98429SHarman Kalra struct rte_intr_handle *
412b7c98429SHarman Kalra rte_intr_instance_dup(const struct rte_intr_handle *src);
413b7c98429SHarman Kalra 
414b7c98429SHarman Kalra /**
415b7c98429SHarman Kalra  * @internal
416cb68a563SStephen Hemminger  * Set the device fd field of interrupt handle with user
417b7c98429SHarman Kalra  * provided dev fd. Device fd corresponds to VFIO device fd or UIO config fd.
418b7c98429SHarman Kalra  *
419b7c98429SHarman Kalra  * @param intr_handle
420b7c98429SHarman Kalra  *  pointer to the interrupt handle.
421b7c98429SHarman Kalra  * @param fd
422b7c98429SHarman Kalra  *  interrupt type
423b7c98429SHarman Kalra  *
424b7c98429SHarman Kalra  * @return
425b7c98429SHarman Kalra  *  - On success, zero.
426b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
427b7c98429SHarman Kalra  */
428b7c98429SHarman Kalra __rte_internal
429b7c98429SHarman Kalra int
430b7c98429SHarman Kalra rte_intr_dev_fd_set(struct rte_intr_handle *intr_handle, int fd);
431b7c98429SHarman Kalra 
432b7c98429SHarman Kalra /**
433b7c98429SHarman Kalra  * @internal
434b7c98429SHarman Kalra  * Returns the device fd field of the given interrupt handle instance.
435b7c98429SHarman Kalra  *
436b7c98429SHarman Kalra  * @param intr_handle
437b7c98429SHarman Kalra  *  pointer to the interrupt handle.
438b7c98429SHarman Kalra  *
439b7c98429SHarman Kalra  * @return
440b7c98429SHarman Kalra  *  - On success, dev fd.
441b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
442b7c98429SHarman Kalra  */
443b7c98429SHarman Kalra __rte_internal
444b7c98429SHarman Kalra int
445b7c98429SHarman Kalra rte_intr_dev_fd_get(const struct rte_intr_handle *intr_handle);
446b7c98429SHarman Kalra 
447b7c98429SHarman Kalra /**
448b7c98429SHarman Kalra  * @internal
449cb68a563SStephen Hemminger  * Set the max intr field of interrupt handle with user
450b7c98429SHarman Kalra  * provided max intr value.
451b7c98429SHarman Kalra  *
452b7c98429SHarman Kalra  * @param intr_handle
453b7c98429SHarman Kalra  *  pointer to the interrupt handle.
454b7c98429SHarman Kalra  * @param max_intr
455b7c98429SHarman Kalra  *  interrupt type
456b7c98429SHarman Kalra  *
457b7c98429SHarman Kalra  * @return
458b7c98429SHarman Kalra  *  - On success, zero.
459b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
460b7c98429SHarman Kalra  */
461b7c98429SHarman Kalra __rte_internal
462b7c98429SHarman Kalra int
463b7c98429SHarman Kalra rte_intr_max_intr_set(struct rte_intr_handle *intr_handle, int max_intr);
464b7c98429SHarman Kalra 
465b7c98429SHarman Kalra /**
466b7c98429SHarman Kalra  * @internal
467b7c98429SHarman Kalra  * Returns the max intr field of the given interrupt handle instance.
468b7c98429SHarman Kalra  *
469b7c98429SHarman Kalra  * @param intr_handle
470b7c98429SHarman Kalra  *  pointer to the interrupt handle.
471b7c98429SHarman Kalra  *
472b7c98429SHarman Kalra  * @return
473b7c98429SHarman Kalra  *  - On success, max intr.
474b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
475b7c98429SHarman Kalra  */
476b7c98429SHarman Kalra __rte_internal
477b7c98429SHarman Kalra int
478b7c98429SHarman Kalra rte_intr_max_intr_get(const struct rte_intr_handle *intr_handle);
479b7c98429SHarman Kalra 
480b7c98429SHarman Kalra /**
481b7c98429SHarman Kalra  * @internal
482cb68a563SStephen Hemminger  * Set the number of event fd field of interrupt handle
483b7c98429SHarman Kalra  * with user provided available event file descriptor value.
484b7c98429SHarman Kalra  *
485b7c98429SHarman Kalra  * @param intr_handle
486b7c98429SHarman Kalra  *  pointer to the interrupt handle.
487b7c98429SHarman Kalra  * @param nb_efd
488b7c98429SHarman Kalra  *  Available event fd
489b7c98429SHarman Kalra  *
490b7c98429SHarman Kalra  * @return
491b7c98429SHarman Kalra  *  - On success, zero.
492b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
493b7c98429SHarman Kalra  */
494b7c98429SHarman Kalra __rte_internal
495b7c98429SHarman Kalra int
496b7c98429SHarman Kalra rte_intr_nb_efd_set(struct rte_intr_handle *intr_handle, int nb_efd);
497b7c98429SHarman Kalra 
498b7c98429SHarman Kalra /**
499b7c98429SHarman Kalra  * @internal
500b7c98429SHarman Kalra  * Returns the number of available event fd field of the given interrupt handle
501b7c98429SHarman Kalra  * instance.
502b7c98429SHarman Kalra  *
503b7c98429SHarman Kalra  * @param intr_handle
504b7c98429SHarman Kalra  *  pointer to the interrupt handle.
505b7c98429SHarman Kalra  *
506b7c98429SHarman Kalra  * @return
507b7c98429SHarman Kalra  *  - On success, nb_efd
508b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
509b7c98429SHarman Kalra  */
510b7c98429SHarman Kalra __rte_internal
511b7c98429SHarman Kalra int
512b7c98429SHarman Kalra rte_intr_nb_efd_get(const struct rte_intr_handle *intr_handle);
513b7c98429SHarman Kalra 
514b7c98429SHarman Kalra /**
515b7c98429SHarman Kalra  * @internal
516b7c98429SHarman Kalra  * Returns the number of interrupt vector field of the given interrupt handle
517b7c98429SHarman Kalra  * instance. This field is to configured on device probe time, and based on
518b7c98429SHarman Kalra  * this value efds and elist arrays are dynamically allocated. By default
519b7c98429SHarman Kalra  * this value is set to RTE_MAX_RXTX_INTR_VEC_ID.
520b7c98429SHarman Kalra  * For eg. in case of PCI device, its msix size is queried and efds/elist
521b7c98429SHarman Kalra  * arrays are allocated accordingly.
522b7c98429SHarman Kalra  *
523b7c98429SHarman Kalra  * @param intr_handle
524b7c98429SHarman Kalra  *  pointer to the interrupt handle.
525b7c98429SHarman Kalra  *
526b7c98429SHarman Kalra  * @return
527b7c98429SHarman Kalra  *  - On success, nb_intr
528b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
529b7c98429SHarman Kalra  */
530b7c98429SHarman Kalra __rte_internal
531b7c98429SHarman Kalra int
532b7c98429SHarman Kalra rte_intr_nb_intr_get(const struct rte_intr_handle *intr_handle);
533b7c98429SHarman Kalra 
534b7c98429SHarman Kalra /**
535b7c98429SHarman Kalra  * @internal
536cb68a563SStephen Hemminger  * Set the event fd counter size field of interrupt handle
537b7c98429SHarman Kalra  * with user provided efd counter size.
538b7c98429SHarman Kalra  *
539b7c98429SHarman Kalra  * @param intr_handle
540b7c98429SHarman Kalra  *  pointer to the interrupt handle.
541b7c98429SHarman Kalra  * @param efd_counter_size
542b7c98429SHarman Kalra  *  size of efd counter.
543b7c98429SHarman Kalra  *
544b7c98429SHarman Kalra  * @return
545b7c98429SHarman Kalra  *  - On success, zero.
546b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
547b7c98429SHarman Kalra  */
548b7c98429SHarman Kalra __rte_internal
549b7c98429SHarman Kalra int
550b7c98429SHarman Kalra rte_intr_efd_counter_size_set(struct rte_intr_handle *intr_handle,
551b7c98429SHarman Kalra 			      uint8_t efd_counter_size);
552b7c98429SHarman Kalra 
553b7c98429SHarman Kalra /**
554b7c98429SHarman Kalra  * @internal
555b7c98429SHarman Kalra  * Returns the event fd counter size field of the given interrupt handle
556b7c98429SHarman Kalra  * instance.
557b7c98429SHarman Kalra  *
558b7c98429SHarman Kalra  * @param intr_handle
559b7c98429SHarman Kalra  *  pointer to the interrupt handle.
560b7c98429SHarman Kalra  *
561b7c98429SHarman Kalra  * @return
562b7c98429SHarman Kalra  *  - On success, efd_counter_size
563b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
564b7c98429SHarman Kalra  */
565b7c98429SHarman Kalra __rte_internal
566b7c98429SHarman Kalra int
567b7c98429SHarman Kalra rte_intr_efd_counter_size_get(const struct rte_intr_handle *intr_handle);
568b7c98429SHarman Kalra 
569b7c98429SHarman Kalra /**
570b7c98429SHarman Kalra  * @internal
571cb68a563SStephen Hemminger  * Set the event fd array index with the given fd.
572b7c98429SHarman Kalra  *
573b7c98429SHarman Kalra  * @param intr_handle
574b7c98429SHarman Kalra  *  pointer to the interrupt handle.
575b7c98429SHarman Kalra  * @param index
576b7c98429SHarman Kalra  *  efds array index to be set
577b7c98429SHarman Kalra  * @param fd
578b7c98429SHarman Kalra  *  event fd
579b7c98429SHarman Kalra  *
580b7c98429SHarman Kalra  * @return
581b7c98429SHarman Kalra  *  - On success, zero.
582b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
583b7c98429SHarman Kalra  */
584b7c98429SHarman Kalra __rte_internal
585b7c98429SHarman Kalra int
586b7c98429SHarman Kalra rte_intr_efds_index_set(struct rte_intr_handle *intr_handle, int index, int fd);
587b7c98429SHarman Kalra 
588b7c98429SHarman Kalra /**
589b7c98429SHarman Kalra  * @internal
590b7c98429SHarman Kalra  * Returns the fd value of event fds array at a given index.
591b7c98429SHarman Kalra  *
592b7c98429SHarman Kalra  * @param intr_handle
593b7c98429SHarman Kalra  *  pointer to the interrupt handle.
594b7c98429SHarman Kalra  * @param index
595b7c98429SHarman Kalra  *  efds array index to be returned
596b7c98429SHarman Kalra  *
597b7c98429SHarman Kalra  * @return
598b7c98429SHarman Kalra  *  - On success, fd
599b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
600b7c98429SHarman Kalra  */
601b7c98429SHarman Kalra __rte_internal
602b7c98429SHarman Kalra int
603b7c98429SHarman Kalra rte_intr_efds_index_get(const struct rte_intr_handle *intr_handle, int index);
604b7c98429SHarman Kalra 
605b7c98429SHarman Kalra /**
606b7c98429SHarman Kalra  * @internal
607cb68a563SStephen Hemminger  * Set the epoll event object array index with the given
608b7c98429SHarman Kalra  * elist instance.
609b7c98429SHarman Kalra  *
610b7c98429SHarman Kalra  * @param intr_handle
611b7c98429SHarman Kalra  *  pointer to the interrupt handle.
612b7c98429SHarman Kalra  * @param index
613b7c98429SHarman Kalra  *  elist array index to be set
614b7c98429SHarman Kalra  * @param elist
615b7c98429SHarman Kalra  *  epoll event instance of struct rte_epoll_event
616b7c98429SHarman Kalra  *
617b7c98429SHarman Kalra  * @return
618b7c98429SHarman Kalra  *  - On success, zero.
619b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
620b7c98429SHarman Kalra  */
621b7c98429SHarman Kalra __rte_internal
622b7c98429SHarman Kalra int
623b7c98429SHarman Kalra rte_intr_elist_index_set(struct rte_intr_handle *intr_handle, int index,
624b7c98429SHarman Kalra 			 struct rte_epoll_event elist);
625b7c98429SHarman Kalra 
626b7c98429SHarman Kalra /**
627b7c98429SHarman Kalra  * @internal
628b7c98429SHarman Kalra  * Returns the address of epoll event instance from elist array at a given
629b7c98429SHarman Kalra  * index.
630b7c98429SHarman Kalra  *
631b7c98429SHarman Kalra  * @param intr_handle
632b7c98429SHarman Kalra  *  pointer to the interrupt handle.
633b7c98429SHarman Kalra  * @param index
634b7c98429SHarman Kalra  *  elist array index to be returned
635b7c98429SHarman Kalra  *
636b7c98429SHarman Kalra  * @return
637b7c98429SHarman Kalra  *  - On success, elist
638b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
639b7c98429SHarman Kalra  */
640b7c98429SHarman Kalra __rte_internal
641b7c98429SHarman Kalra struct rte_epoll_event *
642b7c98429SHarman Kalra rte_intr_elist_index_get(struct rte_intr_handle *intr_handle, int index);
643b7c98429SHarman Kalra 
644b7c98429SHarman Kalra /**
645b7c98429SHarman Kalra  * @internal
646b7c98429SHarman Kalra  * Allocates the memory of interrupt vector list array, with size defining the
647b7c98429SHarman Kalra  * number of elements required in the array.
648b7c98429SHarman Kalra  *
649b7c98429SHarman Kalra  * @param intr_handle
650b7c98429SHarman Kalra  *  pointer to the interrupt handle.
651b7c98429SHarman Kalra  * @param name
652b7c98429SHarman Kalra  *  Name assigned to the allocation, or NULL.
653b7c98429SHarman Kalra  * @param size
654b7c98429SHarman Kalra  *  Number of element required in the array.
655b7c98429SHarman Kalra  *
656b7c98429SHarman Kalra  * @return
657b7c98429SHarman Kalra  *  - On success, zero
658b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
659b7c98429SHarman Kalra  */
660b7c98429SHarman Kalra __rte_internal
661b7c98429SHarman Kalra int
662b7c98429SHarman Kalra rte_intr_vec_list_alloc(struct rte_intr_handle *intr_handle, const char *name,
663b7c98429SHarman Kalra 			int size);
664b7c98429SHarman Kalra 
665b7c98429SHarman Kalra /**
666b7c98429SHarman Kalra  * @internal
667b7c98429SHarman Kalra  * Sets the vector value at given index of interrupt vector list field of given
668b7c98429SHarman Kalra  * interrupt handle.
669b7c98429SHarman Kalra  *
670b7c98429SHarman Kalra  * @param intr_handle
671b7c98429SHarman Kalra  *  pointer to the interrupt handle.
672b7c98429SHarman Kalra  * @param index
673b7c98429SHarman Kalra  *  intr_vec array index to be set
674b7c98429SHarman Kalra  * @param vec
675b7c98429SHarman Kalra  *  Interrupt vector value.
676b7c98429SHarman Kalra  *
677b7c98429SHarman Kalra  * @return
678b7c98429SHarman Kalra  *  - On success, zero
679b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
680b7c98429SHarman Kalra  */
681b7c98429SHarman Kalra __rte_internal
682b7c98429SHarman Kalra int
683b7c98429SHarman Kalra rte_intr_vec_list_index_set(struct rte_intr_handle *intr_handle, int index,
684b7c98429SHarman Kalra 			    int vec);
685b7c98429SHarman Kalra 
686b7c98429SHarman Kalra /**
687b7c98429SHarman Kalra  * @internal
688b7c98429SHarman Kalra  * Returns the vector value at the given index of interrupt vector list array.
689b7c98429SHarman Kalra  *
690b7c98429SHarman Kalra  * @param intr_handle
691b7c98429SHarman Kalra  *  pointer to the interrupt handle.
692b7c98429SHarman Kalra  * @param index
693b7c98429SHarman Kalra  *  intr_vec array index to be returned
694b7c98429SHarman Kalra  *
695b7c98429SHarman Kalra  * @return
696b7c98429SHarman Kalra  *  - On success, interrupt vector
697b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
698b7c98429SHarman Kalra  */
699b7c98429SHarman Kalra __rte_internal
700b7c98429SHarman Kalra int
701b7c98429SHarman Kalra rte_intr_vec_list_index_get(const struct rte_intr_handle *intr_handle,
702b7c98429SHarman Kalra 			    int index);
703b7c98429SHarman Kalra 
704b7c98429SHarman Kalra /**
705b7c98429SHarman Kalra  * @internal
706b7c98429SHarman Kalra  * Frees the memory allocated for interrupt vector list array.
707b7c98429SHarman Kalra  *
708b7c98429SHarman Kalra  * @param intr_handle
709b7c98429SHarman Kalra  *  pointer to the interrupt handle.
710b7c98429SHarman Kalra  *
711b7c98429SHarman Kalra  * @return
712b7c98429SHarman Kalra  *  - On success, zero
713b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
714b7c98429SHarman Kalra  */
715b7c98429SHarman Kalra __rte_internal
716b7c98429SHarman Kalra void
717b7c98429SHarman Kalra rte_intr_vec_list_free(struct rte_intr_handle *intr_handle);
718b7c98429SHarman Kalra 
719b7c98429SHarman Kalra /**
720b7c98429SHarman Kalra  * @internal
7218cb5d08dSHarman Kalra  * Reallocates the size efds and elist array based on size provided by user.
7228cb5d08dSHarman Kalra  * By default efds and elist array are allocated with default size
7238cb5d08dSHarman Kalra  * RTE_MAX_RXTX_INTR_VEC_ID on interrupt handle array creation. Later on device
7248cb5d08dSHarman Kalra  * probe, device may have capability of more interrupts than
7258cb5d08dSHarman Kalra  * RTE_MAX_RXTX_INTR_VEC_ID. Using this API, PMDs can reallocate the arrays as
7268cb5d08dSHarman Kalra  * per the max interrupts capability of device.
7278cb5d08dSHarman Kalra  *
7288cb5d08dSHarman Kalra  * @param intr_handle
7298cb5d08dSHarman Kalra  *  pointer to the interrupt handle.
7308cb5d08dSHarman Kalra  * @param size
7318cb5d08dSHarman Kalra  *  efds and elist array size.
7328cb5d08dSHarman Kalra  *
7338cb5d08dSHarman Kalra  * @return
7348cb5d08dSHarman Kalra  *  - On success, zero
7358cb5d08dSHarman Kalra  *  - On failure, a negative value and rte_errno is set.
7368cb5d08dSHarman Kalra  */
7378cb5d08dSHarman Kalra __rte_internal
7388cb5d08dSHarman Kalra int
7398cb5d08dSHarman Kalra rte_intr_event_list_update(struct rte_intr_handle *intr_handle, int size);
7408cb5d08dSHarman Kalra 
7418cb5d08dSHarman Kalra /**
7428cb5d08dSHarman Kalra  * @internal
743cb68a563SStephen Hemminger  * Returns the Windows handle of the given interrupt instance.
744b7c98429SHarman Kalra  *
745b7c98429SHarman Kalra  * @param intr_handle
746b7c98429SHarman Kalra  *  pointer to the interrupt handle.
747b7c98429SHarman Kalra  *
748b7c98429SHarman Kalra  * @return
749b7c98429SHarman Kalra  *  - On success, Windows handle.
750b7c98429SHarman Kalra  *  - On failure, NULL.
751b7c98429SHarman Kalra  */
752b7c98429SHarman Kalra __rte_internal
753b7c98429SHarman Kalra void *
754b7c98429SHarman Kalra rte_intr_instance_windows_handle_get(struct rte_intr_handle *intr_handle);
755b7c98429SHarman Kalra 
756b7c98429SHarman Kalra /**
757b7c98429SHarman Kalra  * @internal
758cb68a563SStephen Hemminger  * Set the Windows handle for the given interrupt instance.
759b7c98429SHarman Kalra  *
760b7c98429SHarman Kalra  * @param intr_handle
761b7c98429SHarman Kalra  *  pointer to the interrupt handle.
762b7c98429SHarman Kalra  * @param windows_handle
763b7c98429SHarman Kalra  *  Windows handle to be set.
764b7c98429SHarman Kalra  *
765b7c98429SHarman Kalra  * @return
766b7c98429SHarman Kalra  *  - On success, zero
767b7c98429SHarman Kalra  *  - On failure, a negative value and rte_errno is set.
768b7c98429SHarman Kalra  */
769b7c98429SHarman Kalra __rte_internal
770b7c98429SHarman Kalra int
771b7c98429SHarman Kalra rte_intr_instance_windows_handle_set(struct rte_intr_handle *intr_handle,
772b7c98429SHarman Kalra 				     void *windows_handle);
773b7c98429SHarman Kalra 
77499a2dd95SBruce Richardson #ifdef __cplusplus
77599a2dd95SBruce Richardson }
77699a2dd95SBruce Richardson #endif
77799a2dd95SBruce Richardson 
77899a2dd95SBruce Richardson #endif
779