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 Intel Corporation.  All rights reserved.
6 *
7 * This software is available to you under a choice of one of two
8 * licenses.  You may choose to be licensed under the terms of the GNU
9 * General Public License (GPL) Version 2, available from the file
10 * COPYING in the main directory of this source tree, or the
11 * OpenIB.org BSD license below:
12 *
13 *     Redistribution and use in source and binary forms, with or
14 *     without modification, are permitted provided that the following
15 *     conditions are met:
16 *
17 *      - Redistributions of source code must retain the above
18 *        copyright notice, this list of conditions and the following
19 *        disclaimer.
20 *
21 *      - Redistributions in binary form must reproduce the above
22 *        copyright notice, this list of conditions and the following
23 *        disclaimer in the documentation and/or other materials
24 *        provided with the distribution.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 * SOFTWARE.
34 *
35 * $FreeBSD$
36 */
37
38#ifndef IB_USER_CM_H
39#define IB_USER_CM_H
40
41#ifdef _KERNEL
42#include <linux/types.h>
43#else
44#include <infiniband/types.h>
45#endif
46#include <rdma/ib_user_sa.h>
47
48#define IB_USER_CM_ABI_VERSION 5
49
50enum {
51	IB_USER_CM_CMD_CREATE_ID,
52	IB_USER_CM_CMD_DESTROY_ID,
53	IB_USER_CM_CMD_ATTR_ID,
54
55	IB_USER_CM_CMD_LISTEN,
56	IB_USER_CM_CMD_NOTIFY,
57
58	IB_USER_CM_CMD_SEND_REQ,
59	IB_USER_CM_CMD_SEND_REP,
60	IB_USER_CM_CMD_SEND_RTU,
61	IB_USER_CM_CMD_SEND_DREQ,
62	IB_USER_CM_CMD_SEND_DREP,
63	IB_USER_CM_CMD_SEND_REJ,
64	IB_USER_CM_CMD_SEND_MRA,
65	IB_USER_CM_CMD_SEND_LAP,
66	IB_USER_CM_CMD_SEND_APR,
67	IB_USER_CM_CMD_SEND_SIDR_REQ,
68	IB_USER_CM_CMD_SEND_SIDR_REP,
69
70	IB_USER_CM_CMD_EVENT,
71	IB_USER_CM_CMD_INIT_QP_ATTR,
72};
73/*
74 * command ABI structures.
75 */
76struct ib_ucm_cmd_hdr {
77	__u32 cmd;
78	__u16 in;
79	__u16 out;
80};
81
82struct ib_ucm_create_id {
83	__u64 uid;
84	__u64 response;
85};
86
87struct ib_ucm_create_id_resp {
88	__u32 id;
89};
90
91struct ib_ucm_destroy_id {
92	__u64 response;
93	__u32 id;
94	__u32 reserved;
95};
96
97struct ib_ucm_destroy_id_resp {
98	__u32 events_reported;
99};
100
101struct ib_ucm_attr_id {
102	__u64 response;
103	__u32 id;
104	__u32 reserved;
105};
106
107struct ib_ucm_attr_id_resp {
108	__be64 service_id;
109	__be64 service_mask;
110	__be32 local_id;
111	__be32 remote_id;
112};
113
114struct ib_ucm_init_qp_attr {
115	__u64 response;
116	__u32 id;
117	__u32 qp_state;
118};
119
120struct ib_ucm_listen {
121	__be64 service_id;
122	__be64 service_mask;
123	__u32 id;
124	__u32 reserved;
125};
126
127struct ib_ucm_notify {
128	__u32 id;
129	__u32 event;
130};
131
132struct ib_ucm_private_data {
133	__u64 data;
134	__u32 id;
135	__u8  len;
136	__u8  reserved[3];
137};
138
139struct ib_ucm_req {
140	__u32 id;
141	__u32 qpn;
142	__u32 qp_type;
143	__u32 psn;
144	__be64 sid;
145	__u64 data;
146	__u64 primary_path;
147	__u64 alternate_path;
148	__u8  len;
149	__u8  peer_to_peer;
150	__u8  responder_resources;
151	__u8  initiator_depth;
152	__u8  remote_cm_response_timeout;
153	__u8  flow_control;
154	__u8  local_cm_response_timeout;
155	__u8  retry_count;
156	__u8  rnr_retry_count;
157	__u8  max_cm_retries;
158	__u8  srq;
159	__u8  reserved[5];
160};
161
162struct ib_ucm_rep {
163	__u64 uid;
164	__u64 data;
165	__u32 id;
166	__u32 qpn;
167	__u32 psn;
168	__u8  len;
169	__u8  responder_resources;
170	__u8  initiator_depth;
171	__u8  target_ack_delay;
172	__u8  failover_accepted;
173	__u8  flow_control;
174	__u8  rnr_retry_count;
175	__u8  srq;
176	__u8  reserved[4];
177};
178
179struct ib_ucm_info {
180	__u32 id;
181	__u32 status;
182	__u64 info;
183	__u64 data;
184	__u8  info_len;
185	__u8  data_len;
186	__u8  reserved[6];
187};
188
189struct ib_ucm_mra {
190	__u64 data;
191	__u32 id;
192	__u8  len;
193	__u8  timeout;
194	__u8  reserved[2];
195};
196
197struct ib_ucm_lap {
198	__u64 path;
199	__u64 data;
200	__u32 id;
201	__u8  len;
202	__u8  reserved[3];
203};
204
205struct ib_ucm_sidr_req {
206	__u32 id;
207	__u32 timeout;
208	__be64 sid;
209	__u64 data;
210	__u64 path;
211	__u16 reserved_pkey;
212	__u8  len;
213	__u8  max_cm_retries;
214	__u8  reserved[4];
215};
216
217struct ib_ucm_sidr_rep {
218	__u32 id;
219	__u32 qpn;
220	__u32 qkey;
221	__u32 status;
222	__u64 info;
223	__u64 data;
224	__u8  info_len;
225	__u8  data_len;
226	__u8  reserved[6];
227};
228/*
229 * event notification ABI structures.
230 */
231struct ib_ucm_event_get {
232	__u64 response;
233	__u64 data;
234	__u64 info;
235	__u8  data_len;
236	__u8  info_len;
237	__u8  reserved[6];
238};
239
240struct ib_ucm_req_event_resp {
241	struct ib_user_path_rec primary_path;
242	struct ib_user_path_rec alternate_path;
243	__be64                 remote_ca_guid;
244	__u32                  remote_qkey;
245	__u32                  remote_qpn;
246	__u32                  qp_type;
247	__u32                  starting_psn;
248	__u8  responder_resources;
249	__u8  initiator_depth;
250	__u8  local_cm_response_timeout;
251	__u8  flow_control;
252	__u8  remote_cm_response_timeout;
253	__u8  retry_count;
254	__u8  rnr_retry_count;
255	__u8  srq;
256	__u8  port;
257	__u8  reserved[7];
258};
259
260struct ib_ucm_rep_event_resp {
261	__be64 remote_ca_guid;
262	__u32 remote_qkey;
263	__u32 remote_qpn;
264	__u32 starting_psn;
265	__u8  responder_resources;
266	__u8  initiator_depth;
267	__u8  target_ack_delay;
268	__u8  failover_accepted;
269	__u8  flow_control;
270	__u8  rnr_retry_count;
271	__u8  srq;
272	__u8  reserved[5];
273};
274
275struct ib_ucm_rej_event_resp {
276	__u32 reason;
277	/* ari in ib_ucm_event_get info field. */
278};
279
280struct ib_ucm_mra_event_resp {
281	__u8  timeout;
282	__u8  reserved[3];
283};
284
285struct ib_ucm_lap_event_resp {
286	struct ib_user_path_rec path;
287};
288
289struct ib_ucm_apr_event_resp {
290	__u32 status;
291	/* apr info in ib_ucm_event_get info field. */
292};
293
294struct ib_ucm_sidr_req_event_resp {
295	__u16 pkey;
296	__u8  port;
297	__u8  reserved;
298};
299
300struct ib_ucm_sidr_rep_event_resp {
301	__u32 status;
302	__u32 qkey;
303	__u32 qpn;
304	/* info in ib_ucm_event_get info field. */
305};
306
307#define IB_UCM_PRES_DATA      0x01
308#define IB_UCM_PRES_INFO      0x02
309#define IB_UCM_PRES_PRIMARY   0x04
310#define IB_UCM_PRES_ALTERNATE 0x08
311
312struct ib_ucm_event_resp {
313	__u64 uid;
314	__u32 id;
315	__u32 event;
316	__u32 present;
317	__u32 reserved;
318	union {
319		struct ib_ucm_req_event_resp req_resp;
320		struct ib_ucm_rep_event_resp rep_resp;
321		struct ib_ucm_rej_event_resp rej_resp;
322		struct ib_ucm_mra_event_resp mra_resp;
323		struct ib_ucm_lap_event_resp lap_resp;
324		struct ib_ucm_apr_event_resp apr_resp;
325
326		struct ib_ucm_sidr_req_event_resp sidr_req_resp;
327		struct ib_ucm_sidr_rep_event_resp sidr_rep_resp;
328
329		__u32                             send_status;
330	} u;
331};
332
333#endif /* IB_USER_CM_H */
334