Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/rdma/ib_user_verbs.h
10817 views
1
/*
2
* Copyright (c) 2005 Topspin Communications. All rights reserved.
3
* Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.
4
* Copyright (c) 2005 PathScale, Inc. All rights reserved.
5
* Copyright (c) 2006 Mellanox Technologies. All rights reserved.
6
*
7
* This software is available to you under a choice of one of two
8
* licenses. You may choose to be licensed under the terms of the GNU
9
* General Public License (GPL) Version 2, available from the file
10
* COPYING in the main directory of this source tree, or the
11
* OpenIB.org BSD license below:
12
*
13
* Redistribution and use in source and binary forms, with or
14
* without modification, are permitted provided that the following
15
* conditions are met:
16
*
17
* - Redistributions of source code must retain the above
18
* copyright notice, this list of conditions and the following
19
* disclaimer.
20
*
21
* - Redistributions in binary form must reproduce the above
22
* copyright notice, this list of conditions and the following
23
* disclaimer in the documentation and/or other materials
24
* provided with the distribution.
25
*
26
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33
* SOFTWARE.
34
*/
35
36
#ifndef IB_USER_VERBS_H
37
#define IB_USER_VERBS_H
38
39
#include <linux/types.h>
40
41
/*
42
* Increment this value if any changes that break userspace ABI
43
* compatibility are made.
44
*/
45
#define IB_USER_VERBS_ABI_VERSION 6
46
47
enum {
48
IB_USER_VERBS_CMD_GET_CONTEXT,
49
IB_USER_VERBS_CMD_QUERY_DEVICE,
50
IB_USER_VERBS_CMD_QUERY_PORT,
51
IB_USER_VERBS_CMD_ALLOC_PD,
52
IB_USER_VERBS_CMD_DEALLOC_PD,
53
IB_USER_VERBS_CMD_CREATE_AH,
54
IB_USER_VERBS_CMD_MODIFY_AH,
55
IB_USER_VERBS_CMD_QUERY_AH,
56
IB_USER_VERBS_CMD_DESTROY_AH,
57
IB_USER_VERBS_CMD_REG_MR,
58
IB_USER_VERBS_CMD_REG_SMR,
59
IB_USER_VERBS_CMD_REREG_MR,
60
IB_USER_VERBS_CMD_QUERY_MR,
61
IB_USER_VERBS_CMD_DEREG_MR,
62
IB_USER_VERBS_CMD_ALLOC_MW,
63
IB_USER_VERBS_CMD_BIND_MW,
64
IB_USER_VERBS_CMD_DEALLOC_MW,
65
IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
66
IB_USER_VERBS_CMD_CREATE_CQ,
67
IB_USER_VERBS_CMD_RESIZE_CQ,
68
IB_USER_VERBS_CMD_DESTROY_CQ,
69
IB_USER_VERBS_CMD_POLL_CQ,
70
IB_USER_VERBS_CMD_PEEK_CQ,
71
IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
72
IB_USER_VERBS_CMD_CREATE_QP,
73
IB_USER_VERBS_CMD_QUERY_QP,
74
IB_USER_VERBS_CMD_MODIFY_QP,
75
IB_USER_VERBS_CMD_DESTROY_QP,
76
IB_USER_VERBS_CMD_POST_SEND,
77
IB_USER_VERBS_CMD_POST_RECV,
78
IB_USER_VERBS_CMD_ATTACH_MCAST,
79
IB_USER_VERBS_CMD_DETACH_MCAST,
80
IB_USER_VERBS_CMD_CREATE_SRQ,
81
IB_USER_VERBS_CMD_MODIFY_SRQ,
82
IB_USER_VERBS_CMD_QUERY_SRQ,
83
IB_USER_VERBS_CMD_DESTROY_SRQ,
84
IB_USER_VERBS_CMD_POST_SRQ_RECV
85
};
86
87
/*
88
* Make sure that all structs defined in this file remain laid out so
89
* that they pack the same way on 32-bit and 64-bit architectures (to
90
* avoid incompatibility between 32-bit userspace and 64-bit kernels).
91
* Specifically:
92
* - Do not use pointer types -- pass pointers in __u64 instead.
93
* - Make sure that any structure larger than 4 bytes is padded to a
94
* multiple of 8 bytes. Otherwise the structure size will be
95
* different between 32-bit and 64-bit architectures.
96
*/
97
98
struct ib_uverbs_async_event_desc {
99
__u64 element;
100
__u32 event_type; /* enum ib_event_type */
101
__u32 reserved;
102
};
103
104
struct ib_uverbs_comp_event_desc {
105
__u64 cq_handle;
106
};
107
108
/*
109
* All commands from userspace should start with a __u32 command field
110
* followed by __u16 in_words and out_words fields (which give the
111
* length of the command block and response buffer if any in 32-bit
112
* words). The kernel driver will read these fields first and read
113
* the rest of the command struct based on these value.
114
*/
115
116
struct ib_uverbs_cmd_hdr {
117
__u32 command;
118
__u16 in_words;
119
__u16 out_words;
120
};
121
122
struct ib_uverbs_get_context {
123
__u64 response;
124
__u64 driver_data[0];
125
};
126
127
struct ib_uverbs_get_context_resp {
128
__u32 async_fd;
129
__u32 num_comp_vectors;
130
};
131
132
struct ib_uverbs_query_device {
133
__u64 response;
134
__u64 driver_data[0];
135
};
136
137
struct ib_uverbs_query_device_resp {
138
__u64 fw_ver;
139
__be64 node_guid;
140
__be64 sys_image_guid;
141
__u64 max_mr_size;
142
__u64 page_size_cap;
143
__u32 vendor_id;
144
__u32 vendor_part_id;
145
__u32 hw_ver;
146
__u32 max_qp;
147
__u32 max_qp_wr;
148
__u32 device_cap_flags;
149
__u32 max_sge;
150
__u32 max_sge_rd;
151
__u32 max_cq;
152
__u32 max_cqe;
153
__u32 max_mr;
154
__u32 max_pd;
155
__u32 max_qp_rd_atom;
156
__u32 max_ee_rd_atom;
157
__u32 max_res_rd_atom;
158
__u32 max_qp_init_rd_atom;
159
__u32 max_ee_init_rd_atom;
160
__u32 atomic_cap;
161
__u32 max_ee;
162
__u32 max_rdd;
163
__u32 max_mw;
164
__u32 max_raw_ipv6_qp;
165
__u32 max_raw_ethy_qp;
166
__u32 max_mcast_grp;
167
__u32 max_mcast_qp_attach;
168
__u32 max_total_mcast_qp_attach;
169
__u32 max_ah;
170
__u32 max_fmr;
171
__u32 max_map_per_fmr;
172
__u32 max_srq;
173
__u32 max_srq_wr;
174
__u32 max_srq_sge;
175
__u16 max_pkeys;
176
__u8 local_ca_ack_delay;
177
__u8 phys_port_cnt;
178
__u8 reserved[4];
179
};
180
181
struct ib_uverbs_query_port {
182
__u64 response;
183
__u8 port_num;
184
__u8 reserved[7];
185
__u64 driver_data[0];
186
};
187
188
struct ib_uverbs_query_port_resp {
189
__u32 port_cap_flags;
190
__u32 max_msg_sz;
191
__u32 bad_pkey_cntr;
192
__u32 qkey_viol_cntr;
193
__u32 gid_tbl_len;
194
__u16 pkey_tbl_len;
195
__u16 lid;
196
__u16 sm_lid;
197
__u8 state;
198
__u8 max_mtu;
199
__u8 active_mtu;
200
__u8 lmc;
201
__u8 max_vl_num;
202
__u8 sm_sl;
203
__u8 subnet_timeout;
204
__u8 init_type_reply;
205
__u8 active_width;
206
__u8 active_speed;
207
__u8 phys_state;
208
__u8 link_layer;
209
__u8 reserved[2];
210
};
211
212
struct ib_uverbs_alloc_pd {
213
__u64 response;
214
__u64 driver_data[0];
215
};
216
217
struct ib_uverbs_alloc_pd_resp {
218
__u32 pd_handle;
219
};
220
221
struct ib_uverbs_dealloc_pd {
222
__u32 pd_handle;
223
};
224
225
struct ib_uverbs_reg_mr {
226
__u64 response;
227
__u64 start;
228
__u64 length;
229
__u64 hca_va;
230
__u32 pd_handle;
231
__u32 access_flags;
232
__u64 driver_data[0];
233
};
234
235
struct ib_uverbs_reg_mr_resp {
236
__u32 mr_handle;
237
__u32 lkey;
238
__u32 rkey;
239
};
240
241
struct ib_uverbs_dereg_mr {
242
__u32 mr_handle;
243
};
244
245
struct ib_uverbs_create_comp_channel {
246
__u64 response;
247
};
248
249
struct ib_uverbs_create_comp_channel_resp {
250
__u32 fd;
251
};
252
253
struct ib_uverbs_create_cq {
254
__u64 response;
255
__u64 user_handle;
256
__u32 cqe;
257
__u32 comp_vector;
258
__s32 comp_channel;
259
__u32 reserved;
260
__u64 driver_data[0];
261
};
262
263
struct ib_uverbs_create_cq_resp {
264
__u32 cq_handle;
265
__u32 cqe;
266
};
267
268
struct ib_uverbs_resize_cq {
269
__u64 response;
270
__u32 cq_handle;
271
__u32 cqe;
272
__u64 driver_data[0];
273
};
274
275
struct ib_uverbs_resize_cq_resp {
276
__u32 cqe;
277
__u32 reserved;
278
__u64 driver_data[0];
279
};
280
281
struct ib_uverbs_poll_cq {
282
__u64 response;
283
__u32 cq_handle;
284
__u32 ne;
285
};
286
287
struct ib_uverbs_wc {
288
__u64 wr_id;
289
__u32 status;
290
__u32 opcode;
291
__u32 vendor_err;
292
__u32 byte_len;
293
union {
294
__u32 imm_data;
295
__u32 invalidate_rkey;
296
} ex;
297
__u32 qp_num;
298
__u32 src_qp;
299
__u32 wc_flags;
300
__u16 pkey_index;
301
__u16 slid;
302
__u8 sl;
303
__u8 dlid_path_bits;
304
__u8 port_num;
305
__u8 reserved;
306
};
307
308
struct ib_uverbs_poll_cq_resp {
309
__u32 count;
310
__u32 reserved;
311
struct ib_uverbs_wc wc[0];
312
};
313
314
struct ib_uverbs_req_notify_cq {
315
__u32 cq_handle;
316
__u32 solicited_only;
317
};
318
319
struct ib_uverbs_destroy_cq {
320
__u64 response;
321
__u32 cq_handle;
322
__u32 reserved;
323
};
324
325
struct ib_uverbs_destroy_cq_resp {
326
__u32 comp_events_reported;
327
__u32 async_events_reported;
328
};
329
330
struct ib_uverbs_global_route {
331
__u8 dgid[16];
332
__u32 flow_label;
333
__u8 sgid_index;
334
__u8 hop_limit;
335
__u8 traffic_class;
336
__u8 reserved;
337
};
338
339
struct ib_uverbs_ah_attr {
340
struct ib_uverbs_global_route grh;
341
__u16 dlid;
342
__u8 sl;
343
__u8 src_path_bits;
344
__u8 static_rate;
345
__u8 is_global;
346
__u8 port_num;
347
__u8 reserved;
348
};
349
350
struct ib_uverbs_qp_attr {
351
__u32 qp_attr_mask;
352
__u32 qp_state;
353
__u32 cur_qp_state;
354
__u32 path_mtu;
355
__u32 path_mig_state;
356
__u32 qkey;
357
__u32 rq_psn;
358
__u32 sq_psn;
359
__u32 dest_qp_num;
360
__u32 qp_access_flags;
361
362
struct ib_uverbs_ah_attr ah_attr;
363
struct ib_uverbs_ah_attr alt_ah_attr;
364
365
/* ib_qp_cap */
366
__u32 max_send_wr;
367
__u32 max_recv_wr;
368
__u32 max_send_sge;
369
__u32 max_recv_sge;
370
__u32 max_inline_data;
371
372
__u16 pkey_index;
373
__u16 alt_pkey_index;
374
__u8 en_sqd_async_notify;
375
__u8 sq_draining;
376
__u8 max_rd_atomic;
377
__u8 max_dest_rd_atomic;
378
__u8 min_rnr_timer;
379
__u8 port_num;
380
__u8 timeout;
381
__u8 retry_cnt;
382
__u8 rnr_retry;
383
__u8 alt_port_num;
384
__u8 alt_timeout;
385
__u8 reserved[5];
386
};
387
388
struct ib_uverbs_create_qp {
389
__u64 response;
390
__u64 user_handle;
391
__u32 pd_handle;
392
__u32 send_cq_handle;
393
__u32 recv_cq_handle;
394
__u32 srq_handle;
395
__u32 max_send_wr;
396
__u32 max_recv_wr;
397
__u32 max_send_sge;
398
__u32 max_recv_sge;
399
__u32 max_inline_data;
400
__u8 sq_sig_all;
401
__u8 qp_type;
402
__u8 is_srq;
403
__u8 reserved;
404
__u64 driver_data[0];
405
};
406
407
struct ib_uverbs_create_qp_resp {
408
__u32 qp_handle;
409
__u32 qpn;
410
__u32 max_send_wr;
411
__u32 max_recv_wr;
412
__u32 max_send_sge;
413
__u32 max_recv_sge;
414
__u32 max_inline_data;
415
__u32 reserved;
416
};
417
418
/*
419
* This struct needs to remain a multiple of 8 bytes to keep the
420
* alignment of the modify QP parameters.
421
*/
422
struct ib_uverbs_qp_dest {
423
__u8 dgid[16];
424
__u32 flow_label;
425
__u16 dlid;
426
__u16 reserved;
427
__u8 sgid_index;
428
__u8 hop_limit;
429
__u8 traffic_class;
430
__u8 sl;
431
__u8 src_path_bits;
432
__u8 static_rate;
433
__u8 is_global;
434
__u8 port_num;
435
};
436
437
struct ib_uverbs_query_qp {
438
__u64 response;
439
__u32 qp_handle;
440
__u32 attr_mask;
441
__u64 driver_data[0];
442
};
443
444
struct ib_uverbs_query_qp_resp {
445
struct ib_uverbs_qp_dest dest;
446
struct ib_uverbs_qp_dest alt_dest;
447
__u32 max_send_wr;
448
__u32 max_recv_wr;
449
__u32 max_send_sge;
450
__u32 max_recv_sge;
451
__u32 max_inline_data;
452
__u32 qkey;
453
__u32 rq_psn;
454
__u32 sq_psn;
455
__u32 dest_qp_num;
456
__u32 qp_access_flags;
457
__u16 pkey_index;
458
__u16 alt_pkey_index;
459
__u8 qp_state;
460
__u8 cur_qp_state;
461
__u8 path_mtu;
462
__u8 path_mig_state;
463
__u8 sq_draining;
464
__u8 max_rd_atomic;
465
__u8 max_dest_rd_atomic;
466
__u8 min_rnr_timer;
467
__u8 port_num;
468
__u8 timeout;
469
__u8 retry_cnt;
470
__u8 rnr_retry;
471
__u8 alt_port_num;
472
__u8 alt_timeout;
473
__u8 sq_sig_all;
474
__u8 reserved[5];
475
__u64 driver_data[0];
476
};
477
478
struct ib_uverbs_modify_qp {
479
struct ib_uverbs_qp_dest dest;
480
struct ib_uverbs_qp_dest alt_dest;
481
__u32 qp_handle;
482
__u32 attr_mask;
483
__u32 qkey;
484
__u32 rq_psn;
485
__u32 sq_psn;
486
__u32 dest_qp_num;
487
__u32 qp_access_flags;
488
__u16 pkey_index;
489
__u16 alt_pkey_index;
490
__u8 qp_state;
491
__u8 cur_qp_state;
492
__u8 path_mtu;
493
__u8 path_mig_state;
494
__u8 en_sqd_async_notify;
495
__u8 max_rd_atomic;
496
__u8 max_dest_rd_atomic;
497
__u8 min_rnr_timer;
498
__u8 port_num;
499
__u8 timeout;
500
__u8 retry_cnt;
501
__u8 rnr_retry;
502
__u8 alt_port_num;
503
__u8 alt_timeout;
504
__u8 reserved[2];
505
__u64 driver_data[0];
506
};
507
508
struct ib_uverbs_modify_qp_resp {
509
};
510
511
struct ib_uverbs_destroy_qp {
512
__u64 response;
513
__u32 qp_handle;
514
__u32 reserved;
515
};
516
517
struct ib_uverbs_destroy_qp_resp {
518
__u32 events_reported;
519
};
520
521
/*
522
* The ib_uverbs_sge structure isn't used anywhere, since we assume
523
* the ib_sge structure is packed the same way on 32-bit and 64-bit
524
* architectures in both kernel and user space. It's just here to
525
* document the ABI.
526
*/
527
struct ib_uverbs_sge {
528
__u64 addr;
529
__u32 length;
530
__u32 lkey;
531
};
532
533
struct ib_uverbs_send_wr {
534
__u64 wr_id;
535
__u32 num_sge;
536
__u32 opcode;
537
__u32 send_flags;
538
union {
539
__u32 imm_data;
540
__u32 invalidate_rkey;
541
} ex;
542
union {
543
struct {
544
__u64 remote_addr;
545
__u32 rkey;
546
__u32 reserved;
547
} rdma;
548
struct {
549
__u64 remote_addr;
550
__u64 compare_add;
551
__u64 swap;
552
__u32 rkey;
553
__u32 reserved;
554
} atomic;
555
struct {
556
__u32 ah;
557
__u32 remote_qpn;
558
__u32 remote_qkey;
559
__u32 reserved;
560
} ud;
561
} wr;
562
};
563
564
struct ib_uverbs_post_send {
565
__u64 response;
566
__u32 qp_handle;
567
__u32 wr_count;
568
__u32 sge_count;
569
__u32 wqe_size;
570
struct ib_uverbs_send_wr send_wr[0];
571
};
572
573
struct ib_uverbs_post_send_resp {
574
__u32 bad_wr;
575
};
576
577
struct ib_uverbs_recv_wr {
578
__u64 wr_id;
579
__u32 num_sge;
580
__u32 reserved;
581
};
582
583
struct ib_uverbs_post_recv {
584
__u64 response;
585
__u32 qp_handle;
586
__u32 wr_count;
587
__u32 sge_count;
588
__u32 wqe_size;
589
struct ib_uverbs_recv_wr recv_wr[0];
590
};
591
592
struct ib_uverbs_post_recv_resp {
593
__u32 bad_wr;
594
};
595
596
struct ib_uverbs_post_srq_recv {
597
__u64 response;
598
__u32 srq_handle;
599
__u32 wr_count;
600
__u32 sge_count;
601
__u32 wqe_size;
602
struct ib_uverbs_recv_wr recv[0];
603
};
604
605
struct ib_uverbs_post_srq_recv_resp {
606
__u32 bad_wr;
607
};
608
609
struct ib_uverbs_create_ah {
610
__u64 response;
611
__u64 user_handle;
612
__u32 pd_handle;
613
__u32 reserved;
614
struct ib_uverbs_ah_attr attr;
615
};
616
617
struct ib_uverbs_create_ah_resp {
618
__u32 ah_handle;
619
};
620
621
struct ib_uverbs_destroy_ah {
622
__u32 ah_handle;
623
};
624
625
struct ib_uverbs_attach_mcast {
626
__u8 gid[16];
627
__u32 qp_handle;
628
__u16 mlid;
629
__u16 reserved;
630
__u64 driver_data[0];
631
};
632
633
struct ib_uverbs_detach_mcast {
634
__u8 gid[16];
635
__u32 qp_handle;
636
__u16 mlid;
637
__u16 reserved;
638
__u64 driver_data[0];
639
};
640
641
struct ib_uverbs_create_srq {
642
__u64 response;
643
__u64 user_handle;
644
__u32 pd_handle;
645
__u32 max_wr;
646
__u32 max_sge;
647
__u32 srq_limit;
648
__u64 driver_data[0];
649
};
650
651
struct ib_uverbs_create_srq_resp {
652
__u32 srq_handle;
653
__u32 max_wr;
654
__u32 max_sge;
655
__u32 reserved;
656
};
657
658
struct ib_uverbs_modify_srq {
659
__u32 srq_handle;
660
__u32 attr_mask;
661
__u32 max_wr;
662
__u32 srq_limit;
663
__u64 driver_data[0];
664
};
665
666
struct ib_uverbs_query_srq {
667
__u64 response;
668
__u32 srq_handle;
669
__u32 reserved;
670
__u64 driver_data[0];
671
};
672
673
struct ib_uverbs_query_srq_resp {
674
__u32 max_wr;
675
__u32 max_sge;
676
__u32 srq_limit;
677
__u32 reserved;
678
};
679
680
struct ib_uverbs_destroy_srq {
681
__u64 response;
682
__u32 srq_handle;
683
__u32 reserved;
684
};
685
686
struct ib_uverbs_destroy_srq_resp {
687
__u32 events_reported;
688
};
689
690
#endif /* IB_USER_VERBS_H */
691
692