xref: /dpdk/drivers/common/mlx5/linux/mlx5_common_os.h (revision 1cb210abddfaa2f00f0a804ce41b7a81e6093945)
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