blob: 5271469aad10cd8ad5a620d325a7003bf2277ef7 [file] [log] [blame]
Yishai Hadasa8b92ca2018-06-17 12:59:57 +03001// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2/*
3 * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved.
4 */
5
6#include <rdma/ib_user_verbs.h>
7#include <rdma/ib_verbs.h>
8#include <rdma/uverbs_types.h>
9#include <rdma/uverbs_ioctl.h>
10#include <rdma/mlx5_user_ioctl_cmds.h>
11#include <rdma/ib_umem.h>
Yishai Hadas34613eb2018-11-26 08:28:35 +020012#include <rdma/uverbs_std_types.h>
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030013#include <linux/mlx5/driver.h>
14#include <linux/mlx5/fs.h>
15#include "mlx5_ib.h"
16
Yishai Hadas8aa8c952018-06-17 13:00:00 +030017#define UVERBS_MODULE_NAME mlx5_ib
18#include <rdma/uverbs_named_ioctl.h>
19
Yishai Hadas7efce362018-06-17 13:00:01 +030020#define MLX5_MAX_DESTROY_INBOX_SIZE_DW MLX5_ST_SZ_DW(delete_fte_in)
21struct devx_obj {
22 struct mlx5_core_dev *mdev;
Yishai Hadas2351776e2018-10-07 12:06:34 +030023 u64 obj_id;
Yishai Hadas7efce362018-06-17 13:00:01 +030024 u32 dinlen; /* destroy inbox length */
25 u32 dinbox[MLX5_MAX_DESTROY_INBOX_SIZE_DW];
26};
27
Yishai Hadasaeae9452018-06-17 13:00:04 +030028struct devx_umem {
29 struct mlx5_core_dev *mdev;
30 struct ib_umem *umem;
31 u32 page_offset;
32 int page_shift;
33 int ncont;
34 u32 dinlen;
35 u32 dinbox[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)];
36};
37
38struct devx_umem_reg_cmd {
39 void *in;
40 u32 inlen;
41 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
42};
43
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +020044static struct mlx5_ib_ucontext *
45devx_ufile2uctx(const struct uverbs_attr_bundle *attrs)
Yishai Hadas8aa8c952018-06-17 13:00:00 +030046{
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +020047 return to_mucontext(ib_uverbs_get_ucontext(attrs));
Yishai Hadas8aa8c952018-06-17 13:00:00 +030048}
49
Yishai Hadasfb981532018-11-26 08:28:36 +020050int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user)
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030051{
52 u32 in[MLX5_ST_SZ_DW(create_uctx_in)] = {0};
53 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
54 u64 general_obj_types;
Yishai Hadasfb981532018-11-26 08:28:36 +020055 void *hdr, *uctx;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030056 int err;
Yishai Hadas76dc5a82018-09-20 21:45:19 +030057 u16 uid;
Yishai Hadasfb981532018-11-26 08:28:36 +020058 u32 cap = 0;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030059
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030060 hdr = MLX5_ADDR_OF(create_uctx_in, in, hdr);
Yishai Hadasfb981532018-11-26 08:28:36 +020061 uctx = MLX5_ADDR_OF(create_uctx_in, in, uctx);
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030062
63 general_obj_types = MLX5_CAP_GEN_64(dev->mdev, general_obj_types);
64 if (!(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UCTX) ||
65 !(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UMEM))
66 return -EINVAL;
67
Yishai Hadasfb981532018-11-26 08:28:36 +020068 if (is_user && capable(CAP_NET_RAW) &&
69 (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RAW_TX))
70 cap |= MLX5_UCTX_CAP_RAW_TX;
71
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030072 MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
73 MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type, MLX5_OBJ_TYPE_UCTX);
Yishai Hadasfb981532018-11-26 08:28:36 +020074 MLX5_SET(uctx, uctx, cap, cap);
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030075
76 err = mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
77 if (err)
78 return err;
79
Yishai Hadas76dc5a82018-09-20 21:45:19 +030080 uid = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
81 return uid;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030082}
83
Yishai Hadas76dc5a82018-09-20 21:45:19 +030084void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid)
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030085{
86 u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};
87 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
88
89 MLX5_SET(general_obj_in_cmd_hdr, in, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
90 MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_UCTX);
Yishai Hadas76dc5a82018-09-20 21:45:19 +030091 MLX5_SET(general_obj_in_cmd_hdr, in, obj_id, uid);
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030092
93 mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
94}
Yishai Hadas8aa8c952018-06-17 13:00:00 +030095
Yishai Hadas32269442018-07-23 15:25:09 +030096bool mlx5_ib_devx_is_flow_dest(void *obj, int *dest_id, int *dest_type)
97{
98 struct devx_obj *devx_obj = obj;
99 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, devx_obj->dinbox, opcode);
100
101 switch (opcode) {
102 case MLX5_CMD_OP_DESTROY_TIR:
103 *dest_type = MLX5_FLOW_DESTINATION_TYPE_TIR;
104 *dest_id = MLX5_GET(general_obj_in_cmd_hdr, devx_obj->dinbox,
105 obj_id);
106 return true;
107
108 case MLX5_CMD_OP_DESTROY_FLOW_TABLE:
109 *dest_type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
110 *dest_id = MLX5_GET(destroy_flow_table_in, devx_obj->dinbox,
111 table_id);
112 return true;
113 default:
114 return false;
115 }
116}
117
Mark Blochbfc5d832018-11-20 20:31:08 +0200118bool mlx5_ib_devx_is_flow_counter(void *obj, u32 *counter_id)
119{
120 struct devx_obj *devx_obj = obj;
121 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, devx_obj->dinbox, opcode);
122
123 if (opcode == MLX5_CMD_OP_DEALLOC_FLOW_COUNTER) {
124 *counter_id = MLX5_GET(dealloc_flow_counter_in,
125 devx_obj->dinbox,
126 flow_counter_id);
127 return true;
128 }
129
130 return false;
131}
132
Yishai Hadas2351776e2018-10-07 12:06:34 +0300133/*
134 * As the obj_id in the firmware is not globally unique the object type
135 * must be considered upon checking for a valid object id.
136 * For that the opcode of the creator command is encoded as part of the obj_id.
137 */
138static u64 get_enc_obj_id(u16 opcode, u32 obj_id)
139{
140 return ((u64)opcode << 32) | obj_id;
141}
142
Yishai Hadas34613eb2018-11-26 08:28:35 +0200143static u64 devx_get_obj_id(const void *in)
Yishai Hadase662e142018-06-17 13:00:02 +0300144{
145 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
Yishai Hadas2351776e2018-10-07 12:06:34 +0300146 u64 obj_id;
Yishai Hadase662e142018-06-17 13:00:02 +0300147
148 switch (opcode) {
149 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
150 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300151 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_GENERAL_OBJECT,
152 MLX5_GET(general_obj_in_cmd_hdr, in,
153 obj_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300154 break;
155 case MLX5_CMD_OP_QUERY_MKEY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300156 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_MKEY,
157 MLX5_GET(query_mkey_in, in,
158 mkey_index));
Yishai Hadase662e142018-06-17 13:00:02 +0300159 break;
160 case MLX5_CMD_OP_QUERY_CQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300161 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_CQ,
162 MLX5_GET(query_cq_in, in, cqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300163 break;
164 case MLX5_CMD_OP_MODIFY_CQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300165 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_CQ,
166 MLX5_GET(modify_cq_in, in, cqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300167 break;
168 case MLX5_CMD_OP_QUERY_SQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300169 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_SQ,
170 MLX5_GET(query_sq_in, in, sqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300171 break;
172 case MLX5_CMD_OP_MODIFY_SQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300173 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_SQ,
174 MLX5_GET(modify_sq_in, in, sqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300175 break;
176 case MLX5_CMD_OP_QUERY_RQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300177 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
178 MLX5_GET(query_rq_in, in, rqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300179 break;
180 case MLX5_CMD_OP_MODIFY_RQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300181 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
182 MLX5_GET(modify_rq_in, in, rqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300183 break;
184 case MLX5_CMD_OP_QUERY_RMP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300185 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RMP,
186 MLX5_GET(query_rmp_in, in, rmpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300187 break;
188 case MLX5_CMD_OP_MODIFY_RMP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300189 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RMP,
190 MLX5_GET(modify_rmp_in, in, rmpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300191 break;
192 case MLX5_CMD_OP_QUERY_RQT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300193 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQT,
194 MLX5_GET(query_rqt_in, in, rqtn));
Yishai Hadase662e142018-06-17 13:00:02 +0300195 break;
196 case MLX5_CMD_OP_MODIFY_RQT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300197 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQT,
198 MLX5_GET(modify_rqt_in, in, rqtn));
Yishai Hadase662e142018-06-17 13:00:02 +0300199 break;
200 case MLX5_CMD_OP_QUERY_TIR:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300201 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_TIR,
202 MLX5_GET(query_tir_in, in, tirn));
Yishai Hadase662e142018-06-17 13:00:02 +0300203 break;
204 case MLX5_CMD_OP_MODIFY_TIR:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300205 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_TIR,
206 MLX5_GET(modify_tir_in, in, tirn));
Yishai Hadase662e142018-06-17 13:00:02 +0300207 break;
208 case MLX5_CMD_OP_QUERY_TIS:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300209 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_TIS,
210 MLX5_GET(query_tis_in, in, tisn));
Yishai Hadase662e142018-06-17 13:00:02 +0300211 break;
212 case MLX5_CMD_OP_MODIFY_TIS:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300213 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_TIS,
214 MLX5_GET(modify_tis_in, in, tisn));
Yishai Hadase662e142018-06-17 13:00:02 +0300215 break;
216 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300217 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_FLOW_TABLE,
218 MLX5_GET(query_flow_table_in, in,
219 table_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300220 break;
221 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300222 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_FLOW_TABLE,
223 MLX5_GET(modify_flow_table_in, in,
224 table_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300225 break;
226 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300227 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_FLOW_GROUP,
228 MLX5_GET(query_flow_group_in, in,
229 group_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300230 break;
231 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300232 obj_id = get_enc_obj_id(MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY,
233 MLX5_GET(query_fte_in, in,
234 flow_index));
Yishai Hadase662e142018-06-17 13:00:02 +0300235 break;
236 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300237 obj_id = get_enc_obj_id(MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY,
238 MLX5_GET(set_fte_in, in, flow_index));
Yishai Hadase662e142018-06-17 13:00:02 +0300239 break;
240 case MLX5_CMD_OP_QUERY_Q_COUNTER:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300241 obj_id = get_enc_obj_id(MLX5_CMD_OP_ALLOC_Q_COUNTER,
242 MLX5_GET(query_q_counter_in, in,
243 counter_set_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300244 break;
245 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300246 obj_id = get_enc_obj_id(MLX5_CMD_OP_ALLOC_FLOW_COUNTER,
247 MLX5_GET(query_flow_counter_in, in,
248 flow_counter_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300249 break;
250 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300251 obj_id = get_enc_obj_id(MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT,
252 MLX5_GET(general_obj_in_cmd_hdr, in,
253 obj_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300254 break;
255 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300256 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT,
257 MLX5_GET(query_scheduling_element_in,
258 in, scheduling_element_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300259 break;
260 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300261 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT,
262 MLX5_GET(modify_scheduling_element_in,
263 in, scheduling_element_id));
Yishai Hadase662e142018-06-17 13:00:02 +0300264 break;
265 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300266 obj_id = get_enc_obj_id(MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT,
267 MLX5_GET(add_vxlan_udp_dport_in, in,
268 vxlan_udp_port));
Yishai Hadase662e142018-06-17 13:00:02 +0300269 break;
270 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300271 obj_id = get_enc_obj_id(MLX5_CMD_OP_SET_L2_TABLE_ENTRY,
272 MLX5_GET(query_l2_table_entry_in, in,
273 table_index));
Yishai Hadase662e142018-06-17 13:00:02 +0300274 break;
275 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300276 obj_id = get_enc_obj_id(MLX5_CMD_OP_SET_L2_TABLE_ENTRY,
277 MLX5_GET(set_l2_table_entry_in, in,
278 table_index));
Yishai Hadase662e142018-06-17 13:00:02 +0300279 break;
280 case MLX5_CMD_OP_QUERY_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300281 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
282 MLX5_GET(query_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300283 break;
284 case MLX5_CMD_OP_RST2INIT_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300285 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
286 MLX5_GET(rst2init_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300287 break;
288 case MLX5_CMD_OP_INIT2RTR_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300289 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
290 MLX5_GET(init2rtr_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300291 break;
292 case MLX5_CMD_OP_RTR2RTS_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300293 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
294 MLX5_GET(rtr2rts_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300295 break;
296 case MLX5_CMD_OP_RTS2RTS_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300297 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
298 MLX5_GET(rts2rts_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300299 break;
300 case MLX5_CMD_OP_SQERR2RTS_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300301 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
302 MLX5_GET(sqerr2rts_qp_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300303 break;
304 case MLX5_CMD_OP_2ERR_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300305 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
306 MLX5_GET(qp_2err_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300307 break;
308 case MLX5_CMD_OP_2RST_QP:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300309 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
310 MLX5_GET(qp_2rst_in, in, qpn));
Yishai Hadase662e142018-06-17 13:00:02 +0300311 break;
312 case MLX5_CMD_OP_QUERY_DCT:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300313 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,
314 MLX5_GET(query_dct_in, in, dctn));
Yishai Hadase662e142018-06-17 13:00:02 +0300315 break;
316 case MLX5_CMD_OP_QUERY_XRQ:
Yishai Hadas719598c2018-11-26 08:28:37 +0200317 case MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY:
318 case MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300319 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_XRQ,
320 MLX5_GET(query_xrq_in, in, xrqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300321 break;
322 case MLX5_CMD_OP_QUERY_XRC_SRQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300323 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_XRC_SRQ,
324 MLX5_GET(query_xrc_srq_in, in,
325 xrc_srqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300326 break;
327 case MLX5_CMD_OP_ARM_XRC_SRQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300328 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_XRC_SRQ,
329 MLX5_GET(arm_xrc_srq_in, in, xrc_srqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300330 break;
331 case MLX5_CMD_OP_QUERY_SRQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300332 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_SRQ,
333 MLX5_GET(query_srq_in, in, srqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300334 break;
335 case MLX5_CMD_OP_ARM_RQ:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300336 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
337 MLX5_GET(arm_rq_in, in, srq_number));
Yishai Hadase662e142018-06-17 13:00:02 +0300338 break;
339 case MLX5_CMD_OP_DRAIN_DCT:
340 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300341 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,
342 MLX5_GET(drain_dct_in, in, dctn));
Yishai Hadase662e142018-06-17 13:00:02 +0300343 break;
344 case MLX5_CMD_OP_ARM_XRQ:
Yishai Hadas719598c2018-11-26 08:28:37 +0200345 case MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY:
Yishai Hadas2351776e2018-10-07 12:06:34 +0300346 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_XRQ,
347 MLX5_GET(arm_xrq_in, in, xrqn));
Yishai Hadase662e142018-06-17 13:00:02 +0300348 break;
Yishai Hadas719598c2018-11-26 08:28:37 +0200349 case MLX5_CMD_OP_QUERY_PACKET_REFORMAT_CONTEXT:
350 obj_id = get_enc_obj_id
351 (MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT,
352 MLX5_GET(query_packet_reformat_context_in,
353 in, packet_reformat_id));
354 break;
Yishai Hadase662e142018-06-17 13:00:02 +0300355 default:
Yishai Hadas34613eb2018-11-26 08:28:35 +0200356 obj_id = 0;
Yishai Hadase662e142018-06-17 13:00:02 +0300357 }
358
Yishai Hadas34613eb2018-11-26 08:28:35 +0200359 return obj_id;
360}
Yishai Hadase662e142018-06-17 13:00:02 +0300361
Yishai Hadas34613eb2018-11-26 08:28:35 +0200362static bool devx_is_valid_obj_id(struct ib_uobject *uobj, const void *in)
363{
364 u64 obj_id = devx_get_obj_id(in);
365
366 if (!obj_id)
367 return false;
368
369 switch (uobj_get_object_id(uobj)) {
370 case UVERBS_OBJECT_CQ:
371 return get_enc_obj_id(MLX5_CMD_OP_CREATE_CQ,
372 to_mcq(uobj->object)->mcq.cqn) ==
373 obj_id;
374
375 case UVERBS_OBJECT_SRQ:
376 {
377 struct mlx5_core_srq *srq = &(to_msrq(uobj->object)->msrq);
378 struct mlx5_ib_dev *dev = to_mdev(uobj->context->device);
379 u16 opcode;
380
381 switch (srq->common.res) {
382 case MLX5_RES_XSRQ:
383 opcode = MLX5_CMD_OP_CREATE_XRC_SRQ;
384 break;
385 case MLX5_RES_XRQ:
386 opcode = MLX5_CMD_OP_CREATE_XRQ;
387 break;
388 default:
389 if (!dev->mdev->issi)
390 opcode = MLX5_CMD_OP_CREATE_SRQ;
391 else
392 opcode = MLX5_CMD_OP_CREATE_RMP;
393 }
394
395 return get_enc_obj_id(opcode,
396 to_msrq(uobj->object)->msrq.srqn) ==
397 obj_id;
398 }
399
400 case UVERBS_OBJECT_QP:
401 {
402 struct mlx5_ib_qp *qp = to_mqp(uobj->object);
403 enum ib_qp_type qp_type = qp->ibqp.qp_type;
404
405 if (qp_type == IB_QPT_RAW_PACKET ||
406 (qp->flags & MLX5_IB_QP_UNDERLAY)) {
407 struct mlx5_ib_raw_packet_qp *raw_packet_qp =
408 &qp->raw_packet_qp;
409 struct mlx5_ib_rq *rq = &raw_packet_qp->rq;
410 struct mlx5_ib_sq *sq = &raw_packet_qp->sq;
411
412 return (get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
413 rq->base.mqp.qpn) == obj_id ||
414 get_enc_obj_id(MLX5_CMD_OP_CREATE_SQ,
415 sq->base.mqp.qpn) == obj_id ||
416 get_enc_obj_id(MLX5_CMD_OP_CREATE_TIR,
417 rq->tirn) == obj_id ||
418 get_enc_obj_id(MLX5_CMD_OP_CREATE_TIS,
419 sq->tisn) == obj_id);
420 }
421
422 if (qp_type == MLX5_IB_QPT_DCT)
423 return get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,
424 qp->dct.mdct.mqp.qpn) == obj_id;
425
426 return get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
427 qp->ibqp.qp_num) == obj_id;
428 }
429
430 case UVERBS_OBJECT_WQ:
431 return get_enc_obj_id(MLX5_CMD_OP_CREATE_RQ,
432 to_mrwq(uobj->object)->core_qp.qpn) ==
433 obj_id;
434
435 case UVERBS_OBJECT_RWQ_IND_TBL:
436 return get_enc_obj_id(MLX5_CMD_OP_CREATE_RQT,
437 to_mrwq_ind_table(uobj->object)->rqtn) ==
438 obj_id;
439
440 case MLX5_IB_OBJECT_DEVX_OBJ:
441 return ((struct devx_obj *)uobj->object)->obj_id == obj_id;
442
443 default:
444 return false;
445 }
Yishai Hadase662e142018-06-17 13:00:02 +0300446}
447
Yishai Hadasba1a0572018-09-20 21:39:33 +0300448static void devx_set_umem_valid(const void *in)
449{
450 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
451
452 switch (opcode) {
453 case MLX5_CMD_OP_CREATE_MKEY:
454 MLX5_SET(create_mkey_in, in, mkey_umem_valid, 1);
455 break;
456 case MLX5_CMD_OP_CREATE_CQ:
457 {
458 void *cqc;
459
460 MLX5_SET(create_cq_in, in, cq_umem_valid, 1);
461 cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
462 MLX5_SET(cqc, cqc, dbr_umem_valid, 1);
463 break;
464 }
465 case MLX5_CMD_OP_CREATE_QP:
466 {
467 void *qpc;
468
469 qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
470 MLX5_SET(qpc, qpc, dbr_umem_valid, 1);
471 MLX5_SET(create_qp_in, in, wq_umem_valid, 1);
472 break;
473 }
474
475 case MLX5_CMD_OP_CREATE_RQ:
476 {
477 void *rqc, *wq;
478
479 rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);
480 wq = MLX5_ADDR_OF(rqc, rqc, wq);
481 MLX5_SET(wq, wq, dbr_umem_valid, 1);
482 MLX5_SET(wq, wq, wq_umem_valid, 1);
483 break;
484 }
485
486 case MLX5_CMD_OP_CREATE_SQ:
487 {
488 void *sqc, *wq;
489
490 sqc = MLX5_ADDR_OF(create_sq_in, in, ctx);
491 wq = MLX5_ADDR_OF(sqc, sqc, wq);
492 MLX5_SET(wq, wq, dbr_umem_valid, 1);
493 MLX5_SET(wq, wq, wq_umem_valid, 1);
494 break;
495 }
496
497 case MLX5_CMD_OP_MODIFY_CQ:
498 MLX5_SET(modify_cq_in, in, cq_umem_valid, 1);
499 break;
500
501 case MLX5_CMD_OP_CREATE_RMP:
502 {
503 void *rmpc, *wq;
504
505 rmpc = MLX5_ADDR_OF(create_rmp_in, in, ctx);
506 wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
507 MLX5_SET(wq, wq, dbr_umem_valid, 1);
508 MLX5_SET(wq, wq, wq_umem_valid, 1);
509 break;
510 }
511
512 case MLX5_CMD_OP_CREATE_XRQ:
513 {
514 void *xrqc, *wq;
515
516 xrqc = MLX5_ADDR_OF(create_xrq_in, in, xrq_context);
517 wq = MLX5_ADDR_OF(xrqc, xrqc, wq);
518 MLX5_SET(wq, wq, dbr_umem_valid, 1);
519 MLX5_SET(wq, wq, wq_umem_valid, 1);
520 break;
521 }
522
523 case MLX5_CMD_OP_CREATE_XRC_SRQ:
524 {
525 void *xrc_srqc;
526
527 MLX5_SET(create_xrc_srq_in, in, xrc_srq_umem_valid, 1);
528 xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, in,
529 xrc_srq_context_entry);
530 MLX5_SET(xrc_srqc, xrc_srqc, dbr_umem_valid, 1);
531 break;
532 }
533
534 default:
535 return;
536 }
537}
538
Yishai Hadas2351776e2018-10-07 12:06:34 +0300539static bool devx_is_obj_create_cmd(const void *in, u16 *opcode)
Yishai Hadas7efce362018-06-17 13:00:01 +0300540{
Yishai Hadas2351776e2018-10-07 12:06:34 +0300541 *opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
Yishai Hadas7efce362018-06-17 13:00:01 +0300542
Yishai Hadas2351776e2018-10-07 12:06:34 +0300543 switch (*opcode) {
Yishai Hadas7efce362018-06-17 13:00:01 +0300544 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
545 case MLX5_CMD_OP_CREATE_MKEY:
546 case MLX5_CMD_OP_CREATE_CQ:
547 case MLX5_CMD_OP_ALLOC_PD:
548 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
549 case MLX5_CMD_OP_CREATE_RMP:
550 case MLX5_CMD_OP_CREATE_SQ:
551 case MLX5_CMD_OP_CREATE_RQ:
552 case MLX5_CMD_OP_CREATE_RQT:
553 case MLX5_CMD_OP_CREATE_TIR:
554 case MLX5_CMD_OP_CREATE_TIS:
555 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
556 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
557 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
558 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
Mark Bloch60786f02018-08-28 14:18:46 +0300559 case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
Yishai Hadas7efce362018-06-17 13:00:01 +0300560 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
561 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
562 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
563 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
564 case MLX5_CMD_OP_CREATE_QP:
565 case MLX5_CMD_OP_CREATE_SRQ:
566 case MLX5_CMD_OP_CREATE_XRC_SRQ:
567 case MLX5_CMD_OP_CREATE_DCT:
568 case MLX5_CMD_OP_CREATE_XRQ:
569 case MLX5_CMD_OP_ATTACH_TO_MCG:
570 case MLX5_CMD_OP_ALLOC_XRCD:
571 return true;
572 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
573 {
574 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
575 if (op_mod == 0)
576 return true;
577 return false;
578 }
579 default:
580 return false;
581 }
582}
583
Yishai Hadase662e142018-06-17 13:00:02 +0300584static bool devx_is_obj_modify_cmd(const void *in)
585{
586 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
587
588 switch (opcode) {
589 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
590 case MLX5_CMD_OP_MODIFY_CQ:
591 case MLX5_CMD_OP_MODIFY_RMP:
592 case MLX5_CMD_OP_MODIFY_SQ:
593 case MLX5_CMD_OP_MODIFY_RQ:
594 case MLX5_CMD_OP_MODIFY_RQT:
595 case MLX5_CMD_OP_MODIFY_TIR:
596 case MLX5_CMD_OP_MODIFY_TIS:
597 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
598 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
599 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
600 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
601 case MLX5_CMD_OP_RST2INIT_QP:
602 case MLX5_CMD_OP_INIT2RTR_QP:
603 case MLX5_CMD_OP_RTR2RTS_QP:
604 case MLX5_CMD_OP_RTS2RTS_QP:
605 case MLX5_CMD_OP_SQERR2RTS_QP:
606 case MLX5_CMD_OP_2ERR_QP:
607 case MLX5_CMD_OP_2RST_QP:
608 case MLX5_CMD_OP_ARM_XRC_SRQ:
609 case MLX5_CMD_OP_ARM_RQ:
610 case MLX5_CMD_OP_DRAIN_DCT:
611 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
612 case MLX5_CMD_OP_ARM_XRQ:
Yishai Hadas719598c2018-11-26 08:28:37 +0200613 case MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY:
Yishai Hadase662e142018-06-17 13:00:02 +0300614 return true;
615 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
616 {
617 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
618
619 if (op_mod == 1)
620 return true;
621 return false;
622 }
623 default:
624 return false;
625 }
626}
627
628static bool devx_is_obj_query_cmd(const void *in)
629{
630 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
631
632 switch (opcode) {
633 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
634 case MLX5_CMD_OP_QUERY_MKEY:
635 case MLX5_CMD_OP_QUERY_CQ:
636 case MLX5_CMD_OP_QUERY_RMP:
637 case MLX5_CMD_OP_QUERY_SQ:
638 case MLX5_CMD_OP_QUERY_RQ:
639 case MLX5_CMD_OP_QUERY_RQT:
640 case MLX5_CMD_OP_QUERY_TIR:
641 case MLX5_CMD_OP_QUERY_TIS:
642 case MLX5_CMD_OP_QUERY_Q_COUNTER:
643 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
644 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
645 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
646 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
647 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
648 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
649 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
650 case MLX5_CMD_OP_QUERY_QP:
651 case MLX5_CMD_OP_QUERY_SRQ:
652 case MLX5_CMD_OP_QUERY_XRC_SRQ:
653 case MLX5_CMD_OP_QUERY_DCT:
654 case MLX5_CMD_OP_QUERY_XRQ:
Yishai Hadas719598c2018-11-26 08:28:37 +0200655 case MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY:
656 case MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS:
657 case MLX5_CMD_OP_QUERY_PACKET_REFORMAT_CONTEXT:
Yishai Hadase662e142018-06-17 13:00:02 +0300658 return true;
659 default:
660 return false;
661 }
662}
663
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300664static bool devx_is_whitelist_cmd(void *in)
665{
666 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
667
668 switch (opcode) {
669 case MLX5_CMD_OP_QUERY_HCA_CAP:
670 case MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT:
671 return true;
672 default:
673 return false;
674 }
675}
676
677static int devx_get_uid(struct mlx5_ib_ucontext *c, void *cmd_in)
678{
679 if (devx_is_whitelist_cmd(cmd_in)) {
680 struct mlx5_ib_dev *dev;
681
682 if (c->devx_uid)
683 return c->devx_uid;
684
685 dev = to_mdev(c->ibucontext.device);
686 if (dev->devx_whitelist_uid)
687 return dev->devx_whitelist_uid;
688
689 return -EOPNOTSUPP;
690 }
691
692 if (!c->devx_uid)
693 return -EINVAL;
694
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300695 return c->devx_uid;
696}
Yishai Hadase662e142018-06-17 13:00:02 +0300697static bool devx_is_general_cmd(void *in)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300698{
699 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
700
Yishai Hadas719598c2018-11-26 08:28:37 +0200701 if (opcode >= MLX5_CMD_OP_GENERAL_START &&
702 opcode < MLX5_CMD_OP_GENERAL_END)
703 return true;
704
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300705 switch (opcode) {
706 case MLX5_CMD_OP_QUERY_HCA_CAP:
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300707 case MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT:
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300708 case MLX5_CMD_OP_QUERY_VPORT_STATE:
709 case MLX5_CMD_OP_QUERY_ADAPTER:
710 case MLX5_CMD_OP_QUERY_ISSI:
711 case MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT:
712 case MLX5_CMD_OP_QUERY_ROCE_ADDRESS:
713 case MLX5_CMD_OP_QUERY_VNIC_ENV:
714 case MLX5_CMD_OP_QUERY_VPORT_COUNTER:
715 case MLX5_CMD_OP_GET_DROPPED_PACKET_LOG:
716 case MLX5_CMD_OP_NOP:
717 case MLX5_CMD_OP_QUERY_CONG_STATUS:
718 case MLX5_CMD_OP_QUERY_CONG_PARAMS:
719 case MLX5_CMD_OP_QUERY_CONG_STATISTICS:
720 return true;
721 default:
722 return false;
723 }
724}
725
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600726static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200727 struct uverbs_attr_bundle *attrs)
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300728{
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600729 struct mlx5_ib_ucontext *c;
730 struct mlx5_ib_dev *dev;
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300731 int user_vector;
732 int dev_eqn;
733 unsigned int irqn;
734 int err;
735
736 if (uverbs_copy_from(&user_vector, attrs,
737 MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC))
738 return -EFAULT;
739
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200740 c = devx_ufile2uctx(attrs);
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600741 if (IS_ERR(c))
742 return PTR_ERR(c);
743 dev = to_mdev(c->ibucontext.device);
744
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300745 err = mlx5_vector2eqn(dev->mdev, user_vector, &dev_eqn, &irqn);
746 if (err < 0)
747 return err;
748
749 if (uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_QUERY_EQN_DEV_EQN,
750 &dev_eqn, sizeof(dev_eqn)))
751 return -EFAULT;
752
753 return 0;
754}
755
Yishai Hadas7c043e92018-06-17 13:00:03 +0300756/*
757 *Security note:
758 * The hardware protection mechanism works like this: Each device object that
759 * is subject to UAR doorbells (QP/SQ/CQ) gets a UAR ID (called uar_page in
760 * the device specification manual) upon its creation. Then upon doorbell,
761 * hardware fetches the object context for which the doorbell was rang, and
762 * validates that the UAR through which the DB was rang matches the UAR ID
763 * of the object.
764 * If no match the doorbell is silently ignored by the hardware. Of course,
765 * the user cannot ring a doorbell on a UAR that was not mapped to it.
766 * Now in devx, as the devx kernel does not manipulate the QP/SQ/CQ command
767 * mailboxes (except tagging them with UID), we expose to the user its UAR
768 * ID, so it can embed it in these objects in the expected specification
769 * format. So the only thing the user can do is hurt itself by creating a
770 * QP/SQ/CQ with a UAR ID other than his, and then in this case other users
771 * may ring a doorbell on its objects.
772 * The consequence of that will be that another user can schedule a QP/SQ
773 * of the buggy user for execution (just insert it to the hardware schedule
774 * queue or arm its CQ for event generation), no further harm is expected.
775 */
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600776static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200777 struct uverbs_attr_bundle *attrs)
Yishai Hadas7c043e92018-06-17 13:00:03 +0300778{
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600779 struct mlx5_ib_ucontext *c;
780 struct mlx5_ib_dev *dev;
Yishai Hadas7c043e92018-06-17 13:00:03 +0300781 u32 user_idx;
782 s32 dev_idx;
783
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200784 c = devx_ufile2uctx(attrs);
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600785 if (IS_ERR(c))
786 return PTR_ERR(c);
787 dev = to_mdev(c->ibucontext.device);
788
Yishai Hadas7c043e92018-06-17 13:00:03 +0300789 if (uverbs_copy_from(&user_idx, attrs,
790 MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX))
791 return -EFAULT;
792
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600793 dev_idx = bfregn_to_uar_index(dev, &c->bfregi, user_idx, true);
Yishai Hadas7c043e92018-06-17 13:00:03 +0300794 if (dev_idx < 0)
795 return dev_idx;
796
797 if (uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX,
798 &dev_idx, sizeof(dev_idx)))
799 return -EFAULT;
800
801 return 0;
802}
803
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600804static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200805 struct uverbs_attr_bundle *attrs)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300806{
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600807 struct mlx5_ib_ucontext *c;
808 struct mlx5_ib_dev *dev;
Yishai Hadas7efce362018-06-17 13:00:01 +0300809 void *cmd_in = uverbs_attr_get_alloced_ptr(
810 attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300811 int cmd_out_len = uverbs_attr_get_len(attrs,
812 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
813 void *cmd_out;
814 int err;
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300815 int uid;
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300816
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +0200817 c = devx_ufile2uctx(attrs);
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600818 if (IS_ERR(c))
819 return PTR_ERR(c);
820 dev = to_mdev(c->ibucontext.device);
821
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300822 uid = devx_get_uid(c, cmd_in);
823 if (uid < 0)
824 return uid;
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300825
826 /* Only white list of some general HCA commands are allowed for this method. */
827 if (!devx_is_general_cmd(cmd_in))
828 return -EINVAL;
829
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600830 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
831 if (IS_ERR(cmd_out))
832 return PTR_ERR(cmd_out);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300833
Yishai Hadas7e1335a2018-09-20 21:45:20 +0300834 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300835 err = mlx5_cmd_exec(dev->mdev, cmd_in,
836 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
837 cmd_out, cmd_out_len);
838 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600839 return err;
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300840
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600841 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out,
842 cmd_out_len);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300843}
844
Yishai Hadas7efce362018-06-17 13:00:01 +0300845static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
846 u32 *dinlen,
847 u32 *obj_id)
848{
849 u16 obj_type = MLX5_GET(general_obj_in_cmd_hdr, in, obj_type);
850 u16 uid = MLX5_GET(general_obj_in_cmd_hdr, in, uid);
851
852 *obj_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
853 *dinlen = MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr);
854
855 MLX5_SET(general_obj_in_cmd_hdr, din, obj_id, *obj_id);
856 MLX5_SET(general_obj_in_cmd_hdr, din, uid, uid);
857
858 switch (MLX5_GET(general_obj_in_cmd_hdr, in, opcode)) {
859 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
860 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
861 MLX5_SET(general_obj_in_cmd_hdr, din, obj_type, obj_type);
862 break;
863
864 case MLX5_CMD_OP_CREATE_MKEY:
865 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_MKEY);
866 break;
867 case MLX5_CMD_OP_CREATE_CQ:
868 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_CQ);
869 break;
870 case MLX5_CMD_OP_ALLOC_PD:
871 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_PD);
872 break;
873 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
874 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
875 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
876 break;
877 case MLX5_CMD_OP_CREATE_RMP:
878 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RMP);
879 break;
880 case MLX5_CMD_OP_CREATE_SQ:
881 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SQ);
882 break;
883 case MLX5_CMD_OP_CREATE_RQ:
884 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQ);
885 break;
886 case MLX5_CMD_OP_CREATE_RQT:
887 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQT);
888 break;
889 case MLX5_CMD_OP_CREATE_TIR:
890 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIR);
891 break;
892 case MLX5_CMD_OP_CREATE_TIS:
893 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIS);
894 break;
895 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
896 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
897 MLX5_CMD_OP_DEALLOC_Q_COUNTER);
898 break;
899 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
900 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_table_in);
901 *obj_id = MLX5_GET(create_flow_table_out, out, table_id);
902 MLX5_SET(destroy_flow_table_in, din, other_vport,
903 MLX5_GET(create_flow_table_in, in, other_vport));
904 MLX5_SET(destroy_flow_table_in, din, vport_number,
905 MLX5_GET(create_flow_table_in, in, vport_number));
906 MLX5_SET(destroy_flow_table_in, din, table_type,
907 MLX5_GET(create_flow_table_in, in, table_type));
908 MLX5_SET(destroy_flow_table_in, din, table_id, *obj_id);
909 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
910 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
911 break;
912 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
913 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_group_in);
914 *obj_id = MLX5_GET(create_flow_group_out, out, group_id);
915 MLX5_SET(destroy_flow_group_in, din, other_vport,
916 MLX5_GET(create_flow_group_in, in, other_vport));
917 MLX5_SET(destroy_flow_group_in, din, vport_number,
918 MLX5_GET(create_flow_group_in, in, vport_number));
919 MLX5_SET(destroy_flow_group_in, din, table_type,
920 MLX5_GET(create_flow_group_in, in, table_type));
921 MLX5_SET(destroy_flow_group_in, din, table_id,
922 MLX5_GET(create_flow_group_in, in, table_id));
923 MLX5_SET(destroy_flow_group_in, din, group_id, *obj_id);
924 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
925 MLX5_CMD_OP_DESTROY_FLOW_GROUP);
926 break;
927 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
928 *dinlen = MLX5_ST_SZ_BYTES(delete_fte_in);
929 *obj_id = MLX5_GET(set_fte_in, in, flow_index);
930 MLX5_SET(delete_fte_in, din, other_vport,
931 MLX5_GET(set_fte_in, in, other_vport));
932 MLX5_SET(delete_fte_in, din, vport_number,
933 MLX5_GET(set_fte_in, in, vport_number));
934 MLX5_SET(delete_fte_in, din, table_type,
935 MLX5_GET(set_fte_in, in, table_type));
936 MLX5_SET(delete_fte_in, din, table_id,
937 MLX5_GET(set_fte_in, in, table_id));
938 MLX5_SET(delete_fte_in, din, flow_index, *obj_id);
939 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
940 MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY);
941 break;
942 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
943 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
944 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
945 break;
Mark Bloch60786f02018-08-28 14:18:46 +0300946 case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
Yishai Hadas7efce362018-06-17 13:00:01 +0300947 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
Mark Bloch60786f02018-08-28 14:18:46 +0300948 MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT);
Yishai Hadas7efce362018-06-17 13:00:01 +0300949 break;
950 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
951 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
952 MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT);
953 break;
954 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
955 *dinlen = MLX5_ST_SZ_BYTES(destroy_scheduling_element_in);
956 *obj_id = MLX5_GET(create_scheduling_element_out, out,
957 scheduling_element_id);
958 MLX5_SET(destroy_scheduling_element_in, din,
959 scheduling_hierarchy,
960 MLX5_GET(create_scheduling_element_in, in,
961 scheduling_hierarchy));
962 MLX5_SET(destroy_scheduling_element_in, din,
963 scheduling_element_id, *obj_id);
964 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
965 MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT);
966 break;
967 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
968 *dinlen = MLX5_ST_SZ_BYTES(delete_vxlan_udp_dport_in);
969 *obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
970 MLX5_SET(delete_vxlan_udp_dport_in, din, vxlan_udp_port, *obj_id);
971 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
972 MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT);
973 break;
974 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
975 *dinlen = MLX5_ST_SZ_BYTES(delete_l2_table_entry_in);
976 *obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
977 MLX5_SET(delete_l2_table_entry_in, din, table_index, *obj_id);
978 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
979 MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY);
980 break;
981 case MLX5_CMD_OP_CREATE_QP:
982 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_QP);
983 break;
984 case MLX5_CMD_OP_CREATE_SRQ:
985 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SRQ);
986 break;
987 case MLX5_CMD_OP_CREATE_XRC_SRQ:
988 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
989 MLX5_CMD_OP_DESTROY_XRC_SRQ);
990 break;
991 case MLX5_CMD_OP_CREATE_DCT:
992 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_DCT);
993 break;
994 case MLX5_CMD_OP_CREATE_XRQ:
995 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_XRQ);
996 break;
997 case MLX5_CMD_OP_ATTACH_TO_MCG:
998 *dinlen = MLX5_ST_SZ_BYTES(detach_from_mcg_in);
999 MLX5_SET(detach_from_mcg_in, din, qpn,
1000 MLX5_GET(attach_to_mcg_in, in, qpn));
1001 memcpy(MLX5_ADDR_OF(detach_from_mcg_in, din, multicast_gid),
1002 MLX5_ADDR_OF(attach_to_mcg_in, in, multicast_gid),
1003 MLX5_FLD_SZ_BYTES(attach_to_mcg_in, multicast_gid));
1004 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DETACH_FROM_MCG);
1005 break;
1006 case MLX5_CMD_OP_ALLOC_XRCD:
1007 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_XRCD);
1008 break;
1009 default:
1010 /* The entry must match to one of the devx_is_obj_create_cmd */
1011 WARN_ON(true);
1012 break;
1013 }
1014}
1015
1016static int devx_obj_cleanup(struct ib_uobject *uobject,
1017 enum rdma_remove_reason why)
1018{
1019 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
1020 struct devx_obj *obj = uobject->object;
1021 int ret;
1022
1023 ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
Yishai Hadas1c774832018-06-20 17:11:39 +03001024 if (ib_is_destroy_retryable(ret, why, uobject))
Yishai Hadas7efce362018-06-17 13:00:01 +03001025 return ret;
1026
1027 kfree(obj);
1028 return ret;
1029}
1030
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -06001031static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +02001032 struct uverbs_attr_bundle *attrs)
Yishai Hadas7efce362018-06-17 13:00:01 +03001033{
Yishai Hadas7efce362018-06-17 13:00:01 +03001034 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN);
1035 int cmd_out_len = uverbs_attr_get_len(attrs,
1036 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT);
1037 void *cmd_out;
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001038 struct ib_uobject *uobj = uverbs_attr_get_uobject(
1039 attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE);
1040 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
1041 struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device);
Yishai Hadase8ef0902018-09-25 12:11:12 +03001042 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
Yishai Hadas7efce362018-06-17 13:00:01 +03001043 struct devx_obj *obj;
1044 int err;
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001045 int uid;
Yishai Hadas2351776e2018-10-07 12:06:34 +03001046 u32 obj_id;
1047 u16 opcode;
Yishai Hadas7efce362018-06-17 13:00:01 +03001048
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001049 uid = devx_get_uid(c, cmd_in);
1050 if (uid < 0)
1051 return uid;
Yishai Hadas7efce362018-06-17 13:00:01 +03001052
Yishai Hadas2351776e2018-10-07 12:06:34 +03001053 if (!devx_is_obj_create_cmd(cmd_in, &opcode))
Yishai Hadas7efce362018-06-17 13:00:01 +03001054 return -EINVAL;
1055
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001056 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
1057 if (IS_ERR(cmd_out))
1058 return PTR_ERR(cmd_out);
1059
Yishai Hadas7efce362018-06-17 13:00:01 +03001060 obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
1061 if (!obj)
1062 return -ENOMEM;
1063
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001064 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
Yishai Hadasba1a0572018-09-20 21:39:33 +03001065 devx_set_umem_valid(cmd_in);
1066
Yishai Hadas7efce362018-06-17 13:00:01 +03001067 err = mlx5_cmd_exec(dev->mdev, cmd_in,
1068 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
1069 cmd_out, cmd_out_len);
1070 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001071 goto obj_free;
Yishai Hadas7efce362018-06-17 13:00:01 +03001072
Yishai Hadas7efce362018-06-17 13:00:01 +03001073 uobj->object = obj;
1074 obj->mdev = dev->mdev;
Yishai Hadas2351776e2018-10-07 12:06:34 +03001075 devx_obj_build_destroy_cmd(cmd_in, cmd_out, obj->dinbox, &obj->dinlen,
1076 &obj_id);
Yishai Hadas7efce362018-06-17 13:00:01 +03001077 WARN_ON(obj->dinlen > MLX5_MAX_DESTROY_INBOX_SIZE_DW * sizeof(u32));
1078
1079 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
1080 if (err)
Yishai Hadase8ef0902018-09-25 12:11:12 +03001081 goto obj_destroy;
Yishai Hadas7efce362018-06-17 13:00:01 +03001082
Yishai Hadas2351776e2018-10-07 12:06:34 +03001083 obj->obj_id = get_enc_obj_id(opcode, obj_id);
Yishai Hadas7efce362018-06-17 13:00:01 +03001084 return 0;
1085
Yishai Hadase8ef0902018-09-25 12:11:12 +03001086obj_destroy:
1087 mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
Yishai Hadas7efce362018-06-17 13:00:01 +03001088obj_free:
1089 kfree(obj);
1090 return err;
1091}
1092
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -06001093static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +02001094 struct uverbs_attr_bundle *attrs)
Yishai Hadase662e142018-06-17 13:00:02 +03001095{
Yishai Hadase662e142018-06-17 13:00:02 +03001096 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN);
1097 int cmd_out_len = uverbs_attr_get_len(attrs,
1098 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT);
1099 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
1100 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE);
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001101 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
Yishai Hadas34613eb2018-11-26 08:28:35 +02001102 struct mlx5_ib_dev *mdev = to_mdev(uobj->context->device);
Yishai Hadase662e142018-06-17 13:00:02 +03001103 void *cmd_out;
1104 int err;
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001105 int uid;
Yishai Hadase662e142018-06-17 13:00:02 +03001106
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001107 uid = devx_get_uid(c, cmd_in);
1108 if (uid < 0)
1109 return uid;
Yishai Hadase662e142018-06-17 13:00:02 +03001110
1111 if (!devx_is_obj_modify_cmd(cmd_in))
1112 return -EINVAL;
1113
Yishai Hadas34613eb2018-11-26 08:28:35 +02001114 if (!devx_is_valid_obj_id(uobj, cmd_in))
Yishai Hadase662e142018-06-17 13:00:02 +03001115 return -EINVAL;
1116
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001117 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
1118 if (IS_ERR(cmd_out))
1119 return PTR_ERR(cmd_out);
Yishai Hadase662e142018-06-17 13:00:02 +03001120
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001121 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
Yishai Hadasba1a0572018-09-20 21:39:33 +03001122 devx_set_umem_valid(cmd_in);
1123
Yishai Hadas34613eb2018-11-26 08:28:35 +02001124 err = mlx5_cmd_exec(mdev->mdev, cmd_in,
Yishai Hadase662e142018-06-17 13:00:02 +03001125 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
1126 cmd_out, cmd_out_len);
1127 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001128 return err;
Yishai Hadase662e142018-06-17 13:00:02 +03001129
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001130 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
1131 cmd_out, cmd_out_len);
Yishai Hadase662e142018-06-17 13:00:02 +03001132}
1133
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -06001134static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +02001135 struct uverbs_attr_bundle *attrs)
Yishai Hadase662e142018-06-17 13:00:02 +03001136{
Yishai Hadase662e142018-06-17 13:00:02 +03001137 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN);
1138 int cmd_out_len = uverbs_attr_get_len(attrs,
1139 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT);
1140 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
1141 MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE);
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001142 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
Yishai Hadase662e142018-06-17 13:00:02 +03001143 void *cmd_out;
1144 int err;
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001145 int uid;
Yishai Hadas34613eb2018-11-26 08:28:35 +02001146 struct mlx5_ib_dev *mdev = to_mdev(uobj->context->device);
Yishai Hadase662e142018-06-17 13:00:02 +03001147
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001148 uid = devx_get_uid(c, cmd_in);
1149 if (uid < 0)
1150 return uid;
Yishai Hadase662e142018-06-17 13:00:02 +03001151
1152 if (!devx_is_obj_query_cmd(cmd_in))
1153 return -EINVAL;
1154
Yishai Hadas34613eb2018-11-26 08:28:35 +02001155 if (!devx_is_valid_obj_id(uobj, cmd_in))
Yishai Hadase662e142018-06-17 13:00:02 +03001156 return -EINVAL;
1157
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001158 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
1159 if (IS_ERR(cmd_out))
1160 return PTR_ERR(cmd_out);
Yishai Hadase662e142018-06-17 13:00:02 +03001161
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001162 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
Yishai Hadas34613eb2018-11-26 08:28:35 +02001163 err = mlx5_cmd_exec(mdev->mdev, cmd_in,
Yishai Hadase662e142018-06-17 13:00:02 +03001164 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
1165 cmd_out, cmd_out_len);
1166 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001167 return err;
Yishai Hadase662e142018-06-17 13:00:02 +03001168
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001169 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
1170 cmd_out, cmd_out_len);
Yishai Hadase662e142018-06-17 13:00:02 +03001171}
1172
Yishai Hadasaeae9452018-06-17 13:00:04 +03001173static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
1174 struct uverbs_attr_bundle *attrs,
1175 struct devx_umem *obj)
1176{
1177 u64 addr;
1178 size_t size;
Jason Gunthorpebccd0622018-07-26 16:37:14 -06001179 u32 access;
Yishai Hadasaeae9452018-06-17 13:00:04 +03001180 int npages;
1181 int err;
1182 u32 page_mask;
1183
1184 if (uverbs_copy_from(&addr, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR) ||
Jason Gunthorpebccd0622018-07-26 16:37:14 -06001185 uverbs_copy_from(&size, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_LEN))
Yishai Hadasaeae9452018-06-17 13:00:04 +03001186 return -EFAULT;
1187
Jason Gunthorpebccd0622018-07-26 16:37:14 -06001188 err = uverbs_get_flags32(&access, attrs,
1189 MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
1190 IB_ACCESS_SUPPORTED);
1191 if (err)
1192 return err;
1193
Yishai Hadasaeae9452018-06-17 13:00:04 +03001194 err = ib_check_mr_access(access);
1195 if (err)
1196 return err;
1197
1198 obj->umem = ib_umem_get(ucontext, addr, size, access, 0);
1199 if (IS_ERR(obj->umem))
1200 return PTR_ERR(obj->umem);
1201
1202 mlx5_ib_cont_pages(obj->umem, obj->umem->address,
1203 MLX5_MKEY_PAGE_SHIFT_MASK, &npages,
1204 &obj->page_shift, &obj->ncont, NULL);
1205
1206 if (!npages) {
1207 ib_umem_release(obj->umem);
1208 return -EINVAL;
1209 }
1210
1211 page_mask = (1 << obj->page_shift) - 1;
1212 obj->page_offset = obj->umem->address & page_mask;
1213
1214 return 0;
1215}
1216
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001217static int devx_umem_reg_cmd_alloc(struct uverbs_attr_bundle *attrs,
1218 struct devx_umem *obj,
Yishai Hadasaeae9452018-06-17 13:00:04 +03001219 struct devx_umem_reg_cmd *cmd)
1220{
1221 cmd->inlen = MLX5_ST_SZ_BYTES(create_umem_in) +
1222 (MLX5_ST_SZ_BYTES(mtt) * obj->ncont);
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001223 cmd->in = uverbs_zalloc(attrs, cmd->inlen);
1224 return PTR_ERR_OR_ZERO(cmd->in);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001225}
1226
1227static void devx_umem_reg_cmd_build(struct mlx5_ib_dev *dev,
1228 struct devx_umem *obj,
1229 struct devx_umem_reg_cmd *cmd)
1230{
1231 void *umem;
1232 __be64 *mtt;
1233
1234 umem = MLX5_ADDR_OF(create_umem_in, cmd->in, umem);
1235 mtt = (__be64 *)MLX5_ADDR_OF(umem, umem, mtt);
1236
1237 MLX5_SET(general_obj_in_cmd_hdr, cmd->in, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
1238 MLX5_SET(general_obj_in_cmd_hdr, cmd->in, obj_type, MLX5_OBJ_TYPE_UMEM);
1239 MLX5_SET64(umem, umem, num_of_mtt, obj->ncont);
1240 MLX5_SET(umem, umem, log_page_size, obj->page_shift -
1241 MLX5_ADAPTER_PAGE_SHIFT);
1242 MLX5_SET(umem, umem, page_offset, obj->page_offset);
1243 mlx5_ib_populate_pas(dev, obj->umem, obj->page_shift, mtt,
1244 (obj->umem->writable ? MLX5_IB_MTT_WRITE : 0) |
1245 MLX5_IB_MTT_READ);
1246}
1247
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -06001248static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
Jason Gunthorpe15a1b4b2018-11-25 20:51:15 +02001249 struct uverbs_attr_bundle *attrs)
Yishai Hadasaeae9452018-06-17 13:00:04 +03001250{
Yishai Hadasaeae9452018-06-17 13:00:04 +03001251 struct devx_umem_reg_cmd cmd;
1252 struct devx_umem *obj;
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001253 struct ib_uobject *uobj = uverbs_attr_get_uobject(
1254 attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001255 u32 obj_id;
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001256 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
1257 struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001258 int err;
1259
1260 if (!c->devx_uid)
Yishai Hadas7e1335a2018-09-20 21:45:20 +03001261 return -EINVAL;
1262
Yishai Hadasaeae9452018-06-17 13:00:04 +03001263 obj = kzalloc(sizeof(struct devx_umem), GFP_KERNEL);
1264 if (!obj)
1265 return -ENOMEM;
1266
1267 err = devx_umem_get(dev, &c->ibucontext, attrs, obj);
1268 if (err)
1269 goto err_obj_free;
1270
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001271 err = devx_umem_reg_cmd_alloc(attrs, obj, &cmd);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001272 if (err)
1273 goto err_umem_release;
1274
1275 devx_umem_reg_cmd_build(dev, obj, &cmd);
1276
1277 MLX5_SET(general_obj_in_cmd_hdr, cmd.in, uid, c->devx_uid);
1278 err = mlx5_cmd_exec(dev->mdev, cmd.in, cmd.inlen, cmd.out,
1279 sizeof(cmd.out));
1280 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001281 goto err_umem_release;
Yishai Hadasaeae9452018-06-17 13:00:04 +03001282
1283 obj->mdev = dev->mdev;
1284 uobj->object = obj;
1285 devx_obj_build_destroy_cmd(cmd.in, cmd.out, obj->dinbox, &obj->dinlen, &obj_id);
1286 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID, &obj_id, sizeof(obj_id));
1287 if (err)
1288 goto err_umem_destroy;
1289
Yishai Hadasaeae9452018-06-17 13:00:04 +03001290 return 0;
1291
1292err_umem_destroy:
1293 mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, cmd.out, sizeof(cmd.out));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001294err_umem_release:
1295 ib_umem_release(obj->umem);
1296err_obj_free:
1297 kfree(obj);
1298 return err;
1299}
1300
Yishai Hadasaeae9452018-06-17 13:00:04 +03001301static int devx_umem_cleanup(struct ib_uobject *uobject,
1302 enum rdma_remove_reason why)
1303{
1304 struct devx_umem *obj = uobject->object;
1305 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
1306 int err;
1307
1308 err = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
Yishai Hadas1c774832018-06-20 17:11:39 +03001309 if (ib_is_destroy_retryable(err, why, uobject))
Yishai Hadasaeae9452018-06-17 13:00:04 +03001310 return err;
1311
1312 ib_umem_release(obj->umem);
1313 kfree(obj);
1314 return 0;
1315}
1316
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001317DECLARE_UVERBS_NAMED_METHOD(
1318 MLX5_IB_METHOD_DEVX_UMEM_REG,
1319 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE,
1320 MLX5_IB_OBJECT_DEVX_UMEM,
1321 UVERBS_ACCESS_NEW,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001322 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001323 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR,
1324 UVERBS_ATTR_TYPE(u64),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001325 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001326 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_LEN,
1327 UVERBS_ATTR_TYPE(u64),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001328 UA_MANDATORY),
Jason Gunthorpebccd0622018-07-26 16:37:14 -06001329 UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
1330 enum ib_access_flags),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001331 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
1332 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001333 UA_MANDATORY));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001334
Yishai Hadas528922a2018-07-08 13:24:39 +03001335DECLARE_UVERBS_NAMED_METHOD_DESTROY(
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001336 MLX5_IB_METHOD_DEVX_UMEM_DEREG,
1337 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_DEREG_HANDLE,
1338 MLX5_IB_OBJECT_DEVX_UMEM,
1339 UVERBS_ACCESS_DESTROY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001340 UA_MANDATORY));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001341
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001342DECLARE_UVERBS_NAMED_METHOD(
1343 MLX5_IB_METHOD_DEVX_QUERY_EQN,
1344 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC,
1345 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001346 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001347 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_EQN_DEV_EQN,
1348 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001349 UA_MANDATORY));
Yishai Hadasf6fe01b2018-06-17 13:00:05 +03001350
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001351DECLARE_UVERBS_NAMED_METHOD(
1352 MLX5_IB_METHOD_DEVX_QUERY_UAR,
1353 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX,
1354 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001355 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001356 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX,
1357 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001358 UA_MANDATORY));
Yishai Hadas7c043e92018-06-17 13:00:03 +03001359
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001360DECLARE_UVERBS_NAMED_METHOD(
1361 MLX5_IB_METHOD_DEVX_OTHER,
1362 UVERBS_ATTR_PTR_IN(
1363 MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
1364 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001365 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001366 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001367 UVERBS_ATTR_PTR_OUT(
1368 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
1369 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001370 UA_MANDATORY));
Yishai Hadas8aa8c952018-06-17 13:00:00 +03001371
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001372DECLARE_UVERBS_NAMED_METHOD(
1373 MLX5_IB_METHOD_DEVX_OBJ_CREATE,
1374 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE,
1375 MLX5_IB_OBJECT_DEVX_OBJ,
1376 UVERBS_ACCESS_NEW,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001377 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001378 UVERBS_ATTR_PTR_IN(
1379 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
1380 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001381 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001382 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001383 UVERBS_ATTR_PTR_OUT(
1384 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
1385 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001386 UA_MANDATORY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001387
Yishai Hadas528922a2018-07-08 13:24:39 +03001388DECLARE_UVERBS_NAMED_METHOD_DESTROY(
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001389 MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
1390 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE,
1391 MLX5_IB_OBJECT_DEVX_OBJ,
1392 UVERBS_ACCESS_DESTROY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001393 UA_MANDATORY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001394
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001395DECLARE_UVERBS_NAMED_METHOD(
1396 MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
1397 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE,
Yishai Hadas34613eb2018-11-26 08:28:35 +02001398 UVERBS_IDR_ANY_OBJECT,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001399 UVERBS_ACCESS_WRITE,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001400 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001401 UVERBS_ATTR_PTR_IN(
1402 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN,
1403 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001404 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001405 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001406 UVERBS_ATTR_PTR_OUT(
1407 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
1408 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001409 UA_MANDATORY));
Yishai Hadase662e142018-06-17 13:00:02 +03001410
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001411DECLARE_UVERBS_NAMED_METHOD(
1412 MLX5_IB_METHOD_DEVX_OBJ_QUERY,
1413 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE,
Yishai Hadas34613eb2018-11-26 08:28:35 +02001414 UVERBS_IDR_ANY_OBJECT,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001415 UVERBS_ACCESS_READ,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001416 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001417 UVERBS_ATTR_PTR_IN(
1418 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN,
1419 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001420 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001421 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001422 UVERBS_ATTR_PTR_OUT(
1423 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
1424 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001425 UA_MANDATORY));
Yishai Hadase662e142018-06-17 13:00:02 +03001426
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001427DECLARE_UVERBS_GLOBAL_METHODS(MLX5_IB_OBJECT_DEVX,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001428 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OTHER),
1429 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR),
1430 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_QUERY_EQN));
Yishai Hadas8aa8c952018-06-17 13:00:00 +03001431
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001432DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001433 UVERBS_TYPE_ALLOC_IDR(devx_obj_cleanup),
1434 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE),
1435 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY),
1436 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY),
1437 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001438
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001439DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_UMEM,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001440 UVERBS_TYPE_ALLOC_IDR(devx_umem_cleanup),
1441 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_UMEM_REG),
1442 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_UMEM_DEREG));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001443
Jason Gunthorpe36e235c2018-11-12 22:59:53 +02001444static bool devx_is_supported(struct ib_device *device)
1445{
1446 struct mlx5_ib_dev *dev = to_mdev(device);
1447
1448 return !dev->rep && MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
1449 MLX5_GENERAL_OBJ_TYPES_CAP_UCTX;
1450}
1451
Jason Gunthorpe0cbf4322018-11-12 22:59:50 +02001452const struct uapi_definition mlx5_ib_devx_defs[] = {
Jason Gunthorpe36e235c2018-11-12 22:59:53 +02001453 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
1454 MLX5_IB_OBJECT_DEVX,
1455 UAPI_DEF_IS_OBJ_SUPPORTED(devx_is_supported)),
1456 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
1457 MLX5_IB_OBJECT_DEVX_OBJ,
1458 UAPI_DEF_IS_OBJ_SUPPORTED(devx_is_supported)),
1459 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
1460 MLX5_IB_OBJECT_DEVX_UMEM,
1461 UAPI_DEF_IS_OBJ_SUPPORTED(devx_is_supported)),
Jason Gunthorpe0cbf4322018-11-12 22:59:50 +02001462 {},
1463};