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