1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
9 #include <rte_interrupts.h>
11 #include <rte_malloc.h>
13 /* Macros to check for valid interrupt handle */
14 #define CHECK_VALID_INTR_HANDLE(intr_handle) do { \
15 if (intr_handle == NULL) { \
16 RTE_LOG(DEBUG, EAL, "Interrupt instance unallocated\n"); \
22 #define RTE_INTR_INSTANCE_KNOWN_FLAGS (RTE_INTR_INSTANCE_F_PRIVATE \
23 | RTE_INTR_INSTANCE_F_SHARED \
26 #define RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags) \
27 (!!(flags & RTE_INTR_INSTANCE_F_SHARED))
29 struct rte_intr_handle *rte_intr_instance_alloc(uint32_t flags)
31 struct rte_intr_handle *intr_handle;
34 /* Check the flag passed by user, it should be part of the
37 if ((flags & ~RTE_INTR_INSTANCE_KNOWN_FLAGS) != 0) {
38 RTE_LOG(DEBUG, EAL, "Invalid alloc flag passed 0x%x\n", flags);
43 uses_rte_memory = RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags);
45 intr_handle = rte_zmalloc(NULL, sizeof(*intr_handle), 0);
47 intr_handle = calloc(1, sizeof(*intr_handle));
48 if (intr_handle == NULL) {
49 RTE_LOG(ERR, EAL, "Failed to allocate intr_handle\n");
54 intr_handle->alloc_flags = flags;
55 intr_handle->nb_intr = RTE_MAX_RXTX_INTR_VEC_ID;
60 struct rte_intr_handle *rte_intr_instance_dup(const struct rte_intr_handle *src)
62 struct rte_intr_handle *intr_handle;
65 RTE_LOG(DEBUG, EAL, "Source interrupt instance unallocated\n");
70 intr_handle = rte_intr_instance_alloc(src->alloc_flags);
71 if (intr_handle != NULL) {
72 intr_handle->fd = src->fd;
73 intr_handle->vfio_dev_fd = src->vfio_dev_fd;
74 intr_handle->type = src->type;
75 intr_handle->max_intr = src->max_intr;
76 intr_handle->nb_efd = src->nb_efd;
77 intr_handle->efd_counter_size = src->efd_counter_size;
78 memcpy(intr_handle->efds, src->efds, src->nb_intr);
79 memcpy(intr_handle->elist, src->elist, src->nb_intr);
85 void rte_intr_instance_free(struct rte_intr_handle *intr_handle)
87 if (intr_handle == NULL)
89 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
90 rte_free(intr_handle);
95 int rte_intr_fd_set(struct rte_intr_handle *intr_handle, int fd)
97 CHECK_VALID_INTR_HANDLE(intr_handle);
106 int rte_intr_fd_get(const struct rte_intr_handle *intr_handle)
108 CHECK_VALID_INTR_HANDLE(intr_handle);
110 return intr_handle->fd;
115 int rte_intr_type_set(struct rte_intr_handle *intr_handle,
116 enum rte_intr_handle_type type)
118 CHECK_VALID_INTR_HANDLE(intr_handle);
120 intr_handle->type = type;
127 enum rte_intr_handle_type rte_intr_type_get(
128 const struct rte_intr_handle *intr_handle)
130 CHECK_VALID_INTR_HANDLE(intr_handle);
132 return intr_handle->type;
134 return RTE_INTR_HANDLE_UNKNOWN;
137 int rte_intr_dev_fd_set(struct rte_intr_handle *intr_handle, int fd)
139 CHECK_VALID_INTR_HANDLE(intr_handle);
141 intr_handle->vfio_dev_fd = fd;
148 int rte_intr_dev_fd_get(const struct rte_intr_handle *intr_handle)
150 CHECK_VALID_INTR_HANDLE(intr_handle);
152 return intr_handle->vfio_dev_fd;
157 int rte_intr_max_intr_set(struct rte_intr_handle *intr_handle,
160 CHECK_VALID_INTR_HANDLE(intr_handle);
162 if (max_intr > intr_handle->nb_intr) {
163 RTE_LOG(DEBUG, EAL, "Maximum interrupt vector ID (%d) exceeds "
164 "the number of available events (%d)\n", max_intr,
165 intr_handle->nb_intr);
170 intr_handle->max_intr = max_intr;
177 int rte_intr_max_intr_get(const struct rte_intr_handle *intr_handle)
179 CHECK_VALID_INTR_HANDLE(intr_handle);
181 return intr_handle->max_intr;
186 int rte_intr_nb_efd_set(struct rte_intr_handle *intr_handle, int nb_efd)
188 CHECK_VALID_INTR_HANDLE(intr_handle);
190 intr_handle->nb_efd = nb_efd;
197 int rte_intr_nb_efd_get(const struct rte_intr_handle *intr_handle)
199 CHECK_VALID_INTR_HANDLE(intr_handle);
201 return intr_handle->nb_efd;
206 int rte_intr_nb_intr_get(const struct rte_intr_handle *intr_handle)
208 CHECK_VALID_INTR_HANDLE(intr_handle);
210 return intr_handle->nb_intr;
215 int rte_intr_efd_counter_size_set(struct rte_intr_handle *intr_handle,
216 uint8_t efd_counter_size)
218 CHECK_VALID_INTR_HANDLE(intr_handle);
220 intr_handle->efd_counter_size = efd_counter_size;
227 int rte_intr_efd_counter_size_get(const struct rte_intr_handle *intr_handle)
229 CHECK_VALID_INTR_HANDLE(intr_handle);
231 return intr_handle->efd_counter_size;
236 int rte_intr_efds_index_get(const struct rte_intr_handle *intr_handle,
239 CHECK_VALID_INTR_HANDLE(intr_handle);
241 if (index >= intr_handle->nb_intr) {
242 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
243 intr_handle->nb_intr);
248 return intr_handle->efds[index];
253 int rte_intr_efds_index_set(struct rte_intr_handle *intr_handle,
256 CHECK_VALID_INTR_HANDLE(intr_handle);
258 if (index >= intr_handle->nb_intr) {
259 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
260 intr_handle->nb_intr);
265 intr_handle->efds[index] = fd;
272 struct rte_epoll_event *rte_intr_elist_index_get(
273 struct rte_intr_handle *intr_handle, int index)
275 CHECK_VALID_INTR_HANDLE(intr_handle);
277 if (index >= intr_handle->nb_intr) {
278 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
279 intr_handle->nb_intr);
284 return &intr_handle->elist[index];
289 int rte_intr_elist_index_set(struct rte_intr_handle *intr_handle,
290 int index, struct rte_epoll_event elist)
292 CHECK_VALID_INTR_HANDLE(intr_handle);
294 if (index >= intr_handle->nb_intr) {
295 RTE_LOG(DEBUG, EAL, "Invalid index %d, max limit %d\n", index,
296 intr_handle->nb_intr);
301 intr_handle->elist[index] = elist;
308 int rte_intr_vec_list_alloc(struct rte_intr_handle *intr_handle,
309 const char *name, int size)
311 CHECK_VALID_INTR_HANDLE(intr_handle);
313 /* Vector list already allocated */
314 if (intr_handle->intr_vec != NULL)
317 if (size > intr_handle->nb_intr) {
318 RTE_LOG(DEBUG, EAL, "Invalid size %d, max limit %d\n", size,
319 intr_handle->nb_intr);
324 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
325 intr_handle->intr_vec = rte_zmalloc(name, size * sizeof(int), 0);
327 intr_handle->intr_vec = calloc(size, sizeof(int));
328 if (intr_handle->intr_vec == NULL) {
329 RTE_LOG(ERR, EAL, "Failed to allocate %d intr_vec\n", size);
334 intr_handle->vec_list_size = size;
341 int rte_intr_vec_list_index_get(const struct rte_intr_handle *intr_handle,
344 CHECK_VALID_INTR_HANDLE(intr_handle);
346 if (index >= intr_handle->vec_list_size) {
347 RTE_LOG(DEBUG, EAL, "Index %d greater than vec list size %d\n",
348 index, intr_handle->vec_list_size);
353 return intr_handle->intr_vec[index];
358 int rte_intr_vec_list_index_set(struct rte_intr_handle *intr_handle,
361 CHECK_VALID_INTR_HANDLE(intr_handle);
363 if (index >= intr_handle->vec_list_size) {
364 RTE_LOG(DEBUG, EAL, "Index %d greater than vec list size %d\n",
365 index, intr_handle->vec_list_size);
370 intr_handle->intr_vec[index] = vec;
377 void rte_intr_vec_list_free(struct rte_intr_handle *intr_handle)
379 if (intr_handle == NULL)
381 if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
382 rte_free(intr_handle->intr_vec);
384 free(intr_handle->intr_vec);
385 intr_handle->intr_vec = NULL;
386 intr_handle->vec_list_size = 0;
389 void *rte_intr_instance_windows_handle_get(struct rte_intr_handle *intr_handle)
391 CHECK_VALID_INTR_HANDLE(intr_handle);
393 return intr_handle->windows_handle;
398 int rte_intr_instance_windows_handle_set(struct rte_intr_handle *intr_handle,
399 void *windows_handle)
401 CHECK_VALID_INTR_HANDLE(intr_handle);
403 intr_handle->windows_handle = windows_handle;