blob: 87116a3b79169c25ebeed481f769e8024f3bdf8e [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 Hadas7efce362018-06-17 13:00:01 +030076static bool devx_is_obj_create_cmd(const void *in)
77{
78 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
79
80 switch (opcode) {
81 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
82 case MLX5_CMD_OP_CREATE_MKEY:
83 case MLX5_CMD_OP_CREATE_CQ:
84 case MLX5_CMD_OP_ALLOC_PD:
85 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
86 case MLX5_CMD_OP_CREATE_RMP:
87 case MLX5_CMD_OP_CREATE_SQ:
88 case MLX5_CMD_OP_CREATE_RQ:
89 case MLX5_CMD_OP_CREATE_RQT:
90 case MLX5_CMD_OP_CREATE_TIR:
91 case MLX5_CMD_OP_CREATE_TIS:
92 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
93 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
94 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
95 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
96 case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
97 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
98 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
99 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
100 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
101 case MLX5_CMD_OP_CREATE_QP:
102 case MLX5_CMD_OP_CREATE_SRQ:
103 case MLX5_CMD_OP_CREATE_XRC_SRQ:
104 case MLX5_CMD_OP_CREATE_DCT:
105 case MLX5_CMD_OP_CREATE_XRQ:
106 case MLX5_CMD_OP_ATTACH_TO_MCG:
107 case MLX5_CMD_OP_ALLOC_XRCD:
108 return true;
109 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
110 {
111 u16 op_mod = MLX5_GET(set_fte_in, in, op_mod);
112 if (op_mod == 0)
113 return true;
114 return false;
115 }
116 default:
117 return false;
118 }
119}
120
121static bool devx_is_general_cmd(const void *in)
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300122{
123 u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
124
125 switch (opcode) {
126 case MLX5_CMD_OP_QUERY_HCA_CAP:
127 case MLX5_CMD_OP_QUERY_VPORT_STATE:
128 case MLX5_CMD_OP_QUERY_ADAPTER:
129 case MLX5_CMD_OP_QUERY_ISSI:
130 case MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT:
131 case MLX5_CMD_OP_QUERY_ROCE_ADDRESS:
132 case MLX5_CMD_OP_QUERY_VNIC_ENV:
133 case MLX5_CMD_OP_QUERY_VPORT_COUNTER:
134 case MLX5_CMD_OP_GET_DROPPED_PACKET_LOG:
135 case MLX5_CMD_OP_NOP:
136 case MLX5_CMD_OP_QUERY_CONG_STATUS:
137 case MLX5_CMD_OP_QUERY_CONG_PARAMS:
138 case MLX5_CMD_OP_QUERY_CONG_STATISTICS:
139 return true;
140 default:
141 return false;
142 }
143}
144
145static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
146 struct ib_uverbs_file *file,
147 struct uverbs_attr_bundle *attrs)
148{
149 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
150 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
Yishai Hadas7efce362018-06-17 13:00:01 +0300151 void *cmd_in = uverbs_attr_get_alloced_ptr(
152 attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300153 int cmd_out_len = uverbs_attr_get_len(attrs,
154 MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
155 void *cmd_out;
156 int err;
157
158 if (!c->devx_uid)
159 return -EPERM;
160
161 /* Only white list of some general HCA commands are allowed for this method. */
162 if (!devx_is_general_cmd(cmd_in))
163 return -EINVAL;
164
165 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
166 if (!cmd_out)
167 return -ENOMEM;
168
169 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
170 err = mlx5_cmd_exec(dev->mdev, cmd_in,
171 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
172 cmd_out, cmd_out_len);
173 if (err)
174 goto other_cmd_free;
175
176 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out, cmd_out_len);
177
178other_cmd_free:
179 kvfree(cmd_out);
180 return err;
181}
182
Yishai Hadas7efce362018-06-17 13:00:01 +0300183static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
184 u32 *dinlen,
185 u32 *obj_id)
186{
187 u16 obj_type = MLX5_GET(general_obj_in_cmd_hdr, in, obj_type);
188 u16 uid = MLX5_GET(general_obj_in_cmd_hdr, in, uid);
189
190 *obj_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
191 *dinlen = MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr);
192
193 MLX5_SET(general_obj_in_cmd_hdr, din, obj_id, *obj_id);
194 MLX5_SET(general_obj_in_cmd_hdr, din, uid, uid);
195
196 switch (MLX5_GET(general_obj_in_cmd_hdr, in, opcode)) {
197 case MLX5_CMD_OP_CREATE_GENERAL_OBJECT:
198 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
199 MLX5_SET(general_obj_in_cmd_hdr, din, obj_type, obj_type);
200 break;
201
202 case MLX5_CMD_OP_CREATE_MKEY:
203 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_MKEY);
204 break;
205 case MLX5_CMD_OP_CREATE_CQ:
206 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_CQ);
207 break;
208 case MLX5_CMD_OP_ALLOC_PD:
209 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_PD);
210 break;
211 case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:
212 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
213 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
214 break;
215 case MLX5_CMD_OP_CREATE_RMP:
216 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RMP);
217 break;
218 case MLX5_CMD_OP_CREATE_SQ:
219 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SQ);
220 break;
221 case MLX5_CMD_OP_CREATE_RQ:
222 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQ);
223 break;
224 case MLX5_CMD_OP_CREATE_RQT:
225 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQT);
226 break;
227 case MLX5_CMD_OP_CREATE_TIR:
228 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIR);
229 break;
230 case MLX5_CMD_OP_CREATE_TIS:
231 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIS);
232 break;
233 case MLX5_CMD_OP_ALLOC_Q_COUNTER:
234 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
235 MLX5_CMD_OP_DEALLOC_Q_COUNTER);
236 break;
237 case MLX5_CMD_OP_CREATE_FLOW_TABLE:
238 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_table_in);
239 *obj_id = MLX5_GET(create_flow_table_out, out, table_id);
240 MLX5_SET(destroy_flow_table_in, din, other_vport,
241 MLX5_GET(create_flow_table_in, in, other_vport));
242 MLX5_SET(destroy_flow_table_in, din, vport_number,
243 MLX5_GET(create_flow_table_in, in, vport_number));
244 MLX5_SET(destroy_flow_table_in, din, table_type,
245 MLX5_GET(create_flow_table_in, in, table_type));
246 MLX5_SET(destroy_flow_table_in, din, table_id, *obj_id);
247 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
248 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
249 break;
250 case MLX5_CMD_OP_CREATE_FLOW_GROUP:
251 *dinlen = MLX5_ST_SZ_BYTES(destroy_flow_group_in);
252 *obj_id = MLX5_GET(create_flow_group_out, out, group_id);
253 MLX5_SET(destroy_flow_group_in, din, other_vport,
254 MLX5_GET(create_flow_group_in, in, other_vport));
255 MLX5_SET(destroy_flow_group_in, din, vport_number,
256 MLX5_GET(create_flow_group_in, in, vport_number));
257 MLX5_SET(destroy_flow_group_in, din, table_type,
258 MLX5_GET(create_flow_group_in, in, table_type));
259 MLX5_SET(destroy_flow_group_in, din, table_id,
260 MLX5_GET(create_flow_group_in, in, table_id));
261 MLX5_SET(destroy_flow_group_in, din, group_id, *obj_id);
262 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
263 MLX5_CMD_OP_DESTROY_FLOW_GROUP);
264 break;
265 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:
266 *dinlen = MLX5_ST_SZ_BYTES(delete_fte_in);
267 *obj_id = MLX5_GET(set_fte_in, in, flow_index);
268 MLX5_SET(delete_fte_in, din, other_vport,
269 MLX5_GET(set_fte_in, in, other_vport));
270 MLX5_SET(delete_fte_in, din, vport_number,
271 MLX5_GET(set_fte_in, in, vport_number));
272 MLX5_SET(delete_fte_in, din, table_type,
273 MLX5_GET(set_fte_in, in, table_type));
274 MLX5_SET(delete_fte_in, din, table_id,
275 MLX5_GET(set_fte_in, in, table_id));
276 MLX5_SET(delete_fte_in, din, flow_index, *obj_id);
277 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
278 MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY);
279 break;
280 case MLX5_CMD_OP_ALLOC_FLOW_COUNTER:
281 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
282 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
283 break;
284 case MLX5_CMD_OP_ALLOC_ENCAP_HEADER:
285 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
286 MLX5_CMD_OP_DEALLOC_ENCAP_HEADER);
287 break;
288 case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:
289 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
290 MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT);
291 break;
292 case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:
293 *dinlen = MLX5_ST_SZ_BYTES(destroy_scheduling_element_in);
294 *obj_id = MLX5_GET(create_scheduling_element_out, out,
295 scheduling_element_id);
296 MLX5_SET(destroy_scheduling_element_in, din,
297 scheduling_hierarchy,
298 MLX5_GET(create_scheduling_element_in, in,
299 scheduling_hierarchy));
300 MLX5_SET(destroy_scheduling_element_in, din,
301 scheduling_element_id, *obj_id);
302 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
303 MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT);
304 break;
305 case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:
306 *dinlen = MLX5_ST_SZ_BYTES(delete_vxlan_udp_dport_in);
307 *obj_id = MLX5_GET(add_vxlan_udp_dport_in, in, vxlan_udp_port);
308 MLX5_SET(delete_vxlan_udp_dport_in, din, vxlan_udp_port, *obj_id);
309 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
310 MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT);
311 break;
312 case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
313 *dinlen = MLX5_ST_SZ_BYTES(delete_l2_table_entry_in);
314 *obj_id = MLX5_GET(set_l2_table_entry_in, in, table_index);
315 MLX5_SET(delete_l2_table_entry_in, din, table_index, *obj_id);
316 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
317 MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY);
318 break;
319 case MLX5_CMD_OP_CREATE_QP:
320 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_QP);
321 break;
322 case MLX5_CMD_OP_CREATE_SRQ:
323 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_SRQ);
324 break;
325 case MLX5_CMD_OP_CREATE_XRC_SRQ:
326 MLX5_SET(general_obj_in_cmd_hdr, din, opcode,
327 MLX5_CMD_OP_DESTROY_XRC_SRQ);
328 break;
329 case MLX5_CMD_OP_CREATE_DCT:
330 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_DCT);
331 break;
332 case MLX5_CMD_OP_CREATE_XRQ:
333 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_XRQ);
334 break;
335 case MLX5_CMD_OP_ATTACH_TO_MCG:
336 *dinlen = MLX5_ST_SZ_BYTES(detach_from_mcg_in);
337 MLX5_SET(detach_from_mcg_in, din, qpn,
338 MLX5_GET(attach_to_mcg_in, in, qpn));
339 memcpy(MLX5_ADDR_OF(detach_from_mcg_in, din, multicast_gid),
340 MLX5_ADDR_OF(attach_to_mcg_in, in, multicast_gid),
341 MLX5_FLD_SZ_BYTES(attach_to_mcg_in, multicast_gid));
342 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DETACH_FROM_MCG);
343 break;
344 case MLX5_CMD_OP_ALLOC_XRCD:
345 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_XRCD);
346 break;
347 default:
348 /* The entry must match to one of the devx_is_obj_create_cmd */
349 WARN_ON(true);
350 break;
351 }
352}
353
354static int devx_obj_cleanup(struct ib_uobject *uobject,
355 enum rdma_remove_reason why)
356{
357 u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
358 struct devx_obj *obj = uobject->object;
359 int ret;
360
361 ret = mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, out, sizeof(out));
362 if (ret && why == RDMA_REMOVE_DESTROY)
363 return ret;
364
365 kfree(obj);
366 return ret;
367}
368
369static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_DESTROY)(struct ib_device *ib_dev,
370 struct ib_uverbs_file *file,
371 struct uverbs_attr_bundle *attrs)
372{
373 return 0;
374}
375
376static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(struct ib_device *ib_dev,
377 struct ib_uverbs_file *file,
378 struct uverbs_attr_bundle *attrs)
379{
380 struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
381 struct mlx5_ib_dev *dev = to_mdev(ib_dev);
382 void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN);
383 int cmd_out_len = uverbs_attr_get_len(attrs,
384 MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT);
385 void *cmd_out;
386 struct ib_uobject *uobj;
387 struct devx_obj *obj;
388 int err;
389
390 if (!c->devx_uid)
391 return -EPERM;
392
393 if (!devx_is_obj_create_cmd(cmd_in))
394 return -EINVAL;
395
396 obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
397 if (!obj)
398 return -ENOMEM;
399
400 cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
401 if (!cmd_out) {
402 err = -ENOMEM;
403 goto obj_free;
404 }
405
406 MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
407 err = mlx5_cmd_exec(dev->mdev, cmd_in,
408 uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
409 cmd_out, cmd_out_len);
410 if (err)
411 goto cmd_free;
412
413 uobj = uverbs_attr_get_uobject(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE);
414 uobj->object = obj;
415 obj->mdev = dev->mdev;
416 devx_obj_build_destroy_cmd(cmd_in, cmd_out, obj->dinbox, &obj->dinlen, &obj->obj_id);
417 WARN_ON(obj->dinlen > MLX5_MAX_DESTROY_INBOX_SIZE_DW * sizeof(u32));
418
419 err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
420 if (err)
421 goto cmd_free;
422
423 kvfree(cmd_out);
424 return 0;
425
426cmd_free:
427 kvfree(cmd_out);
428obj_free:
429 kfree(obj);
430 return err;
431}
432
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300433static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
434 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
435 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
436 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
437 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
438 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
439 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
440 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
441 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
442 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO))
443);
444
Yishai Hadas7efce362018-06-17 13:00:01 +0300445static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
446 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE,
447 MLX5_IB_OBJECT_DEVX_OBJ,
448 UVERBS_ACCESS_NEW,
449 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
450 &UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
451 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
452 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
453 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
454 UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
455 &UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
456 UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
457 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
458 UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
459
460static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
461 &UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE,
462 MLX5_IB_OBJECT_DEVX_OBJ,
463 UVERBS_ACCESS_DESTROY,
464 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));
465
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300466static DECLARE_UVERBS_GLOBAL_METHODS(MLX5_IB_OBJECT_DEVX,
467 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OTHER));
468
Yishai Hadas7efce362018-06-17 13:00:01 +0300469static DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ,
470 &UVERBS_TYPE_ALLOC_IDR(0, devx_obj_cleanup),
471 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE),
472 &UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OBJ_DESTROY));
473
Yishai Hadas8aa8c952018-06-17 13:00:00 +0300474static DECLARE_UVERBS_OBJECT_TREE(devx_objects,
Yishai Hadas7efce362018-06-17 13:00:01 +0300475 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX),
476 &UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ));