1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
9 #include <rte_interrupts.h>
11 #include <rte_malloc.h>
13 #include "eal_interrupts.h"
15 /* Macros to check for valid interrupt handle */
16 #define CHECK_VALID_INTR_HANDLE(intr_handle) do { \
17 if (intr_handle == NULL) { \
18 RTE_LOG(DEBUG, EAL, "Interrupt instance unallocated\n"); \
24 #define RTE_INTR_INSTANCE_KNOWN_FLAGS (RTE_INTR_INSTANCE_F_PRIVATE \
25 | RTE_INTR_INSTANCE_F_SHARED \
28 #define RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags) \
29 (!!(flags & RTE_INTR_INSTANCE_F_SHARED))
31 struct rte_intr_handle *rte_intr_instance_alloc(uint32_t flags)
33 struct rte_intr_handle *intr_handle;
36 /* Check the flag passed by user, it should be part of the
39 if ((flags & ~RTE_INTR_INSTANCE_KNOWN_FLAGS) != 0) {
40 RTE_LOG(DEBUG, EAL, "Invalid alloc flag passed 0x%x\n", flags);
45 uses_rte_memory = RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags);
47 intr_handle = rte_zmalloc(NULL, sizeof(*intr_handle), 0);
49 intr_handle = calloc(1, sizeof(*intr_handle));
50 if (intr_handle == NULL) {
51 RTE_LOG(ERR, EAL, "Failed to allocate intr_handle\n");
56 intr_handle->alloc_flags = flags;
57 intr_handle->nb_intr = RTE_MAX_RXTX_INTR_VEC_ID;
62 struct rte_intr_handle *rte_intr_instance_dup(const struct rte_intr_handle *src)
64 struct rte_intr_handle *intr_handle;
67 RTE_LOG(DEBUG, EAL, "Source interrupt instance unallocated\n");
72 intr_handle = rte_intr_instance_alloc(src->alloc_flags);
73 if (intr_handle != NULL) {
74 intr_handle->fd = src->fd;
75 intr_handle->dev_fd = src->dev_fd;
76 intr_handle->type = src->type;
77 intr_handle->max_intr = src->max_intr;
78 intr_handle->nb_efd = src->nb_efd;
79 intr_handle->efd_counter_size = src->efd_counter_size;
80 memcpy(intr_handle->efds, src->efds, src->nb_intr);
81 memcpy(intr_handle->elist, src->elist, src->nb_intr);
87 void rte_intr_instance_free(struct rte_intr_handle *intr_handle)
89 if (intr_handle == NULL)
91 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
92 rte_free(intr_handle);
97 int rte_intr_fd_set(struct rte_intr_handle *intr_handle, int fd)
99 CHECK_VALID_INTR_HANDLE(intr_handle);
101 intr_handle->fd = fd;
108 int rte_intr_fd_get(const struct rte_intr_handle *intr_handle)
110 CHECK_VALID_INTR_HANDLE(intr_handle);
112 return intr_handle->fd;
117 int rte_intr_type_set(struct rte_intr_handle *intr_handle,
118 enum rte_intr_handle_type type)
120 CHECK_VALID_INTR_HANDLE(intr_handle);
122 intr_handle->type = type;
129 enum rte_intr_handle_type rte_intr_type_get(
130 const struct rte_intr_handle *intr_handle)
132 CHECK_VALID_INTR_HANDLE(intr_handle);
134 return intr_handle->type;
136 return RTE_INTR_HANDLE_UNKNOWN;
139 int rte_intr_dev_fd_set(struct rte_intr_handle *intr_handle, int fd)
141 CHECK_VALID_INTR_HANDLE(intr_handle);
143 intr_handle->dev_fd = fd;
150 int rte_intr_dev_fd_get(const struct rte_intr_handle *intr_handle)
152 CHECK_VALID_INTR_HANDLE(intr_handle);
154 return intr_handle->dev_fd;
159 int rte_intr_max_intr_set(struct rte_intr_handle *intr_handle,
162 CHECK_VALID_INTR_HANDLE(intr_handle);
164 if (max_intr > intr_handle->nb_intr) {
165 RTE_LOG(DEBUG, EAL, "Maximum interrupt vector ID (%d) exceeds "
166 "the number of available events (%d)\n", max_intr,
167 intr_handle->nb_intr);
172 intr_handle->max_intr = max_intr;
179 int rte_intr_max_intr_get(const struct rte_intr_handle *intr_handle)
181 CHECK_VALID_INTR_HANDLE(intr_handle);
183 return intr_handle->max_intr;
188 int rte_intr_nb_efd_set(struct rte_intr_handle *intr_handle, int nb_efd)
190 CHECK_VALID_INTR_HANDLE(intr_handle);
192 intr_handle->nb_efd = nb_efd;
199 int rte_intr_nb_efd_get(const struct rte_intr_handle *intr_handle)
201 CHECK_VALID_INTR_HANDLE(intr_handle);
203 return intr_handle->nb_efd;
208 int rte_intr_nb_intr_get(const struct rte_intr_handle *intr_handle)
210 CHECK_VALID_INTR_HANDLE(intr_handle);
212 return intr_handle->nb_intr;
217 int rte_intr_efd_counter_size_set(struct rte_intr_handle *intr_handle,
218 uint8_t efd_counter_size)
220 CHECK_VALID_INTR_HANDLE(intr_handle);
222 intr_handle->efd_counter_size = efd_counter_size;
229 int rte_intr_efd_counter_size_get(const struct rte_intr_handle *intr_handle)
231 CHECK_VALID_INTR_HANDLE(intr_handle);
233 return intr_handle->efd_counter_size;
238 int rte_intr_efds_index_get(const struct rte_intr_handle *intr_handle,
241 CHECK_VALID_INTR_HANDLE(intr_handle);
243 if (index >= intr_handle->nb_intr) {
244 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
245 intr_handle->nb_intr);
250 return intr_handle->efds[index];
255 int rte_intr_efds_index_set(struct rte_intr_handle *intr_handle,
258 CHECK_VALID_INTR_HANDLE(intr_handle);
260 if (index >= intr_handle->nb_intr) {
261 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
262 intr_handle->nb_intr);
267 intr_handle->efds[index] = fd;
274 struct rte_epoll_event *rte_intr_elist_index_get(
275 struct rte_intr_handle *intr_handle, int index)
277 CHECK_VALID_INTR_HANDLE(intr_handle);
279 if (index >= intr_handle->nb_intr) {
280 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
281 intr_handle->nb_intr);
286 return &intr_handle->elist[index];
291 int rte_intr_elist_index_set(struct rte_intr_handle *intr_handle,
292 int index, struct rte_epoll_event elist)
294 CHECK_VALID_INTR_HANDLE(intr_handle);
296 if (index >= intr_handle->nb_intr) {
297 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
298 intr_handle->nb_intr);
303 intr_handle->elist[index] = elist;
310 int rte_intr_vec_list_alloc(struct rte_intr_handle *intr_handle,
311 const char *name, int size)
313 CHECK_VALID_INTR_HANDLE(intr_handle);
315 /* Vector list already allocated */
316 if (intr_handle->intr_vec != NULL)
319 if (size > intr_handle->nb_intr) {
320 RTE_LOG(DEBUG, EAL, "Invalid size %d, max limit %d\n", size,
321 intr_handle->nb_intr);
326 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
327 intr_handle->intr_vec = rte_zmalloc(name, size * sizeof(int), 0);
329 intr_handle->intr_vec = calloc(size, sizeof(int));
330 if (intr_handle->intr_vec == NULL) {
331 RTE_LOG(ERR, EAL, "Failed to allocate %d intr_vec\n", size);
336 intr_handle->vec_list_size = size;
343 int rte_intr_vec_list_index_get(const struct rte_intr_handle *intr_handle,
346 CHECK_VALID_INTR_HANDLE(intr_handle);
348 if (index >= intr_handle->vec_list_size) {
349 RTE_LOG(DEBUG, EAL, "Index %d greater than vec list size %d\n",
350 index, intr_handle->vec_list_size);
355 return intr_handle->intr_vec[index];
360 int rte_intr_vec_list_index_set(struct rte_intr_handle *intr_handle,
363 CHECK_VALID_INTR_HANDLE(intr_handle);
365 if (index >= intr_handle->vec_list_size) {
366 RTE_LOG(DEBUG, EAL, "Index %d greater than vec list size %d\n",
367 index, intr_handle->vec_list_size);
372 intr_handle->intr_vec[index] = vec;
379 void rte_intr_vec_list_free(struct rte_intr_handle *intr_handle)
381 if (intr_handle == NULL)
383 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
384 rte_free(intr_handle->intr_vec);
386 free(intr_handle->intr_vec);
387 intr_handle->intr_vec = NULL;
388 intr_handle->vec_list_size = 0;
391 void *rte_intr_instance_windows_handle_get(struct rte_intr_handle *intr_handle)
393 CHECK_VALID_INTR_HANDLE(intr_handle);
395 return intr_handle->windows_handle;
400 int rte_intr_instance_windows_handle_set(struct rte_intr_handle *intr_handle,
401 void *windows_handle)
403 CHECK_VALID_INTR_HANDLE(intr_handle);
405 intr_handle->windows_handle = windows_handle;