xref: /dpdk/lib/eal/common/eal_common_interrupts.c (revision ae67895b507bb6af22263c79ba0d5c374b396485)
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