1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2020 Dmitry Kozlyuk 3 */ 4 5 #ifndef _EAL_WINDOWS_H_ 6 #define _EAL_WINDOWS_H_ 7 8 /** 9 * @file Facilities private to Windows EAL 10 */ 11 12 #include <rte_errno.h> 13 #include <rte_windows.h> 14 15 /** 16 * Log current function as not implemented and set rte_errno. 17 */ 18 #define EAL_LOG_NOT_IMPLEMENTED() \ 19 do { \ 20 RTE_LOG(DEBUG, EAL, "%s() is not implemented\n", __func__); \ 21 rte_errno = ENOTSUP; \ 22 } while (0) 23 24 /** 25 * Log current function as a stub. 26 */ 27 #define EAL_LOG_STUB() \ 28 RTE_LOG(DEBUG, EAL, "Windows: %s() is a stub\n", __func__) 29 30 /** 31 * Create a map of processors and cores on the system. 32 * 33 * @return 34 * 0 on success, (-1) on failure and rte_errno is set. 35 */ 36 int eal_create_cpu_map(void); 37 38 /** 39 * Create a thread. 40 * 41 * @param thread 42 * The location to store the thread id if successful. 43 * @param lcore_id 44 * The lcore_id of this worker thread. 45 * @return 46 * 0 for success, -1 if the thread is not created. 47 */ 48 int eal_thread_create(pthread_t *thread, unsigned int lcore_id); 49 50 /** 51 * Get system NUMA node number for a socket ID. 52 * 53 * @param socket_id 54 * Valid EAL socket ID. 55 * @return 56 * NUMA node number to use with Win32 API. 57 */ 58 unsigned int eal_socket_numa_node(unsigned int socket_id); 59 60 /** 61 * Get pointer to the group affinity for the cpu. 62 * 63 * @param cpu_index 64 * Index of the cpu, as it comes from rte_cpuset_t. 65 * @return 66 * Pointer to the group affinity for the cpu. 67 */ 68 PGROUP_AFFINITY eal_get_cpu_affinity(size_t cpu_index); 69 70 /** 71 * Schedule code for execution in the interrupt thread. 72 * 73 * @param func 74 * Function to call. 75 * @param arg 76 * Argument to the called function. 77 * @return 78 * 0 on success, negative error code on failure. 79 */ 80 int eal_intr_thread_schedule(void (*func)(void *arg), void *arg); 81 82 /** 83 * Request interrupt thread to stop and wait its termination. 84 */ 85 void eal_intr_thread_cancel(void); 86 87 /** 88 * Open virt2phys driver interface device. 89 * 90 * @return 0 on success, (-1) on failure. 91 */ 92 int eal_mem_virt2iova_init(void); 93 94 /** 95 * Cleanup resources used for virtual to physical address translation. 96 */ 97 void eal_mem_virt2iova_cleanup(void); 98 99 /** 100 * Locate Win32 memory management routines in system libraries. 101 * 102 * @return 0 on success, (-1) on failure. 103 */ 104 int eal_mem_win32api_init(void); 105 106 /** 107 * Allocate new memory in hugepages on the specified NUMA node. 108 * 109 * @param size 110 * Number of bytes to allocate. Must be a multiple of huge page size. 111 * @param socket_id 112 * Socket ID. 113 * @return 114 * Address of the memory allocated on success or NULL on failure. 115 */ 116 void *eal_mem_alloc_socket(size_t size, int socket_id); 117 118 /** 119 * Commit memory previously reserved with eal_mem_reserve() 120 * or decommitted from hugepages by eal_mem_decommit(). 121 * 122 * @param requested_addr 123 * Address within a reserved region. Must not be NULL. 124 * @param size 125 * Number of bytes to commit. Must be a multiple of page size. 126 * @param socket_id 127 * Socket ID to allocate on. Can be SOCKET_ID_ANY. 128 * @return 129 * On success, address of the committed memory, that is, requested_addr. 130 * On failure, NULL and rte_errno is set. 131 */ 132 void *eal_mem_commit(void *requested_addr, size_t size, int socket_id); 133 134 /** 135 * Put allocated or committed memory back into reserved state. 136 * 137 * @param addr 138 * Address of the region to decommit. 139 * @param size 140 * Number of bytes to decommit, must be the size of a page 141 * (hugepage or regular one). 142 * 143 * The *addr* and *size* must match location and size 144 * of a previously allocated or committed region. 145 * 146 * @return 147 * 0 on success, (-1) on failure. 148 */ 149 int eal_mem_decommit(void *addr, size_t size); 150 151 #endif /* _EAL_WINDOWS_H_ */ 152