kern-abi.h revision 331769
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 *
6 * This software is available to you under a choice of one of two
7 * licenses.  You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 *     Redistribution and use in source and binary forms, with or
13 *     without modification, are permitted provided that the following
14 *     conditions are met:
15 *
16 *      - Redistributions of source code must retain the above
17 *        copyright notice, this list of conditions and the following
18 *        disclaimer.
19 *
20 *      - Redistributions in binary form must reproduce the above
21 *        copyright notice, this list of conditions and the following
22 *        disclaimer in the documentation and/or other materials
23 *        provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 */
34
35#ifndef KERN_ABI_H
36#define KERN_ABI_H
37
38#include <infiniband/types.h>
39
40/*
41 * This file must be kept in sync with the kernel's version of
42 * drivers/infiniband/include/ib_user_verbs.h
43 */
44
45/*
46 * The minimum and maximum kernel ABI that we can handle.
47 */
48#define IB_USER_VERBS_MIN_ABI_VERSION	3
49#define IB_USER_VERBS_MAX_ABI_VERSION	6
50
51#define IB_USER_VERBS_CMD_THRESHOLD    50
52
53enum {
54	IB_USER_VERBS_CMD_GET_CONTEXT,
55	IB_USER_VERBS_CMD_QUERY_DEVICE,
56	IB_USER_VERBS_CMD_QUERY_PORT,
57	IB_USER_VERBS_CMD_ALLOC_PD,
58	IB_USER_VERBS_CMD_DEALLOC_PD,
59	IB_USER_VERBS_CMD_CREATE_AH,
60	IB_USER_VERBS_CMD_MODIFY_AH,
61	IB_USER_VERBS_CMD_QUERY_AH,
62	IB_USER_VERBS_CMD_DESTROY_AH,
63	IB_USER_VERBS_CMD_REG_MR,
64	IB_USER_VERBS_CMD_REG_SMR,
65	IB_USER_VERBS_CMD_REREG_MR,
66	IB_USER_VERBS_CMD_QUERY_MR,
67	IB_USER_VERBS_CMD_DEREG_MR,
68	IB_USER_VERBS_CMD_ALLOC_MW,
69	IB_USER_VERBS_CMD_BIND_MW,
70	IB_USER_VERBS_CMD_DEALLOC_MW,
71	IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
72	IB_USER_VERBS_CMD_CREATE_CQ,
73	IB_USER_VERBS_CMD_RESIZE_CQ,
74	IB_USER_VERBS_CMD_DESTROY_CQ,
75	IB_USER_VERBS_CMD_POLL_CQ,
76	IB_USER_VERBS_CMD_PEEK_CQ,
77	IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
78	IB_USER_VERBS_CMD_CREATE_QP,
79	IB_USER_VERBS_CMD_QUERY_QP,
80	IB_USER_VERBS_CMD_MODIFY_QP,
81	IB_USER_VERBS_CMD_DESTROY_QP,
82	IB_USER_VERBS_CMD_POST_SEND,
83	IB_USER_VERBS_CMD_POST_RECV,
84	IB_USER_VERBS_CMD_ATTACH_MCAST,
85	IB_USER_VERBS_CMD_DETACH_MCAST,
86	IB_USER_VERBS_CMD_CREATE_SRQ,
87	IB_USER_VERBS_CMD_MODIFY_SRQ,
88	IB_USER_VERBS_CMD_QUERY_SRQ,
89	IB_USER_VERBS_CMD_DESTROY_SRQ,
90	IB_USER_VERBS_CMD_POST_SRQ_RECV,
91	IB_USER_VERBS_CMD_OPEN_XRCD,
92	IB_USER_VERBS_CMD_CLOSE_XRCD,
93	IB_USER_VERBS_CMD_CREATE_XSRQ,
94	IB_USER_VERBS_CMD_OPEN_QP
95};
96
97#define IB_USER_VERBS_CMD_COMMAND_MASK		0xff
98#define IB_USER_VERBS_CMD_FLAGS_MASK		0xff000000u
99#define IB_USER_VERBS_CMD_FLAGS_SHIFT		24
100
101
102#define IB_USER_VERBS_CMD_FLAG_EXTENDED		0x80ul
103
104/* use this mask for creating extended commands */
105#define IB_USER_VERBS_CMD_EXTENDED_MASK \
106	(IB_USER_VERBS_CMD_FLAG_EXTENDED << \
107	 IB_USER_VERBS_CMD_FLAGS_SHIFT)
108
109
110enum {
111	IB_USER_VERBS_CMD_QUERY_DEVICE_EX = IB_USER_VERBS_CMD_EXTENDED_MASK |
112					    IB_USER_VERBS_CMD_QUERY_DEVICE,
113	IB_USER_VERBS_CMD_CREATE_QP_EX = IB_USER_VERBS_CMD_EXTENDED_MASK |
114					 IB_USER_VERBS_CMD_CREATE_QP,
115	IB_USER_VERBS_CMD_CREATE_CQ_EX = IB_USER_VERBS_CMD_EXTENDED_MASK |
116						IB_USER_VERBS_CMD_CREATE_CQ,
117	IB_USER_VERBS_CMD_MODIFY_QP_EX = IB_USER_VERBS_CMD_EXTENDED_MASK |
118						IB_USER_VERBS_CMD_MODIFY_QP,
119	IB_USER_VERBS_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_EXTENDED_MASK +
120					IB_USER_VERBS_CMD_THRESHOLD,
121	IB_USER_VERBS_CMD_DESTROY_FLOW,
122	IB_USER_VERBS_CMD_CREATE_WQ,
123	IB_USER_VERBS_CMD_MODIFY_WQ,
124	IB_USER_VERBS_CMD_DESTROY_WQ,
125	IB_USER_VERBS_CMD_CREATE_RWQ_IND_TBL,
126	IB_USER_VERBS_CMD_DESTROY_RWQ_IND_TBL,
127};
128
129/*
130 * Make sure that all structs defined in this file remain laid out so
131 * that they pack the same way on 32-bit and 64-bit architectures (to
132 * avoid incompatibility between 32-bit userspace and 64-bit kernels).
133 * Specifically:
134 *  - Do not use pointer types -- pass pointers in __u64 instead.
135 *  - Make sure that any structure larger than 4 bytes is padded to a
136 *    multiple of 8 bytes.  Otherwise the structure size will be
137 *    different between 32-bit and 64-bit architectures.
138 */
139
140struct hdr {
141	__u32 command;
142	__u16 in_words;
143	__u16 out_words;
144};
145
146struct response_hdr {
147	__u64 response;
148};
149
150struct ex_hdr {
151	struct {
152		__u32 command;
153		__u16 in_words;
154		__u16 out_words;
155	};
156	struct {
157		__u64 response;
158	};
159	struct {
160		__u16 provider_in_words;
161		__u16 provider_out_words;
162		__u32 reserved;
163	};
164};
165
166struct ibv_kern_async_event {
167	__u64 element;
168	__u32 event_type;
169	__u32 reserved;
170};
171
172struct ibv_comp_event {
173	__u64 cq_handle;
174};
175
176/*
177 * All commands from userspace should start with a __u32 command field
178 * followed by __u16 in_words and out_words fields (which give the
179 * length of the command block and response buffer if any in 32-bit
180 * words).  The kernel driver will read these fields first and read
181 * the rest of the command struct based on these value.
182 */
183
184struct ibv_query_params {
185	__u32 command;
186	__u16 in_words;
187	__u16 out_words;
188	__u64 response;
189};
190
191struct ibv_query_params_resp {
192	__u32 num_cq_events;
193};
194
195struct ibv_get_context {
196	__u32 command;
197	__u16 in_words;
198	__u16 out_words;
199	__u64 response;
200	__u64 driver_data[0];
201};
202
203struct ibv_get_context_resp {
204	__u32 async_fd;
205	__u32 num_comp_vectors;
206};
207
208struct ibv_query_device {
209	__u32 command;
210	__u16 in_words;
211	__u16 out_words;
212	__u64 response;
213	__u64 driver_data[0];
214};
215
216struct ibv_query_device_resp {
217	__u64 fw_ver;
218	__be64 node_guid;
219	__be64 sys_image_guid;
220	__u64 max_mr_size;
221	__u64 page_size_cap;
222	__u32 vendor_id;
223	__u32 vendor_part_id;
224	__u32 hw_ver;
225	__u32 max_qp;
226	__u32 max_qp_wr;
227	__u32 device_cap_flags;
228	__u32 max_sge;
229	__u32 max_sge_rd;
230	__u32 max_cq;
231	__u32 max_cqe;
232	__u32 max_mr;
233	__u32 max_pd;
234	__u32 max_qp_rd_atom;
235	__u32 max_ee_rd_atom;
236	__u32 max_res_rd_atom;
237	__u32 max_qp_init_rd_atom;
238	__u32 max_ee_init_rd_atom;
239	__u32 atomic_cap;
240	__u32 max_ee;
241	__u32 max_rdd;
242	__u32 max_mw;
243	__u32 max_raw_ipv6_qp;
244	__u32 max_raw_ethy_qp;
245	__u32 max_mcast_grp;
246	__u32 max_mcast_qp_attach;
247	__u32 max_total_mcast_qp_attach;
248	__u32 max_ah;
249	__u32 max_fmr;
250	__u32 max_map_per_fmr;
251	__u32 max_srq;
252	__u32 max_srq_wr;
253	__u32 max_srq_sge;
254	__u16 max_pkeys;
255	__u8  local_ca_ack_delay;
256	__u8  phys_port_cnt;
257	__u8  reserved[4];
258};
259
260struct ibv_query_device_ex {
261	struct ex_hdr	hdr;
262	__u32		comp_mask;
263	__u32		reserved;
264};
265
266struct ibv_odp_caps_resp {
267	__u64 general_caps;
268	struct {
269		__u32 rc_odp_caps;
270		__u32 uc_odp_caps;
271		__u32 ud_odp_caps;
272	} per_transport_caps;
273	__u32 reserved;
274};
275
276struct ibv_rss_caps_resp {
277	__u32 supported_qpts;
278	__u32 max_rwq_indirection_tables;
279	__u32 max_rwq_indirection_table_size;
280	__u32 reserved;
281};
282
283struct ibv_query_device_resp_ex {
284	struct ibv_query_device_resp base;
285	__u32 comp_mask;
286	__u32 response_length;
287	struct ibv_odp_caps_resp odp_caps;
288	__u64 timestamp_mask;
289	__u64 hca_core_clock;
290	__u64 device_cap_flags_ex;
291	struct ibv_rss_caps_resp rss_caps;
292	__u32  max_wq_type_rq;
293	__u32 raw_packet_caps;
294};
295
296struct ibv_query_port {
297	__u32 command;
298	__u16 in_words;
299	__u16 out_words;
300	__u64 response;
301	__u8  port_num;
302	__u8  reserved[7];
303	__u64 driver_data[0];
304};
305
306struct ibv_query_port_resp {
307	__u32 port_cap_flags;
308	__u32 max_msg_sz;
309	__u32 bad_pkey_cntr;
310	__u32 qkey_viol_cntr;
311	__u32 gid_tbl_len;
312	__u16 pkey_tbl_len;
313	__u16 lid;
314	__u16 sm_lid;
315	__u8  state;
316	__u8  max_mtu;
317	__u8  active_mtu;
318	__u8  lmc;
319	__u8  max_vl_num;
320	__u8  sm_sl;
321	__u8  subnet_timeout;
322	__u8  init_type_reply;
323	__u8  active_width;
324	__u8  active_speed;
325	__u8  phys_state;
326	__u8  link_layer;
327	__u8  reserved[2];
328};
329
330struct ibv_alloc_pd {
331	__u32 command;
332	__u16 in_words;
333	__u16 out_words;
334	__u64 response;
335	__u64 driver_data[0];
336};
337
338struct ibv_alloc_pd_resp {
339	__u32 pd_handle;
340};
341
342struct ibv_dealloc_pd {
343	__u32 command;
344	__u16 in_words;
345	__u16 out_words;
346	__u32 pd_handle;
347};
348
349struct ibv_open_xrcd {
350	__u32 command;
351	__u16 in_words;
352	__u16 out_words;
353	__u64 response;
354	__u32 fd;
355	__u32 oflags;
356	__u64 driver_data[0];
357};
358
359struct ibv_open_xrcd_resp {
360	__u32 xrcd_handle;
361};
362
363struct ibv_close_xrcd {
364	__u32 command;
365	__u16 in_words;
366	__u16 out_words;
367	__u32 xrcd_handle;
368};
369
370struct ibv_reg_mr {
371	__u32 command;
372	__u16 in_words;
373	__u16 out_words;
374	__u64 response;
375	__u64 start;
376	__u64 length;
377	__u64 hca_va;
378	__u32 pd_handle;
379	__u32 access_flags;
380	__u64 driver_data[0];
381};
382
383struct ibv_reg_mr_resp {
384	__u32 mr_handle;
385	__u32 lkey;
386	__u32 rkey;
387};
388
389struct ibv_rereg_mr {
390	__u32 command;
391	__u16 in_words;
392	__u16 out_words;
393	__u64 response;
394	__u32 mr_handle;
395	__u32 flags;
396	__u64 start;
397	__u64 length;
398	__u64 hca_va;
399	__u32 pd_handle;
400	__u32 access_flags;
401	__u64 driver_data[0];
402};
403
404struct ibv_rereg_mr_resp {
405	__u32 lkey;
406	__u32 rkey;
407};
408
409struct ibv_dereg_mr {
410	__u32 command;
411	__u16 in_words;
412	__u16 out_words;
413	__u32 mr_handle;
414};
415
416struct ibv_alloc_mw {
417	__u32 command;
418	__u16 in_words;
419	__u16 out_words;
420	__u64 response;
421	__u32 pd_handle;
422	__u8  mw_type;
423	__u8  reserved[3];
424};
425
426struct ibv_alloc_mw_resp {
427	__u32 mw_handle;
428	__u32 rkey;
429};
430
431struct ibv_dealloc_mw {
432	__u32 command;
433	__u16 in_words;
434	__u16 out_words;
435	__u32 mw_handle;
436	__u32 reserved;
437};
438
439struct ibv_create_comp_channel {
440	__u32 command;
441	__u16 in_words;
442	__u16 out_words;
443	__u64 response;
444};
445
446struct ibv_create_comp_channel_resp {
447	__u32 fd;
448};
449
450struct ibv_create_cq {
451	__u32 command;
452	__u16 in_words;
453	__u16 out_words;
454	__u64 response;
455	__u64 user_handle;
456	__u32 cqe;
457	__u32 comp_vector;
458	__s32 comp_channel;
459	__u32 reserved;
460	__u64 driver_data[0];
461};
462
463struct ibv_create_cq_resp {
464	__u32 cq_handle;
465	__u32 cqe;
466};
467
468enum ibv_create_cq_ex_kernel_flags {
469	IBV_CREATE_CQ_EX_KERNEL_FLAG_COMPLETION_TIMESTAMP = 1 << 0,
470};
471
472struct ibv_create_cq_ex {
473	struct ex_hdr	hdr;
474	__u64		user_handle;
475	__u32		cqe;
476	__u32		comp_vector;
477	__s32		comp_channel;
478	__u32		comp_mask;
479	__u32		flags;
480	__u32		reserved;
481};
482
483struct ibv_create_cq_resp_ex {
484	struct ibv_create_cq_resp	base;
485	__u32				comp_mask;
486	__u32				response_length;
487};
488
489struct ibv_kern_wc {
490	__u64  wr_id;
491	__u32  status;
492	__u32  opcode;
493	__u32  vendor_err;
494	__u32  byte_len;
495	__be32  imm_data;
496	__u32  qp_num;
497	__u32  src_qp;
498	__u32  wc_flags;
499	__u16  pkey_index;
500	__u16  slid;
501	__u8   sl;
502	__u8   dlid_path_bits;
503	__u8   port_num;
504	__u8   reserved;
505};
506
507struct ibv_poll_cq {
508	__u32 command;
509	__u16 in_words;
510	__u16 out_words;
511	__u64 response;
512	__u32 cq_handle;
513	__u32 ne;
514};
515
516struct ibv_poll_cq_resp {
517	__u32 count;
518	__u32 reserved;
519	struct ibv_kern_wc wc[0];
520};
521
522struct ibv_req_notify_cq {
523	__u32 command;
524	__u16 in_words;
525	__u16 out_words;
526	__u32 cq_handle;
527	__u32 solicited;
528};
529
530struct ibv_resize_cq {
531	__u32 command;
532	__u16 in_words;
533	__u16 out_words;
534	__u64 response;
535	__u32 cq_handle;
536	__u32 cqe;
537	__u64 driver_data[0];
538};
539
540struct ibv_resize_cq_resp {
541	__u32 cqe;
542	__u32 reserved;
543	__u64 driver_data[0];
544};
545
546struct ibv_destroy_cq {
547	__u32 command;
548	__u16 in_words;
549	__u16 out_words;
550	__u64 response;
551	__u32 cq_handle;
552	__u32 reserved;
553};
554
555struct ibv_destroy_cq_resp {
556	__u32 comp_events_reported;
557	__u32 async_events_reported;
558};
559
560struct ibv_kern_global_route {
561	__u8  dgid[16];
562	__u32 flow_label;
563	__u8  sgid_index;
564	__u8  hop_limit;
565	__u8  traffic_class;
566	__u8  reserved;
567};
568
569struct ibv_kern_ah_attr {
570	struct ibv_kern_global_route grh;
571	__u16 dlid;
572	__u8  sl;
573	__u8  src_path_bits;
574	__u8  static_rate;
575	__u8  is_global;
576	__u8  port_num;
577	__u8  reserved;
578};
579
580struct ibv_kern_qp_attr {
581	__u32	qp_attr_mask;
582	__u32	qp_state;
583	__u32	cur_qp_state;
584	__u32	path_mtu;
585	__u32	path_mig_state;
586	__u32	qkey;
587	__u32	rq_psn;
588	__u32	sq_psn;
589	__u32	dest_qp_num;
590	__u32	qp_access_flags;
591
592	struct ibv_kern_ah_attr ah_attr;
593	struct ibv_kern_ah_attr alt_ah_attr;
594
595	/* ib_qp_cap */
596	__u32	max_send_wr;
597	__u32	max_recv_wr;
598	__u32	max_send_sge;
599	__u32	max_recv_sge;
600	__u32	max_inline_data;
601
602	__u16	pkey_index;
603	__u16	alt_pkey_index;
604	__u8	en_sqd_async_notify;
605	__u8	sq_draining;
606	__u8	max_rd_atomic;
607	__u8	max_dest_rd_atomic;
608	__u8	min_rnr_timer;
609	__u8	port_num;
610	__u8	timeout;
611	__u8	retry_cnt;
612	__u8	rnr_retry;
613	__u8	alt_port_num;
614	__u8	alt_timeout;
615	__u8	reserved[5];
616};
617
618#define IBV_CREATE_QP_COMMON	\
619	__u64 user_handle;	\
620	__u32 pd_handle;	\
621	__u32 send_cq_handle;	\
622	__u32 recv_cq_handle;	\
623	__u32 srq_handle;	\
624	__u32 max_send_wr;	\
625	__u32 max_recv_wr;	\
626	__u32 max_send_sge;	\
627	__u32 max_recv_sge;	\
628	__u32 max_inline_data;	\
629	__u8  sq_sig_all;	\
630	__u8  qp_type;		\
631	__u8  is_srq;		\
632	__u8  reserved
633
634struct ibv_create_qp {
635	__u32 command;
636	__u16 in_words;
637	__u16 out_words;
638	__u64 response;
639	IBV_CREATE_QP_COMMON;
640	__u64 driver_data[0];
641};
642
643struct ibv_create_qp_common {
644	IBV_CREATE_QP_COMMON;
645};
646
647struct ibv_open_qp {
648	__u32 command;
649	__u16 in_words;
650	__u16 out_words;
651	__u64 response;
652	__u64 user_handle;
653	__u32 pd_handle;
654	__u32 qpn;
655	__u8  qp_type;
656	__u8  reserved[7];
657	__u64 driver_data[0];
658};
659
660/* also used for open response */
661struct ibv_create_qp_resp {
662	__u32 qp_handle;
663	__u32 qpn;
664	__u32 max_send_wr;
665	__u32 max_recv_wr;
666	__u32 max_send_sge;
667	__u32 max_recv_sge;
668	__u32 max_inline_data;
669	__u32 reserved;
670};
671
672enum ibv_create_qp_ex_kernel_mask {
673	IBV_CREATE_QP_EX_KERNEL_MASK_IND_TABLE = 1 << 0,
674};
675
676struct ibv_create_qp_ex {
677	struct ex_hdr	hdr;
678	struct ibv_create_qp_common base;
679	__u32 comp_mask;
680	__u32 create_flags;
681	__u32 ind_tbl_handle;
682	__u32 reserved1;
683};
684
685struct ibv_create_qp_resp_ex {
686	struct ibv_create_qp_resp base;
687	__u32 comp_mask;
688	__u32 response_length;
689};
690
691struct ibv_qp_dest {
692	__u8  dgid[16];
693	__u32 flow_label;
694	__u16 dlid;
695	__u16 reserved;
696	__u8  sgid_index;
697	__u8  hop_limit;
698	__u8  traffic_class;
699	__u8  sl;
700	__u8  src_path_bits;
701	__u8  static_rate;
702	__u8  is_global;
703	__u8  port_num;
704};
705
706struct ibv_query_qp {
707	__u32 command;
708	__u16 in_words;
709	__u16 out_words;
710	__u64 response;
711	__u32 qp_handle;
712	__u32 attr_mask;
713	__u64 driver_data[0];
714};
715
716struct ibv_query_qp_resp {
717	struct ibv_qp_dest dest;
718	struct ibv_qp_dest alt_dest;
719	__u32 max_send_wr;
720	__u32 max_recv_wr;
721	__u32 max_send_sge;
722	__u32 max_recv_sge;
723	__u32 max_inline_data;
724	__u32 qkey;
725	__u32 rq_psn;
726	__u32 sq_psn;
727	__u32 dest_qp_num;
728	__u32 qp_access_flags;
729	__u16 pkey_index;
730	__u16 alt_pkey_index;
731	__u8  qp_state;
732	__u8  cur_qp_state;
733	__u8  path_mtu;
734	__u8  path_mig_state;
735	__u8  sq_draining;
736	__u8  max_rd_atomic;
737	__u8  max_dest_rd_atomic;
738	__u8  min_rnr_timer;
739	__u8  port_num;
740	__u8  timeout;
741	__u8  retry_cnt;
742	__u8  rnr_retry;
743	__u8  alt_port_num;
744	__u8  alt_timeout;
745	__u8  sq_sig_all;
746	__u8  reserved[5];
747	__u64 driver_data[0];
748};
749
750struct ibv_modify_qp_common {
751	struct ibv_qp_dest dest;
752	struct ibv_qp_dest alt_dest;
753	__u32 qp_handle;
754	__u32 attr_mask;
755	__u32 qkey;
756	__u32 rq_psn;
757	__u32 sq_psn;
758	__u32 dest_qp_num;
759	__u32 qp_access_flags;
760	__u16 pkey_index;
761	__u16 alt_pkey_index;
762	__u8  qp_state;
763	__u8  cur_qp_state;
764	__u8  path_mtu;
765	__u8  path_mig_state;
766	__u8  en_sqd_async_notify;
767	__u8  max_rd_atomic;
768	__u8  max_dest_rd_atomic;
769	__u8  min_rnr_timer;
770	__u8  port_num;
771	__u8  timeout;
772	__u8  retry_cnt;
773	__u8  rnr_retry;
774	__u8  alt_port_num;
775	__u8  alt_timeout;
776	__u8  reserved[2];
777};
778
779struct ibv_modify_qp {
780	__u32 command;
781	__u16 in_words;
782	__u16 out_words;
783	struct ibv_modify_qp_common base;
784	__u64 driver_data[0];
785};
786
787struct ibv_modify_qp_ex {
788	struct ex_hdr		    hdr;
789	struct ibv_modify_qp_common base;
790	__u32  rate_limit;
791	__u32  reserved;
792};
793
794struct ibv_modify_qp_resp_ex {
795	__u32  comp_mask;
796	__u32  response_length;
797};
798
799struct ibv_destroy_qp {
800	__u32 command;
801	__u16 in_words;
802	__u16 out_words;
803	__u64 response;
804	__u32 qp_handle;
805	__u32 reserved;
806};
807
808struct ibv_destroy_qp_resp {
809	__u32 events_reported;
810};
811
812struct ibv_kern_send_wr {
813	__u64 wr_id;
814	__u32 num_sge;
815	__u32 opcode;
816	__u32 send_flags;
817	__be32 imm_data;
818	union {
819		struct {
820			__u64 remote_addr;
821			__u32 rkey;
822			__u32 reserved;
823		} rdma;
824		struct {
825			__u64 remote_addr;
826			__u64 compare_add;
827			__u64 swap;
828			__u32 rkey;
829			__u32 reserved;
830		} atomic;
831		struct {
832			__u32 ah;
833			__u32 remote_qpn;
834			__u32 remote_qkey;
835			__u32 reserved;
836		} ud;
837	} wr;
838	union {
839		struct {
840			__u32 remote_srqn;
841		} xrc;
842	} qp_type;
843};
844
845struct ibv_kern_eth_filter {
846	__u8  dst_mac[6];
847	__u8  src_mac[6];
848	__u16  ether_type;
849	__u16  vlan_tag;
850};
851
852struct ibv_kern_spec_eth {
853	__u32 type;
854	__u16  size;
855	__u16 reserved;
856	struct ibv_kern_eth_filter val;
857	struct ibv_kern_eth_filter mask;
858};
859
860struct ibv_kern_ipv4_filter {
861	__u32 src_ip;
862	__u32 dst_ip;
863};
864
865struct ibv_kern_spec_ipv4 {
866	__u32  type;
867	__u16  size;
868	__u16 reserved;
869	struct ibv_kern_ipv4_filter val;
870	struct ibv_kern_ipv4_filter mask;
871};
872
873struct ibv_kern_ipv4_ext_filter {
874	__u32 src_ip;
875	__u32 dst_ip;
876	__u8  proto;
877	__u8  tos;
878	__u8  ttl;
879	__u8  flags;
880};
881
882struct ibv_kern_spec_ipv4_ext {
883	__u32  type;
884	__u16  size;
885	__u16 reserved;
886	struct ibv_kern_ipv4_ext_filter val;
887	struct ibv_kern_ipv4_ext_filter mask;
888};
889
890struct ibv_kern_ipv6_filter {
891	__u8  src_ip[16];
892	__u8  dst_ip[16];
893	__u32 flow_label;
894	__u8  next_hdr;
895	__u8  traffic_class;
896	__u8  hop_limit;
897	__u8  reserved;
898};
899
900struct ibv_kern_spec_ipv6 {
901	__u32  type;
902	__u16  size;
903	__u16 reserved;
904	struct ibv_kern_ipv6_filter val;
905	struct ibv_kern_ipv6_filter mask;
906};
907
908struct ibv_kern_tcp_udp_filter {
909	__u16 dst_port;
910	__u16 src_port;
911};
912
913struct ibv_kern_spec_tcp_udp {
914	__u32  type;
915	__u16  size;
916	__u16 reserved;
917	struct ibv_kern_tcp_udp_filter val;
918	struct ibv_kern_tcp_udp_filter mask;
919};
920
921struct ibv_kern_spec_action_tag {
922	__u32  type;
923	__u16  size;
924	__u16 reserved;
925	__u32 tag_id;
926	__u32 reserved1;
927};
928
929struct ibv_kern_tunnel_filter {
930	__u32 tunnel_id;
931};
932
933struct ibv_kern_spec_tunnel {
934	__u32  type;
935	__u16  size;
936	__u16 reserved;
937	struct ibv_kern_tunnel_filter val;
938	struct ibv_kern_tunnel_filter mask;
939};
940
941struct ibv_kern_spec_action_drop {
942	__u32  type;
943	__u16  size;
944	__u16 reserved;
945};
946
947struct ibv_kern_spec {
948	union {
949		struct {
950			__u32 type;
951			__u16 size;
952			__u16 reserved;
953		} hdr;
954		struct ibv_kern_spec_eth eth;
955		struct ibv_kern_spec_ipv4 ipv4;
956		struct ibv_kern_spec_ipv4_ext ipv4_ext;
957		struct ibv_kern_spec_tcp_udp tcp_udp;
958		struct ibv_kern_spec_ipv6 ipv6;
959		struct ibv_kern_spec_tunnel tunnel;
960		struct ibv_kern_spec_action_tag flow_tag;
961		struct ibv_kern_spec_action_drop drop;
962	};
963};
964
965struct ibv_kern_flow_attr {
966	__u32 type;
967	__u16 size;
968	__u16 priority;
969	__u8 num_of_specs;
970	__u8 reserved[2];
971	__u8 port;
972	__u32 flags;
973	/* Following are the optional layers according to user request
974	 * struct ibv_kern_flow_spec_xxx
975	 * struct ibv_kern_flow_spec_yyy
976	 */
977};
978
979struct ibv_post_send {
980	__u32 command;
981	__u16 in_words;
982	__u16 out_words;
983	__u64 response;
984	__u32 qp_handle;
985	__u32 wr_count;
986	__u32 sge_count;
987	__u32 wqe_size;
988	struct ibv_kern_send_wr send_wr[0];
989};
990
991struct ibv_post_send_resp {
992	__u32 bad_wr;
993};
994
995struct ibv_kern_recv_wr {
996	__u64 wr_id;
997	__u32 num_sge;
998	__u32 reserved;
999};
1000
1001struct ibv_post_recv {
1002	__u32 command;
1003	__u16 in_words;
1004	__u16 out_words;
1005	__u64 response;
1006	__u32 qp_handle;
1007	__u32 wr_count;
1008	__u32 sge_count;
1009	__u32 wqe_size;
1010	struct ibv_kern_recv_wr recv_wr[0];
1011};
1012
1013struct ibv_post_recv_resp {
1014	__u32 bad_wr;
1015};
1016
1017struct ibv_post_srq_recv {
1018	__u32 command;
1019	__u16 in_words;
1020	__u16 out_words;
1021	__u64 response;
1022	__u32 srq_handle;
1023	__u32 wr_count;
1024	__u32 sge_count;
1025	__u32 wqe_size;
1026	struct ibv_kern_recv_wr recv_wr[0];
1027};
1028
1029struct ibv_post_srq_recv_resp {
1030	__u32 bad_wr;
1031};
1032
1033struct ibv_create_ah {
1034	__u32 command;
1035	__u16 in_words;
1036	__u16 out_words;
1037	__u64 response;
1038	__u64 user_handle;
1039	__u32 pd_handle;
1040	__u32 reserved;
1041	struct ibv_kern_ah_attr attr;
1042};
1043
1044struct ibv_create_ah_resp {
1045	__u32 handle;
1046};
1047
1048struct ibv_destroy_ah {
1049	__u32 command;
1050	__u16 in_words;
1051	__u16 out_words;
1052	__u32 ah_handle;
1053};
1054
1055struct ibv_attach_mcast {
1056	__u32 command;
1057	__u16 in_words;
1058	__u16 out_words;
1059	__u8  gid[16];
1060	__u32 qp_handle;
1061	__u16 mlid;
1062	__u16 reserved;
1063	__u64 driver_data[0];
1064};
1065
1066struct ibv_create_flow  {
1067	struct ex_hdr hdr;
1068	__u32 comp_mask;
1069	__u32 qp_handle;
1070	struct ibv_kern_flow_attr flow_attr;
1071};
1072
1073struct ibv_create_flow_resp {
1074	__u32 comp_mask;
1075	__u32 flow_handle;
1076};
1077
1078struct ibv_destroy_flow  {
1079	struct ex_hdr hdr;
1080	__u32 comp_mask;
1081	__u32 flow_handle;
1082};
1083
1084struct ibv_detach_mcast {
1085	__u32 command;
1086	__u16 in_words;
1087	__u16 out_words;
1088	__u8  gid[16];
1089	__u32 qp_handle;
1090	__u16 mlid;
1091	__u16 reserved;
1092	__u64 driver_data[0];
1093};
1094
1095struct ibv_create_srq {
1096	__u32 command;
1097	__u16 in_words;
1098	__u16 out_words;
1099	__u64 response;
1100	__u64 user_handle;
1101	__u32 pd_handle;
1102	__u32 max_wr;
1103	__u32 max_sge;
1104	__u32 srq_limit;
1105	__u64 driver_data[0];
1106};
1107
1108struct ibv_create_xsrq {
1109	__u32 command;
1110	__u16 in_words;
1111	__u16 out_words;
1112	__u64 response;
1113	__u64 user_handle;
1114	__u32 srq_type;
1115	__u32 pd_handle;
1116	__u32 max_wr;
1117	__u32 max_sge;
1118	__u32 srq_limit;
1119	__u32 reserved;
1120	__u32 xrcd_handle;
1121	__u32 cq_handle;
1122	__u64 driver_data[0];
1123};
1124
1125struct ibv_create_srq_resp {
1126	__u32 srq_handle;
1127	__u32 max_wr;
1128	__u32 max_sge;
1129	__u32 srqn;
1130};
1131
1132struct ibv_modify_srq {
1133	__u32 command;
1134	__u16 in_words;
1135	__u16 out_words;
1136	__u32 srq_handle;
1137	__u32 attr_mask;
1138	__u32 max_wr;
1139	__u32 srq_limit;
1140	__u64 driver_data[0];
1141};
1142
1143struct ibv_query_srq {
1144	__u32 command;
1145	__u16 in_words;
1146	__u16 out_words;
1147	__u64 response;
1148	__u32 srq_handle;
1149	__u32 reserved;
1150	__u64 driver_data[0];
1151};
1152
1153struct ibv_query_srq_resp {
1154	__u32 max_wr;
1155	__u32 max_sge;
1156	__u32 srq_limit;
1157	__u32 reserved;
1158};
1159
1160struct ibv_destroy_srq {
1161	__u32 command;
1162	__u16 in_words;
1163	__u16 out_words;
1164	__u64 response;
1165	__u32 srq_handle;
1166	__u32 reserved;
1167};
1168
1169struct ibv_destroy_srq_resp {
1170	__u32 events_reported;
1171};
1172
1173/*
1174 * Compatibility with older ABI versions
1175 */
1176
1177enum {
1178	IB_USER_VERBS_CMD_QUERY_PARAMS_V2,
1179	IB_USER_VERBS_CMD_GET_CONTEXT_V2,
1180	IB_USER_VERBS_CMD_QUERY_DEVICE_V2,
1181	IB_USER_VERBS_CMD_QUERY_PORT_V2,
1182	IB_USER_VERBS_CMD_QUERY_GID_V2,
1183	IB_USER_VERBS_CMD_QUERY_PKEY_V2,
1184	IB_USER_VERBS_CMD_ALLOC_PD_V2,
1185	IB_USER_VERBS_CMD_DEALLOC_PD_V2,
1186	IB_USER_VERBS_CMD_CREATE_AH_V2,
1187	IB_USER_VERBS_CMD_MODIFY_AH_V2,
1188	IB_USER_VERBS_CMD_QUERY_AH_V2,
1189	IB_USER_VERBS_CMD_DESTROY_AH_V2,
1190	IB_USER_VERBS_CMD_REG_MR_V2,
1191	IB_USER_VERBS_CMD_REG_SMR_V2,
1192	IB_USER_VERBS_CMD_REREG_MR_V2,
1193	IB_USER_VERBS_CMD_QUERY_MR_V2,
1194	IB_USER_VERBS_CMD_DEREG_MR_V2,
1195	IB_USER_VERBS_CMD_ALLOC_MW_V2,
1196	IB_USER_VERBS_CMD_BIND_MW_V2,
1197	IB_USER_VERBS_CMD_DEALLOC_MW_V2,
1198	IB_USER_VERBS_CMD_CREATE_CQ_V2,
1199	IB_USER_VERBS_CMD_RESIZE_CQ_V2,
1200	IB_USER_VERBS_CMD_DESTROY_CQ_V2,
1201	IB_USER_VERBS_CMD_POLL_CQ_V2,
1202	IB_USER_VERBS_CMD_PEEK_CQ_V2,
1203	IB_USER_VERBS_CMD_REQ_NOTIFY_CQ_V2,
1204	IB_USER_VERBS_CMD_CREATE_QP_V2,
1205	IB_USER_VERBS_CMD_QUERY_QP_V2,
1206	IB_USER_VERBS_CMD_MODIFY_QP_V2,
1207	IB_USER_VERBS_CMD_DESTROY_QP_V2,
1208	IB_USER_VERBS_CMD_POST_SEND_V2,
1209	IB_USER_VERBS_CMD_POST_RECV_V2,
1210	IB_USER_VERBS_CMD_ATTACH_MCAST_V2,
1211	IB_USER_VERBS_CMD_DETACH_MCAST_V2,
1212	IB_USER_VERBS_CMD_CREATE_SRQ_V2,
1213	IB_USER_VERBS_CMD_MODIFY_SRQ_V2,
1214	IB_USER_VERBS_CMD_QUERY_SRQ_V2,
1215	IB_USER_VERBS_CMD_DESTROY_SRQ_V2,
1216	IB_USER_VERBS_CMD_POST_SRQ_RECV_V2,
1217	/*
1218	 * Set commands that didn't exist to -1 so our compile-time
1219	 * trick opcodes in IBV_INIT_CMD() doesn't break.
1220	 */
1221	IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL_V2 = -1,
1222	IB_USER_VERBS_CMD_OPEN_XRCD_V2 = -1,
1223	IB_USER_VERBS_CMD_CLOSE_XRCD_V2 = -1,
1224	IB_USER_VERBS_CMD_CREATE_XSRQ_V2 = -1,
1225	IB_USER_VERBS_CMD_OPEN_QP_V2 = -1,
1226	IB_USER_VERBS_CMD_CREATE_FLOW_V2 = -1,
1227	IB_USER_VERBS_CMD_DESTROY_FLOW_V2 = -1,
1228	IB_USER_VERBS_CMD_QUERY_DEVICE_EX_V2 = -1,
1229	IB_USER_VERBS_CMD_CREATE_QP_EX_V2 = -1,
1230	IB_USER_VERBS_CMD_CREATE_CQ_EX_V2 = -1,
1231	IB_USER_VERBS_CMD_CREATE_WQ_V2 = -1,
1232	IB_USER_VERBS_CMD_MODIFY_WQ_V2 = -1,
1233	IB_USER_VERBS_CMD_DESTROY_WQ_V2 = -1,
1234	IB_USER_VERBS_CMD_CREATE_RWQ_IND_TBL_V2 = -1,
1235	IB_USER_VERBS_CMD_DESTROY_RWQ_IND_TBL_V2 = -1,
1236	IB_USER_VERBS_CMD_MODIFY_QP_EX_V2 = -1,
1237};
1238
1239struct ibv_modify_srq_v3 {
1240	__u32 command;
1241	__u16 in_words;
1242	__u16 out_words;
1243	__u32 srq_handle;
1244	__u32 attr_mask;
1245	__u32 max_wr;
1246	__u32 max_sge;
1247	__u32 srq_limit;
1248	__u32 reserved;
1249	__u64 driver_data[0];
1250};
1251
1252struct ibv_create_qp_resp_v3 {
1253	__u32 qp_handle;
1254	__u32 qpn;
1255};
1256
1257struct ibv_create_qp_resp_v4 {
1258	__u32 qp_handle;
1259	__u32 qpn;
1260	__u32 max_send_wr;
1261	__u32 max_recv_wr;
1262	__u32 max_send_sge;
1263	__u32 max_recv_sge;
1264	__u32 max_inline_data;
1265};
1266
1267struct ibv_create_srq_resp_v5 {
1268	__u32 srq_handle;
1269};
1270
1271struct ibv_create_wq {
1272	struct ex_hdr hdr;
1273	__u32 comp_mask;
1274	__u32 wq_type;
1275	__u64 user_handle;
1276	__u32 pd_handle;
1277	__u32 cq_handle;
1278	__u32 max_wr;
1279	__u32 max_sge;
1280	__u32 create_flags;
1281	__u32 reserved;
1282};
1283
1284struct ibv_create_wq_resp {
1285	__u32 comp_mask;
1286	__u32 response_length;
1287	__u32 wq_handle;
1288	__u32 max_wr;
1289	__u32 max_sge;
1290	__u32 wqn;
1291};
1292
1293struct ibv_destroy_wq {
1294	struct ex_hdr hdr;
1295	__u32 comp_mask;
1296	__u32 wq_handle;
1297};
1298
1299struct ibv_destroy_wq_resp {
1300	__u32 comp_mask;
1301	__u32 response_length;
1302	__u32 events_reported;
1303	__u32 reserved;
1304};
1305
1306struct ibv_modify_wq  {
1307	struct ex_hdr hdr;
1308	__u32 attr_mask;
1309	__u32 wq_handle;
1310	__u32 wq_state;
1311	__u32 curr_wq_state;
1312	__u32 flags;
1313	__u32 flags_mask;
1314};
1315
1316struct ibv_create_rwq_ind_table {
1317	struct ex_hdr hdr;
1318	__u32 comp_mask;
1319	__u32 log_ind_tbl_size;
1320	/* Following are wq handles based on log_ind_tbl_size, must be 64 bytes aligned.
1321	 * __u32 wq_handle1
1322	 * __u32 wq_handle2
1323	 */
1324};
1325
1326struct ibv_create_rwq_ind_table_resp {
1327	__u32 comp_mask;
1328	__u32 response_length;
1329	__u32 ind_tbl_handle;
1330	__u32 ind_tbl_num;
1331};
1332
1333struct ibv_destroy_rwq_ind_table {
1334	struct ex_hdr hdr;
1335	__u32 comp_mask;
1336	__u32 ind_tbl_handle;
1337};
1338
1339#endif /* KERN_ABI_H */
1340