1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
2 /*
3  * Copyright (c) 2005 Topspin Communications.  All rights reserved.
4  * Copyright (c) 2005 Intel Corporation.  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 IB_USER_CM_H
36 #define IB_USER_CM_H
37 
38 #include <linux/types.h>
39 #include <rdma/ib_user_sa.h>
40 
41 #define IB_USER_CM_ABI_VERSION 5
42 
43 enum {
44 	IB_USER_CM_CMD_CREATE_ID,
45 	IB_USER_CM_CMD_DESTROY_ID,
46 	IB_USER_CM_CMD_ATTR_ID,
47 
48 	IB_USER_CM_CMD_LISTEN,
49 	IB_USER_CM_CMD_NOTIFY,
50 
51 	IB_USER_CM_CMD_SEND_REQ,
52 	IB_USER_CM_CMD_SEND_REP,
53 	IB_USER_CM_CMD_SEND_RTU,
54 	IB_USER_CM_CMD_SEND_DREQ,
55 	IB_USER_CM_CMD_SEND_DREP,
56 	IB_USER_CM_CMD_SEND_REJ,
57 	IB_USER_CM_CMD_SEND_MRA,
58 	IB_USER_CM_CMD_SEND_LAP,
59 	IB_USER_CM_CMD_SEND_APR,
60 	IB_USER_CM_CMD_SEND_SIDR_REQ,
61 	IB_USER_CM_CMD_SEND_SIDR_REP,
62 
63 	IB_USER_CM_CMD_EVENT,
64 	IB_USER_CM_CMD_INIT_QP_ATTR,
65 };
66 /*
67  * command ABI structures.
68  */
69 struct ib_ucm_cmd_hdr {
70 	__u32 cmd;
71 	__u16 in;
72 	__u16 out;
73 };
74 
75 struct ib_ucm_create_id {
76 	__aligned_u64 uid;
77 	__aligned_u64 response;
78 };
79 
80 struct ib_ucm_create_id_resp {
81 	__u32 id;
82 };
83 
84 struct ib_ucm_destroy_id {
85 	__aligned_u64 response;
86 	__u32 id;
87 	__u32 reserved;
88 };
89 
90 struct ib_ucm_destroy_id_resp {
91 	__u32 events_reported;
92 };
93 
94 struct ib_ucm_attr_id {
95 	__aligned_u64 response;
96 	__u32 id;
97 	__u32 reserved;
98 };
99 
100 struct ib_ucm_attr_id_resp {
101 	__be64 service_id;
102 	__be64 service_mask;
103 	__be32 local_id;
104 	__be32 remote_id;
105 };
106 
107 struct ib_ucm_init_qp_attr {
108 	__aligned_u64 response;
109 	__u32 id;
110 	__u32 qp_state;
111 };
112 
113 struct ib_ucm_listen {
114 	__be64 service_id;
115 	__be64 service_mask;
116 	__u32 id;
117 	__u32 reserved;
118 };
119 
120 struct ib_ucm_notify {
121 	__u32 id;
122 	__u32 event;
123 };
124 
125 struct ib_ucm_private_data {
126 	__aligned_u64 data;
127 	__u32 id;
128 	__u8  len;
129 	__u8  reserved[3];
130 };
131 
132 struct ib_ucm_req {
133 	__u32 id;
134 	__u32 qpn;
135 	__u32 qp_type;
136 	__u32 psn;
137 	__be64 sid;
138 	__aligned_u64 data;
139 	__aligned_u64 primary_path;
140 	__aligned_u64 alternate_path;
141 	__u8  len;
142 	__u8  peer_to_peer;
143 	__u8  responder_resources;
144 	__u8  initiator_depth;
145 	__u8  remote_cm_response_timeout;
146 	__u8  flow_control;
147 	__u8  local_cm_response_timeout;
148 	__u8  retry_count;
149 	__u8  rnr_retry_count;
150 	__u8  max_cm_retries;
151 	__u8  srq;
152 	__u8  reserved[5];
153 };
154 
155 struct ib_ucm_rep {
156 	__aligned_u64 uid;
157 	__aligned_u64 data;
158 	__u32 id;
159 	__u32 qpn;
160 	__u32 psn;
161 	__u8  len;
162 	__u8  responder_resources;
163 	__u8  initiator_depth;
164 	__u8  target_ack_delay;
165 	__u8  failover_accepted;
166 	__u8  flow_control;
167 	__u8  rnr_retry_count;
168 	__u8  srq;
169 	__u8  reserved[4];
170 };
171 
172 struct ib_ucm_info {
173 	__u32 id;
174 	__u32 status;
175 	__aligned_u64 info;
176 	__aligned_u64 data;
177 	__u8  info_len;
178 	__u8  data_len;
179 	__u8  reserved[6];
180 };
181 
182 struct ib_ucm_mra {
183 	__aligned_u64 data;
184 	__u32 id;
185 	__u8  len;
186 	__u8  timeout;
187 	__u8  reserved[2];
188 };
189 
190 struct ib_ucm_lap {
191 	__aligned_u64 path;
192 	__aligned_u64 data;
193 	__u32 id;
194 	__u8  len;
195 	__u8  reserved[3];
196 };
197 
198 struct ib_ucm_sidr_req {
199 	__u32 id;
200 	__u32 timeout;
201 	__be64 sid;
202 	__aligned_u64 data;
203 	__aligned_u64 path;
204 	__u16 reserved_pkey;
205 	__u8  len;
206 	__u8  max_cm_retries;
207 	__u8  reserved[4];
208 };
209 
210 struct ib_ucm_sidr_rep {
211 	__u32 id;
212 	__u32 qpn;
213 	__u32 qkey;
214 	__u32 status;
215 	__aligned_u64 info;
216 	__aligned_u64 data;
217 	__u8  info_len;
218 	__u8  data_len;
219 	__u8  reserved[6];
220 };
221 /*
222  * event notification ABI structures.
223  */
224 struct ib_ucm_event_get {
225 	__aligned_u64 response;
226 	__aligned_u64 data;
227 	__aligned_u64 info;
228 	__u8  data_len;
229 	__u8  info_len;
230 	__u8  reserved[6];
231 };
232 
233 struct ib_ucm_req_event_resp {
234 	struct ib_user_path_rec primary_path;
235 	struct ib_user_path_rec alternate_path;
236 	__be64                 remote_ca_guid;
237 	__u32                  remote_qkey;
238 	__u32                  remote_qpn;
239 	__u32                  qp_type;
240 	__u32                  starting_psn;
241 	__u8  responder_resources;
242 	__u8  initiator_depth;
243 	__u8  local_cm_response_timeout;
244 	__u8  flow_control;
245 	__u8  remote_cm_response_timeout;
246 	__u8  retry_count;
247 	__u8  rnr_retry_count;
248 	__u8  srq;
249 	__u8  port;
250 	__u8  reserved[7];
251 };
252 
253 struct ib_ucm_rep_event_resp {
254 	__be64 remote_ca_guid;
255 	__u32 remote_qkey;
256 	__u32 remote_qpn;
257 	__u32 starting_psn;
258 	__u8  responder_resources;
259 	__u8  initiator_depth;
260 	__u8  target_ack_delay;
261 	__u8  failover_accepted;
262 	__u8  flow_control;
263 	__u8  rnr_retry_count;
264 	__u8  srq;
265 	__u8  reserved[5];
266 };
267 
268 struct ib_ucm_rej_event_resp {
269 	__u32 reason;
270 	/* ari in ib_ucm_event_get info field. */
271 };
272 
273 struct ib_ucm_mra_event_resp {
274 	__u8  timeout;
275 	__u8  reserved[3];
276 };
277 
278 struct ib_ucm_lap_event_resp {
279 	struct ib_user_path_rec path;
280 };
281 
282 struct ib_ucm_apr_event_resp {
283 	__u32 status;
284 	/* apr info in ib_ucm_event_get info field. */
285 };
286 
287 struct ib_ucm_sidr_req_event_resp {
288 	__u16 pkey;
289 	__u8  port;
290 	__u8  reserved;
291 };
292 
293 struct ib_ucm_sidr_rep_event_resp {
294 	__u32 status;
295 	__u32 qkey;
296 	__u32 qpn;
297 	/* info in ib_ucm_event_get info field. */
298 };
299 
300 #define IB_UCM_PRES_DATA      0x01
301 #define IB_UCM_PRES_INFO      0x02
302 #define IB_UCM_PRES_PRIMARY   0x04
303 #define IB_UCM_PRES_ALTERNATE 0x08
304 
305 struct ib_ucm_event_resp {
306 	__aligned_u64 uid;
307 	__u32 id;
308 	__u32 event;
309 	__u32 present;
310 	__u32 reserved;
311 	union {
312 		struct ib_ucm_req_event_resp req_resp;
313 		struct ib_ucm_rep_event_resp rep_resp;
314 		struct ib_ucm_rej_event_resp rej_resp;
315 		struct ib_ucm_mra_event_resp mra_resp;
316 		struct ib_ucm_lap_event_resp lap_resp;
317 		struct ib_ucm_apr_event_resp apr_resp;
318 
319 		struct ib_ucm_sidr_req_event_resp sidr_req_resp;
320 		struct ib_ucm_sidr_rep_event_resp sidr_rep_resp;
321 
322 		__u32                             send_status;
323 	} u;
324 };
325 
326 #endif /* IB_USER_CM_H */
327