1/*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3 *
4 * Copyright (c) 2005 Topspin Communications.  All rights reserved.
5 * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved.
6 * Copyright (c) 2005 PathScale, Inc.  All rights reserved.
7 * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.
8 *
9 * This software is available to you under a choice of one of two
10 * licenses.  You may choose to be licensed under the terms of the GNU
11 * General Public License (GPL) Version 2, available from the file
12 * COPYING in the main directory of this source tree, or the
13 * OpenIB.org BSD license below:
14 *
15 *     Redistribution and use in source and binary forms, with or
16 *     without modification, are permitted provided that the following
17 *     conditions are met:
18 *
19 *      - Redistributions of source code must retain the above
20 *        copyright notice, this list of conditions and the following
21 *        disclaimer.
22 *
23 *      - Redistributions in binary form must reproduce the above
24 *        copyright notice, this list of conditions and the following
25 *        disclaimer in the documentation and/or other materials
26 *        provided with the distribution.
27 *
28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
32 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
33 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 * SOFTWARE.
36 */
37
38#ifndef IB_USER_VERBS_H
39#define IB_USER_VERBS_H
40
41#ifdef _KERNEL
42#include <linux/types.h>
43#else
44#include <infiniband/types.h>
45#endif
46
47/*
48 * Increment this value if any changes that break userspace ABI
49 * compatibility are made.
50 */
51#define IB_USER_VERBS_ABI_VERSION	6
52#define IB_USER_VERBS_CMD_THRESHOLD    50
53
54enum ib_uverbs_write_cmds {
55	IB_USER_VERBS_CMD_GET_CONTEXT,
56	IB_USER_VERBS_CMD_QUERY_DEVICE,
57	IB_USER_VERBS_CMD_QUERY_PORT,
58	IB_USER_VERBS_CMD_ALLOC_PD,
59	IB_USER_VERBS_CMD_DEALLOC_PD,
60	IB_USER_VERBS_CMD_CREATE_AH,
61	IB_USER_VERBS_CMD_MODIFY_AH,
62	IB_USER_VERBS_CMD_QUERY_AH,
63	IB_USER_VERBS_CMD_DESTROY_AH,
64	IB_USER_VERBS_CMD_REG_MR,
65	IB_USER_VERBS_CMD_REG_SMR,
66	IB_USER_VERBS_CMD_REREG_MR,
67	IB_USER_VERBS_CMD_QUERY_MR,
68	IB_USER_VERBS_CMD_DEREG_MR,
69	IB_USER_VERBS_CMD_ALLOC_MW,
70	IB_USER_VERBS_CMD_BIND_MW,
71	IB_USER_VERBS_CMD_DEALLOC_MW,
72	IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
73	IB_USER_VERBS_CMD_CREATE_CQ,
74	IB_USER_VERBS_CMD_RESIZE_CQ,
75	IB_USER_VERBS_CMD_DESTROY_CQ,
76	IB_USER_VERBS_CMD_POLL_CQ,
77	IB_USER_VERBS_CMD_PEEK_CQ,
78	IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
79	IB_USER_VERBS_CMD_CREATE_QP,
80	IB_USER_VERBS_CMD_QUERY_QP,
81	IB_USER_VERBS_CMD_MODIFY_QP,
82	IB_USER_VERBS_CMD_DESTROY_QP,
83	IB_USER_VERBS_CMD_POST_SEND,
84	IB_USER_VERBS_CMD_POST_RECV,
85	IB_USER_VERBS_CMD_ATTACH_MCAST,
86	IB_USER_VERBS_CMD_DETACH_MCAST,
87	IB_USER_VERBS_CMD_CREATE_SRQ,
88	IB_USER_VERBS_CMD_MODIFY_SRQ,
89	IB_USER_VERBS_CMD_QUERY_SRQ,
90	IB_USER_VERBS_CMD_DESTROY_SRQ,
91	IB_USER_VERBS_CMD_POST_SRQ_RECV,
92	IB_USER_VERBS_CMD_OPEN_XRCD,
93	IB_USER_VERBS_CMD_CLOSE_XRCD,
94	IB_USER_VERBS_CMD_CREATE_XSRQ,
95	IB_USER_VERBS_CMD_OPEN_QP,
96};
97
98enum {
99	IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE,
100	IB_USER_VERBS_EX_CMD_CREATE_CQ = IB_USER_VERBS_CMD_CREATE_CQ,
101	IB_USER_VERBS_EX_CMD_CREATE_QP = IB_USER_VERBS_CMD_CREATE_QP,
102	IB_USER_VERBS_EX_CMD_MODIFY_QP = IB_USER_VERBS_CMD_MODIFY_QP,
103	IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD,
104	IB_USER_VERBS_EX_CMD_DESTROY_FLOW,
105	IB_USER_VERBS_EX_CMD_CREATE_WQ,
106	IB_USER_VERBS_EX_CMD_MODIFY_WQ,
107	IB_USER_VERBS_EX_CMD_DESTROY_WQ,
108	IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL,
109	IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL,
110	IB_USER_VERBS_EX_CMD_MODIFY_CQ
111};
112
113/*
114 * Make sure that all structs defined in this file remain laid out so
115 * that they pack the same way on 32-bit and 64-bit architectures (to
116 * avoid incompatibility between 32-bit userspace and 64-bit kernels).
117 * Specifically:
118 *  - Do not use pointer types -- pass pointers in __u64 instead.
119 *  - Make sure that any structure larger than 4 bytes is padded to a
120 *    multiple of 8 bytes.  Otherwise the structure size will be
121 *    different between 32-bit and 64-bit architectures.
122 */
123
124struct ib_uverbs_async_event_desc {
125	__aligned_u64 element;
126	__u32 event_type;	/* enum ib_event_type */
127	__u32 reserved;
128};
129
130struct ib_uverbs_comp_event_desc {
131	__aligned_u64 cq_handle;
132};
133
134struct ib_uverbs_cq_moderation_caps {
135	__u16     max_cq_moderation_count;
136	__u16     max_cq_moderation_period;
137	__u32     reserved;
138};
139
140/*
141 * All commands from userspace should start with a __u32 command field
142 * followed by __u16 in_words and out_words fields (which give the
143 * length of the command block and response buffer if any in 32-bit
144 * words).  The kernel driver will read these fields first and read
145 * the rest of the command struct based on these value.
146 */
147
148#define IB_USER_VERBS_CMD_COMMAND_MASK 0xff
149#define IB_USER_VERBS_CMD_FLAG_EXTENDED 0x80000000u
150
151struct ib_uverbs_cmd_hdr {
152	__u32 command;
153	__u16 in_words;
154	__u16 out_words;
155};
156
157struct ib_uverbs_ex_cmd_hdr {
158	__aligned_u64 response;
159	__u16 provider_in_words;
160	__u16 provider_out_words;
161	__u32 cmd_hdr_reserved;
162};
163
164struct ib_uverbs_get_context {
165	__aligned_u64 response;
166	__aligned_u64 driver_data[0];
167};
168
169struct ib_uverbs_get_context_resp {
170	__u32 async_fd;
171	__u32 num_comp_vectors;
172	__aligned_u64 driver_data[0];
173};
174
175struct ib_uverbs_query_device {
176	__aligned_u64 response;
177	__aligned_u64 driver_data[0];
178};
179
180struct ib_uverbs_query_device_resp {
181	__aligned_u64 fw_ver;
182	__be64 node_guid;
183	__be64 sys_image_guid;
184	__aligned_u64 max_mr_size;
185	__aligned_u64 page_size_cap;
186	__u32 vendor_id;
187	__u32 vendor_part_id;
188	__u32 hw_ver;
189	__u32 max_qp;
190	__u32 max_qp_wr;
191	__u32 device_cap_flags;
192	__u32 max_sge;
193	__u32 max_sge_rd;
194	__u32 max_cq;
195	__u32 max_cqe;
196	__u32 max_mr;
197	__u32 max_pd;
198	__u32 max_qp_rd_atom;
199	__u32 max_ee_rd_atom;
200	__u32 max_res_rd_atom;
201	__u32 max_qp_init_rd_atom;
202	__u32 max_ee_init_rd_atom;
203	__u32 atomic_cap;
204	__u32 max_ee;
205	__u32 max_rdd;
206	__u32 max_mw;
207	__u32 max_raw_ipv6_qp;
208	__u32 max_raw_ethy_qp;
209	__u32 max_mcast_grp;
210	__u32 max_mcast_qp_attach;
211	__u32 max_total_mcast_qp_attach;
212	__u32 max_ah;
213	__u32 max_fmr;
214	__u32 max_map_per_fmr;
215	__u32 max_srq;
216	__u32 max_srq_wr;
217	__u32 max_srq_sge;
218	__u16 max_pkeys;
219	__u8  local_ca_ack_delay;
220	__u8  phys_port_cnt;
221	__u8  reserved[4];
222};
223
224struct ib_uverbs_ex_query_device {
225	__u32 comp_mask;
226	__u32 reserved;
227};
228
229struct ib_uverbs_odp_caps {
230	__aligned_u64 general_caps;
231	struct {
232		__u32 rc_odp_caps;
233		__u32 uc_odp_caps;
234		__u32 ud_odp_caps;
235	} per_transport_caps;
236	__u32 reserved;
237};
238
239struct ib_uverbs_rss_caps {
240	/* Corresponding bit will be set if qp type from
241	 * 'enum ib_qp_type' is supported, e.g.
242	 * supported_qpts |= 1 << IB_QPT_UD
243	 */
244	__u32 supported_qpts;
245	__u32 max_rwq_indirection_tables;
246	__u32 max_rwq_indirection_table_size;
247	__u32 reserved;
248};
249
250struct ib_uverbs_tm_caps {
251	/* Max size of rendezvous request message */
252	__u32 max_rndv_hdr_size;
253	/* Max number of entries in tag matching list */
254	__u32 max_num_tags;
255	/* TM flags */
256	__u32 flags;
257	/* Max number of outstanding list operations */
258	__u32 max_ops;
259	/* Max number of SGE in tag matching entry */
260	__u32 max_sge;
261	__u32 reserved;
262};
263
264struct ib_uverbs_ex_query_device_resp {
265	struct ib_uverbs_query_device_resp base;
266	__u32 comp_mask;
267	__u32 response_length;
268	struct ib_uverbs_odp_caps odp_caps;
269	__aligned_u64 timestamp_mask;
270	__aligned_u64 hca_core_clock; /* in KHZ */
271	__aligned_u64 device_cap_flags_ex;
272	struct ib_uverbs_rss_caps rss_caps;
273	__u32  max_wq_type_rq;
274	__u32 raw_packet_caps;
275	struct ib_uverbs_tm_caps tm_caps;
276	struct ib_uverbs_cq_moderation_caps cq_moderation_caps;
277	__aligned_u64 max_dm_size;
278	__u32 xrc_odp_caps;
279	__u32 reserved;
280};
281
282struct ib_uverbs_query_port {
283	__aligned_u64 response;
284	__u8  port_num;
285	__u8  reserved[7];
286	__aligned_u64 driver_data[0];
287};
288
289struct ib_uverbs_query_port_resp {
290	__u32 port_cap_flags;		/* see ib_uverbs_query_port_cap_flags */
291	__u32 max_msg_sz;
292	__u32 bad_pkey_cntr;
293	__u32 qkey_viol_cntr;
294	__u32 gid_tbl_len;
295	__u16 pkey_tbl_len;
296	__u16 lid;
297	__u16 sm_lid;
298	__u8  state;
299	__u8  max_mtu;
300	__u8  active_mtu;
301	__u8  lmc;
302	__u8  max_vl_num;
303	__u8  sm_sl;
304	__u8  subnet_timeout;
305	__u8  init_type_reply;
306	__u8  active_width;
307	__u8  active_speed;
308	__u8  phys_state;
309	__u8  link_layer;
310	__u8  flags;			/* see ib_uverbs_query_port_flags */
311	__u8  reserved;
312};
313
314struct ib_uverbs_alloc_pd {
315	__aligned_u64 response;
316	__aligned_u64 driver_data[0];
317};
318
319struct ib_uverbs_alloc_pd_resp {
320	__u32 pd_handle;
321	__u32 driver_data[0];
322};
323
324struct ib_uverbs_dealloc_pd {
325	__u32 pd_handle;
326};
327
328struct ib_uverbs_open_xrcd {
329	__aligned_u64 response;
330	__u32 fd;
331	__u32 oflags;
332	__aligned_u64 driver_data[0];
333};
334
335struct ib_uverbs_open_xrcd_resp {
336	__u32 xrcd_handle;
337	__u32 driver_data[0];
338};
339
340struct ib_uverbs_close_xrcd {
341	__u32 xrcd_handle;
342};
343
344struct ib_uverbs_reg_mr {
345	__aligned_u64 response;
346	__aligned_u64 start;
347	__aligned_u64 length;
348	__aligned_u64 hca_va;
349	__u32 pd_handle;
350	__u32 access_flags;
351	__aligned_u64 driver_data[0];
352};
353
354struct ib_uverbs_reg_mr_resp {
355	__u32 mr_handle;
356	__u32 lkey;
357	__u32 rkey;
358	__u32 driver_data[0];
359};
360
361struct ib_uverbs_rereg_mr {
362	__aligned_u64 response;
363	__u32 mr_handle;
364	__u32 flags;
365	__aligned_u64 start;
366	__aligned_u64 length;
367	__aligned_u64 hca_va;
368	__u32 pd_handle;
369	__u32 access_flags;
370	__aligned_u64 driver_data[0];
371};
372
373struct ib_uverbs_rereg_mr_resp {
374	__u32 lkey;
375	__u32 rkey;
376	__aligned_u64 driver_data[0];
377};
378
379struct ib_uverbs_dereg_mr {
380	__u32 mr_handle;
381};
382
383struct ib_uverbs_alloc_mw {
384	__aligned_u64 response;
385	__u32 pd_handle;
386	__u8  mw_type;
387	__u8  reserved[3];
388	__aligned_u64 driver_data[0];
389};
390
391struct ib_uverbs_alloc_mw_resp {
392	__u32 mw_handle;
393	__u32 rkey;
394	__aligned_u64 driver_data[0];
395};
396
397struct ib_uverbs_dealloc_mw {
398	__u32 mw_handle;
399};
400
401struct ib_uverbs_create_comp_channel {
402	__aligned_u64 response;
403};
404
405struct ib_uverbs_create_comp_channel_resp {
406	__u32 fd;
407};
408
409struct ib_uverbs_create_cq {
410	__aligned_u64 response;
411	__aligned_u64 user_handle;
412	__u32 cqe;
413	__u32 comp_vector;
414	__s32 comp_channel;
415	__u32 reserved;
416	__aligned_u64 driver_data[0];
417};
418
419enum ib_uverbs_ex_create_cq_flags {
420	IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION = 1 << 0,
421	IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN = 1 << 1,
422};
423
424struct ib_uverbs_ex_create_cq {
425	__aligned_u64 user_handle;
426	__u32 cqe;
427	__u32 comp_vector;
428	__s32 comp_channel;
429	__u32 comp_mask;
430	__u32 flags;  /* bitmask of ib_uverbs_ex_create_cq_flags */
431	__u32 reserved;
432};
433
434struct ib_uverbs_create_cq_resp {
435	__u32 cq_handle;
436	__u32 cqe;
437	__aligned_u64 driver_data[0];
438};
439
440struct ib_uverbs_ex_create_cq_resp {
441	struct ib_uverbs_create_cq_resp base;
442	__u32 comp_mask;
443	__u32 response_length;
444};
445
446struct ib_uverbs_resize_cq {
447	__aligned_u64 response;
448	__u32 cq_handle;
449	__u32 cqe;
450	__aligned_u64 driver_data[0];
451};
452
453struct ib_uverbs_resize_cq_resp {
454	__u32 cqe;
455	__u32 reserved;
456	__aligned_u64 driver_data[0];
457};
458
459struct ib_uverbs_poll_cq {
460	__aligned_u64 response;
461	__u32 cq_handle;
462	__u32 ne;
463};
464
465struct ib_uverbs_wc {
466	__aligned_u64 wr_id;
467	__u32 status;
468	__u32 opcode;
469	__u32 vendor_err;
470	__u32 byte_len;
471	union {
472		__be32 imm_data;
473		__u32 invalidate_rkey;
474	} ex;
475	__u32 qp_num;
476	__u32 src_qp;
477	__u32 wc_flags;
478	__u16 pkey_index;
479	__u16 slid;
480	__u8 sl;
481	__u8 dlid_path_bits;
482	__u8 port_num;
483	__u8 reserved;
484};
485
486struct ib_uverbs_poll_cq_resp {
487	__u32 count;
488	__u32 reserved;
489	struct ib_uverbs_wc wc[0];
490};
491
492struct ib_uverbs_req_notify_cq {
493	__u32 cq_handle;
494	__u32 solicited_only;
495};
496
497struct ib_uverbs_destroy_cq {
498	__aligned_u64 response;
499	__u32 cq_handle;
500	__u32 reserved;
501};
502
503struct ib_uverbs_destroy_cq_resp {
504	__u32 comp_events_reported;
505	__u32 async_events_reported;
506};
507
508struct ib_uverbs_global_route {
509	__u8  dgid[16];
510	__u32 flow_label;
511	__u8  sgid_index;
512	__u8  hop_limit;
513	__u8  traffic_class;
514	__u8  reserved;
515};
516
517struct ib_uverbs_ah_attr {
518	struct ib_uverbs_global_route grh;
519	__u16 dlid;
520	__u8  sl;
521	__u8  src_path_bits;
522	__u8  static_rate;
523	__u8  is_global;
524	__u8  port_num;
525	__u8  reserved;
526};
527
528struct ib_uverbs_qp_attr {
529	__u32	qp_attr_mask;
530	__u32	qp_state;
531	__u32	cur_qp_state;
532	__u32	path_mtu;
533	__u32	path_mig_state;
534	__u32	qkey;
535	__u32	rq_psn;
536	__u32	sq_psn;
537	__u32	dest_qp_num;
538	__u32	qp_access_flags;
539
540	struct ib_uverbs_ah_attr ah_attr;
541	struct ib_uverbs_ah_attr alt_ah_attr;
542
543	/* ib_qp_cap */
544	__u32	max_send_wr;
545	__u32	max_recv_wr;
546	__u32	max_send_sge;
547	__u32	max_recv_sge;
548	__u32	max_inline_data;
549
550	__u16	pkey_index;
551	__u16	alt_pkey_index;
552	__u8	en_sqd_async_notify;
553	__u8	sq_draining;
554	__u8	max_rd_atomic;
555	__u8	max_dest_rd_atomic;
556	__u8	min_rnr_timer;
557	__u8	port_num;
558	__u8	timeout;
559	__u8	retry_cnt;
560	__u8	rnr_retry;
561	__u8	alt_port_num;
562	__u8	alt_timeout;
563	__u8	reserved[5];
564};
565
566struct ib_uverbs_create_qp {
567	__aligned_u64 response;
568	__aligned_u64 user_handle;
569	__u32 pd_handle;
570	__u32 send_cq_handle;
571	__u32 recv_cq_handle;
572	__u32 srq_handle;
573	__u32 max_send_wr;
574	__u32 max_recv_wr;
575	__u32 max_send_sge;
576	__u32 max_recv_sge;
577	__u32 max_inline_data;
578	__u8  sq_sig_all;
579	__u8  qp_type;
580	__u8  is_srq;
581	__u8  reserved;
582	__aligned_u64 driver_data[0];
583};
584
585enum ib_uverbs_create_qp_mask {
586	IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1UL << 0,
587};
588
589enum {
590	IB_UVERBS_CREATE_QP_SUP_COMP_MASK = IB_UVERBS_CREATE_QP_MASK_IND_TABLE,
591};
592
593enum {
594	/*
595	 * This value is equal to IB_QP_DEST_QPN.
596	 */
597	IB_USER_LEGACY_LAST_QP_ATTR_MASK = 1ULL << 20,
598};
599
600enum {
601	/*
602	 * This value is equal to IB_QP_RATE_LIMIT.
603	 */
604	IB_USER_LAST_QP_ATTR_MASK = 1ULL << 25,
605};
606
607struct ib_uverbs_ex_create_qp {
608	__aligned_u64 user_handle;
609	__u32 pd_handle;
610	__u32 send_cq_handle;
611	__u32 recv_cq_handle;
612	__u32 srq_handle;
613	__u32 max_send_wr;
614	__u32 max_recv_wr;
615	__u32 max_send_sge;
616	__u32 max_recv_sge;
617	__u32 max_inline_data;
618	__u8  sq_sig_all;
619	__u8  qp_type;
620	__u8  is_srq;
621	__u8 reserved;
622	__u32 comp_mask;
623	__u32 create_flags;
624	__u32 rwq_ind_tbl_handle;
625	__u32  source_qpn;
626};
627
628struct ib_uverbs_open_qp {
629	__aligned_u64 response;
630	__aligned_u64 user_handle;
631	__u32 pd_handle;
632	__u32 qpn;
633	__u8  qp_type;
634	__u8  reserved[7];
635	__aligned_u64 driver_data[0];
636};
637
638/* also used for open response */
639struct ib_uverbs_create_qp_resp {
640	__u32 qp_handle;
641	__u32 qpn;
642	__u32 max_send_wr;
643	__u32 max_recv_wr;
644	__u32 max_send_sge;
645	__u32 max_recv_sge;
646	__u32 max_inline_data;
647	__u32 reserved;
648	__u32 driver_data[0];
649};
650
651struct ib_uverbs_ex_create_qp_resp {
652	struct ib_uverbs_create_qp_resp base;
653	__u32 comp_mask;
654	__u32 response_length;
655};
656
657/*
658 * This struct needs to remain a multiple of 8 bytes to keep the
659 * alignment of the modify QP parameters.
660 */
661struct ib_uverbs_qp_dest {
662	__u8  dgid[16];
663	__u32 flow_label;
664	__u16 dlid;
665	__u16 reserved;
666	__u8  sgid_index;
667	__u8  hop_limit;
668	__u8  traffic_class;
669	__u8  sl;
670	__u8  src_path_bits;
671	__u8  static_rate;
672	__u8  is_global;
673	__u8  port_num;
674};
675
676struct ib_uverbs_query_qp {
677	__aligned_u64 response;
678	__u32 qp_handle;
679	__u32 attr_mask;
680	__aligned_u64 driver_data[0];
681};
682
683struct ib_uverbs_query_qp_resp {
684	struct ib_uverbs_qp_dest dest;
685	struct ib_uverbs_qp_dest alt_dest;
686	__u32 max_send_wr;
687	__u32 max_recv_wr;
688	__u32 max_send_sge;
689	__u32 max_recv_sge;
690	__u32 max_inline_data;
691	__u32 qkey;
692	__u32 rq_psn;
693	__u32 sq_psn;
694	__u32 dest_qp_num;
695	__u32 qp_access_flags;
696	__u16 pkey_index;
697	__u16 alt_pkey_index;
698	__u8  qp_state;
699	__u8  cur_qp_state;
700	__u8  path_mtu;
701	__u8  path_mig_state;
702	__u8  sq_draining;
703	__u8  max_rd_atomic;
704	__u8  max_dest_rd_atomic;
705	__u8  min_rnr_timer;
706	__u8  port_num;
707	__u8  timeout;
708	__u8  retry_cnt;
709	__u8  rnr_retry;
710	__u8  alt_port_num;
711	__u8  alt_timeout;
712	__u8  sq_sig_all;
713	__u8  reserved[5];
714	__aligned_u64 driver_data[0];
715};
716
717struct ib_uverbs_modify_qp {
718	struct ib_uverbs_qp_dest dest;
719	struct ib_uverbs_qp_dest alt_dest;
720	__u32 qp_handle;
721	__u32 attr_mask;
722	__u32 qkey;
723	__u32 rq_psn;
724	__u32 sq_psn;
725	__u32 dest_qp_num;
726	__u32 qp_access_flags;
727	__u16 pkey_index;
728	__u16 alt_pkey_index;
729	__u8  qp_state;
730	__u8  cur_qp_state;
731	__u8  path_mtu;
732	__u8  path_mig_state;
733	__u8  en_sqd_async_notify;
734	__u8  max_rd_atomic;
735	__u8  max_dest_rd_atomic;
736	__u8  min_rnr_timer;
737	__u8  port_num;
738	__u8  timeout;
739	__u8  retry_cnt;
740	__u8  rnr_retry;
741	__u8  alt_port_num;
742	__u8  alt_timeout;
743	__u8  reserved[2];
744	__aligned_u64 driver_data[0];
745};
746
747struct ib_uverbs_ex_modify_qp {
748	struct ib_uverbs_modify_qp base;
749	__u32	rate_limit;
750	__u32	reserved;
751};
752
753struct ib_uverbs_ex_modify_qp_resp {
754	__u32  comp_mask;
755	__u32  response_length;
756};
757
758struct ib_uverbs_destroy_qp {
759	__aligned_u64 response;
760	__u32 qp_handle;
761	__u32 reserved;
762};
763
764struct ib_uverbs_destroy_qp_resp {
765	__u32 events_reported;
766};
767
768/*
769 * The ib_uverbs_sge structure isn't used anywhere, since we assume
770 * the ib_sge structure is packed the same way on 32-bit and 64-bit
771 * architectures in both kernel and user space.  It's just here to
772 * document the ABI.
773 */
774struct ib_uverbs_sge {
775	__aligned_u64 addr;
776	__u32 length;
777	__u32 lkey;
778};
779
780enum ib_uverbs_wr_opcode {
781	IB_UVERBS_WR_RDMA_WRITE = 0,
782	IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1,
783	IB_UVERBS_WR_SEND = 2,
784	IB_UVERBS_WR_SEND_WITH_IMM = 3,
785	IB_UVERBS_WR_RDMA_READ = 4,
786	IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5,
787	IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6,
788	IB_UVERBS_WR_LOCAL_INV = 7,
789	IB_UVERBS_WR_BIND_MW = 8,
790	IB_UVERBS_WR_SEND_WITH_INV = 9,
791	IB_UVERBS_WR_TSO = 10,
792	IB_UVERBS_WR_RDMA_READ_WITH_INV = 11,
793	IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,
794	IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,
795	/* Review enum ib_wr_opcode before modifying this */
796};
797
798struct ib_uverbs_send_wr {
799	__aligned_u64 wr_id;
800	__u32 num_sge;
801	__u32 opcode;		/* see enum ib_uverbs_wr_opcode */
802	__u32 send_flags;
803	union {
804		__be32 imm_data;
805		__u32 invalidate_rkey;
806	} ex;
807	union {
808		struct {
809			__aligned_u64 remote_addr;
810			__u32 rkey;
811			__u32 reserved;
812		} rdma;
813		struct {
814			__aligned_u64 remote_addr;
815			__aligned_u64 compare_add;
816			__aligned_u64 swap;
817			__u32 rkey;
818			__u32 reserved;
819		} atomic;
820		struct {
821			__u32 ah;
822			__u32 remote_qpn;
823			__u32 remote_qkey;
824			__u32 reserved;
825		} ud;
826	} wr;
827};
828
829struct ib_uverbs_post_send {
830	__aligned_u64 response;
831	__u32 qp_handle;
832	__u32 wr_count;
833	__u32 sge_count;
834	__u32 wqe_size;
835	struct ib_uverbs_send_wr send_wr[0];
836};
837
838struct ib_uverbs_post_send_resp {
839	__u32 bad_wr;
840};
841
842struct ib_uverbs_recv_wr {
843	__aligned_u64 wr_id;
844	__u32 num_sge;
845	__u32 reserved;
846};
847
848struct ib_uverbs_post_recv {
849	__aligned_u64 response;
850	__u32 qp_handle;
851	__u32 wr_count;
852	__u32 sge_count;
853	__u32 wqe_size;
854	struct ib_uverbs_recv_wr recv_wr[0];
855};
856
857struct ib_uverbs_post_recv_resp {
858	__u32 bad_wr;
859};
860
861struct ib_uverbs_post_srq_recv {
862	__aligned_u64 response;
863	__u32 srq_handle;
864	__u32 wr_count;
865	__u32 sge_count;
866	__u32 wqe_size;
867	struct ib_uverbs_recv_wr recv[0];
868};
869
870struct ib_uverbs_post_srq_recv_resp {
871	__u32 bad_wr;
872};
873
874struct ib_uverbs_create_ah {
875	__aligned_u64 response;
876	__aligned_u64 user_handle;
877	__u32 pd_handle;
878	__u32 reserved;
879	struct ib_uverbs_ah_attr attr;
880	__aligned_u64 driver_data[0];
881};
882
883struct ib_uverbs_create_ah_resp {
884	__u32 ah_handle;
885	__u32 driver_data[0];
886};
887
888struct ib_uverbs_destroy_ah {
889	__u32 ah_handle;
890};
891
892struct ib_uverbs_attach_mcast {
893	__u8  gid[16];
894	__u32 qp_handle;
895	__u16 mlid;
896	__u16 reserved;
897	__aligned_u64 driver_data[0];
898};
899
900struct ib_uverbs_detach_mcast {
901	__u8  gid[16];
902	__u32 qp_handle;
903	__u16 mlid;
904	__u16 reserved;
905	__aligned_u64 driver_data[0];
906};
907
908struct ib_uverbs_flow_spec_hdr {
909	__u32 type;
910	__u16 size;
911	__u16 reserved;
912	/* followed by flow_spec */
913	__aligned_u64 flow_spec_data[0];
914};
915
916struct ib_uverbs_flow_eth_filter {
917	__u8  dst_mac[6];
918	__u8  src_mac[6];
919	__be16 ether_type;
920	__be16 vlan_tag;
921};
922
923struct ib_uverbs_flow_spec_eth {
924	union {
925		struct ib_uverbs_flow_spec_hdr hdr;
926		struct {
927			__u32 type;
928			__u16 size;
929			__u16 reserved;
930		};
931	};
932	struct ib_uverbs_flow_eth_filter val;
933	struct ib_uverbs_flow_eth_filter mask;
934};
935
936struct ib_uverbs_flow_ipv4_filter {
937	__be32 src_ip;
938	__be32 dst_ip;
939	__u8	proto;
940	__u8	tos;
941	__u8	ttl;
942	__u8	flags;
943};
944
945struct ib_uverbs_flow_spec_ipv4 {
946	union {
947		struct ib_uverbs_flow_spec_hdr hdr;
948		struct {
949			__u32 type;
950			__u16 size;
951			__u16 reserved;
952		};
953	};
954	struct ib_uverbs_flow_ipv4_filter val;
955	struct ib_uverbs_flow_ipv4_filter mask;
956};
957
958struct ib_uverbs_flow_tcp_udp_filter {
959	__be16 dst_port;
960	__be16 src_port;
961};
962
963struct ib_uverbs_flow_spec_tcp_udp {
964	union {
965		struct ib_uverbs_flow_spec_hdr hdr;
966		struct {
967			__u32 type;
968			__u16 size;
969			__u16 reserved;
970		};
971	};
972	struct ib_uverbs_flow_tcp_udp_filter val;
973	struct ib_uverbs_flow_tcp_udp_filter mask;
974};
975
976struct ib_uverbs_flow_ipv6_filter {
977	__u8    src_ip[16];
978	__u8    dst_ip[16];
979	__be32	flow_label;
980	__u8	next_hdr;
981	__u8	traffic_class;
982	__u8	hop_limit;
983	__u8	reserved;
984};
985
986struct ib_uverbs_flow_spec_ipv6 {
987	union {
988		struct ib_uverbs_flow_spec_hdr hdr;
989		struct {
990			__u32 type;
991			__u16 size;
992			__u16 reserved;
993		};
994	};
995	struct ib_uverbs_flow_ipv6_filter val;
996	struct ib_uverbs_flow_ipv6_filter mask;
997};
998
999struct ib_uverbs_flow_spec_action_tag {
1000	union {
1001		struct ib_uverbs_flow_spec_hdr hdr;
1002		struct {
1003			__u32 type;
1004			__u16 size;
1005			__u16 reserved;
1006		};
1007	};
1008	__u32			      tag_id;
1009	__u32			      reserved1;
1010};
1011
1012struct ib_uverbs_flow_spec_action_drop {
1013	union {
1014		struct ib_uverbs_flow_spec_hdr hdr;
1015		struct {
1016			__u32 type;
1017			__u16 size;
1018			__u16 reserved;
1019		};
1020	};
1021};
1022
1023struct ib_uverbs_flow_spec_action_handle {
1024	union {
1025		struct ib_uverbs_flow_spec_hdr hdr;
1026		struct {
1027			__u32 type;
1028			__u16 size;
1029			__u16 reserved;
1030		};
1031	};
1032	__u32			      handle;
1033	__u32			      reserved1;
1034};
1035
1036struct ib_uverbs_flow_spec_action_count {
1037	union {
1038		struct ib_uverbs_flow_spec_hdr hdr;
1039		struct {
1040			__u32 type;
1041			__u16 size;
1042			__u16 reserved;
1043		};
1044	};
1045	__u32			      handle;
1046	__u32			      reserved1;
1047};
1048
1049struct ib_uverbs_flow_tunnel_filter {
1050	__be32 tunnel_id;
1051};
1052
1053struct ib_uverbs_flow_spec_tunnel {
1054	union {
1055		struct ib_uverbs_flow_spec_hdr hdr;
1056		struct {
1057			__u32 type;
1058			__u16 size;
1059			__u16 reserved;
1060		};
1061	};
1062	struct ib_uverbs_flow_tunnel_filter val;
1063	struct ib_uverbs_flow_tunnel_filter mask;
1064};
1065
1066struct ib_uverbs_flow_spec_esp_filter {
1067	__u32 spi;
1068	__u32 seq;
1069};
1070
1071struct ib_uverbs_flow_spec_esp {
1072	union {
1073		struct ib_uverbs_flow_spec_hdr hdr;
1074		struct {
1075			__u32 type;
1076			__u16 size;
1077			__u16 reserved;
1078		};
1079	};
1080	struct ib_uverbs_flow_spec_esp_filter val;
1081	struct ib_uverbs_flow_spec_esp_filter mask;
1082};
1083
1084struct ib_uverbs_flow_gre_filter {
1085	/* c_ks_res0_ver field is bits 0-15 in offset 0 of a standard GRE header:
1086	 * bit 0 - C - checksum bit.
1087	 * bit 1 - reserved. set to 0.
1088	 * bit 2 - key bit.
1089	 * bit 3 - sequence number bit.
1090	 * bits 4:12 - reserved. set to 0.
1091	 * bits 13:15 - GRE version.
1092	 */
1093	__be16 c_ks_res0_ver;
1094	__be16 protocol;
1095	__be32 key;
1096};
1097
1098struct ib_uverbs_flow_spec_gre {
1099	union {
1100		struct ib_uverbs_flow_spec_hdr hdr;
1101		struct {
1102			__u32 type;
1103			__u16 size;
1104			__u16 reserved;
1105		};
1106	};
1107	struct ib_uverbs_flow_gre_filter     val;
1108	struct ib_uverbs_flow_gre_filter     mask;
1109};
1110
1111struct ib_uverbs_flow_mpls_filter {
1112	/* The field includes the entire MPLS label:
1113	 * bits 0:19 - label field.
1114	 * bits 20:22 - traffic class field.
1115	 * bits 23 - bottom of stack bit.
1116	 * bits 24:31 - ttl field.
1117	 */
1118	__be32 label;
1119};
1120
1121struct ib_uverbs_flow_spec_mpls {
1122	union {
1123		struct ib_uverbs_flow_spec_hdr hdr;
1124		struct {
1125			__u32 type;
1126			__u16 size;
1127			__u16 reserved;
1128		};
1129	};
1130	struct ib_uverbs_flow_mpls_filter     val;
1131	struct ib_uverbs_flow_mpls_filter     mask;
1132};
1133
1134struct ib_uverbs_flow_attr {
1135	__u32 type;
1136	__u16 size;
1137	__u16 priority;
1138	__u8  num_of_specs;
1139	__u8  reserved[2];
1140	__u8  port;
1141	__u32 flags;
1142	/* Following are the optional layers according to user request
1143	 * struct ib_flow_spec_xxx
1144	 * struct ib_flow_spec_yyy
1145	 */
1146	struct ib_uverbs_flow_spec_hdr flow_specs[0];
1147};
1148
1149struct ib_uverbs_create_flow  {
1150	__u32 comp_mask;
1151	__u32 qp_handle;
1152	struct ib_uverbs_flow_attr flow_attr;
1153};
1154
1155struct ib_uverbs_create_flow_resp {
1156	__u32 comp_mask;
1157	__u32 flow_handle;
1158};
1159
1160struct ib_uverbs_destroy_flow  {
1161	__u32 comp_mask;
1162	__u32 flow_handle;
1163};
1164
1165struct ib_uverbs_create_srq {
1166	__aligned_u64 response;
1167	__aligned_u64 user_handle;
1168	__u32 pd_handle;
1169	__u32 max_wr;
1170	__u32 max_sge;
1171	__u32 srq_limit;
1172	__aligned_u64 driver_data[0];
1173};
1174
1175struct ib_uverbs_create_xsrq {
1176	__aligned_u64 response;
1177	__aligned_u64 user_handle;
1178	__u32 srq_type;
1179	__u32 pd_handle;
1180	__u32 max_wr;
1181	__u32 max_sge;
1182	__u32 srq_limit;
1183	__u32 max_num_tags;
1184	__u32 xrcd_handle;
1185	__u32 cq_handle;
1186	__aligned_u64 driver_data[0];
1187};
1188
1189struct ib_uverbs_create_srq_resp {
1190	__u32 srq_handle;
1191	__u32 max_wr;
1192	__u32 max_sge;
1193	__u32 srqn;
1194	__u32 driver_data[0];
1195};
1196
1197struct ib_uverbs_modify_srq {
1198	__u32 srq_handle;
1199	__u32 attr_mask;
1200	__u32 max_wr;
1201	__u32 srq_limit;
1202	__aligned_u64 driver_data[0];
1203};
1204
1205struct ib_uverbs_query_srq {
1206	__aligned_u64 response;
1207	__u32 srq_handle;
1208	__u32 reserved;
1209	__aligned_u64 driver_data[0];
1210};
1211
1212struct ib_uverbs_query_srq_resp {
1213	__u32 max_wr;
1214	__u32 max_sge;
1215	__u32 srq_limit;
1216	__u32 reserved;
1217};
1218
1219struct ib_uverbs_destroy_srq {
1220	__aligned_u64 response;
1221	__u32 srq_handle;
1222	__u32 reserved;
1223};
1224
1225struct ib_uverbs_destroy_srq_resp {
1226	__u32 events_reported;
1227};
1228
1229struct ib_uverbs_ex_create_wq  {
1230	__u32 comp_mask;
1231	__u32 wq_type;
1232	__aligned_u64 user_handle;
1233	__u32 pd_handle;
1234	__u32 cq_handle;
1235	__u32 max_wr;
1236	__u32 max_sge;
1237	__u32 create_flags; /* Use enum ib_wq_flags */
1238	__u32 reserved;
1239};
1240
1241struct ib_uverbs_ex_create_wq_resp {
1242	__u32 comp_mask;
1243	__u32 response_length;
1244	__u32 wq_handle;
1245	__u32 max_wr;
1246	__u32 max_sge;
1247	__u32 wqn;
1248};
1249
1250struct ib_uverbs_ex_destroy_wq  {
1251	__u32 comp_mask;
1252	__u32 wq_handle;
1253};
1254
1255struct ib_uverbs_ex_destroy_wq_resp {
1256	__u32 comp_mask;
1257	__u32 response_length;
1258	__u32 events_reported;
1259	__u32 reserved;
1260};
1261
1262struct ib_uverbs_ex_modify_wq  {
1263	__u32 attr_mask;
1264	__u32 wq_handle;
1265	__u32 wq_state;
1266	__u32 curr_wq_state;
1267	__u32 flags; /* Use enum ib_wq_flags */
1268	__u32 flags_mask; /* Use enum ib_wq_flags */
1269};
1270
1271/* Prevent memory allocation rather than max expected size */
1272#define IB_USER_VERBS_MAX_LOG_IND_TBL_SIZE 0x0d
1273struct ib_uverbs_ex_create_rwq_ind_table  {
1274	__u32 comp_mask;
1275	__u32 log_ind_tbl_size;
1276	/* Following are the wq handles according to log_ind_tbl_size
1277	 * wq_handle1
1278	 * wq_handle2
1279	 */
1280	__u32 wq_handles[0];
1281};
1282
1283struct ib_uverbs_ex_create_rwq_ind_table_resp {
1284	__u32 comp_mask;
1285	__u32 response_length;
1286	__u32 ind_tbl_handle;
1287	__u32 ind_tbl_num;
1288};
1289
1290struct ib_uverbs_ex_destroy_rwq_ind_table  {
1291	__u32 comp_mask;
1292	__u32 ind_tbl_handle;
1293};
1294
1295struct ib_uverbs_cq_moderation {
1296	__u16 cq_count;
1297	__u16 cq_period;
1298};
1299
1300struct ib_uverbs_ex_modify_cq {
1301	__u32 cq_handle;
1302	__u32 attr_mask;
1303	struct ib_uverbs_cq_moderation attr;
1304	__u32 reserved;
1305};
1306
1307#define IB_DEVICE_NAME_MAX 64
1308
1309#endif /* IB_USER_VERBS_H */
1310