1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2020 Mellanox Technologies, Ltd 3 */ 4 5 #ifndef RTE_PMD_MLX5_COMMON_OS_H_ 6 #define RTE_PMD_MLX5_COMMON_OS_H_ 7 8 #include <stdio.h> 9 #include <malloc.h> 10 11 #include <rte_pci.h> 12 #include <rte_debug.h> 13 #include <rte_atomic.h> 14 #include <rte_log.h> 15 #include <rte_kvargs.h> 16 #include <rte_devargs.h> 17 18 #include "mlx5_autoconf.h" 19 #include "mlx5_glue.h" 20 #include "mlx5_malloc.h" 21 22 /** 23 * Get device name. Given an ibv_device pointer - return a 24 * pointer to the corresponding device name. 25 * 26 * @param[in] dev 27 * Pointer to ibv device. 28 * 29 * @return 30 * Pointer to device name if dev is valid, NULL otherwise. 31 */ 32 static inline const char * 33 mlx5_os_get_dev_device_name(void *dev) 34 { 35 if (!dev) 36 return NULL; 37 return ((struct ibv_device *)dev)->name; 38 } 39 40 /** 41 * Get ibv device name. Given an ibv_context pointer - return a 42 * pointer to the corresponding device name. 43 * 44 * @param[in] ctx 45 * Pointer to ibv context. 46 * 47 * @return 48 * Pointer to device name if ctx is valid, NULL otherwise. 49 */ 50 static inline const char * 51 mlx5_os_get_ctx_device_name(void *ctx) 52 { 53 if (!ctx) 54 return NULL; 55 return ((struct ibv_context *)ctx)->device->name; 56 } 57 58 /** 59 * Get ibv device path name. Given an ibv_context pointer - return a 60 * pointer to the corresponding device path name. 61 * 62 * @param[in] ctx 63 * Pointer to ibv context. 64 * 65 * @return 66 * Pointer to device path name if ctx is valid, NULL otherwise. 67 */ 68 69 static inline const char * 70 mlx5_os_get_ctx_device_path(void *ctx) 71 { 72 if (!ctx) 73 return NULL; 74 75 return ((struct ibv_context *)ctx)->device->ibdev_path; 76 } 77 78 /** 79 * Get umem id. Given a pointer to umem object of type 80 * 'struct mlx5dv_devx_umem *' - return its id. 81 * 82 * @param[in] umem 83 * Pointer to umem object. 84 * 85 * @return 86 * The umem id if umem is valid, 0 otherwise. 87 */ 88 static inline uint32_t 89 mlx5_os_get_umem_id(void *umem) 90 { 91 if (!umem) 92 return 0; 93 return ((struct mlx5dv_devx_umem *)umem)->umem_id; 94 } 95 96 /** 97 * Get fd. Given a pointer to DevX channel object of type 98 * 'struct mlx5dv_devx_event_channel*' - return its fd. 99 * 100 * @param[in] channel 101 * Pointer to channel object. 102 * 103 * @return 104 * The fd if channel is valid, 0 otherwise. 105 */ 106 static inline int 107 mlx5_os_get_devx_channel_fd(void *channel) 108 { 109 if (!channel) 110 return 0; 111 return ((struct mlx5dv_devx_event_channel *)channel)->fd; 112 } 113 114 /** 115 * Get mmap offset. Given a pointer to an DevX UAR object of type 116 * 'struct mlx5dv_devx_uar *' - return its mmap offset. 117 * 118 * @param[in] uar 119 * Pointer to UAR object. 120 * 121 * @return 122 * The mmap offset if uar is valid, 0 otherwise. 123 */ 124 static inline off_t 125 mlx5_os_get_devx_uar_mmap_offset(void *uar) 126 { 127 #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 128 if (!uar) 129 return 0; 130 return ((struct mlx5dv_devx_uar *)uar)->mmap_off; 131 #else 132 RTE_SET_USED(uar); 133 return 0; 134 #endif 135 } 136 137 /** 138 * Get base addr pointer. Given a pointer to an UAR object of type 139 * 'struct mlx5dv_devx_uar *' - return its base address. 140 * 141 * @param[in] uar 142 * Pointer to an UAR object. 143 * 144 * @return 145 * The base address if UAR is valid, 0 otherwise. 146 */ 147 static inline void * 148 mlx5_os_get_devx_uar_base_addr(void *uar) 149 { 150 #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 151 if (!uar) 152 return NULL; 153 return ((struct mlx5dv_devx_uar *)uar)->base_addr; 154 #else 155 RTE_SET_USED(uar); 156 return NULL; 157 #endif 158 } 159 160 /** 161 * Get reg addr pointer. Given a pointer to an UAR object of type 162 * 'struct mlx5dv_devx_uar *' - return its reg address. 163 * 164 * @param[in] uar 165 * Pointer to an UAR object. 166 * 167 * @return 168 * The reg address if UAR is valid, 0 otherwise. 169 */ 170 static inline void * 171 mlx5_os_get_devx_uar_reg_addr(void *uar) 172 { 173 #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 174 if (!uar) 175 return NULL; 176 return ((struct mlx5dv_devx_uar *)uar)->reg_addr; 177 #else 178 RTE_SET_USED(uar); 179 return NULL; 180 #endif 181 } 182 183 /** 184 * Get page id. Given a pointer to an UAR object of type 185 * 'struct mlx5dv_devx_uar *' - return its page id. 186 * 187 * @param[in] uar 188 * Pointer to an UAR object. 189 * 190 * @return 191 * The page id if UAR is valid, 0 otherwise. 192 */ 193 static inline uint32_t 194 mlx5_os_get_devx_uar_page_id(void *uar) 195 { 196 #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 197 if (!uar) 198 return 0; 199 return ((struct mlx5dv_devx_uar *)uar)->page_id; 200 #else 201 RTE_SET_USED(uar); 202 return 0; 203 #endif 204 } 205 206 static inline int 207 mlx5_os_dealloc_pd(void *pd) 208 { 209 return mlx5_glue->dealloc_pd(pd); 210 } 211 212 __rte_internal 213 static inline void * 214 mlx5_os_umem_reg(void *ctx, void *addr, size_t size, uint32_t access) 215 { 216 return mlx5_glue->devx_umem_reg(ctx, addr, size, access); 217 } 218 219 __rte_internal 220 static inline int 221 mlx5_os_umem_dereg(void *pumem) 222 { 223 return mlx5_glue->devx_umem_dereg(pumem); 224 } 225 226 static inline void * 227 mlx5_os_devx_create_event_channel(void *ctx, int flags) 228 { 229 return mlx5_glue->devx_create_event_channel(ctx, flags); 230 } 231 232 static inline void 233 mlx5_os_devx_destroy_event_channel(void *eventc) 234 { 235 mlx5_glue->devx_destroy_event_channel(eventc); 236 } 237 238 static inline int 239 mlx5_os_devx_subscribe_devx_event(void *eventc, 240 void *obj, 241 uint16_t events_sz, uint16_t events_num[], 242 uint64_t cookie) 243 { 244 return mlx5_glue->devx_subscribe_devx_event(eventc, obj, events_sz, 245 events_num, cookie); 246 } 247 248 /** 249 * Memory allocation optionally with alignment. 250 * 251 * @param[in] align 252 * Alignment size (may be zero) 253 * @param[in] size 254 * Size in bytes to allocate 255 * 256 * @return 257 * Valid pointer to allocated memory, NULL in case of failure 258 */ 259 static inline void * 260 mlx5_os_malloc(size_t align, size_t size) 261 { 262 void *buf; 263 264 if (posix_memalign(&buf, align, size)) 265 return NULL; 266 return buf; 267 } 268 269 /** 270 * This API de-allocates a memory that originally could have been 271 * allocated aligned or non-aligned. In Linux it is a wrapper 272 * around free(). 273 * 274 * @param[in] addr 275 * Pointer to address to free 276 * 277 */ 278 static inline void 279 mlx5_os_free(void *addr) 280 { 281 free(addr); 282 } 283 284 void 285 mlx5_set_context_attr(struct rte_device *dev, struct ibv_context *ctx); 286 287 #endif /* RTE_PMD_MLX5_COMMON_OS_H_ */ 288