Branch data Line data Source code
1 : : /*
2 : : * SPDX-License-Identifier: BSD-3-Clause
3 : : * Copyright(c) 2023 Napatech A/S
4 : : */
5 : :
6 : : #include <unistd.h>
7 : : #include <stdlib.h>
8 : : #include <stdint.h>
9 : : #include <inttypes.h>
10 : :
11 : : #include <rte_ethdev.h>
12 : : #include <rte_malloc.h>
13 : :
14 : : #include "ntlog.h"
15 : : #include "nt_util.h"
16 : :
17 : : static struct nt_util_vfio_impl vfio_cb;
18 : :
19 : : /* uses usleep which schedules out the calling thread */
20 : 0 : void nt_os_wait_usec(int val)
21 : : {
22 : 0 : rte_delay_us_sleep(val);
23 : 0 : }
24 : :
25 : : /* spins in a waiting loop calling pause asm instruction uses RDTSC - precise wait */
26 : 0 : void nt_os_wait_usec_poll(int val)
27 : : {
28 : 0 : rte_delay_us(val);
29 : 0 : }
30 : :
31 : 0 : uint64_t nt_os_get_time_monotonic_counter(void)
32 : : {
33 : 0 : return rte_get_timer_cycles();
34 : : }
35 : :
36 : : /* Allocation size matching minimum alignment of specified size */
37 [ # # ]: 0 : uint64_t nt_util_align_size(uint64_t size)
38 : : {
39 : 0 : uint64_t alignment_size = 1ULL << rte_log2_u64(size);
40 : 0 : return alignment_size;
41 : : }
42 : :
43 : 0 : void nt_util_vfio_init(struct nt_util_vfio_impl *impl)
44 : : {
45 : 0 : vfio_cb = *impl;
46 : 0 : }
47 : :
48 : 0 : struct nt_dma_s *nt_dma_alloc(uint64_t size, uint64_t align, int numa)
49 : : {
50 : : int res;
51 : : struct nt_dma_s *vfio_addr;
52 : :
53 : 0 : vfio_addr = rte_malloc(NULL, sizeof(struct nt_dma_s), 0);
54 : :
55 [ # # ]: 0 : if (!vfio_addr) {
56 : 0 : NT_LOG(ERR, GENERAL, "VFIO rte_malloc failed");
57 : 0 : return NULL;
58 : : }
59 : :
60 : 0 : void *addr = rte_malloc_socket(NULL, size, align, numa);
61 : :
62 [ # # ]: 0 : if (!addr) {
63 : 0 : rte_free(vfio_addr);
64 : 0 : NT_LOG(ERR, GENERAL, "VFIO rte_malloc_socket failed");
65 : 0 : return NULL;
66 : : }
67 : :
68 : 0 : res = vfio_cb.vfio_dma_map(0, addr, &vfio_addr->iova, nt_util_align_size(size));
69 : :
70 [ # # ]: 0 : if (res != 0) {
71 : 0 : rte_free(addr);
72 : 0 : rte_free(vfio_addr);
73 : 0 : NT_LOG(ERR, GENERAL, "VFIO nt_dma_map failed");
74 : 0 : return NULL;
75 : : }
76 : :
77 : 0 : vfio_addr->addr = (uint64_t)addr;
78 : 0 : vfio_addr->size = nt_util_align_size(size);
79 : :
80 : 0 : NT_LOG(DBG, GENERAL,
81 : : "VFIO DMA alloc addr=%" PRIX64 ", iova=%" PRIX64
82 : : ", size=%" PRIX64 "align=0x%" PRIX64,
83 : : vfio_addr->addr, vfio_addr->iova, vfio_addr->size, align);
84 : :
85 : 0 : return vfio_addr;
86 : : }
87 : :
88 : 0 : void nt_dma_free(struct nt_dma_s *vfio_addr)
89 : : {
90 : 0 : NT_LOG(DBG, GENERAL, "VFIO DMA free addr=%" PRIX64 ", iova=%" PRIX64 ", size=%" PRIX64,
91 : : vfio_addr->addr, vfio_addr->iova, vfio_addr->size);
92 : :
93 : 0 : int res = vfio_cb.vfio_dma_unmap(0, (void *)vfio_addr->addr, vfio_addr->iova,
94 : : vfio_addr->size);
95 : :
96 [ # # ]: 0 : if (res != 0) {
97 : 0 : NT_LOG(WRN, GENERAL,
98 : : "VFIO DMA free FAILED addr=%" PRIX64 ", iova=%" PRIX64 ", size=%" PRIX64,
99 : : vfio_addr->addr, vfio_addr->iova, vfio_addr->size);
100 : : }
101 : :
102 : 0 : rte_free((void *)(vfio_addr->addr));
103 : 0 : rte_free(vfio_addr);
104 : 0 : }
105 : :
106 : : /* NOTE: please note the difference between RTE_ETH_SPEED_NUM_xxx and RTE_ETH_LINK_SPEED_xxx */
107 : 0 : int nt_link_speed_to_eth_speed_num(enum nt_link_speed_e nt_link_speed)
108 : : {
109 : : int eth_speed_num = RTE_ETH_SPEED_NUM_NONE;
110 : :
111 [ # # # # : 0 : switch (nt_link_speed) {
# # # #
# ]
112 : : case NT_LINK_SPEED_10M:
113 : : eth_speed_num = RTE_ETH_SPEED_NUM_10M;
114 : : break;
115 : :
116 : 0 : case NT_LINK_SPEED_100M:
117 : : eth_speed_num = RTE_ETH_SPEED_NUM_100M;
118 : 0 : break;
119 : :
120 : 0 : case NT_LINK_SPEED_1G:
121 : : eth_speed_num = RTE_ETH_SPEED_NUM_1G;
122 : 0 : break;
123 : :
124 : 0 : case NT_LINK_SPEED_10G:
125 : : eth_speed_num = RTE_ETH_SPEED_NUM_10G;
126 : 0 : break;
127 : :
128 : 0 : case NT_LINK_SPEED_25G:
129 : : eth_speed_num = RTE_ETH_SPEED_NUM_25G;
130 : 0 : break;
131 : :
132 : 0 : case NT_LINK_SPEED_40G:
133 : : eth_speed_num = RTE_ETH_SPEED_NUM_40G;
134 : 0 : break;
135 : :
136 : 0 : case NT_LINK_SPEED_50G:
137 : : eth_speed_num = RTE_ETH_SPEED_NUM_50G;
138 : 0 : break;
139 : :
140 : 0 : case NT_LINK_SPEED_100G:
141 : : eth_speed_num = RTE_ETH_SPEED_NUM_100G;
142 : 0 : break;
143 : :
144 : 0 : default:
145 : : eth_speed_num = RTE_ETH_SPEED_NUM_NONE;
146 : 0 : break;
147 : : }
148 : :
149 : 0 : return eth_speed_num;
150 : : }
151 : :
152 : 0 : uint32_t nt_link_speed_capa_to_eth_speed_capa(int nt_link_speed_capa)
153 : : {
154 : : uint32_t eth_speed_capa = 0;
155 : :
156 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_10M)
157 : : eth_speed_capa |= RTE_ETH_LINK_SPEED_10M;
158 : :
159 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_100M)
160 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_100M;
161 : :
162 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_1G)
163 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_1G;
164 : :
165 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_10G)
166 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_10G;
167 : :
168 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_25G)
169 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_25G;
170 : :
171 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_40G)
172 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_40G;
173 : :
174 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_50G)
175 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_50G;
176 : :
177 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_100G)
178 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_100G;
179 : :
180 : 0 : return eth_speed_capa;
181 : : }
182 : :
183 : : /* Converts link speed provided in Mbps to NT specific definitions.*/
184 : 0 : nt_link_speed_t nthw_convert_link_speed(int link_speed_mbps)
185 : : {
186 [ # # # # : 0 : switch (link_speed_mbps) {
# # # #
# ]
187 : : case 10:
188 : : return NT_LINK_SPEED_10M;
189 : :
190 : 0 : case 100:
191 : 0 : return NT_LINK_SPEED_100M;
192 : :
193 : 0 : case 1000:
194 : 0 : return NT_LINK_SPEED_1G;
195 : :
196 : 0 : case 10000:
197 : 0 : return NT_LINK_SPEED_10G;
198 : :
199 : 0 : case 40000:
200 : 0 : return NT_LINK_SPEED_40G;
201 : :
202 : 0 : case 100000:
203 : 0 : return NT_LINK_SPEED_100G;
204 : :
205 : 0 : case 50000:
206 : 0 : return NT_LINK_SPEED_50G;
207 : :
208 : 0 : case 25000:
209 : 0 : return NT_LINK_SPEED_25G;
210 : :
211 : 0 : default:
212 : 0 : return NT_LINK_SPEED_UNKNOWN;
213 : : }
214 : : }
215 : :
216 : 0 : int nt_link_duplex_to_eth_duplex(enum nt_link_duplex_e nt_link_duplex)
217 : : {
218 : : int eth_link_duplex = 0;
219 : :
220 [ # # ]: 0 : switch (nt_link_duplex) {
221 : 0 : case NT_LINK_DUPLEX_FULL:
222 : : eth_link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
223 : 0 : break;
224 : :
225 : : case NT_LINK_DUPLEX_HALF:
226 : : eth_link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
227 : : break;
228 : :
229 : : case NT_LINK_DUPLEX_UNKNOWN: /* fall-through */
230 : : default:
231 : : break;
232 : : }
233 : :
234 : 0 : return eth_link_duplex;
235 : : }
236 : :
237 : 0 : int nthw_string_to_u32(const char *key_str __rte_unused, const char *value_str, void *extra_args)
238 : : {
239 [ # # ]: 0 : if (!value_str || !extra_args)
240 : : return -1;
241 : :
242 : 0 : const uint32_t value = strtol(value_str, NULL, 0);
243 : 0 : *(uint32_t *)extra_args = value;
244 : 0 : return 0;
245 : : }
|