Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2023 Napatech A/S 3 : : */ 4 : : 5 : : #include <unistd.h> 6 : : #include <stdlib.h> 7 : : #include <stdint.h> 8 : : #include <inttypes.h> 9 : : 10 : : #include <rte_ethdev.h> 11 : : #include <rte_malloc.h> 12 : : 13 : : #include "ntlog.h" 14 : : #include "nt_util.h" 15 : : 16 : : static struct nt_util_vfio_impl vfio_cb; 17 : : 18 : : /* uses usleep which schedules out the calling service */ 19 : 0 : void nthw_os_wait_usec(int val) 20 : : { 21 : 0 : rte_delay_us_sleep(val); 22 : 0 : } 23 : : 24 : : /* spins in a waiting loop calling pause asm instruction uses RDTSC - precise wait */ 25 : 0 : void nthw_os_wait_usec_poll(int val) 26 : : { 27 : 0 : rte_delay_us(val); 28 : 0 : } 29 : : 30 : 0 : uint64_t nthw_os_get_time_monotonic_counter(void) 31 : : { 32 : 0 : return rte_get_timer_cycles(); 33 : : } 34 : : 35 : : /* Allocation size matching minimum alignment of specified size */ 36 [ # # ]: 0 : uint64_t nthw_util_align_size(uint64_t size) 37 : : { 38 : 0 : uint64_t alignment_size = 1ULL << rte_log2_u64(size); 39 : 0 : return alignment_size; 40 : : } 41 : : 42 : 0 : void nthw_util_vfio_init(struct nt_util_vfio_impl *impl) 43 : : { 44 : 0 : vfio_cb = *impl; 45 : 0 : } 46 : : 47 : 0 : struct nt_dma_s *nthw_dma_alloc(uint64_t size, uint64_t align, int numa) 48 : : { 49 : : int res; 50 : : struct nt_dma_s *vfio_addr; 51 : : 52 : 0 : vfio_addr = rte_malloc(NULL, sizeof(struct nt_dma_s), 0); 53 : : 54 [ # # ]: 0 : if (!vfio_addr) { 55 : 0 : NT_LOG(ERR, GENERAL, "VFIO rte_malloc failed"); 56 : 0 : return NULL; 57 : : } 58 : : 59 : 0 : void *addr = rte_malloc_socket(NULL, size, align, numa); 60 : : 61 [ # # ]: 0 : if (!addr) { 62 : 0 : rte_free(vfio_addr); 63 : 0 : NT_LOG(ERR, GENERAL, "VFIO rte_malloc_socket failed"); 64 : 0 : return NULL; 65 : : } 66 : : 67 : 0 : res = vfio_cb.vfio_dma_map(0, addr, &vfio_addr->iova, nthw_util_align_size(size)); 68 : : 69 [ # # ]: 0 : if (res != 0) { 70 : 0 : rte_free(addr); 71 : 0 : rte_free(vfio_addr); 72 : 0 : NT_LOG(ERR, GENERAL, "VFIO nt_dma_map failed"); 73 : 0 : return NULL; 74 : : } 75 : : 76 : 0 : vfio_addr->addr = (uint64_t)addr; 77 : 0 : vfio_addr->size = nthw_util_align_size(size); 78 : : 79 : 0 : NT_LOG(DBG, GENERAL, 80 : : "VFIO DMA alloc addr=%" PRIX64 ", iova=%" PRIX64 81 : : ", size=%" PRIX64 "align=0x%" PRIX64, 82 : : vfio_addr->addr, vfio_addr->iova, vfio_addr->size, align); 83 : : 84 : 0 : return vfio_addr; 85 : : } 86 : : 87 : : /* NOTE: please note the difference between RTE_ETH_SPEED_NUM_xxx and RTE_ETH_LINK_SPEED_xxx */ 88 : 0 : int nthw_link_speed_to_eth_speed_num(enum nt_link_speed_e nt_link_speed) 89 : : { 90 : : int eth_speed_num = RTE_ETH_SPEED_NUM_NONE; 91 : : 92 [ # # # # : 0 : switch (nt_link_speed) { # # # # # ] 93 : : case NT_LINK_SPEED_10M: 94 : : eth_speed_num = RTE_ETH_SPEED_NUM_10M; 95 : : break; 96 : : 97 : 0 : case NT_LINK_SPEED_100M: 98 : : eth_speed_num = RTE_ETH_SPEED_NUM_100M; 99 : 0 : break; 100 : : 101 : 0 : case NT_LINK_SPEED_1G: 102 : : eth_speed_num = RTE_ETH_SPEED_NUM_1G; 103 : 0 : break; 104 : : 105 : 0 : case NT_LINK_SPEED_10G: 106 : : eth_speed_num = RTE_ETH_SPEED_NUM_10G; 107 : 0 : break; 108 : : 109 : 0 : case NT_LINK_SPEED_25G: 110 : : eth_speed_num = RTE_ETH_SPEED_NUM_25G; 111 : 0 : break; 112 : : 113 : 0 : case NT_LINK_SPEED_40G: 114 : : eth_speed_num = RTE_ETH_SPEED_NUM_40G; 115 : 0 : break; 116 : : 117 : 0 : case NT_LINK_SPEED_50G: 118 : : eth_speed_num = RTE_ETH_SPEED_NUM_50G; 119 : 0 : break; 120 : : 121 : 0 : case NT_LINK_SPEED_100G: 122 : : eth_speed_num = RTE_ETH_SPEED_NUM_100G; 123 : 0 : break; 124 : : 125 : 0 : default: 126 : : eth_speed_num = RTE_ETH_SPEED_NUM_NONE; 127 : 0 : break; 128 : : } 129 : : 130 : 0 : return eth_speed_num; 131 : : } 132 : : 133 : 0 : uint32_t nthw_link_speed_capa_to_eth_speed_capa(int nt_link_speed_capa) 134 : : { 135 : : uint32_t eth_speed_capa = 0; 136 : : 137 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_10M) 138 : : eth_speed_capa |= RTE_ETH_LINK_SPEED_10M; 139 : : 140 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_100M) 141 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_100M; 142 : : 143 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_1G) 144 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_1G; 145 : : 146 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_10G) 147 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_10G; 148 : : 149 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_25G) 150 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_25G; 151 : : 152 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_40G) 153 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_40G; 154 : : 155 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_50G) 156 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_50G; 157 : : 158 [ # # ]: 0 : if (nt_link_speed_capa & NT_LINK_SPEED_100G) 159 : 0 : eth_speed_capa |= RTE_ETH_LINK_SPEED_100G; 160 : : 161 : 0 : return eth_speed_capa; 162 : : } 163 : : 164 : 0 : int nthw_link_duplex_to_eth_duplex(enum nt_link_duplex_e nt_link_duplex) 165 : : { 166 : : int eth_link_duplex = 0; 167 : : 168 [ # # ]: 0 : switch (nt_link_duplex) { 169 : 0 : case NT_LINK_DUPLEX_FULL: 170 : : eth_link_duplex = RTE_ETH_LINK_FULL_DUPLEX; 171 : 0 : break; 172 : : 173 : : case NT_LINK_DUPLEX_HALF: 174 : : eth_link_duplex = RTE_ETH_LINK_HALF_DUPLEX; 175 : : break; 176 : : 177 : : case NT_LINK_DUPLEX_UNKNOWN: /* fall-through */ 178 : : default: 179 : : break; 180 : : } 181 : : 182 : 0 : return eth_link_duplex; 183 : : } 184 : : 185 : 0 : int nthw_string_to_u32(const char *key_str __rte_unused, const char *value_str, void *extra_args) 186 : : { 187 [ # # ]: 0 : if (!value_str || !extra_args) 188 : : return -1; 189 : : 190 : 0 : const uint32_t value = strtol(value_str, NULL, 0); 191 : 0 : *(uint32_t *)extra_args = value; 192 : 0 : return 0; 193 : : }