Skip to content

Commit 7efce36

Browse files
yishaihjgunthorpe
authored andcommitted
IB/mlx5: Add obj create and destroy functionality
Add support to create and destroy firmware objects via the DEVX interface. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
1 parent 8aa8c95 commit 7efce36

File tree

2 files changed

+350
-3
lines changed

2 files changed

+350
-3
lines changed

drivers/infiniband/hw/mlx5/devx.c

Lines changed: 334 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616
#define UVERBS_MODULE_NAME mlx5_ib
1717
#include <rdma/uverbs_named_ioctl.h>
1818

19+
#define MLX5_MAX_DESTROY_INBOX_SIZE_DW MLX5_ST_SZ_DW(delete_fte_in)
20+
struct 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+
1927
static struct mlx5_ib_ucontext *devx_ufile2uctx(struct ib_uverbs_file *file)
2028
{
2129
return to_mucontext(ib_uverbs_get_ucontext(file));
@@ -65,7 +73,52 @@ void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev,
6573
mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
6674
}
6775

68-
static bool devx_is_general_cmd(void *in)
76+
static 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+
121+
static bool devx_is_general_cmd(const void *in)
69122
{
70123
u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
71124

@@ -95,7 +148,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
95148
{
96149
struct mlx5_ib_ucontext *c = devx_ufile2uctx(file);
97150
struct mlx5_ib_dev *dev = to_mdev(ib_dev);
98-
void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
151+
void *cmd_in = uverbs_attr_get_alloced_ptr(
152+
attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN);
99153
int cmd_out_len = uverbs_attr_get_len(attrs,
100154
MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
101155
void *cmd_out;
@@ -126,6 +180,256 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
126180
return err;
127181
}
128182

183+
static 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+
354+
static 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+
369+
static 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+
376+
static 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+
426+
cmd_free:
427+
kvfree(cmd_out);
428+
obj_free:
429+
kfree(obj);
430+
return err;
431+
}
432+
129433
static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
130434
&UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
131435
UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
@@ -138,8 +442,35 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
138442
UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO))
139443
);
140444

445+
static 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+
460+
static 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+
141466
static DECLARE_UVERBS_GLOBAL_METHODS(MLX5_IB_OBJECT_DEVX,
142467
&UVERBS_METHOD(MLX5_IB_METHOD_DEVX_OTHER));
143468

469+
static 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+
144474
static DECLARE_UVERBS_OBJECT_TREE(devx_objects,
145-
&UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX));
475+
&UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX),
476+
&UVERBS_OBJECT(MLX5_IB_OBJECT_DEVX_OBJ));

include/uapi/rdma/mlx5_user_ioctl_cmds.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,24 @@ enum mlx5_ib_devx_other_attrs {
5454
MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
5555
};
5656

57+
enum mlx5_ib_devx_obj_create_attrs {
58+
MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
59+
MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
60+
MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
61+
};
62+
63+
enum mlx5_ib_devx_obj_destroy_attrs {
64+
MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
65+
};
66+
67+
enum mlx5_ib_devx_obj_methods {
68+
MLX5_IB_METHOD_DEVX_OBJ_CREATE = (1U << UVERBS_ID_NS_SHIFT),
69+
MLX5_IB_METHOD_DEVX_OBJ_DESTROY,
70+
};
71+
5772
enum mlx5_ib_devx_objects {
5873
MLX5_IB_OBJECT_DEVX = (1U << UVERBS_ID_NS_SHIFT),
74+
MLX5_IB_OBJECT_DEVX_OBJ,
5975
};
6076

6177
#endif

0 commit comments

Comments
 (0)