blob: 9b1804eb9924ec04da73cdcd71d9b4862d3baac1 [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 Hadas8aa8c952018-06-17 13:00:00 +030027static struct mlx5_ib_ucontext *devx_ufile2uctx(struct ib_uverbs_file *file)
28{
29 return to_mucontext(ib_uverbs_get_ucontext(file));
30}
31
Yishai Hadasa8b92ca2018-06-17 12:59:57 +030032int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, struct mlx5_ib_ucontext *context)
33{
34 u32 in[MLX5_ST_SZ_DW(create_uctx_in)] = {0};
35 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
36 u64 general_obj_types;
37 void *uctx;
38 void *hdr;
39 int err;
40
41 uctx = MLX5_ADDR_OF(create_uctx_in, in, uctx);
42 hdr = MLX5_ADDR_OF(create_uctx_in, in, hdr);
43
44 general_obj_types = MLX5_CAP_GEN_64(dev->mdev, general_obj_types);
45 if (!(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UCTX) ||
46 !(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UMEM))
47 return -EINVAL;
48
49 if (!capable(CAP_NET_RAW))
50 return -EPERM;
51
52 MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
53 MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type, MLX5_OBJ_TYPE_UCTX);
54
55 err = mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
56 if (err)
57 return err;
58
59 context->devx_uid = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
60 return 0;
61}
62
63void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev,
64 struct mlx5_ib_ucontext *context)
65{
66 u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};
67 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
68
69 MLX5_SET(general_obj_in_cmd_hdr, in, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
70 MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_UCTX);
71 MLX5_SET(general_obj_in_cmd_hdr, in, obj_id, context->devx_uid);
72
73 mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
74}
Yishai Hadas8aa8c952018-06-17 13:00:00 +030075
Yishai Hadase662e142018-06-17 13:00:02 +030076static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
77{
78 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
79 u32 obj_id;
80
81 switch (opcode) {
82 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
83 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
84 obj_id = MLX5_GET(general_obj_in_cmd_hdr, in, obj_id);
85 break;
86 case MLX5_CMD_OP_QUERY_MKEY:
87 obj_id = MLX5_GET(query_mkey_in, in, mkey_index);
88 break;
89 case MLX5_CMD_OP_QUERY_CQ:
90 obj_id = MLX5_GET(query_cq_in, in, cqn);
91 break;
92 case MLX5_CMD_OP_MODIFY_CQ:
93 obj_id = MLX5_GET(modify_cq_in, in, cqn);
94 break;
95 case MLX5_CMD_OP_QUERY_SQ:
96 obj_id = MLX5_GET(query_sq_in, in, sqn);
97 break;
98 case MLX5_CMD_OP_MODIFY_SQ:
99 obj_id = MLX5_GET(modify_sq_in, in, sqn);
100 break;
101 case MLX5_CMD_OP_QUERY_RQ:
102 obj_id = MLX5_GET(query_rq_in, in, rqn);
103 break;
104 case MLX5_CMD_OP_MODIFY_RQ:
105 obj_id = MLX5_GET(modify_rq_in, in, rqn);
106 break;
107 case MLX5_CMD_OP_QUERY_RMP:
108 obj_id = MLX5_GET(query_rmp_in, in, rmpn);
109 break;
110 case MLX5_CMD_OP_MODIFY_RMP:
111 obj_id = MLX5_GET(modify_rmp_in, in, rmpn);
112 break;
113 case MLX5_CMD_OP_QUERY_RQT:
114 obj_id = MLX5_GET(query_rqt_in, in, rqtn);
115 break;
116 case MLX5_CMD_OP_MODIFY_RQT:
117 obj_id = MLX5_GET(modify_rqt_in, in, rqtn);
118 break;
119 case MLX5_CMD_OP_QUERY_TIR:
120 obj_id = MLX5_GET(query_tir_in, in, tirn);
121 break;
122 case MLX5_CMD_OP_MODIFY_TIR:
123 obj_id = MLX5_GET(modify_tir_in, in, tirn);
124 break;
125 case MLX5_CMD_OP_QUERY_TIS:
126 obj_id = MLX5_GET(query_tis_in, in, tisn);
127 break;
128 case MLX5_CMD_OP_MODIFY_TIS:
129 obj_id = MLX5_GET(modify_tis_in, in, tisn);
130 break;
131 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
132 obj_id = MLX5_GET(query_flow_table_in, in, table_id);
133 break;
134 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
135 obj_id = MLX5_GET(modify_flow_table_in, in, table_id);
136 break;
137 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
138 obj_id = MLX5_GET(query_flow_group_in, in, group_id);
139 break;
140 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
141 obj_id = MLX5_GET(query_fte_in, in, flow_index);
142 break;
143 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
144 obj_id = MLX5_GET(set_fte_in, in, flow_index);
145 break;
146 case MLX5_CMD_OP_QUERY_Q_COUNTER:
147 obj_id = MLX5_GET(query_q_counter_in, in, counter_set_id);
148 break;
149 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
150 obj_id = MLX5_GET(query_flow_counter_in, in, flow_counter_id);
151 break;
152 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
153 obj_id = MLX5_GET(general_obj_in_cmd_hdr, in, obj_id);
154 break;
155 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
156 obj_id = MLX5_GET(query_scheduling_element_in, in,
157 scheduling_element_id);
158 break;
159 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
160 obj_id = MLX5_GET(modify_scheduling_element_in, in,
161 scheduling_element_id);
162 break;
163 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
164 obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
165 break;
166 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
167 obj_id = MLX5_GET(query_l2_table_entry_in, in, table_index);
168 break;
169 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
170 obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
171 break;
172 case MLX5_CMD_OP_QUERY_QP:
173 obj_id = MLX5_GET(query_qp_in, in, qpn);
174 break;
175 case MLX5_CMD_OP_RST2INIT_QP:
176 obj_id = MLX5_GET(rst2init_qp_in, in, qpn);
177 break;
178 case MLX5_CMD_OP_INIT2RTR_QP:
179 obj_id = MLX5_GET(init2rtr_qp_in, in, qpn);
180 break;
181 case MLX5_CMD_OP_RTR2RTS_QP:
182 obj_id = MLX5_GET(rtr2rts_qp_in, in, qpn);
183 break;
184 case MLX5_CMD_OP_RTS2RTS_QP:
185 obj_id = MLX5_GET(rts2rts_qp_in, in, qpn);
186 break;
187 case MLX5_CMD_OP_SQERR2RTS_QP:
188 obj_id = MLX5_GET(sqerr2rts_qp_in, in, qpn);
189 break;
190 case MLX5_CMD_OP_2ERR_QP:
191 obj_id = MLX5_GET(qp_2err_in, in, qpn);
192 break;
193 case MLX5_CMD_OP_2RST_QP:
194 obj_id = MLX5_GET(qp_2rst_in, in, qpn);
195 break;
196 case MLX5_CMD_OP_QUERY_DCT:
197 obj_id = MLX5_GET(query_dct_in, in, dctn);
198 break;
199 case MLX5_CMD_OP_QUERY_XRQ:
200 obj_id = MLX5_GET(query_xrq_in, in, xrqn);
201 break;
202 case MLX5_CMD_OP_QUERY_XRC_SRQ:
203 obj_id = MLX5_GET(query_xrc_srq_in, in, xrc_srqn);
204 break;
205 case MLX5_CMD_OP_ARM_XRC_SRQ:
206 obj_id = MLX5_GET(arm_xrc_srq_in, in, xrc_srqn);
207 break;
208 case MLX5_CMD_OP_QUERY_SRQ:
209 obj_id = MLX5_GET(query_srq_in, in, srqn);
210 break;
211 case MLX5_CMD_OP_ARM_RQ:
212 obj_id = MLX5_GET(arm_rq_in, in, srq_number);
213 break;
214 case MLX5_CMD_OP_DRAIN_DCT:
215 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
216 obj_id = MLX5_GET(drain_dct_in, in, dctn);
217 break;
218 case MLX5_CMD_OP_ARM_XRQ:
219 obj_id = MLX5_GET(arm_xrq_in, in, xrqn);
220 break;
221 default:
222 return false;
223 }
224
225 if (obj_id == obj->obj_id)
226 return true;
227
228 return false;
229}
230
Yishai Hadas7efce362018-06-17 13:00:01 +0300231static bool devx_is_obj_create_cmd(const void *in)
232{
233 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
234
235 switch (opcode) {
236 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
237 case MLX5_CMD_OP_CREATE_MKEY:
238 case MLX5_CMD_OP_CREATE_CQ:
239 case MLX5_CMD_OP_ALLOC_PD:
240 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
241 case MLX5_CMD_OP_CREATE_RMP:
242 case MLX5_CMD_OP_CREATE_SQ:
243 case MLX5_CMD_OP_CREATE_RQ:
244 case MLX5_CMD_OP_CREATE_RQT:
245 case MLX5_CMD_OP_CREATE_TIR:
246 case MLX5_CMD_OP_CREATE_TIS:
247 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
248 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
249 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
250 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
251 case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
252 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
253 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
254 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
255 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
256 case MLX5_CMD_OP_CREATE_QP:
257 case MLX5_CMD_OP_CREATE_SRQ:
258 case MLX5_CMD_OP_CREATE_XRC_SRQ:
259 case MLX5_CMD_OP_CREATE_DCT:
260 case MLX5_CMD_OP_CREATE_XRQ:
261 case MLX5_CMD_OP_ATTACH_TO_MCG:
262 case MLX5_CMD_OP_ALLOC_XRCD:
263 return true;
264 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
265 {
266 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
267 if (op_mod == 0)
268 return true;
269 return false;
270 }
271 default:
272 return false;
273 }
274}
275
Yishai Hadase662e142018-06-17 13:00:02 +0300276static bool devx_is_obj_modify_cmd(const void *in)
277{
278 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
279
280 switch (opcode) {
281 case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
282 case MLX5_CMD_OP_MODIFY_CQ:
283 case MLX5_CMD_OP_MODIFY_RMP:
284 case MLX5_CMD_OP_MODIFY_SQ:
285 case MLX5_CMD_OP_MODIFY_RQ:
286 case MLX5_CMD_OP_MODIFY_RQT:
287 case MLX5_CMD_OP_MODIFY_TIR:
288 case MLX5_CMD_OP_MODIFY_TIS:
289 case MLX5_CMD_OP_MODIFY_FLOW_TABLE:
290 case MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:
291 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
292 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
293 case MLX5_CMD_OP_RST2INIT_QP:
294 case MLX5_CMD_OP_INIT2RTR_QP:
295 case MLX5_CMD_OP_RTR2RTS_QP:
296 case MLX5_CMD_OP_RTS2RTS_QP:
297 case MLX5_CMD_OP_SQERR2RTS_QP:
298 case MLX5_CMD_OP_2ERR_QP:
299 case MLX5_CMD_OP_2RST_QP:
300 case MLX5_CMD_OP_ARM_XRC_SRQ:
301 case MLX5_CMD_OP_ARM_RQ:
302 case MLX5_CMD_OP_DRAIN_DCT:
303 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:
304 case MLX5_CMD_OP_ARM_XRQ:
305 return true;
306 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
307 {
308 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
309
310 if (op_mod == 1)
311 return true;
312 return false;
313 }
314 default:
315 return false;
316 }
317}
318
319static bool devx_is_obj_query_cmd(const void *in)
320{
321 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
322
323 switch (opcode) {
324 case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
325 case MLX5_CMD_OP_QUERY_MKEY:
326 case MLX5_CMD_OP_QUERY_CQ:
327 case MLX5_CMD_OP_QUERY_RMP:
328 case MLX5_CMD_OP_QUERY_SQ:
329 case MLX5_CMD_OP_QUERY_RQ:
330 case MLX5_CMD_OP_QUERY_RQT:
331 case MLX5_CMD_OP_QUERY_TIR:
332 case MLX5_CMD_OP_QUERY_TIS:
333 case MLX5_CMD_OP_QUERY_Q_COUNTER:
334 case MLX5_CMD_OP_QUERY_FLOW_TABLE:
335 case MLX5_CMD_OP_QUERY_FLOW_GROUP:
336 case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:
337 case MLX5_CMD_OP_QUERY_FLOW_COUNTER:
338 case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:
339 case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:
340 case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:
341 case MLX5_CMD_OP_QUERY_QP:
342 case MLX5_CMD_OP_QUERY_SRQ:
343 case MLX5_CMD_OP_QUERY_XRC_SRQ:
344 case MLX5_CMD_OP_QUERY_DCT:
345 case MLX5_CMD_OP_QUERY_XRQ:
346 return true;
347 default:
348 return false;
349 }
350}
351
352static bool devx_is_general_cmd(void *in)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300353{
354 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
355
356 switch (opcode) {
357 case MLX5_CMD_OP_QUERY_HCA_CAP:
358 case MLX5_CMD_OP_QUERY_VPORT_STATE:
359 case MLX5_CMD_OP_QUERY_ADAPTER:
360 case MLX5_CMD_OP_QUERY_ISSI:
361 case MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT:
362 case MLX5_CMD_OP_QUERY_ROCE_ADDRESS:
363 case MLX5_CMD_OP_QUERY_VNIC_ENV:
364 case MLX5_CMD_OP_QUERY_VPORT_COUNTER:
365 case MLX5_CMD_OP_GET_DROPPED_PACKET_LOG:
366 case MLX5_CMD_OP_NOP:
367 case MLX5_CMD_OP_QUERY_CONG_STATUS:
368 case MLX5_CMD_OP_QUERY_CONG_PARAMS:
369 case MLX5_CMD_OP_QUERY_CONG_STATISTICS:
370 return true;
371 default:
372 return false;
373 }
374}
375
Yishai Hadas7c043e92018-06-17 13:00:03 +0300376/*
377 *Security note:
378 * The hardware protection mechanism works like this: Each device object that
379 * is subject to UAR doorbells (QP/SQ/CQ) gets a UAR ID (called uar_page in
380 * the device specification manual) upon its creation. Then upon doorbell,
381 * hardware fetches the object context for which the doorbell was rang, and
382 * validates that the UAR through which the DB was rang matches the UAR ID
383 * of the object.
384 * If no match the doorbell is silently ignored by the hardware. Of course,
385 * the user cannot ring a doorbell on a UAR that was not mapped to it.
386 * Now in devx, as the devx kernel does not manipulate the QP/SQ/CQ command
387 * mailboxes (except tagging them with UID), we expose to the user its UAR
388 * ID, so it can embed it in these objects in the expected specification
389 * format. So the only thing the user can do is hurt itself by creating a
390 * QP/SQ/CQ with a UAR ID other than his, and then in this case other users
391 * may ring a doorbell on its objects.
392 * The consequence of that will be that another user can schedule a QP/SQ
393 * of the buggy user for execution (just insert it to the hardware schedule
394 * queue or arm its CQ for event generation), no further harm is expected.
395 */
396static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(struct ib_device *ib_dev,
397 struct ib_uverbs_file *file,
398 struct uverbs_attr_bundle *attrs)
399{
400 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
401 u32 user_idx;
402 s32 dev_idx;
403
404 if (uverbs_copy_from(&user_idx, attrs,
405 MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX))
406 return -EFAULT;
407
408 dev_idx = bfregn_to_uar_index(to_mdev(ib_dev),
409 &c->bfregi, user_idx, true);
410 if (dev_idx < 0)
411 return dev_idx;
412
413 if (uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX,
414 &dev_idx, sizeof(dev_idx)))
415 return -EFAULT;
416
417 return 0;
418}
419
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300420static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
421 struct ib_uverbs_file *file,
422 struct uverbs_attr_bundle *attrs)
423{
424 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
425 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
Yishai Hadas7efce362018-06-17 13:00:01 +0300426 void *cmd_in = uverbs_attr_get_alloced_ptr(
427 attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300428 int cmd_out_len = uverbs_attr_get_len(attrs,
429 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
430 void *cmd_out;
431 int err;
432
433 if (!c->devx_uid)
434 return -EPERM;
435
436 /* Only white list of some general HCA commands are allowed for this method. */
437 if (!devx_is_general_cmd(cmd_in))
438 return -EINVAL;
439
440 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
441 if (!cmd_out)
442 return -ENOMEM;
443
444 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
445 err = mlx5_cmd_exec(dev->mdev, cmd_in,
446 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
447 cmd_out, cmd_out_len);
448 if (err)
449 goto other_cmd_free;
450
451 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out, cmd_out_len);
452
453other_cmd_free:
454 kvfree(cmd_out);
455 return err;
456}
457
Yishai Hadas7efce362018-06-17 13:00:01 +0300458static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
459 u32 *dinlen,
460 u32 *obj_id)
461{
462 u16 obj_type = MLX5_GET(general_obj_in_cmd_hdr, in, obj_type);
463 u16 uid = MLX5_GET(general_obj_in_cmd_hdr, in, uid);
464
465 *obj_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
466 *dinlen = MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr);
467
468 MLX5_SET(general_obj_in_cmd_hdr, din, obj_id, *obj_id);
469 MLX5_SET(general_obj_in_cmd_hdr, din, uid, uid);
470
471 switch (MLX5_GET(general_obj_in_cmd_hdr, in, opcode)) {
472 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
473 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
474 MLX5_SET(general_obj_in_cmd_hdr, din, obj_type, obj_type);
475 break;
476
477 case MLX5_CMD_OP_CREATE_MKEY:
478 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_MKEY);
479 break;
480 case MLX5_CMD_OP_CREATE_CQ:
481 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_CQ);
482 break;
483 case MLX5_CMD_OP_ALLOC_PD:
484 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_PD);
485 break;
486 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
487 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
488 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
489 break;
490 case MLX5_CMD_OP_CREATE_RMP:
491 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RMP);
492 break;
493 case MLX5_CMD_OP_CREATE_SQ:
494 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SQ);
495 break;
496 case MLX5_CMD_OP_CREATE_RQ:
497 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQ);
498 break;
499 case MLX5_CMD_OP_CREATE_RQT:
500 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQT);
501 break;
502 case MLX5_CMD_OP_CREATE_TIR:
503 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIR);
504 break;
505 case MLX5_CMD_OP_CREATE_TIS:
506 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIS);
507 break;
508 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
509 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
510 MLX5_CMD_OP_DEALLOC_Q_COUNTER);
511 break;
512 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
513 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_table_in);
514 *obj_id = MLX5_GET(create_flow_table_out, out, table_id);
515 MLX5_SET(destroy_flow_table_in, din, other_vport,
516 MLX5_GET(create_flow_table_in, in, other_vport));
517 MLX5_SET(destroy_flow_table_in, din, vport_number,
518 MLX5_GET(create_flow_table_in, in, vport_number));
519 MLX5_SET(destroy_flow_table_in, din, table_type,
520 MLX5_GET(create_flow_table_in, in, table_type));
521 MLX5_SET(destroy_flow_table_in, din, table_id, *obj_id);
522 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
523 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
524 break;
525 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
526 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_group_in);
527 *obj_id = MLX5_GET(create_flow_group_out, out, group_id);
528 MLX5_SET(destroy_flow_group_in, din, other_vport,
529 MLX5_GET(create_flow_group_in, in, other_vport));
530 MLX5_SET(destroy_flow_group_in, din, vport_number,
531 MLX5_GET(create_flow_group_in, in, vport_number));
532 MLX5_SET(destroy_flow_group_in, din, table_type,
533 MLX5_GET(create_flow_group_in, in, table_type));
534 MLX5_SET(destroy_flow_group_in, din, table_id,
535 MLX5_GET(create_flow_group_in, in, table_id));
536 MLX5_SET(destroy_flow_group_in, din, group_id, *obj_id);
537 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
538 MLX5_CMD_OP_DESTROY_FLOW_GROUP);
539 break;
540 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
541 *dinlen = MLX5_ST_SZ_BYTES(delete_fte_in);
542 *obj_id = MLX5_GET(set_fte_in, in, flow_index);
543 MLX5_SET(delete_fte_in, din, other_vport,
544 MLX5_GET(set_fte_in, in, other_vport));
545 MLX5_SET(delete_fte_in, din, vport_number,
546 MLX5_GET(set_fte_in, in, vport_number));
547 MLX5_SET(delete_fte_in, din, table_type,
548 MLX5_GET(set_fte_in, in, table_type));
549 MLX5_SET(delete_fte_in, din, table_id,
550 MLX5_GET(set_fte_in, in, table_id));
551 MLX5_SET(delete_fte_in, din, flow_index, *obj_id);
552 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
553 MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY);
554 break;
555 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
556 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
557 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
558 break;
559 case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
560 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
561 MLX5_CMD_OP_DEALLOC_ENCAP_HEADER);
562 break;
563 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
564 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
565 MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT);
566 break;
567 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
568 *dinlen = MLX5_ST_SZ_BYTES(destroy_scheduling_element_in);
569 *obj_id = MLX5_GET(create_scheduling_element_out, out,
570 scheduling_element_id);
571 MLX5_SET(destroy_scheduling_element_in, din,
572 scheduling_hierarchy,
573 MLX5_GET(create_scheduling_element_in, in,
574 scheduling_hierarchy));
575 MLX5_SET(destroy_scheduling_element_in, din,
576 scheduling_element_id, *obj_id);
577 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
578 MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT);
579 break;
580 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
581 *dinlen = MLX5_ST_SZ_BYTES(delete_vxlan_udp_dport_in);
582 *obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
583 MLX5_SET(delete_vxlan_udp_dport_in, din, vxlan_udp_port, *obj_id);
584 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
585 MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT);
586 break;
587 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
588 *dinlen = MLX5_ST_SZ_BYTES(delete_l2_table_entry_in);
589 *obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
590 MLX5_SET(delete_l2_table_entry_in, din, table_index, *obj_id);
591 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
592 MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY);
593 break;
594 case MLX5_CMD_OP_CREATE_QP:
595 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_QP);
596 break;
597 case MLX5_CMD_OP_CREATE_SRQ:
598 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SRQ);
599 break;
600 case MLX5_CMD_OP_CREATE_XRC_SRQ:
601 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
602 MLX5_CMD_OP_DESTROY_XRC_SRQ);
603 break;
604 case MLX5_CMD_OP_CREATE_DCT:
605 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_DCT);
606 break;
607 case MLX5_CMD_OP_CREATE_XRQ:
608 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_XRQ);
609 break;
610 case MLX5_CMD_OP_ATTACH_TO_MCG:
611 *dinlen = MLX5_ST_SZ_BYTES(detach_from_mcg_in);
612 MLX5_SET(detach_from_mcg_in, din, qpn,
613 MLX5_GET(attach_to_mcg_in, in, qpn));
614 memcpy(MLX5_ADDR_OF(detach_from_mcg_in, din, multicast_gid),
615 MLX5_ADDR_OF(attach_to_mcg_in, in, multicast_gid),
616 MLX5_FLD_SZ_BYTES(attach_to_mcg_in, multicast_gid));
617 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DETACH_FROM_MCG);
618 break;
619 case MLX5_CMD_OP_ALLOC_XRCD:
620 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_XRCD);
621 break;
622 default:
623 /* The entry must match to one of the devx_is_obj_create_cmd */
624 WARN_ON(true);
625 break;
626 }
627}
628
629static int devx_obj_cleanup(struct ib_uobject *uobject,
630 enum rdma_remove_reason why)
631{
632 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
633 struct devx_obj *obj = uobject->object;
634 int ret;
635
636 ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
637 if (ret && why == RDMA_REMOVE_DESTROY)
638 return ret;
639
640 kfree(obj);
641 return ret;
642}
643
644static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_DESTROY)(struct ib_device *ib_dev,
645 struct ib_uverbs_file *file,
646 struct uverbs_attr_bundle *attrs)
647{
648 return 0;
649}
650
651static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(struct ib_device *ib_dev,
652 struct ib_uverbs_file *file,
653 struct uverbs_attr_bundle *attrs)
654{
655 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
656 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
657 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN);
658 int cmd_out_len = uverbs_attr_get_len(attrs,
659 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT);
660 void *cmd_out;
661 struct ib_uobject *uobj;
662 struct devx_obj *obj;
663 int err;
664
665 if (!c->devx_uid)
666 return -EPERM;
667
668 if (!devx_is_obj_create_cmd(cmd_in))
669 return -EINVAL;
670
671 obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
672 if (!obj)
673 return -ENOMEM;
674
675 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
676 if (!cmd_out) {
677 err = -ENOMEM;
678 goto obj_free;
679 }
680
681 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
682 err = mlx5_cmd_exec(dev->mdev, cmd_in,
683 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
684 cmd_out, cmd_out_len);
685 if (err)
686 goto cmd_free;
687
688 uobj = uverbs_attr_get_uobject(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE);
689 uobj->object = obj;
690 obj->mdev = dev->mdev;
691 devx_obj_build_destroy_cmd(cmd_in, cmd_out, obj->dinbox, &obj->dinlen, &obj->obj_id);
692 WARN_ON(obj->dinlen > MLX5_MAX_DESTROY_INBOX_SIZE_DW * sizeof(u32));
693
694 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
695 if (err)
696 goto cmd_free;
697
698 kvfree(cmd_out);
699 return 0;
700
701cmd_free:
702 kvfree(cmd_out);
703obj_free:
704 kfree(obj);
705 return err;
706}
707
Yishai Hadase662e142018-06-17 13:00:02 +0300708static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(struct ib_device *ib_dev,
709 struct ib_uverbs_file *file,
710 struct uverbs_attr_bundle *attrs)
711{
712 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
713 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
714 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN);
715 int cmd_out_len = uverbs_attr_get_len(attrs,
716 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT);
717 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
718 MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE);
719 void *cmd_out;
720 int err;
721
722 if (!c->devx_uid)
723 return -EPERM;
724
725 if (!devx_is_obj_modify_cmd(cmd_in))
726 return -EINVAL;
727
728 if (!devx_is_valid_obj_id(uobj->object, cmd_in))
729 return -EINVAL;
730
731 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
732 if (!cmd_out)
733 return -ENOMEM;
734
735 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
736 err = mlx5_cmd_exec(dev->mdev, cmd_in,
737 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
738 cmd_out, cmd_out_len);
739 if (err)
740 goto other_cmd_free;
741
742 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
743 cmd_out, cmd_out_len);
744
745other_cmd_free:
746 kvfree(cmd_out);
747 return err;
748}
749
750static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(struct ib_device *ib_dev,
751 struct ib_uverbs_file *file,
752 struct uverbs_attr_bundle *attrs)
753{
754 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
755 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
756 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN);
757 int cmd_out_len = uverbs_attr_get_len(attrs,
758 MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT);
759 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
760 MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE);
761 void *cmd_out;
762 int err;
763
764 if (!c->devx_uid)
765 return -EPERM;
766
767 if (!devx_is_obj_query_cmd(cmd_in))
768 return -EINVAL;
769
770 if (!devx_is_valid_obj_id(uobj->object, cmd_in))
771 return -EINVAL;
772
773 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
774 if (!cmd_out)
775 return -ENOMEM;
776
777 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
778 err = mlx5_cmd_exec(dev->mdev, cmd_in,
779 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
780 cmd_out, cmd_out_len);
781 if (err)
782 goto other_cmd_free;
783
784 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT, cmd_out, cmd_out_len);
785
786other_cmd_free:
787 kvfree(cmd_out);
788 return err;
789}
790
Yishai Hadas7c043e92018-06-17 13:00:03 +0300791static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR,
792 &UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_QUERY_UAR_USER_IDX, UVERBS_ATTR_TYPE(u32),
793 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
794 &UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_QUERY_UAR_DEV_IDX, UVERBS_ATTR_TYPE(u32),
795 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
796
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300797static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
798 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
799 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
800 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
801 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
802 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
803 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
804 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
805 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
806 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO))
807);
808
Yishai Hadas7efce362018-06-17 13:00:01 +0300809static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
810 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE,
811 MLX5_IB_OBJECT_DEVX_OBJ,
812 UVERBS_ACCESS_NEW,
813 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
814 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
815 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
816 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
817 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
818 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
819 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
820 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
821 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
822 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
823
824static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
825 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE,
826 MLX5_IB_OBJECT_DEVX_OBJ,
827 UVERBS_ACCESS_DESTROY,
828 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
829
Yishai Hadase662e142018-06-17 13:00:02 +0300830static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
831 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_HANDLE,
832 MLX5_IB_OBJECT_DEVX_OBJ,
833 UVERBS_ACCESS_WRITE,
834 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
835 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN,
836 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
837 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
838 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
839 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
840 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
841 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
842 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
843 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
844
845static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY,
846 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_QUERY_HANDLE,
847 MLX5_IB_OBJECT_DEVX_OBJ,
848 UVERBS_ACCESS_READ,
849 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
850 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN,
851 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
852 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
853 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
854 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
855 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
856 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
857 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
858 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
859
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300860static DECLARE_UVERBS_GLOBAL_METHODS(MLX5_IB_OBJECT_DEVX,
Yishai Hadas7c043e92018-06-17 13:00:03 +0300861 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OTHER),
862 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR));
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300863
Yishai Hadas7efce362018-06-17 13:00:01 +0300864static DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ,
865 &UVERBS_TYPE_ALLOC_IDR(0, devx_obj_cleanup),
866 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE),
Yishai Hadase662e142018-06-17 13:00:02 +0300867 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY),
868 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY),
869 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY));
Yishai Hadas7efce362018-06-17 13:00:01 +0300870
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300871static DECLARE_UVERBS_OBJECT_TREE(devx_objects,
Yishai Hadas7efce362018-06-17 13:00:01 +0300872 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX),
873 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ));