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