1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2015 6WIND S.A.
3 * Copyright 2020 Mellanox Technologies, Ltd
14 #include <linux/rtnetlink.h>
18 /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
20 #pragma GCC diagnostic ignored "-Wpedantic"
22 #include <infiniband/verbs.h>
24 #pragma GCC diagnostic error "-Wpedantic"
27 #include <rte_malloc.h>
28 #include <rte_ethdev_driver.h>
29 #include <rte_ethdev_pci.h>
31 #include <rte_bus_pci.h>
32 #include <rte_common.h>
33 #include <rte_kvargs.h>
34 #include <rte_rwlock.h>
35 #include <rte_spinlock.h>
36 #include <rte_string_fns.h>
37 #include <rte_alarm.h>
39 #include <mlx5_glue.h>
40 #include <mlx5_devx_cmds.h>
41 #include <mlx5_common.h>
43 #include "mlx5_defs.h"
45 #include "mlx5_utils.h"
46 #include "mlx5_rxtx.h"
47 #include "mlx5_autoconf.h"
49 #include "mlx5_flow.h"
50 #include "rte_pmd_mlx5.h"
53 * Get ibv device name. Given an ibv_context pointer - return a
54 * pointer to the corresponding device name.
57 * Pointer to ibv context.
60 * Pointer to device name if ctx is valid, NULL otherwise.
63 mlx5_os_get_ctx_device_name(void *ctx)
67 return ((struct ibv_context *)ctx)->device->name;
71 * Get ibv device path name. Given an ibv_context pointer - return a
72 * pointer to the corresponding device path name.
75 * Pointer to ibv context.
78 * Pointer to device path name if ctx is valid, NULL otherwise.
81 mlx5_os_get_ctx_device_path(void *ctx)
86 return ((struct ibv_context *)ctx)->device->ibdev_path;
90 * Get mlx5 device attributes. The glue function query_device_ex() is called
91 * with out parameter of type 'struct ibv_device_attr_ex *'. Then fill in mlx5
92 * device attributes from the glue out parameter.
95 * Pointer to ibv context.
98 * Pointer to mlx5 device attributes.
101 * 0 on success, non zero error number otherwise
104 mlx5_os_get_dev_attr(void *ctx, struct mlx5_dev_attr *device_attr)
107 struct ibv_device_attr_ex attr_ex;
108 memset(device_attr, 0, sizeof(*device_attr));
109 err = mlx5_glue->query_device_ex(ctx, NULL, &attr_ex);
113 device_attr->device_cap_flags_ex = attr_ex.device_cap_flags_ex;
114 device_attr->max_qp_wr = attr_ex.orig_attr.max_qp_wr;
115 device_attr->max_sge = attr_ex.orig_attr.max_sge;
116 device_attr->max_cq = attr_ex.orig_attr.max_cq;
117 device_attr->max_qp = attr_ex.orig_attr.max_qp;
118 device_attr->raw_packet_caps = attr_ex.raw_packet_caps;
119 device_attr->max_rwq_indirection_table_size =
120 attr_ex.rss_caps.max_rwq_indirection_table_size;
121 device_attr->max_tso = attr_ex.tso_caps.max_tso;
122 device_attr->tso_supported_qpts = attr_ex.tso_caps.supported_qpts;
124 struct mlx5dv_context dv_attr = { .comp_mask = 0 };
125 err = mlx5_glue->dv_query_device(ctx, &dv_attr);
129 device_attr->flags = dv_attr.flags;
130 device_attr->comp_mask = dv_attr.comp_mask;
131 #ifdef HAVE_IBV_MLX5_MOD_SWP
132 device_attr->sw_parsing_offloads =
133 dv_attr.sw_parsing_caps.sw_parsing_offloads;
135 device_attr->min_single_stride_log_num_of_bytes =
136 dv_attr.striding_rq_caps.min_single_stride_log_num_of_bytes;
137 device_attr->max_single_stride_log_num_of_bytes =
138 dv_attr.striding_rq_caps.max_single_stride_log_num_of_bytes;
139 device_attr->min_single_wqe_log_num_of_strides =
140 dv_attr.striding_rq_caps.min_single_wqe_log_num_of_strides;
141 device_attr->max_single_wqe_log_num_of_strides =
142 dv_attr.striding_rq_caps.max_single_wqe_log_num_of_strides;
143 device_attr->stride_supported_qpts =
144 dv_attr.striding_rq_caps.supported_qpts;
145 #ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
146 device_attr->tunnel_offloads_caps = dv_attr.tunnel_offloads_caps;