blob: 97cac57dcb3dde91c6345463b998b356eecde3c1 [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>
12#include <linux/mlx5/driver.h>
13#include <linux/mlx5/fs.h>
14#include "mlx5_ib.h"
15
Yishai Hadas8aa8c952018-06-17 13:00:00 +030016#define UVERBS_MODULE_NAME mlx5_ib
17#include <rdma/uverbs_named_ioctl.h>
18
Yishai Hadas7efce362018-06-17 13:00:01 +030019#define MLX5_MAX_DESTROY_INBOX_SIZE_DW MLX5_ST_SZ_DW(delete_fte_in)
20struct devx_obj {
21 struct mlx5_core_dev *mdev;
22 u32 obj_id;
23 u32 dinlen; /* destroy inbox length */
24 u32 dinbox[MLX5_MAX_DESTROY_INBOX_SIZE_DW];
25};
26
Yishai Hadasaeae9452018-06-17 13:00:04 +030027struct devx_umem {
28 struct mlx5_core_dev *mdev;
29 struct ib_umem *umem;
30 u32 page_offset;
31 int page_shift;
32 int ncont;
33 u32 dinlen;
34 u32 dinbox[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)];
35};
36
37struct devx_umem_reg_cmd {
38 void *in;
39 u32 inlen;
40 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
41};
42
Yishai Hadas8aa8c952018-06-17 13:00:00 +030043static struct mlx5_ib_ucontext *devx_ufile2uctx(struct ib_uverbs_file *file)
44{
45 return to_mucontext(ib_uverbs_get_ucontext(file));
46}
47
Yishai Hadas76dc5a82018-09-20 21:45:19 +030048int mlx5_ib_devx_create(struct mlx5_ib_dev *dev)
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030049{
50 u32 in[MLX5_ST_SZ_DW(create_uctx_in)] = {0};
51 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
52 u64 general_obj_types;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030053 void *hdr;
54 int err;
Yishai Hadas76dc5a82018-09-20 21:45:19 +030055 u16 uid;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030056
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030057 hdr = MLX5_ADDR_OF(create_uctx_in, in, hdr);
58
59 general_obj_types = MLX5_CAP_GEN_64(dev->mdev, general_obj_types);
60 if (!(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UCTX) ||
61 !(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UMEM))
62 return -EINVAL;
63
64 if (!capable(CAP_NET_RAW))
65 return -EPERM;
66
67 MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
68 MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type, MLX5_OBJ_TYPE_UCTX);
69
70 err = mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
71 if (err)
72 return err;
73
Yishai Hadas76dc5a82018-09-20 21:45:19 +030074 uid = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
75 return uid;
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030076}
77
Yishai Hadas76dc5a82018-09-20 21:45:19 +030078void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid)
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030079{
80 u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};
81 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
82
83 MLX5_SET(general_obj_in_cmd_hdr, in, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
84 MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_UCTX);
Yishai Hadas76dc5a82018-09-20 21:45:19 +030085 MLX5_SET(general_obj_in_cmd_hdr, in, obj_id, uid);
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030086
87 mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
88}
Yishai Hadas8aa8c952018-06-17 13:00:00 +030089
Yishai Hadas32269442018-07-23 15:25:09 +030090bool mlx5_ib_devx_is_flow_dest(void *obj, int *dest_id, int *dest_type)
91{
92 struct devx_obj *devx_obj = obj;
93 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, devx_obj->dinbox, opcode);
94
95 switch (opcode) {
96 case MLX5_CMD_OP_DESTROY_TIR:
97 *dest_type = MLX5_FLOW_DESTINATION_TYPE_TIR;
98 *dest_id = MLX5_GET(general_obj_in_cmd_hdr, devx_obj->dinbox,
99 obj_id);
100 return true;
101
102 case MLX5_CMD_OP_DESTROY_FLOW_TABLE:
103 *dest_type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
104 *dest_id = MLX5_GET(destroy_flow_table_in, devx_obj->dinbox,
105 table_id);
106 return true;
107 default:
108 return false;
109 }
110}
111
Yishai Hadase662e142018-06-17 13:00:02 +0300112static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
113{
114 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
115 u32 obj_id;
116
117 switch (opcode) {
118 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
119 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
120 obj_id = MLX5_GET(general_obj_in_cmd_hdr, in, obj_id);
121 break;
122 case MLX5_CMD_OP_QUERY_MKEY:
123 obj_id = MLX5_GET(query_mkey_in, in, mkey_index);
124 break;
125 case MLX5_CMD_OP_QUERY_CQ:
126 obj_id = MLX5_GET(query_cq_in, in, cqn);
127 break;
128 case MLX5_CMD_OP_MODIFY_CQ:
129 obj_id = MLX5_GET(modify_cq_in, in, cqn);
130 break;
131 case MLX5_CMD_OP_QUERY_SQ:
132 obj_id = MLX5_GET(query_sq_in, in, sqn);
133 break;
134 case MLX5_CMD_OP_MODIFY_SQ:
135 obj_id = MLX5_GET(modify_sq_in, in, sqn);
136 break;
137 case MLX5_CMD_OP_QUERY_RQ:
138 obj_id = MLX5_GET(query_rq_in, in, rqn);
139 break;
140 case MLX5_CMD_OP_MODIFY_RQ:
141 obj_id = MLX5_GET(modify_rq_in, in, rqn);
142 break;
143 case MLX5_CMD_OP_QUERY_RMP:
144 obj_id = MLX5_GET(query_rmp_in, in, rmpn);
145 break;
146 case MLX5_CMD_OP_MODIFY_RMP:
147 obj_id = MLX5_GET(modify_rmp_in, in, rmpn);
148 break;
149 case MLX5_CMD_OP_QUERY_RQT:
150 obj_id = MLX5_GET(query_rqt_in, in, rqtn);
151 break;
152 case MLX5_CMD_OP_MODIFY_RQT:
153 obj_id = MLX5_GET(modify_rqt_in, in, rqtn);
154 break;
155 case MLX5_CMD_OP_QUERY_TIR:
156 obj_id = MLX5_GET(query_tir_in, in, tirn);
157 break;
158 case MLX5_CMD_OP_MODIFY_TIR:
159 obj_id = MLX5_GET(modify_tir_in, in, tirn);
160 break;
161 case MLX5_CMD_OP_QUERY_TIS:
162 obj_id = MLX5_GET(query_tis_in, in, tisn);
163 break;
164 case MLX5_CMD_OP_MODIFY_TIS:
165 obj_id = MLX5_GET(modify_tis_in, in, tisn);
166 break;
167 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
168 obj_id = MLX5_GET(query_flow_table_in, in, table_id);
169 break;
170 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
171 obj_id = MLX5_GET(modify_flow_table_in, in, table_id);
172 break;
173 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
174 obj_id = MLX5_GET(query_flow_group_in, in, group_id);
175 break;
176 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
177 obj_id = MLX5_GET(query_fte_in, in, flow_index);
178 break;
179 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
180 obj_id = MLX5_GET(set_fte_in, in, flow_index);
181 break;
182 case MLX5_CMD_OP_QUERY_Q_COUNTER:
183 obj_id = MLX5_GET(query_q_counter_in, in, counter_set_id);
184 break;
185 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
186 obj_id = MLX5_GET(query_flow_counter_in, in, flow_counter_id);
187 break;
188 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
189 obj_id = MLX5_GET(general_obj_in_cmd_hdr, in, obj_id);
190 break;
191 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
192 obj_id = MLX5_GET(query_scheduling_element_in, in,
193 scheduling_element_id);
194 break;
195 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
196 obj_id = MLX5_GET(modify_scheduling_element_in, in,
197 scheduling_element_id);
198 break;
199 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
200 obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
201 break;
202 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
203 obj_id = MLX5_GET(query_l2_table_entry_in, in, table_index);
204 break;
205 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
206 obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
207 break;
208 case MLX5_CMD_OP_QUERY_QP:
209 obj_id = MLX5_GET(query_qp_in, in, qpn);
210 break;
211 case MLX5_CMD_OP_RST2INIT_QP:
212 obj_id = MLX5_GET(rst2init_qp_in, in, qpn);
213 break;
214 case MLX5_CMD_OP_INIT2RTR_QP:
215 obj_id = MLX5_GET(init2rtr_qp_in, in, qpn);
216 break;
217 case MLX5_CMD_OP_RTR2RTS_QP:
218 obj_id = MLX5_GET(rtr2rts_qp_in, in, qpn);
219 break;
220 case MLX5_CMD_OP_RTS2RTS_QP:
221 obj_id = MLX5_GET(rts2rts_qp_in, in, qpn);
222 break;
223 case MLX5_CMD_OP_SQERR2RTS_QP:
224 obj_id = MLX5_GET(sqerr2rts_qp_in, in, qpn);
225 break;
226 case MLX5_CMD_OP_2ERR_QP:
227 obj_id = MLX5_GET(qp_2err_in, in, qpn);
228 break;
229 case MLX5_CMD_OP_2RST_QP:
230 obj_id = MLX5_GET(qp_2rst_in, in, qpn);
231 break;
232 case MLX5_CMD_OP_QUERY_DCT:
233 obj_id = MLX5_GET(query_dct_in, in, dctn);
234 break;
235 case MLX5_CMD_OP_QUERY_XRQ:
236 obj_id = MLX5_GET(query_xrq_in, in, xrqn);
237 break;
238 case MLX5_CMD_OP_QUERY_XRC_SRQ:
239 obj_id = MLX5_GET(query_xrc_srq_in, in, xrc_srqn);
240 break;
241 case MLX5_CMD_OP_ARM_XRC_SRQ:
242 obj_id = MLX5_GET(arm_xrc_srq_in, in, xrc_srqn);
243 break;
244 case MLX5_CMD_OP_QUERY_SRQ:
245 obj_id = MLX5_GET(query_srq_in, in, srqn);
246 break;
247 case MLX5_CMD_OP_ARM_RQ:
248 obj_id = MLX5_GET(arm_rq_in, in, srq_number);
249 break;
250 case MLX5_CMD_OP_DRAIN_DCT:
251 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
252 obj_id = MLX5_GET(drain_dct_in, in, dctn);
253 break;
254 case MLX5_CMD_OP_ARM_XRQ:
255 obj_id = MLX5_GET(arm_xrq_in, in, xrqn);
256 break;
257 default:
258 return false;
259 }
260
261 if (obj_id == obj->obj_id)
262 return true;
263
264 return false;
265}
266
Yishai Hadasba1a0572018-09-20 21:39:33 +0300267static void devx_set_umem_valid(const void *in)
268{
269 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
270
271 switch (opcode) {
272 case MLX5_CMD_OP_CREATE_MKEY:
273 MLX5_SET(create_mkey_in, in, mkey_umem_valid, 1);
274 break;
275 case MLX5_CMD_OP_CREATE_CQ:
276 {
277 void *cqc;
278
279 MLX5_SET(create_cq_in, in, cq_umem_valid, 1);
280 cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
281 MLX5_SET(cqc, cqc, dbr_umem_valid, 1);
282 break;
283 }
284 case MLX5_CMD_OP_CREATE_QP:
285 {
286 void *qpc;
287
288 qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
289 MLX5_SET(qpc, qpc, dbr_umem_valid, 1);
290 MLX5_SET(create_qp_in, in, wq_umem_valid, 1);
291 break;
292 }
293
294 case MLX5_CMD_OP_CREATE_RQ:
295 {
296 void *rqc, *wq;
297
298 rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);
299 wq = MLX5_ADDR_OF(rqc, rqc, wq);
300 MLX5_SET(wq, wq, dbr_umem_valid, 1);
301 MLX5_SET(wq, wq, wq_umem_valid, 1);
302 break;
303 }
304
305 case MLX5_CMD_OP_CREATE_SQ:
306 {
307 void *sqc, *wq;
308
309 sqc = MLX5_ADDR_OF(create_sq_in, in, ctx);
310 wq = MLX5_ADDR_OF(sqc, sqc, wq);
311 MLX5_SET(wq, wq, dbr_umem_valid, 1);
312 MLX5_SET(wq, wq, wq_umem_valid, 1);
313 break;
314 }
315
316 case MLX5_CMD_OP_MODIFY_CQ:
317 MLX5_SET(modify_cq_in, in, cq_umem_valid, 1);
318 break;
319
320 case MLX5_CMD_OP_CREATE_RMP:
321 {
322 void *rmpc, *wq;
323
324 rmpc = MLX5_ADDR_OF(create_rmp_in, in, ctx);
325 wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
326 MLX5_SET(wq, wq, dbr_umem_valid, 1);
327 MLX5_SET(wq, wq, wq_umem_valid, 1);
328 break;
329 }
330
331 case MLX5_CMD_OP_CREATE_XRQ:
332 {
333 void *xrqc, *wq;
334
335 xrqc = MLX5_ADDR_OF(create_xrq_in, in, xrq_context);
336 wq = MLX5_ADDR_OF(xrqc, xrqc, wq);
337 MLX5_SET(wq, wq, dbr_umem_valid, 1);
338 MLX5_SET(wq, wq, wq_umem_valid, 1);
339 break;
340 }
341
342 case MLX5_CMD_OP_CREATE_XRC_SRQ:
343 {
344 void *xrc_srqc;
345
346 MLX5_SET(create_xrc_srq_in, in, xrc_srq_umem_valid, 1);
347 xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, in,
348 xrc_srq_context_entry);
349 MLX5_SET(xrc_srqc, xrc_srqc, dbr_umem_valid, 1);
350 break;
351 }
352
353 default:
354 return;
355 }
356}
357
Yishai Hadas7efce362018-06-17 13:00:01 +0300358static bool devx_is_obj_create_cmd(const void *in)
359{
360 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
361
362 switch (opcode) {
363 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
364 case MLX5_CMD_OP_CREATE_MKEY:
365 case MLX5_CMD_OP_CREATE_CQ:
366 case MLX5_CMD_OP_ALLOC_PD:
367 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
368 case MLX5_CMD_OP_CREATE_RMP:
369 case MLX5_CMD_OP_CREATE_SQ:
370 case MLX5_CMD_OP_CREATE_RQ:
371 case MLX5_CMD_OP_CREATE_RQT:
372 case MLX5_CMD_OP_CREATE_TIR:
373 case MLX5_CMD_OP_CREATE_TIS:
374 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
375 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
376 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
377 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
Mark Bloch60786f02018-08-28 14:18:46 +0300378 case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
Yishai Hadas7efce362018-06-17 13:00:01 +0300379 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
380 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
381 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
382 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
383 case MLX5_CMD_OP_CREATE_QP:
384 case MLX5_CMD_OP_CREATE_SRQ:
385 case MLX5_CMD_OP_CREATE_XRC_SRQ:
386 case MLX5_CMD_OP_CREATE_DCT:
387 case MLX5_CMD_OP_CREATE_XRQ:
388 case MLX5_CMD_OP_ATTACH_TO_MCG:
389 case MLX5_CMD_OP_ALLOC_XRCD:
390 return true;
391 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
392 {
393 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
394 if (op_mod == 0)
395 return true;
396 return false;
397 }
398 default:
399 return false;
400 }
401}
402
Yishai Hadase662e142018-06-17 13:00:02 +0300403static bool devx_is_obj_modify_cmd(const void *in)
404{
405 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
406
407 switch (opcode) {
408 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
409 case MLX5_CMD_OP_MODIFY_CQ:
410 case MLX5_CMD_OP_MODIFY_RMP:
411 case MLX5_CMD_OP_MODIFY_SQ:
412 case MLX5_CMD_OP_MODIFY_RQ:
413 case MLX5_CMD_OP_MODIFY_RQT:
414 case MLX5_CMD_OP_MODIFY_TIR:
415 case MLX5_CMD_OP_MODIFY_TIS:
416 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
417 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
418 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
419 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
420 case MLX5_CMD_OP_RST2INIT_QP:
421 case MLX5_CMD_OP_INIT2RTR_QP:
422 case MLX5_CMD_OP_RTR2RTS_QP:
423 case MLX5_CMD_OP_RTS2RTS_QP:
424 case MLX5_CMD_OP_SQERR2RTS_QP:
425 case MLX5_CMD_OP_2ERR_QP:
426 case MLX5_CMD_OP_2RST_QP:
427 case MLX5_CMD_OP_ARM_XRC_SRQ:
428 case MLX5_CMD_OP_ARM_RQ:
429 case MLX5_CMD_OP_DRAIN_DCT:
430 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
431 case MLX5_CMD_OP_ARM_XRQ:
432 return true;
433 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
434 {
435 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
436
437 if (op_mod == 1)
438 return true;
439 return false;
440 }
441 default:
442 return false;
443 }
444}
445
446static bool devx_is_obj_query_cmd(const void *in)
447{
448 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
449
450 switch (opcode) {
451 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
452 case MLX5_CMD_OP_QUERY_MKEY:
453 case MLX5_CMD_OP_QUERY_CQ:
454 case MLX5_CMD_OP_QUERY_RMP:
455 case MLX5_CMD_OP_QUERY_SQ:
456 case MLX5_CMD_OP_QUERY_RQ:
457 case MLX5_CMD_OP_QUERY_RQT:
458 case MLX5_CMD_OP_QUERY_TIR:
459 case MLX5_CMD_OP_QUERY_TIS:
460 case MLX5_CMD_OP_QUERY_Q_COUNTER:
461 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
462 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
463 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
464 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
465 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
466 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
467 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
468 case MLX5_CMD_OP_QUERY_QP:
469 case MLX5_CMD_OP_QUERY_SRQ:
470 case MLX5_CMD_OP_QUERY_XRC_SRQ:
471 case MLX5_CMD_OP_QUERY_DCT:
472 case MLX5_CMD_OP_QUERY_XRQ:
473 return true;
474 default:
475 return false;
476 }
477}
478
479static bool devx_is_general_cmd(void *in)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300480{
481 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
482
483 switch (opcode) {
484 case MLX5_CMD_OP_QUERY_HCA_CAP:
485 case MLX5_CMD_OP_QUERY_VPORT_STATE:
486 case MLX5_CMD_OP_QUERY_ADAPTER:
487 case MLX5_CMD_OP_QUERY_ISSI:
488 case MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT:
489 case MLX5_CMD_OP_QUERY_ROCE_ADDRESS:
490 case MLX5_CMD_OP_QUERY_VNIC_ENV:
491 case MLX5_CMD_OP_QUERY_VPORT_COUNTER:
492 case MLX5_CMD_OP_GET_DROPPED_PACKET_LOG:
493 case MLX5_CMD_OP_NOP:
494 case MLX5_CMD_OP_QUERY_CONG_STATUS:
495 case MLX5_CMD_OP_QUERY_CONG_PARAMS:
496 case MLX5_CMD_OP_QUERY_CONG_STATISTICS:
497 return true;
498 default:
499 return false;
500 }
501}
502
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600503static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(
504 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300505{
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600506 struct mlx5_ib_ucontext *c;
507 struct mlx5_ib_dev *dev;
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300508 int user_vector;
509 int dev_eqn;
510 unsigned int irqn;
511 int err;
512
513 if (uverbs_copy_from(&user_vector, attrs,
514 MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC))
515 return -EFAULT;
516
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600517 c = devx_ufile2uctx(file);
518 if (IS_ERR(c))
519 return PTR_ERR(c);
520 dev = to_mdev(c->ibucontext.device);
521
Yishai Hadasf6fe01b2018-06-17 13:00:05 +0300522 err = mlx5_vector2eqn(dev->mdev, user_vector, &dev_eqn, &irqn);
523 if (err < 0)
524 return err;
525
526 if (uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_QUERY_EQN_DEV_EQN,
527 &dev_eqn, sizeof(dev_eqn)))
528 return -EFAULT;
529
530 return 0;
531}
532
Yishai Hadas7c043e92018-06-17 13:00:03 +0300533/*
534 *Security note:
535 * The hardware protection mechanism works like this: Each device object that
536 * is subject to UAR doorbells (QP/SQ/CQ) gets a UAR ID (called uar_page in
537 * the device specification manual) upon its creation. Then upon doorbell,
538 * hardware fetches the object context for which the doorbell was rang, and
539 * validates that the UAR through which the DB was rang matches the UAR ID
540 * of the object.
541 * If no match the doorbell is silently ignored by the hardware. Of course,
542 * the user cannot ring a doorbell on a UAR that was not mapped to it.
543 * Now in devx, as the devx kernel does not manipulate the QP/SQ/CQ command
544 * mailboxes (except tagging them with UID), we expose to the user its UAR
545 * ID, so it can embed it in these objects in the expected specification
546 * format. So the only thing the user can do is hurt itself by creating a
547 * QP/SQ/CQ with a UAR ID other than his, and then in this case other users
548 * may ring a doorbell on its objects.
549 * The consequence of that will be that another user can schedule a QP/SQ
550 * of the buggy user for execution (just insert it to the hardware schedule
551 * queue or arm its CQ for event generation), no further harm is expected.
552 */
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600553static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(
554 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadas7c043e92018-06-17 13:00:03 +0300555{
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600556 struct mlx5_ib_ucontext *c;
557 struct mlx5_ib_dev *dev;
Yishai Hadas7c043e92018-06-17 13:00:03 +0300558 u32 user_idx;
559 s32 dev_idx;
560
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600561 c = devx_ufile2uctx(file);
562 if (IS_ERR(c))
563 return PTR_ERR(c);
564 dev = to_mdev(c->ibucontext.device);
565
Yishai Hadas7c043e92018-06-17 13:00:03 +0300566 if (uverbs_copy_from(&user_idx, attrs,
567 MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX))
568 return -EFAULT;
569
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600570 dev_idx = bfregn_to_uar_index(dev, &c->bfregi, user_idx, true);
Yishai Hadas7c043e92018-06-17 13:00:03 +0300571 if (dev_idx < 0)
572 return dev_idx;
573
574 if (uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX,
575 &dev_idx, sizeof(dev_idx)))
576 return -EFAULT;
577
578 return 0;
579}
580
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600581static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(
582 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300583{
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600584 struct mlx5_ib_ucontext *c;
585 struct mlx5_ib_dev *dev;
Yishai Hadas7efce362018-06-17 13:00:01 +0300586 void *cmd_in = uverbs_attr_get_alloced_ptr(
587 attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300588 int cmd_out_len = uverbs_attr_get_len(attrs,
589 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
590 void *cmd_out;
591 int err;
592
Jason Gunthorpe22fa27f2018-07-10 13:43:06 -0600593 c = devx_ufile2uctx(file);
594 if (IS_ERR(c))
595 return PTR_ERR(c);
596 dev = to_mdev(c->ibucontext.device);
597
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300598 if (!c->devx_uid)
599 return -EPERM;
600
601 /* Only white list of some general HCA commands are allowed for this method. */
602 if (!devx_is_general_cmd(cmd_in))
603 return -EINVAL;
604
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600605 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
606 if (IS_ERR(cmd_out))
607 return PTR_ERR(cmd_out);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300608
609 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
610 err = mlx5_cmd_exec(dev->mdev, cmd_in,
611 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
612 cmd_out, cmd_out_len);
613 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600614 return err;
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300615
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600616 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out,
617 cmd_out_len);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300618}
619
Yishai Hadas7efce362018-06-17 13:00:01 +0300620static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
621 u32 *dinlen,
622 u32 *obj_id)
623{
624 u16 obj_type = MLX5_GET(general_obj_in_cmd_hdr, in, obj_type);
625 u16 uid = MLX5_GET(general_obj_in_cmd_hdr, in, uid);
626
627 *obj_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
628 *dinlen = MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr);
629
630 MLX5_SET(general_obj_in_cmd_hdr, din, obj_id, *obj_id);
631 MLX5_SET(general_obj_in_cmd_hdr, din, uid, uid);
632
633 switch (MLX5_GET(general_obj_in_cmd_hdr, in, opcode)) {
634 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
635 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
636 MLX5_SET(general_obj_in_cmd_hdr, din, obj_type, obj_type);
637 break;
638
639 case MLX5_CMD_OP_CREATE_MKEY:
640 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_MKEY);
641 break;
642 case MLX5_CMD_OP_CREATE_CQ:
643 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_CQ);
644 break;
645 case MLX5_CMD_OP_ALLOC_PD:
646 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_PD);
647 break;
648 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
649 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
650 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
651 break;
652 case MLX5_CMD_OP_CREATE_RMP:
653 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RMP);
654 break;
655 case MLX5_CMD_OP_CREATE_SQ:
656 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SQ);
657 break;
658 case MLX5_CMD_OP_CREATE_RQ:
659 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQ);
660 break;
661 case MLX5_CMD_OP_CREATE_RQT:
662 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQT);
663 break;
664 case MLX5_CMD_OP_CREATE_TIR:
665 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIR);
666 break;
667 case MLX5_CMD_OP_CREATE_TIS:
668 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIS);
669 break;
670 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
671 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
672 MLX5_CMD_OP_DEALLOC_Q_COUNTER);
673 break;
674 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
675 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_table_in);
676 *obj_id = MLX5_GET(create_flow_table_out, out, table_id);
677 MLX5_SET(destroy_flow_table_in, din, other_vport,
678 MLX5_GET(create_flow_table_in, in, other_vport));
679 MLX5_SET(destroy_flow_table_in, din, vport_number,
680 MLX5_GET(create_flow_table_in, in, vport_number));
681 MLX5_SET(destroy_flow_table_in, din, table_type,
682 MLX5_GET(create_flow_table_in, in, table_type));
683 MLX5_SET(destroy_flow_table_in, din, table_id, *obj_id);
684 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
685 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
686 break;
687 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
688 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_group_in);
689 *obj_id = MLX5_GET(create_flow_group_out, out, group_id);
690 MLX5_SET(destroy_flow_group_in, din, other_vport,
691 MLX5_GET(create_flow_group_in, in, other_vport));
692 MLX5_SET(destroy_flow_group_in, din, vport_number,
693 MLX5_GET(create_flow_group_in, in, vport_number));
694 MLX5_SET(destroy_flow_group_in, din, table_type,
695 MLX5_GET(create_flow_group_in, in, table_type));
696 MLX5_SET(destroy_flow_group_in, din, table_id,
697 MLX5_GET(create_flow_group_in, in, table_id));
698 MLX5_SET(destroy_flow_group_in, din, group_id, *obj_id);
699 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
700 MLX5_CMD_OP_DESTROY_FLOW_GROUP);
701 break;
702 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
703 *dinlen = MLX5_ST_SZ_BYTES(delete_fte_in);
704 *obj_id = MLX5_GET(set_fte_in, in, flow_index);
705 MLX5_SET(delete_fte_in, din, other_vport,
706 MLX5_GET(set_fte_in, in, other_vport));
707 MLX5_SET(delete_fte_in, din, vport_number,
708 MLX5_GET(set_fte_in, in, vport_number));
709 MLX5_SET(delete_fte_in, din, table_type,
710 MLX5_GET(set_fte_in, in, table_type));
711 MLX5_SET(delete_fte_in, din, table_id,
712 MLX5_GET(set_fte_in, in, table_id));
713 MLX5_SET(delete_fte_in, din, flow_index, *obj_id);
714 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
715 MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY);
716 break;
717 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
718 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
719 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
720 break;
Mark Bloch60786f02018-08-28 14:18:46 +0300721 case MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:
Yishai Hadas7efce362018-06-17 13:00:01 +0300722 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
Mark Bloch60786f02018-08-28 14:18:46 +0300723 MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT);
Yishai Hadas7efce362018-06-17 13:00:01 +0300724 break;
725 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
726 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
727 MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT);
728 break;
729 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
730 *dinlen = MLX5_ST_SZ_BYTES(destroy_scheduling_element_in);
731 *obj_id = MLX5_GET(create_scheduling_element_out, out,
732 scheduling_element_id);
733 MLX5_SET(destroy_scheduling_element_in, din,
734 scheduling_hierarchy,
735 MLX5_GET(create_scheduling_element_in, in,
736 scheduling_hierarchy));
737 MLX5_SET(destroy_scheduling_element_in, din,
738 scheduling_element_id, *obj_id);
739 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
740 MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT);
741 break;
742 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
743 *dinlen = MLX5_ST_SZ_BYTES(delete_vxlan_udp_dport_in);
744 *obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
745 MLX5_SET(delete_vxlan_udp_dport_in, din, vxlan_udp_port, *obj_id);
746 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
747 MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT);
748 break;
749 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
750 *dinlen = MLX5_ST_SZ_BYTES(delete_l2_table_entry_in);
751 *obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
752 MLX5_SET(delete_l2_table_entry_in, din, table_index, *obj_id);
753 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
754 MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY);
755 break;
756 case MLX5_CMD_OP_CREATE_QP:
757 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_QP);
758 break;
759 case MLX5_CMD_OP_CREATE_SRQ:
760 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SRQ);
761 break;
762 case MLX5_CMD_OP_CREATE_XRC_SRQ:
763 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
764 MLX5_CMD_OP_DESTROY_XRC_SRQ);
765 break;
766 case MLX5_CMD_OP_CREATE_DCT:
767 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_DCT);
768 break;
769 case MLX5_CMD_OP_CREATE_XRQ:
770 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_XRQ);
771 break;
772 case MLX5_CMD_OP_ATTACH_TO_MCG:
773 *dinlen = MLX5_ST_SZ_BYTES(detach_from_mcg_in);
774 MLX5_SET(detach_from_mcg_in, din, qpn,
775 MLX5_GET(attach_to_mcg_in, in, qpn));
776 memcpy(MLX5_ADDR_OF(detach_from_mcg_in, din, multicast_gid),
777 MLX5_ADDR_OF(attach_to_mcg_in, in, multicast_gid),
778 MLX5_FLD_SZ_BYTES(attach_to_mcg_in, multicast_gid));
779 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DETACH_FROM_MCG);
780 break;
781 case MLX5_CMD_OP_ALLOC_XRCD:
782 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_XRCD);
783 break;
784 default:
785 /* The entry must match to one of the devx_is_obj_create_cmd */
786 WARN_ON(true);
787 break;
788 }
789}
790
791static int devx_obj_cleanup(struct ib_uobject *uobject,
792 enum rdma_remove_reason why)
793{
794 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
795 struct devx_obj *obj = uobject->object;
796 int ret;
797
798 ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
Yishai Hadas1c774832018-06-20 17:11:39 +0300799 if (ib_is_destroy_retryable(ret, why, uobject))
Yishai Hadas7efce362018-06-17 13:00:01 +0300800 return ret;
801
802 kfree(obj);
803 return ret;
804}
805
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600806static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
807 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadas7efce362018-06-17 13:00:01 +0300808{
Yishai Hadas7efce362018-06-17 13:00:01 +0300809 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN);
810 int cmd_out_len = uverbs_attr_get_len(attrs,
811 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT);
812 void *cmd_out;
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600813 struct ib_uobject *uobj = uverbs_attr_get_uobject(
814 attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE);
815 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
816 struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device);
Yishai Hadas7efce362018-06-17 13:00:01 +0300817 struct devx_obj *obj;
818 int err;
819
820 if (!c->devx_uid)
821 return -EPERM;
822
823 if (!devx_is_obj_create_cmd(cmd_in))
824 return -EINVAL;
825
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600826 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
827 if (IS_ERR(cmd_out))
828 return PTR_ERR(cmd_out);
829
Yishai Hadas7efce362018-06-17 13:00:01 +0300830 obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
831 if (!obj)
832 return -ENOMEM;
833
Yishai Hadas7efce362018-06-17 13:00:01 +0300834 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
Yishai Hadasba1a0572018-09-20 21:39:33 +0300835 devx_set_umem_valid(cmd_in);
836
Yishai Hadas7efce362018-06-17 13:00:01 +0300837 err = mlx5_cmd_exec(dev->mdev, cmd_in,
838 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
839 cmd_out, cmd_out_len);
840 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600841 goto obj_free;
Yishai Hadas7efce362018-06-17 13:00:01 +0300842
Yishai Hadas7efce362018-06-17 13:00:01 +0300843 uobj->object = obj;
844 obj->mdev = dev->mdev;
845 devx_obj_build_destroy_cmd(cmd_in, cmd_out, obj->dinbox, &obj->dinlen, &obj->obj_id);
846 WARN_ON(obj->dinlen > MLX5_MAX_DESTROY_INBOX_SIZE_DW * sizeof(u32));
847
848 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
849 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600850 goto obj_free;
Yishai Hadas7efce362018-06-17 13:00:01 +0300851
Yishai Hadas7efce362018-06-17 13:00:01 +0300852 return 0;
853
Yishai Hadas7efce362018-06-17 13:00:01 +0300854obj_free:
855 kfree(obj);
856 return err;
857}
858
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600859static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
860 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadase662e142018-06-17 13:00:02 +0300861{
Yishai Hadase662e142018-06-17 13:00:02 +0300862 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN);
863 int cmd_out_len = uverbs_attr_get_len(attrs,
864 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT);
865 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
866 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE);
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600867 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
868 struct devx_obj *obj = uobj->object;
Yishai Hadase662e142018-06-17 13:00:02 +0300869 void *cmd_out;
870 int err;
871
872 if (!c->devx_uid)
873 return -EPERM;
874
875 if (!devx_is_obj_modify_cmd(cmd_in))
876 return -EINVAL;
877
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600878 if (!devx_is_valid_obj_id(obj, cmd_in))
Yishai Hadase662e142018-06-17 13:00:02 +0300879 return -EINVAL;
880
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600881 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
882 if (IS_ERR(cmd_out))
883 return PTR_ERR(cmd_out);
Yishai Hadase662e142018-06-17 13:00:02 +0300884
885 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
Yishai Hadasba1a0572018-09-20 21:39:33 +0300886 devx_set_umem_valid(cmd_in);
887
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600888 err = mlx5_cmd_exec(obj->mdev, cmd_in,
Yishai Hadase662e142018-06-17 13:00:02 +0300889 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
890 cmd_out, cmd_out_len);
891 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600892 return err;
Yishai Hadase662e142018-06-17 13:00:02 +0300893
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600894 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
895 cmd_out, cmd_out_len);
Yishai Hadase662e142018-06-17 13:00:02 +0300896}
897
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -0600898static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
899 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadase662e142018-06-17 13:00:02 +0300900{
Yishai Hadase662e142018-06-17 13:00:02 +0300901 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN);
902 int cmd_out_len = uverbs_attr_get_len(attrs,
903 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT);
904 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
905 MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE);
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600906 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
907 struct devx_obj *obj = uobj->object;
Yishai Hadase662e142018-06-17 13:00:02 +0300908 void *cmd_out;
909 int err;
910
911 if (!c->devx_uid)
912 return -EPERM;
913
914 if (!devx_is_obj_query_cmd(cmd_in))
915 return -EINVAL;
916
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600917 if (!devx_is_valid_obj_id(obj, cmd_in))
Yishai Hadase662e142018-06-17 13:00:02 +0300918 return -EINVAL;
919
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600920 cmd_out = uverbs_zalloc(attrs, cmd_out_len);
921 if (IS_ERR(cmd_out))
922 return PTR_ERR(cmd_out);
Yishai Hadase662e142018-06-17 13:00:02 +0300923
924 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
Jason Gunthorpec36ee462018-07-10 20:55:22 -0600925 err = mlx5_cmd_exec(obj->mdev, cmd_in,
Yishai Hadase662e142018-06-17 13:00:02 +0300926 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
927 cmd_out, cmd_out_len);
928 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600929 return err;
Yishai Hadase662e142018-06-17 13:00:02 +0300930
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600931 return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
932 cmd_out, cmd_out_len);
Yishai Hadase662e142018-06-17 13:00:02 +0300933}
934
Yishai Hadasaeae9452018-06-17 13:00:04 +0300935static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
936 struct uverbs_attr_bundle *attrs,
937 struct devx_umem *obj)
938{
939 u64 addr;
940 size_t size;
Jason Gunthorpebccd0622018-07-26 16:37:14 -0600941 u32 access;
Yishai Hadasaeae9452018-06-17 13:00:04 +0300942 int npages;
943 int err;
944 u32 page_mask;
945
946 if (uverbs_copy_from(&addr, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR) ||
Jason Gunthorpebccd0622018-07-26 16:37:14 -0600947 uverbs_copy_from(&size, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_LEN))
Yishai Hadasaeae9452018-06-17 13:00:04 +0300948 return -EFAULT;
949
Jason Gunthorpebccd0622018-07-26 16:37:14 -0600950 err = uverbs_get_flags32(&access, attrs,
951 MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
952 IB_ACCESS_SUPPORTED);
953 if (err)
954 return err;
955
Yishai Hadasaeae9452018-06-17 13:00:04 +0300956 err = ib_check_mr_access(access);
957 if (err)
958 return err;
959
960 obj->umem = ib_umem_get(ucontext, addr, size, access, 0);
961 if (IS_ERR(obj->umem))
962 return PTR_ERR(obj->umem);
963
964 mlx5_ib_cont_pages(obj->umem, obj->umem->address,
965 MLX5_MKEY_PAGE_SHIFT_MASK, &npages,
966 &obj->page_shift, &obj->ncont, NULL);
967
968 if (!npages) {
969 ib_umem_release(obj->umem);
970 return -EINVAL;
971 }
972
973 page_mask = (1 << obj->page_shift) - 1;
974 obj->page_offset = obj->umem->address & page_mask;
975
976 return 0;
977}
978
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600979static int devx_umem_reg_cmd_alloc(struct uverbs_attr_bundle *attrs,
980 struct devx_umem *obj,
Yishai Hadasaeae9452018-06-17 13:00:04 +0300981 struct devx_umem_reg_cmd *cmd)
982{
983 cmd->inlen = MLX5_ST_SZ_BYTES(create_umem_in) +
984 (MLX5_ST_SZ_BYTES(mtt) * obj->ncont);
Jason Gunthorpeb61815e2018-08-09 20:14:41 -0600985 cmd->in = uverbs_zalloc(attrs, cmd->inlen);
986 return PTR_ERR_OR_ZERO(cmd->in);
Yishai Hadasaeae9452018-06-17 13:00:04 +0300987}
988
989static void devx_umem_reg_cmd_build(struct mlx5_ib_dev *dev,
990 struct devx_umem *obj,
991 struct devx_umem_reg_cmd *cmd)
992{
993 void *umem;
994 __be64 *mtt;
995
996 umem = MLX5_ADDR_OF(create_umem_in, cmd->in, umem);
997 mtt = (__be64 *)MLX5_ADDR_OF(umem, umem, mtt);
998
999 MLX5_SET(general_obj_in_cmd_hdr, cmd->in, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
1000 MLX5_SET(general_obj_in_cmd_hdr, cmd->in, obj_type, MLX5_OBJ_TYPE_UMEM);
1001 MLX5_SET64(umem, umem, num_of_mtt, obj->ncont);
1002 MLX5_SET(umem, umem, log_page_size, obj->page_shift -
1003 MLX5_ADAPTER_PAGE_SHIFT);
1004 MLX5_SET(umem, umem, page_offset, obj->page_offset);
1005 mlx5_ib_populate_pas(dev, obj->umem, obj->page_shift, mtt,
1006 (obj->umem->writable ? MLX5_IB_MTT_WRITE : 0) |
1007 MLX5_IB_MTT_READ);
1008}
1009
Jason Gunthorpee83f0ec2018-07-25 21:40:18 -06001010static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
1011 struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
Yishai Hadasaeae9452018-06-17 13:00:04 +03001012{
Yishai Hadasaeae9452018-06-17 13:00:04 +03001013 struct devx_umem_reg_cmd cmd;
1014 struct devx_umem *obj;
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001015 struct ib_uobject *uobj = uverbs_attr_get_uobject(
1016 attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001017 u32 obj_id;
Jason Gunthorpec36ee462018-07-10 20:55:22 -06001018 struct mlx5_ib_ucontext *c = to_mucontext(uobj->context);
1019 struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001020 int err;
1021
1022 if (!c->devx_uid)
1023 return -EPERM;
1024
Yishai Hadasaeae9452018-06-17 13:00:04 +03001025 obj = kzalloc(sizeof(struct devx_umem), GFP_KERNEL);
1026 if (!obj)
1027 return -ENOMEM;
1028
1029 err = devx_umem_get(dev, &c->ibucontext, attrs, obj);
1030 if (err)
1031 goto err_obj_free;
1032
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001033 err = devx_umem_reg_cmd_alloc(attrs, obj, &cmd);
Yishai Hadasaeae9452018-06-17 13:00:04 +03001034 if (err)
1035 goto err_umem_release;
1036
1037 devx_umem_reg_cmd_build(dev, obj, &cmd);
1038
1039 MLX5_SET(general_obj_in_cmd_hdr, cmd.in, uid, c->devx_uid);
1040 err = mlx5_cmd_exec(dev->mdev, cmd.in, cmd.inlen, cmd.out,
1041 sizeof(cmd.out));
1042 if (err)
Jason Gunthorpeb61815e2018-08-09 20:14:41 -06001043 goto err_umem_release;
Yishai Hadasaeae9452018-06-17 13:00:04 +03001044
1045 obj->mdev = dev->mdev;
1046 uobj->object = obj;
1047 devx_obj_build_destroy_cmd(cmd.in, cmd.out, obj->dinbox, &obj->dinlen, &obj_id);
1048 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID, &obj_id, sizeof(obj_id));
1049 if (err)
1050 goto err_umem_destroy;
1051
Yishai Hadasaeae9452018-06-17 13:00:04 +03001052 return 0;
1053
1054err_umem_destroy:
1055 mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, cmd.out, sizeof(cmd.out));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001056err_umem_release:
1057 ib_umem_release(obj->umem);
1058err_obj_free:
1059 kfree(obj);
1060 return err;
1061}
1062
Yishai Hadasaeae9452018-06-17 13:00:04 +03001063static int devx_umem_cleanup(struct ib_uobject *uobject,
1064 enum rdma_remove_reason why)
1065{
1066 struct devx_umem *obj = uobject->object;
1067 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
1068 int err;
1069
1070 err = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
Yishai Hadas1c774832018-06-20 17:11:39 +03001071 if (ib_is_destroy_retryable(err, why, uobject))
Yishai Hadasaeae9452018-06-17 13:00:04 +03001072 return err;
1073
1074 ib_umem_release(obj->umem);
1075 kfree(obj);
1076 return 0;
1077}
1078
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001079DECLARE_UVERBS_NAMED_METHOD(
1080 MLX5_IB_METHOD_DEVX_UMEM_REG,
1081 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE,
1082 MLX5_IB_OBJECT_DEVX_UMEM,
1083 UVERBS_ACCESS_NEW,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001084 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001085 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR,
1086 UVERBS_ATTR_TYPE(u64),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001087 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001088 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_LEN,
1089 UVERBS_ATTR_TYPE(u64),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001090 UA_MANDATORY),
Jason Gunthorpebccd0622018-07-26 16:37:14 -06001091 UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS,
1092 enum ib_access_flags),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001093 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
1094 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001095 UA_MANDATORY));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001096
Yishai Hadas528922a2018-07-08 13:24:39 +03001097DECLARE_UVERBS_NAMED_METHOD_DESTROY(
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001098 MLX5_IB_METHOD_DEVX_UMEM_DEREG,
1099 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_DEREG_HANDLE,
1100 MLX5_IB_OBJECT_DEVX_UMEM,
1101 UVERBS_ACCESS_DESTROY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001102 UA_MANDATORY));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001103
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001104DECLARE_UVERBS_NAMED_METHOD(
1105 MLX5_IB_METHOD_DEVX_QUERY_EQN,
1106 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC,
1107 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001108 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001109 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_EQN_DEV_EQN,
1110 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001111 UA_MANDATORY));
Yishai Hadasf6fe01b2018-06-17 13:00:05 +03001112
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001113DECLARE_UVERBS_NAMED_METHOD(
1114 MLX5_IB_METHOD_DEVX_QUERY_UAR,
1115 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX,
1116 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001117 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001118 UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX,
1119 UVERBS_ATTR_TYPE(u32),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001120 UA_MANDATORY));
Yishai Hadas7c043e92018-06-17 13:00:03 +03001121
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001122DECLARE_UVERBS_NAMED_METHOD(
1123 MLX5_IB_METHOD_DEVX_OTHER,
1124 UVERBS_ATTR_PTR_IN(
1125 MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
1126 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001127 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001128 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001129 UVERBS_ATTR_PTR_OUT(
1130 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
1131 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001132 UA_MANDATORY));
Yishai Hadas8aa8c952018-06-17 13:00:00 +03001133
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001134DECLARE_UVERBS_NAMED_METHOD(
1135 MLX5_IB_METHOD_DEVX_OBJ_CREATE,
1136 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE,
1137 MLX5_IB_OBJECT_DEVX_OBJ,
1138 UVERBS_ACCESS_NEW,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001139 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001140 UVERBS_ATTR_PTR_IN(
1141 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
1142 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001143 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001144 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001145 UVERBS_ATTR_PTR_OUT(
1146 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
1147 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001148 UA_MANDATORY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001149
Yishai Hadas528922a2018-07-08 13:24:39 +03001150DECLARE_UVERBS_NAMED_METHOD_DESTROY(
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001151 MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
1152 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE,
1153 MLX5_IB_OBJECT_DEVX_OBJ,
1154 UVERBS_ACCESS_DESTROY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001155 UA_MANDATORY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001156
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001157DECLARE_UVERBS_NAMED_METHOD(
1158 MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
1159 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE,
1160 MLX5_IB_OBJECT_DEVX_OBJ,
1161 UVERBS_ACCESS_WRITE,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001162 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001163 UVERBS_ATTR_PTR_IN(
1164 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN,
1165 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001166 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001167 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001168 UVERBS_ATTR_PTR_OUT(
1169 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
1170 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001171 UA_MANDATORY));
Yishai Hadase662e142018-06-17 13:00:02 +03001172
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001173DECLARE_UVERBS_NAMED_METHOD(
1174 MLX5_IB_METHOD_DEVX_OBJ_QUERY,
1175 UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE,
1176 MLX5_IB_OBJECT_DEVX_OBJ,
1177 UVERBS_ACCESS_READ,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001178 UA_MANDATORY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001179 UVERBS_ATTR_PTR_IN(
1180 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN,
1181 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001182 UA_MANDATORY,
Jason Gunthorpe83bb4442018-07-04 08:50:29 +03001183 UA_ALLOC_AND_COPY),
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001184 UVERBS_ATTR_PTR_OUT(
1185 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
1186 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
Jason Gunthorpe540cd692018-07-04 08:50:30 +03001187 UA_MANDATORY));
Yishai Hadase662e142018-06-17 13:00:02 +03001188
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001189DECLARE_UVERBS_GLOBAL_METHODS(MLX5_IB_OBJECT_DEVX,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001190 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OTHER),
1191 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR),
1192 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_QUERY_EQN));
Yishai Hadas8aa8c952018-06-17 13:00:00 +03001193
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001194DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001195 UVERBS_TYPE_ALLOC_IDR(devx_obj_cleanup),
1196 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE),
1197 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY),
1198 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY),
1199 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY));
Yishai Hadas7efce362018-06-17 13:00:01 +03001200
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001201DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_UMEM,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001202 UVERBS_TYPE_ALLOC_IDR(devx_umem_cleanup),
1203 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_UMEM_REG),
1204 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_UMEM_DEREG));
Yishai Hadasaeae9452018-06-17 13:00:04 +03001205
Jason Gunthorpe6c61d2a2018-07-04 08:50:27 +03001206DECLARE_UVERBS_OBJECT_TREE(devx_objects,
Jason Gunthorpe9a119cd2018-07-04 08:50:28 +03001207 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX),
1208 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ),
1209 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX_UMEM));
Yishai Hadasc59450c2018-06-17 13:00:06 +03001210
1211const struct uverbs_object_tree_def *mlx5_ib_get_devx_tree(void)
1212{
1213 return &devx_objects;
1214}