1b7c98429SHarman Kalra /* SPDX-License-Identifier: BSD-3-Clause
2b7c98429SHarman Kalra * Copyright(C) 2021 Marvell.
3b7c98429SHarman Kalra */
4b7c98429SHarman Kalra
5b7c98429SHarman Kalra #include <stdlib.h>
6b7c98429SHarman Kalra #include <string.h>
7b7c98429SHarman Kalra
8b7c98429SHarman Kalra #include <rte_errno.h>
9b7c98429SHarman Kalra #include <rte_interrupts.h>
10b7c98429SHarman Kalra #include <rte_log.h>
11b7c98429SHarman Kalra #include <rte_malloc.h>
12b7c98429SHarman Kalra
1373d844fdSHarman Kalra #include "eal_interrupts.h"
14*ae67895bSDavid Marchand #include "eal_private.h"
1573d844fdSHarman Kalra
16b7c98429SHarman Kalra /* Macros to check for valid interrupt handle */
17b7c98429SHarman Kalra #define CHECK_VALID_INTR_HANDLE(intr_handle) do { \
18b7c98429SHarman Kalra if (intr_handle == NULL) { \
19*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Interrupt instance unallocated"); \
20b7c98429SHarman Kalra rte_errno = EINVAL; \
21b7c98429SHarman Kalra goto fail; \
22b7c98429SHarman Kalra } \
23b7c98429SHarman Kalra } while (0)
24b7c98429SHarman Kalra
25b7c98429SHarman Kalra #define RTE_INTR_INSTANCE_KNOWN_FLAGS (RTE_INTR_INSTANCE_F_PRIVATE \
26b7c98429SHarman Kalra | RTE_INTR_INSTANCE_F_SHARED \
27b7c98429SHarman Kalra )
28b7c98429SHarman Kalra
29b7c98429SHarman Kalra #define RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags) \
30b7c98429SHarman Kalra (!!(flags & RTE_INTR_INSTANCE_F_SHARED))
31b7c98429SHarman Kalra
rte_intr_instance_alloc(uint32_t flags)32b7c98429SHarman Kalra struct rte_intr_handle *rte_intr_instance_alloc(uint32_t flags)
33b7c98429SHarman Kalra {
34b7c98429SHarman Kalra struct rte_intr_handle *intr_handle;
35b7c98429SHarman Kalra bool uses_rte_memory;
36b7c98429SHarman Kalra
37b7c98429SHarman Kalra /* Check the flag passed by user, it should be part of the
38b7c98429SHarman Kalra * defined flags.
39b7c98429SHarman Kalra */
40b7c98429SHarman Kalra if ((flags & ~RTE_INTR_INSTANCE_KNOWN_FLAGS) != 0) {
41*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid alloc flag passed 0x%x", flags);
42b7c98429SHarman Kalra rte_errno = EINVAL;
43b7c98429SHarman Kalra return NULL;
44b7c98429SHarman Kalra }
45b7c98429SHarman Kalra
46b7c98429SHarman Kalra uses_rte_memory = RTE_INTR_INSTANCE_USES_RTE_MEMORY(flags);
47b7c98429SHarman Kalra if (uses_rte_memory)
48b7c98429SHarman Kalra intr_handle = rte_zmalloc(NULL, sizeof(*intr_handle), 0);
49b7c98429SHarman Kalra else
50b7c98429SHarman Kalra intr_handle = calloc(1, sizeof(*intr_handle));
51b7c98429SHarman Kalra if (intr_handle == NULL) {
52*ae67895bSDavid Marchand EAL_LOG(ERR, "Failed to allocate intr_handle");
53b7c98429SHarman Kalra rte_errno = ENOMEM;
54b7c98429SHarman Kalra return NULL;
55b7c98429SHarman Kalra }
56b7c98429SHarman Kalra
578cb5d08dSHarman Kalra if (uses_rte_memory) {
588cb5d08dSHarman Kalra intr_handle->efds = rte_zmalloc(NULL,
598cb5d08dSHarman Kalra RTE_MAX_RXTX_INTR_VEC_ID * sizeof(int), 0);
608cb5d08dSHarman Kalra } else {
618cb5d08dSHarman Kalra intr_handle->efds = calloc(RTE_MAX_RXTX_INTR_VEC_ID,
628cb5d08dSHarman Kalra sizeof(int));
638cb5d08dSHarman Kalra }
648cb5d08dSHarman Kalra if (intr_handle->efds == NULL) {
65*ae67895bSDavid Marchand EAL_LOG(ERR, "Fail to allocate event fd list");
668cb5d08dSHarman Kalra rte_errno = ENOMEM;
678cb5d08dSHarman Kalra goto fail;
688cb5d08dSHarman Kalra }
698cb5d08dSHarman Kalra
708cb5d08dSHarman Kalra if (uses_rte_memory) {
718cb5d08dSHarman Kalra intr_handle->elist = rte_zmalloc(NULL,
728cb5d08dSHarman Kalra RTE_MAX_RXTX_INTR_VEC_ID * sizeof(struct rte_epoll_event),
738cb5d08dSHarman Kalra 0);
748cb5d08dSHarman Kalra } else {
758cb5d08dSHarman Kalra intr_handle->elist = calloc(RTE_MAX_RXTX_INTR_VEC_ID,
768cb5d08dSHarman Kalra sizeof(struct rte_epoll_event));
778cb5d08dSHarman Kalra }
788cb5d08dSHarman Kalra if (intr_handle->elist == NULL) {
79*ae67895bSDavid Marchand EAL_LOG(ERR, "fail to allocate event fd list");
808cb5d08dSHarman Kalra rte_errno = ENOMEM;
818cb5d08dSHarman Kalra goto fail;
828cb5d08dSHarman Kalra }
838cb5d08dSHarman Kalra
84b7c98429SHarman Kalra intr_handle->alloc_flags = flags;
85b7c98429SHarman Kalra intr_handle->nb_intr = RTE_MAX_RXTX_INTR_VEC_ID;
86b7c98429SHarman Kalra
87b7c98429SHarman Kalra return intr_handle;
888cb5d08dSHarman Kalra fail:
898cb5d08dSHarman Kalra if (uses_rte_memory) {
908cb5d08dSHarman Kalra rte_free(intr_handle->efds);
918cb5d08dSHarman Kalra rte_free(intr_handle);
928cb5d08dSHarman Kalra } else {
938cb5d08dSHarman Kalra free(intr_handle->efds);
948cb5d08dSHarman Kalra free(intr_handle);
958cb5d08dSHarman Kalra }
968cb5d08dSHarman Kalra return NULL;
97b7c98429SHarman Kalra }
98b7c98429SHarman Kalra
rte_intr_instance_dup(const struct rte_intr_handle * src)99b7c98429SHarman Kalra struct rte_intr_handle *rte_intr_instance_dup(const struct rte_intr_handle *src)
100b7c98429SHarman Kalra {
101b7c98429SHarman Kalra struct rte_intr_handle *intr_handle;
102b7c98429SHarman Kalra
103b7c98429SHarman Kalra if (src == NULL) {
104*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Source interrupt instance unallocated");
105b7c98429SHarman Kalra rte_errno = EINVAL;
106b7c98429SHarman Kalra return NULL;
107b7c98429SHarman Kalra }
108b7c98429SHarman Kalra
109b7c98429SHarman Kalra intr_handle = rte_intr_instance_alloc(src->alloc_flags);
110b7c98429SHarman Kalra if (intr_handle != NULL) {
111b7c98429SHarman Kalra intr_handle->fd = src->fd;
11299e6c7e3SHarman Kalra intr_handle->dev_fd = src->dev_fd;
113b7c98429SHarman Kalra intr_handle->type = src->type;
114b7c98429SHarman Kalra intr_handle->max_intr = src->max_intr;
115b7c98429SHarman Kalra intr_handle->nb_efd = src->nb_efd;
116b7c98429SHarman Kalra intr_handle->efd_counter_size = src->efd_counter_size;
117b7c98429SHarman Kalra memcpy(intr_handle->efds, src->efds, src->nb_intr);
118b7c98429SHarman Kalra memcpy(intr_handle->elist, src->elist, src->nb_intr);
119b7c98429SHarman Kalra }
120b7c98429SHarman Kalra
121b7c98429SHarman Kalra return intr_handle;
122b7c98429SHarman Kalra }
123b7c98429SHarman Kalra
rte_intr_event_list_update(struct rte_intr_handle * intr_handle,int size)1248cb5d08dSHarman Kalra int rte_intr_event_list_update(struct rte_intr_handle *intr_handle, int size)
1258cb5d08dSHarman Kalra {
1268cb5d08dSHarman Kalra struct rte_epoll_event *tmp_elist;
1278cb5d08dSHarman Kalra bool uses_rte_memory;
1288cb5d08dSHarman Kalra int *tmp_efds;
1298cb5d08dSHarman Kalra
1308cb5d08dSHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
1318cb5d08dSHarman Kalra
1328cb5d08dSHarman Kalra if (size == 0) {
133*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Size can't be zero");
1348cb5d08dSHarman Kalra rte_errno = EINVAL;
1358cb5d08dSHarman Kalra goto fail;
1368cb5d08dSHarman Kalra }
1378cb5d08dSHarman Kalra
1388cb5d08dSHarman Kalra uses_rte_memory =
1398cb5d08dSHarman Kalra RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags);
1408cb5d08dSHarman Kalra if (uses_rte_memory) {
1418cb5d08dSHarman Kalra tmp_efds = rte_realloc(intr_handle->efds, size * sizeof(int),
1428cb5d08dSHarman Kalra 0);
1438cb5d08dSHarman Kalra } else {
1448cb5d08dSHarman Kalra tmp_efds = realloc(intr_handle->efds, size * sizeof(int));
1458cb5d08dSHarman Kalra }
1468cb5d08dSHarman Kalra if (tmp_efds == NULL) {
147*ae67895bSDavid Marchand EAL_LOG(ERR, "Failed to realloc the efds list");
1488cb5d08dSHarman Kalra rte_errno = ENOMEM;
1498cb5d08dSHarman Kalra goto fail;
1508cb5d08dSHarman Kalra }
1518cb5d08dSHarman Kalra intr_handle->efds = tmp_efds;
1528cb5d08dSHarman Kalra
1538cb5d08dSHarman Kalra if (uses_rte_memory) {
1548cb5d08dSHarman Kalra tmp_elist = rte_realloc(intr_handle->elist,
1558cb5d08dSHarman Kalra size * sizeof(struct rte_epoll_event), 0);
1568cb5d08dSHarman Kalra } else {
1578cb5d08dSHarman Kalra tmp_elist = realloc(intr_handle->elist,
1588cb5d08dSHarman Kalra size * sizeof(struct rte_epoll_event));
1598cb5d08dSHarman Kalra }
1608cb5d08dSHarman Kalra if (tmp_elist == NULL) {
161*ae67895bSDavid Marchand EAL_LOG(ERR, "Failed to realloc the event list");
1628cb5d08dSHarman Kalra rte_errno = ENOMEM;
1638cb5d08dSHarman Kalra goto fail;
1648cb5d08dSHarman Kalra }
1658cb5d08dSHarman Kalra intr_handle->elist = tmp_elist;
1668cb5d08dSHarman Kalra
1678cb5d08dSHarman Kalra intr_handle->nb_intr = size;
1688cb5d08dSHarman Kalra
1698cb5d08dSHarman Kalra return 0;
1708cb5d08dSHarman Kalra fail:
1718cb5d08dSHarman Kalra return -rte_errno;
1728cb5d08dSHarman Kalra }
1738cb5d08dSHarman Kalra
rte_intr_instance_free(struct rte_intr_handle * intr_handle)174b7c98429SHarman Kalra void rte_intr_instance_free(struct rte_intr_handle *intr_handle)
175b7c98429SHarman Kalra {
176b7c98429SHarman Kalra if (intr_handle == NULL)
177b7c98429SHarman Kalra return;
1788cb5d08dSHarman Kalra if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags)) {
1798cb5d08dSHarman Kalra rte_free(intr_handle->efds);
1808cb5d08dSHarman Kalra rte_free(intr_handle->elist);
181b7c98429SHarman Kalra rte_free(intr_handle);
1828cb5d08dSHarman Kalra } else {
1838cb5d08dSHarman Kalra free(intr_handle->efds);
1848cb5d08dSHarman Kalra free(intr_handle->elist);
185b7c98429SHarman Kalra free(intr_handle);
186b7c98429SHarman Kalra }
1878cb5d08dSHarman Kalra }
188b7c98429SHarman Kalra
rte_intr_fd_set(struct rte_intr_handle * intr_handle,int fd)189b7c98429SHarman Kalra int rte_intr_fd_set(struct rte_intr_handle *intr_handle, int fd)
190b7c98429SHarman Kalra {
191b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
192b7c98429SHarman Kalra
193b7c98429SHarman Kalra intr_handle->fd = fd;
194b7c98429SHarman Kalra
195b7c98429SHarman Kalra return 0;
196b7c98429SHarman Kalra fail:
197b7c98429SHarman Kalra return -rte_errno;
198b7c98429SHarman Kalra }
199b7c98429SHarman Kalra
rte_intr_fd_get(const struct rte_intr_handle * intr_handle)200b7c98429SHarman Kalra int rte_intr_fd_get(const struct rte_intr_handle *intr_handle)
201b7c98429SHarman Kalra {
202b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
203b7c98429SHarman Kalra
204b7c98429SHarman Kalra return intr_handle->fd;
205b7c98429SHarman Kalra fail:
206b7c98429SHarman Kalra return -1;
207b7c98429SHarman Kalra }
208b7c98429SHarman Kalra
rte_intr_type_set(struct rte_intr_handle * intr_handle,enum rte_intr_handle_type type)209b7c98429SHarman Kalra int rte_intr_type_set(struct rte_intr_handle *intr_handle,
210b7c98429SHarman Kalra enum rte_intr_handle_type type)
211b7c98429SHarman Kalra {
212b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
213b7c98429SHarman Kalra
214b7c98429SHarman Kalra intr_handle->type = type;
215b7c98429SHarman Kalra
216b7c98429SHarman Kalra return 0;
217b7c98429SHarman Kalra fail:
218b7c98429SHarman Kalra return -rte_errno;
219b7c98429SHarman Kalra }
220b7c98429SHarman Kalra
rte_intr_type_get(const struct rte_intr_handle * intr_handle)221b7c98429SHarman Kalra enum rte_intr_handle_type rte_intr_type_get(
222b7c98429SHarman Kalra const struct rte_intr_handle *intr_handle)
223b7c98429SHarman Kalra {
224b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
225b7c98429SHarman Kalra
226b7c98429SHarman Kalra return intr_handle->type;
227b7c98429SHarman Kalra fail:
228b7c98429SHarman Kalra return RTE_INTR_HANDLE_UNKNOWN;
229b7c98429SHarman Kalra }
230b7c98429SHarman Kalra
rte_intr_dev_fd_set(struct rte_intr_handle * intr_handle,int fd)231b7c98429SHarman Kalra int rte_intr_dev_fd_set(struct rte_intr_handle *intr_handle, int fd)
232b7c98429SHarman Kalra {
233b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
234b7c98429SHarman Kalra
23599e6c7e3SHarman Kalra intr_handle->dev_fd = fd;
236b7c98429SHarman Kalra
237b7c98429SHarman Kalra return 0;
238b7c98429SHarman Kalra fail:
239b7c98429SHarman Kalra return -rte_errno;
240b7c98429SHarman Kalra }
241b7c98429SHarman Kalra
rte_intr_dev_fd_get(const struct rte_intr_handle * intr_handle)242b7c98429SHarman Kalra int rte_intr_dev_fd_get(const struct rte_intr_handle *intr_handle)
243b7c98429SHarman Kalra {
244b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
245b7c98429SHarman Kalra
24699e6c7e3SHarman Kalra return intr_handle->dev_fd;
247b7c98429SHarman Kalra fail:
248b7c98429SHarman Kalra return -1;
249b7c98429SHarman Kalra }
250b7c98429SHarman Kalra
rte_intr_max_intr_set(struct rte_intr_handle * intr_handle,int max_intr)251b7c98429SHarman Kalra int rte_intr_max_intr_set(struct rte_intr_handle *intr_handle,
252b7c98429SHarman Kalra int max_intr)
253b7c98429SHarman Kalra {
254b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
255b7c98429SHarman Kalra
256b7c98429SHarman Kalra if (max_intr > intr_handle->nb_intr) {
257*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Maximum interrupt vector ID (%d) exceeds "
258*ae67895bSDavid Marchand "the number of available events (%d)", max_intr,
259b7c98429SHarman Kalra intr_handle->nb_intr);
260b7c98429SHarman Kalra rte_errno = ERANGE;
261b7c98429SHarman Kalra goto fail;
262b7c98429SHarman Kalra }
263b7c98429SHarman Kalra
264b7c98429SHarman Kalra intr_handle->max_intr = max_intr;
265b7c98429SHarman Kalra
266b7c98429SHarman Kalra return 0;
267b7c98429SHarman Kalra fail:
268b7c98429SHarman Kalra return -rte_errno;
269b7c98429SHarman Kalra }
270b7c98429SHarman Kalra
rte_intr_max_intr_get(const struct rte_intr_handle * intr_handle)271b7c98429SHarman Kalra int rte_intr_max_intr_get(const struct rte_intr_handle *intr_handle)
272b7c98429SHarman Kalra {
273b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
274b7c98429SHarman Kalra
275b7c98429SHarman Kalra return intr_handle->max_intr;
276b7c98429SHarman Kalra fail:
277b7c98429SHarman Kalra return -rte_errno;
278b7c98429SHarman Kalra }
279b7c98429SHarman Kalra
rte_intr_nb_efd_set(struct rte_intr_handle * intr_handle,int nb_efd)280b7c98429SHarman Kalra int rte_intr_nb_efd_set(struct rte_intr_handle *intr_handle, int nb_efd)
281b7c98429SHarman Kalra {
282b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
283b7c98429SHarman Kalra
284b7c98429SHarman Kalra intr_handle->nb_efd = nb_efd;
285b7c98429SHarman Kalra
286b7c98429SHarman Kalra return 0;
287b7c98429SHarman Kalra fail:
288b7c98429SHarman Kalra return -rte_errno;
289b7c98429SHarman Kalra }
290b7c98429SHarman Kalra
rte_intr_nb_efd_get(const struct rte_intr_handle * intr_handle)291b7c98429SHarman Kalra int rte_intr_nb_efd_get(const struct rte_intr_handle *intr_handle)
292b7c98429SHarman Kalra {
293b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
294b7c98429SHarman Kalra
295b7c98429SHarman Kalra return intr_handle->nb_efd;
296b7c98429SHarman Kalra fail:
297b7c98429SHarman Kalra return -rte_errno;
298b7c98429SHarman Kalra }
299b7c98429SHarman Kalra
rte_intr_nb_intr_get(const struct rte_intr_handle * intr_handle)300b7c98429SHarman Kalra int rte_intr_nb_intr_get(const struct rte_intr_handle *intr_handle)
301b7c98429SHarman Kalra {
302b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
303b7c98429SHarman Kalra
304b7c98429SHarman Kalra return intr_handle->nb_intr;
305b7c98429SHarman Kalra fail:
306b7c98429SHarman Kalra return -rte_errno;
307b7c98429SHarman Kalra }
308b7c98429SHarman Kalra
rte_intr_efd_counter_size_set(struct rte_intr_handle * intr_handle,uint8_t efd_counter_size)309b7c98429SHarman Kalra int rte_intr_efd_counter_size_set(struct rte_intr_handle *intr_handle,
310b7c98429SHarman Kalra uint8_t efd_counter_size)
311b7c98429SHarman Kalra {
312b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
313b7c98429SHarman Kalra
314b7c98429SHarman Kalra intr_handle->efd_counter_size = efd_counter_size;
315b7c98429SHarman Kalra
316b7c98429SHarman Kalra return 0;
317b7c98429SHarman Kalra fail:
318b7c98429SHarman Kalra return -rte_errno;
319b7c98429SHarman Kalra }
320b7c98429SHarman Kalra
rte_intr_efd_counter_size_get(const struct rte_intr_handle * intr_handle)321b7c98429SHarman Kalra int rte_intr_efd_counter_size_get(const struct rte_intr_handle *intr_handle)
322b7c98429SHarman Kalra {
323b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
324b7c98429SHarman Kalra
325b7c98429SHarman Kalra return intr_handle->efd_counter_size;
326b7c98429SHarman Kalra fail:
327b7c98429SHarman Kalra return -rte_errno;
328b7c98429SHarman Kalra }
329b7c98429SHarman Kalra
rte_intr_efds_index_get(const struct rte_intr_handle * intr_handle,int index)330b7c98429SHarman Kalra int rte_intr_efds_index_get(const struct rte_intr_handle *intr_handle,
331b7c98429SHarman Kalra int index)
332b7c98429SHarman Kalra {
333b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
334b7c98429SHarman Kalra
335b7c98429SHarman Kalra if (index >= intr_handle->nb_intr) {
336*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid index %d, max limit %d", index,
337b7c98429SHarman Kalra intr_handle->nb_intr);
338b7c98429SHarman Kalra rte_errno = EINVAL;
339b7c98429SHarman Kalra goto fail;
340b7c98429SHarman Kalra }
341b7c98429SHarman Kalra
342b7c98429SHarman Kalra return intr_handle->efds[index];
343b7c98429SHarman Kalra fail:
344b7c98429SHarman Kalra return -rte_errno;
345b7c98429SHarman Kalra }
346b7c98429SHarman Kalra
rte_intr_efds_index_set(struct rte_intr_handle * intr_handle,int index,int fd)347b7c98429SHarman Kalra int rte_intr_efds_index_set(struct rte_intr_handle *intr_handle,
348b7c98429SHarman Kalra int index, int fd)
349b7c98429SHarman Kalra {
350b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
351b7c98429SHarman Kalra
352b7c98429SHarman Kalra if (index >= intr_handle->nb_intr) {
353*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid index %d, max limit %d", index,
354b7c98429SHarman Kalra intr_handle->nb_intr);
355b7c98429SHarman Kalra rte_errno = ERANGE;
356b7c98429SHarman Kalra goto fail;
357b7c98429SHarman Kalra }
358b7c98429SHarman Kalra
359b7c98429SHarman Kalra intr_handle->efds[index] = fd;
360b7c98429SHarman Kalra
361b7c98429SHarman Kalra return 0;
362b7c98429SHarman Kalra fail:
363b7c98429SHarman Kalra return -rte_errno;
364b7c98429SHarman Kalra }
365b7c98429SHarman Kalra
rte_intr_elist_index_get(struct rte_intr_handle * intr_handle,int index)366b7c98429SHarman Kalra struct rte_epoll_event *rte_intr_elist_index_get(
367b7c98429SHarman Kalra struct rte_intr_handle *intr_handle, int index)
368b7c98429SHarman Kalra {
369b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
370b7c98429SHarman Kalra
371b7c98429SHarman Kalra if (index >= intr_handle->nb_intr) {
372*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid index %d, max limit %d", index,
373b7c98429SHarman Kalra intr_handle->nb_intr);
374b7c98429SHarman Kalra rte_errno = ERANGE;
375b7c98429SHarman Kalra goto fail;
376b7c98429SHarman Kalra }
377b7c98429SHarman Kalra
378b7c98429SHarman Kalra return &intr_handle->elist[index];
379b7c98429SHarman Kalra fail:
380b7c98429SHarman Kalra return NULL;
381b7c98429SHarman Kalra }
382b7c98429SHarman Kalra
rte_intr_elist_index_set(struct rte_intr_handle * intr_handle,int index,struct rte_epoll_event elist)383b7c98429SHarman Kalra int rte_intr_elist_index_set(struct rte_intr_handle *intr_handle,
384b7c98429SHarman Kalra int index, struct rte_epoll_event elist)
385b7c98429SHarman Kalra {
386b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
387b7c98429SHarman Kalra
388b7c98429SHarman Kalra if (index >= intr_handle->nb_intr) {
389*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid index %d, max limit %d", index,
390b7c98429SHarman Kalra intr_handle->nb_intr);
391b7c98429SHarman Kalra rte_errno = ERANGE;
392b7c98429SHarman Kalra goto fail;
393b7c98429SHarman Kalra }
394b7c98429SHarman Kalra
395b7c98429SHarman Kalra intr_handle->elist[index] = elist;
396b7c98429SHarman Kalra
397b7c98429SHarman Kalra return 0;
398b7c98429SHarman Kalra fail:
399b7c98429SHarman Kalra return -rte_errno;
400b7c98429SHarman Kalra }
401b7c98429SHarman Kalra
rte_intr_vec_list_alloc(struct rte_intr_handle * intr_handle,const char * name,int size)402b7c98429SHarman Kalra int rte_intr_vec_list_alloc(struct rte_intr_handle *intr_handle,
403b7c98429SHarman Kalra const char *name, int size)
404b7c98429SHarman Kalra {
405b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
406b7c98429SHarman Kalra
407b7c98429SHarman Kalra /* Vector list already allocated */
408b7c98429SHarman Kalra if (intr_handle->intr_vec != NULL)
409b7c98429SHarman Kalra return 0;
410b7c98429SHarman Kalra
411b7c98429SHarman Kalra if (size > intr_handle->nb_intr) {
412*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Invalid size %d, max limit %d", size,
413b7c98429SHarman Kalra intr_handle->nb_intr);
414b7c98429SHarman Kalra rte_errno = ERANGE;
415b7c98429SHarman Kalra goto fail;
416b7c98429SHarman Kalra }
417b7c98429SHarman Kalra
418b7c98429SHarman Kalra if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
419b7c98429SHarman Kalra intr_handle->intr_vec = rte_zmalloc(name, size * sizeof(int), 0);
420b7c98429SHarman Kalra else
421b7c98429SHarman Kalra intr_handle->intr_vec = calloc(size, sizeof(int));
422b7c98429SHarman Kalra if (intr_handle->intr_vec == NULL) {
423*ae67895bSDavid Marchand EAL_LOG(ERR, "Failed to allocate %d intr_vec", size);
424b7c98429SHarman Kalra rte_errno = ENOMEM;
425b7c98429SHarman Kalra goto fail;
426b7c98429SHarman Kalra }
427b7c98429SHarman Kalra
428b7c98429SHarman Kalra intr_handle->vec_list_size = size;
429b7c98429SHarman Kalra
430b7c98429SHarman Kalra return 0;
431b7c98429SHarman Kalra fail:
432b7c98429SHarman Kalra return -rte_errno;
433b7c98429SHarman Kalra }
434b7c98429SHarman Kalra
rte_intr_vec_list_index_get(const struct rte_intr_handle * intr_handle,int index)435b7c98429SHarman Kalra int rte_intr_vec_list_index_get(const struct rte_intr_handle *intr_handle,
436b7c98429SHarman Kalra int index)
437b7c98429SHarman Kalra {
438b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
439b7c98429SHarman Kalra
440b7c98429SHarman Kalra if (index >= intr_handle->vec_list_size) {
441*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Index %d greater than vec list size %d",
442b7c98429SHarman Kalra index, intr_handle->vec_list_size);
443b7c98429SHarman Kalra rte_errno = ERANGE;
444b7c98429SHarman Kalra goto fail;
445b7c98429SHarman Kalra }
446b7c98429SHarman Kalra
447b7c98429SHarman Kalra return intr_handle->intr_vec[index];
448b7c98429SHarman Kalra fail:
449b7c98429SHarman Kalra return -rte_errno;
450b7c98429SHarman Kalra }
451b7c98429SHarman Kalra
rte_intr_vec_list_index_set(struct rte_intr_handle * intr_handle,int index,int vec)452b7c98429SHarman Kalra int rte_intr_vec_list_index_set(struct rte_intr_handle *intr_handle,
453b7c98429SHarman Kalra int index, int vec)
454b7c98429SHarman Kalra {
455b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
456b7c98429SHarman Kalra
457b7c98429SHarman Kalra if (index >= intr_handle->vec_list_size) {
458*ae67895bSDavid Marchand EAL_LOG(DEBUG, "Index %d greater than vec list size %d",
459b7c98429SHarman Kalra index, intr_handle->vec_list_size);
460b7c98429SHarman Kalra rte_errno = ERANGE;
461b7c98429SHarman Kalra goto fail;
462b7c98429SHarman Kalra }
463b7c98429SHarman Kalra
464b7c98429SHarman Kalra intr_handle->intr_vec[index] = vec;
465b7c98429SHarman Kalra
466b7c98429SHarman Kalra return 0;
467b7c98429SHarman Kalra fail:
468b7c98429SHarman Kalra return -rte_errno;
469b7c98429SHarman Kalra }
470b7c98429SHarman Kalra
rte_intr_vec_list_free(struct rte_intr_handle * intr_handle)471b7c98429SHarman Kalra void rte_intr_vec_list_free(struct rte_intr_handle *intr_handle)
472b7c98429SHarman Kalra {
473b7c98429SHarman Kalra if (intr_handle == NULL)
474b7c98429SHarman Kalra return;
475b7c98429SHarman Kalra if (RTE_INTR_INSTANCE_USES_RTE_MEMORY(intr_handle->alloc_flags))
476b7c98429SHarman Kalra rte_free(intr_handle->intr_vec);
477b7c98429SHarman Kalra else
478b7c98429SHarman Kalra free(intr_handle->intr_vec);
479b7c98429SHarman Kalra intr_handle->intr_vec = NULL;
480b7c98429SHarman Kalra intr_handle->vec_list_size = 0;
481b7c98429SHarman Kalra }
482b7c98429SHarman Kalra
rte_intr_instance_windows_handle_get(struct rte_intr_handle * intr_handle)483b7c98429SHarman Kalra void *rte_intr_instance_windows_handle_get(struct rte_intr_handle *intr_handle)
484b7c98429SHarman Kalra {
485b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
486b7c98429SHarman Kalra
487b7c98429SHarman Kalra return intr_handle->windows_handle;
488b7c98429SHarman Kalra fail:
489b7c98429SHarman Kalra return NULL;
490b7c98429SHarman Kalra }
491b7c98429SHarman Kalra
rte_intr_instance_windows_handle_set(struct rte_intr_handle * intr_handle,void * windows_handle)492b7c98429SHarman Kalra int rte_intr_instance_windows_handle_set(struct rte_intr_handle *intr_handle,
493b7c98429SHarman Kalra void *windows_handle)
494b7c98429SHarman Kalra {
495b7c98429SHarman Kalra CHECK_VALID_INTR_HANDLE(intr_handle);
496b7c98429SHarman Kalra
497b7c98429SHarman Kalra intr_handle->windows_handle = windows_handle;
498b7c98429SHarman Kalra
499b7c98429SHarman Kalra return 0;
500b7c98429SHarman Kalra fail:
501b7c98429SHarman Kalra return -rte_errno;
502b7c98429SHarman Kalra }
503