1391b8bccSOphir Munk /* SPDX-License-Identifier: BSD-3-Clause 2391b8bccSOphir Munk * Copyright 2020 Mellanox Technologies, Ltd 3391b8bccSOphir Munk */ 4391b8bccSOphir Munk 5391b8bccSOphir Munk #ifndef RTE_PMD_MLX5_COMMON_OS_H_ 6391b8bccSOphir Munk #define RTE_PMD_MLX5_COMMON_OS_H_ 7391b8bccSOphir Munk 8391b8bccSOphir Munk #include <stdio.h> 9391b8bccSOphir Munk 10391b8bccSOphir Munk #include <rte_pci.h> 11391b8bccSOphir Munk #include <rte_debug.h> 12391b8bccSOphir Munk #include <rte_atomic.h> 13391b8bccSOphir Munk #include <rte_log.h> 14391b8bccSOphir Munk #include <rte_kvargs.h> 15391b8bccSOphir Munk #include <rte_devargs.h> 16391b8bccSOphir Munk 17391b8bccSOphir Munk #include "mlx5_autoconf.h" 189d60f545SOphir Munk #include "mlx5_glue.h" 19391b8bccSOphir Munk 20391b8bccSOphir Munk /** 21391b8bccSOphir Munk * Get device name. Given an ibv_device pointer - return a 22391b8bccSOphir Munk * pointer to the corresponding device name. 23391b8bccSOphir Munk * 24391b8bccSOphir Munk * @param[in] dev 25391b8bccSOphir Munk * Pointer to ibv device. 26391b8bccSOphir Munk * 27391b8bccSOphir Munk * @return 28391b8bccSOphir Munk * Pointer to device name if dev is valid, NULL otherwise. 29391b8bccSOphir Munk */ 30391b8bccSOphir Munk static inline const char * 31391b8bccSOphir Munk mlx5_os_get_dev_device_name(void *dev) 32391b8bccSOphir Munk { 33391b8bccSOphir Munk if (!dev) 34391b8bccSOphir Munk return NULL; 35391b8bccSOphir Munk return ((struct ibv_device *)dev)->name; 36391b8bccSOphir Munk } 37391b8bccSOphir Munk 38391b8bccSOphir Munk /** 39391b8bccSOphir Munk * Get ibv device name. Given an ibv_context pointer - return a 40391b8bccSOphir Munk * pointer to the corresponding device name. 41391b8bccSOphir Munk * 42391b8bccSOphir Munk * @param[in] ctx 43391b8bccSOphir Munk * Pointer to ibv context. 44391b8bccSOphir Munk * 45391b8bccSOphir Munk * @return 46391b8bccSOphir Munk * Pointer to device name if ctx is valid, NULL otherwise. 47391b8bccSOphir Munk */ 48391b8bccSOphir Munk static inline const char * 49391b8bccSOphir Munk mlx5_os_get_ctx_device_name(void *ctx) 50391b8bccSOphir Munk { 51391b8bccSOphir Munk if (!ctx) 52391b8bccSOphir Munk return NULL; 53391b8bccSOphir Munk return ((struct ibv_context *)ctx)->device->name; 54391b8bccSOphir Munk } 55391b8bccSOphir Munk 56391b8bccSOphir Munk /** 57391b8bccSOphir Munk * Get ibv device path name. Given an ibv_context pointer - return a 58391b8bccSOphir Munk * pointer to the corresponding device path name. 59391b8bccSOphir Munk * 60391b8bccSOphir Munk * @param[in] ctx 61391b8bccSOphir Munk * Pointer to ibv context. 62391b8bccSOphir Munk * 63391b8bccSOphir Munk * @return 64391b8bccSOphir Munk * Pointer to device path name if ctx is valid, NULL otherwise. 65391b8bccSOphir Munk */ 66391b8bccSOphir Munk 67391b8bccSOphir Munk static inline const char * 68391b8bccSOphir Munk mlx5_os_get_ctx_device_path(void *ctx) 69391b8bccSOphir Munk { 70391b8bccSOphir Munk if (!ctx) 71391b8bccSOphir Munk return NULL; 72391b8bccSOphir Munk 73391b8bccSOphir Munk return ((struct ibv_context *)ctx)->device->ibdev_path; 74391b8bccSOphir Munk } 75391b8bccSOphir Munk 76391b8bccSOphir Munk /** 77391b8bccSOphir Munk * Get umem id. Given a pointer to umem object of type 78391b8bccSOphir Munk * 'struct mlx5dv_devx_umem *' - return its id. 79391b8bccSOphir Munk * 80391b8bccSOphir Munk * @param[in] umem 81391b8bccSOphir Munk * Pointer to umem object. 82391b8bccSOphir Munk * 83391b8bccSOphir Munk * @return 84391b8bccSOphir Munk * The umem id if umem is valid, 0 otherwise. 85391b8bccSOphir Munk */ 86391b8bccSOphir Munk static inline uint32_t 87391b8bccSOphir Munk mlx5_os_get_umem_id(void *umem) 88391b8bccSOphir Munk { 89391b8bccSOphir Munk if (!umem) 90391b8bccSOphir Munk return 0; 91391b8bccSOphir Munk return ((struct mlx5dv_devx_umem *)umem)->umem_id; 92391b8bccSOphir Munk } 931f66ac5bSOphir Munk 941f66ac5bSOphir Munk /** 951f66ac5bSOphir Munk * Get fd. Given a pointer to DevX channel object of type 961f66ac5bSOphir Munk * 'struct mlx5dv_devx_event_channel*' - return its fd. 971f66ac5bSOphir Munk * 981f66ac5bSOphir Munk * @param[in] channel 991f66ac5bSOphir Munk * Pointer to channel object. 1001f66ac5bSOphir Munk * 1011f66ac5bSOphir Munk * @return 1021f66ac5bSOphir Munk * The fd if channel is valid, 0 otherwise. 1031f66ac5bSOphir Munk */ 1041f66ac5bSOphir Munk static inline int 1051f66ac5bSOphir Munk mlx5_os_get_devx_channel_fd(void *channel) 1061f66ac5bSOphir Munk { 1071f66ac5bSOphir Munk if (!channel) 1081f66ac5bSOphir Munk return 0; 1091f66ac5bSOphir Munk return ((struct mlx5dv_devx_event_channel *)channel)->fd; 1101f66ac5bSOphir Munk } 1111f66ac5bSOphir Munk 1121f66ac5bSOphir Munk /** 1131f66ac5bSOphir Munk * Get mmap offset. Given a pointer to an DevX UAR object of type 1141f66ac5bSOphir Munk * 'struct mlx5dv_devx_uar *' - return its mmap offset. 1151f66ac5bSOphir Munk * 1161f66ac5bSOphir Munk * @param[in] uar 1171f66ac5bSOphir Munk * Pointer to UAR object. 1181f66ac5bSOphir Munk * 1191f66ac5bSOphir Munk * @return 1201f66ac5bSOphir Munk * The mmap offset if uar is valid, 0 otherwise. 1211f66ac5bSOphir Munk */ 1221f66ac5bSOphir Munk static inline off_t 1231f66ac5bSOphir Munk mlx5_os_get_devx_uar_mmap_offset(void *uar) 1241f66ac5bSOphir Munk { 1251f66ac5bSOphir Munk #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 1261f66ac5bSOphir Munk if (!uar) 1271f66ac5bSOphir Munk return 0; 1281f66ac5bSOphir Munk return ((struct mlx5dv_devx_uar *)uar)->mmap_off; 1291f66ac5bSOphir Munk #else 1301f66ac5bSOphir Munk RTE_SET_USED(uar); 1311f66ac5bSOphir Munk return 0; 1321f66ac5bSOphir Munk #endif 1331f66ac5bSOphir Munk } 1341f66ac5bSOphir Munk 1351f66ac5bSOphir Munk /** 1361f66ac5bSOphir Munk * Get base addr pointer. Given a pointer to an UAR object of type 1371f66ac5bSOphir Munk * 'struct mlx5dv_devx_uar *' - return its base address. 1381f66ac5bSOphir Munk * 1391f66ac5bSOphir Munk * @param[in] uar 1401f66ac5bSOphir Munk * Pointer to an UAR object. 1411f66ac5bSOphir Munk * 1421f66ac5bSOphir Munk * @return 1431f66ac5bSOphir Munk * The base address if UAR is valid, 0 otherwise. 1441f66ac5bSOphir Munk */ 1451f66ac5bSOphir Munk static inline void * 1461f66ac5bSOphir Munk mlx5_os_get_devx_uar_base_addr(void *uar) 1471f66ac5bSOphir Munk { 1481f66ac5bSOphir Munk #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 1491f66ac5bSOphir Munk if (!uar) 1501f66ac5bSOphir Munk return NULL; 1511f66ac5bSOphir Munk return ((struct mlx5dv_devx_uar *)uar)->base_addr; 1521f66ac5bSOphir Munk #else 1531f66ac5bSOphir Munk RTE_SET_USED(uar); 1541f66ac5bSOphir Munk return NULL; 1551f66ac5bSOphir Munk #endif 1561f66ac5bSOphir Munk } 1571f66ac5bSOphir Munk 1581f66ac5bSOphir Munk /** 1591f66ac5bSOphir Munk * Get reg addr pointer. Given a pointer to an UAR object of type 1601f66ac5bSOphir Munk * 'struct mlx5dv_devx_uar *' - return its reg address. 1611f66ac5bSOphir Munk * 1621f66ac5bSOphir Munk * @param[in] uar 1631f66ac5bSOphir Munk * Pointer to an UAR object. 1641f66ac5bSOphir Munk * 1651f66ac5bSOphir Munk * @return 1661f66ac5bSOphir Munk * The reg address if UAR is valid, 0 otherwise. 1671f66ac5bSOphir Munk */ 1681f66ac5bSOphir Munk static inline void * 1691f66ac5bSOphir Munk mlx5_os_get_devx_uar_reg_addr(void *uar) 1701f66ac5bSOphir Munk { 1711f66ac5bSOphir Munk #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 1721f66ac5bSOphir Munk if (!uar) 1731f66ac5bSOphir Munk return NULL; 1741f66ac5bSOphir Munk return ((struct mlx5dv_devx_uar *)uar)->reg_addr; 1751f66ac5bSOphir Munk #else 1761f66ac5bSOphir Munk RTE_SET_USED(uar); 1771f66ac5bSOphir Munk return NULL; 1781f66ac5bSOphir Munk #endif 1791f66ac5bSOphir Munk } 1801f66ac5bSOphir Munk 1811f66ac5bSOphir Munk /** 1821f66ac5bSOphir Munk * Get page id. Given a pointer to an UAR object of type 1831f66ac5bSOphir Munk * 'struct mlx5dv_devx_uar *' - return its page id. 1841f66ac5bSOphir Munk * 1851f66ac5bSOphir Munk * @param[in] uar 1861f66ac5bSOphir Munk * Pointer to an UAR object. 1871f66ac5bSOphir Munk * 1881f66ac5bSOphir Munk * @return 1891f66ac5bSOphir Munk * The page id if UAR is valid, 0 otherwise. 1901f66ac5bSOphir Munk */ 1911f66ac5bSOphir Munk static inline uint32_t 1921f66ac5bSOphir Munk mlx5_os_get_devx_uar_page_id(void *uar) 1931f66ac5bSOphir Munk { 1941f66ac5bSOphir Munk #ifdef HAVE_MLX5DV_DEVX_UAR_OFFSET 1951f66ac5bSOphir Munk if (!uar) 1961f66ac5bSOphir Munk return 0; 1971f66ac5bSOphir Munk return ((struct mlx5dv_devx_uar *)uar)->page_id; 1981f66ac5bSOphir Munk #else 1991f66ac5bSOphir Munk RTE_SET_USED(uar); 2001f66ac5bSOphir Munk return 0; 2011f66ac5bSOphir Munk #endif 2021f66ac5bSOphir Munk } 2031f66ac5bSOphir Munk 204*1cb210abSOphir Munk static inline void * 205*1cb210abSOphir Munk mlx5_os_alloc_pd(void *ctx) 206*1cb210abSOphir Munk { 207*1cb210abSOphir Munk return mlx5_glue->alloc_pd(ctx); 208*1cb210abSOphir Munk } 209*1cb210abSOphir Munk 210*1cb210abSOphir Munk static inline int 211*1cb210abSOphir Munk mlx5_os_dealloc_pd(void *pd) 212*1cb210abSOphir Munk { 213*1cb210abSOphir Munk return mlx5_glue->dealloc_pd(pd); 214*1cb210abSOphir Munk } 215391b8bccSOphir Munk #endif /* RTE_PMD_MLX5_COMMON_OS_H_ */ 216