1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23 */
24
25#ifndef	_SYS_IB_IBTL_IBTL_CI_TYPES_H
26#define	_SYS_IB_IBTL_IBTL_CI_TYPES_H
27
28/*
29 * ibtl_ci_types.h
30 * Definitions shared between the IBTL and CI interface.
31 */
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37typedef	struct ibc_cq_s		*ibt_opaque1_t;
38typedef	struct ibc_srq_s	*ibt_opaque2_t;
39typedef	struct ibc_rdd_s	*ibt_rdd_hdl_t;	/* ibt_alloc_eec() */
40
41
42/*
43 * Channel Modify flags - ibt_cep_modify_flags_t
44 *
45 *    Note:
46 *	That the IBT_CEP_SET_RESET_INIT, IBT_CEP_SET_INIT_RTR
47 *	IBT_CEP_SET_RTR_RTS flags are mutually exclusive. However if one of the
48 *	optional attributes associated with these flags is to be modified then
49 *	the corresponding modify flag must also be specified. For example if
50 *	a client wishes to transit from the INIT to RTR state but additionally
51 *	they want to disable atomics, then the modify flags should be:
52 *
53 *	(IBT_CEP_SET_INIT_RTR | IBT_CEP_SET_ATOMIC)
54 *
55 *	And the following attributes specified:
56 *
57 *		- Number of responder resources for RDMA read/atomic ops.
58 *		- Primary Path Address Vector Information.
59 *		- Destination QPN.
60 *		- PSN for ReceiveQ.
61 *		- Minimum RNR NAK Timer field value.
62 *		- ibt_cep_flags_t set to IBT_CEP_ATOMIC
63 *
64 */
65#define	IBT_CEP_SET_RESET_INIT		IBT_CEP_SET_OPAQUE1
66#define	IBT_CEP_SET_INIT_RTR		IBT_CEP_SET_OPAQUE2
67#define	IBT_CEP_SET_RTR_RTS		IBT_CEP_SET_OPAQUE3
68
69#define	IBT_CEP_SET_STATE		IBT_CEP_SET_OPAQUE4
70#define	IBT_CEP_SET_MTU			IBT_CEP_SET_OPAQUE5
71
72#define	IBT_CEP_SET_TIMEOUT		IBT_CEP_SET_OPAQUE6
73#define	IBT_CEP_SET_PKEY_IX		IBT_CEP_SET_OPAQUE7
74#define	IBT_CEP_SET_MIG			IBT_CEP_SET_OPAQUE8
75
76/*
77 * ibt_async_code_t
78 */
79#define	IBT_EVENT_PATH_MIGRATED_QP	IBT_EVENT_PATH_MIGRATED
80#define	IBT_EVENT_COM_EST_QP		IBT_EVENT_COM_EST
81#define	IBT_EVENT_COM_EST_EEC		IBT_ASYNC_OPAQUE2
82#define	IBT_ERROR_CATASTROPHIC_QP	IBT_ERROR_CATASTROPHIC_CHAN
83#define	IBT_ERROR_INVALID_REQUEST_QP	IBT_ERROR_INVALID_REQUEST_CHAN
84#define	IBT_ERROR_ACCESS_VIOLATION_QP	IBT_ERROR_ACCESS_VIOLATION_CHAN
85#define	IBT_ERROR_PATH_MIGRATE_REQ_QP	IBT_ERROR_PATH_MIGRATE_REQ
86#define	IBT_EVENT_EMPTY_QP		IBT_EVENT_EMPTY_CHAN
87
88
89/*
90 * ibt_adds_vect_t
91 */
92#define	av_send_grh	av_opaque1	/* flag to specify if GRH is there */
93#define	av_dlid		av_opaque2	/* destination LID, or router LID */
94#define	av_src_path	av_opaque3	/* Source path bits */
95#define	av_sgid_ix	av_opaque4
96
97/*
98 * ibt_wc_t
99 */
100#define	wc_slid		wc_opaque1	/* source LID */
101#define	wc_pkey_ix	wc_opaque2	/* The P_Key index, GSI only */
102#define	wc_path_bits	wc_opaque4	/* DLID path bits, UD's, RawIPv6 & */
103					/* RawEthr only */
104
105/*
106 * ibt_mcg_attr_t
107 */
108#define	mc_mlid		mc_opaque1	/* Multicast LID */
109
110/*
111 * ibt_mcg_info_t
112 */
113#define	mc_pkt_lt	mc_opaque2
114
115/*
116 * ibt_hca_flags_t
117 */
118#define	IBT_HCA_RESIZE_QP	IBT_HCA_RESIZE_CHAN
119
120/*
121 * ibt_object_type_t
122 */
123#define	IBT_HDL_QP	IBT_HDL_CHANNEL
124#define	IBT_HDL_AH	IBT_HDL_UD_DEST
125
126/*
127 * ibt_hca_attr_t
128 */
129#define	hca_max_ah	hca_max_ud_dest	/* Max address handles in HCA */
130#define	hca_ah_max_ci_priv_sz	hca_ud_dest_max_ci_priv_sz
131#define	hca_qp_max_ci_priv_sz	hca_chan_max_ci_priv_sz
132#define	hca_max_qp	hca_max_chans	/* Max Channels supported by the HCA */
133#define	hca_max_qp_sz	hca_max_chan_sz	/* Max outstanding WRs on any channel */
134#define	hca_max_rdma_out_qp	hca_max_rdma_out_chan
135#define	hca_max_rdma_in_qp	hca_max_rdma_in_chan
136#define	hca_max_mcg_qps		hca_max_mcg_chans
137#define	hca_max_qp_per_mcg	hca_max_chan_per_mcg
138
139/*
140 * ibt_hca_portinfo_t
141 */
142#define	p_base_lid	p_opaque1	/* Base LID of the port */
143
144
145/* Mapping of Verbs defined return status to channel specific. */
146#define	IBT_QP_FULL			IBT_CHAN_FULL
147#define	IBT_QP_HDL_INVALID		IBT_CHAN_HDL_INVALID
148#define	IBT_QP_ATTR_RO			IBT_CHAN_ATTR_RO
149#define	IBT_QP_STATE_INVALID		IBT_CHAN_STATE_INVALID
150#define	IBT_QP_SRV_TYPE_INVALID		IBT_CHAN_SRV_TYPE_INVALID
151#define	IBT_QP_IN_USE			IBT_CHAN_IN_USE
152#define	IBT_QP_ATOMICS_NOT_SUPPORTED	IBT_CHAN_ATOMICS_NOT_SUPPORTED
153#define	IBT_QP_OP_TYPE_INVALID		IBT_CHAN_OP_TYPE_INVALID
154#define	IBT_QP_SGL_FORMAT_INVALID	IBT_CHAN_SGL_FORMAT_INVALID
155#define	IBT_QP_SGL_LEN_INVALID		IBT_CHAN_SGL_LEN_INVALID
156#define	IBT_QP_APM_STATE_INVALID	IBT_CHAN_APM_STATE_INVALID
157#define	IBT_QP_SZ_INSUFFICIENT		IBT_CHAN_SZ_INSUFFICIENT
158#define	IBT_QP_SPECIAL_TYPE_INVALID	IBT_CHAN_SPECIAL_TYPE_INVALID
159#define	IBT_WC_LOCAL_QP_OP_ERR		IBT_WC_LOCAL_CHAN_OP_ERR
160#define	IBT_AH_HDL_INVALID		IBT_UD_DEST_HDL_INVALID
161#define	IBT_HCA_MCG_QP_EXCEEDED		IBT_HCA_MCG_CHAN_EXCEEDED
162#define	IBT_MC_MLID_INVALID		IBT_MC_OPAQUE
163#define	IBT_QP_SRQ			IBT_CHAN_SRQ
164#define	IBT_QP_TYPE_2A_MW_BOUND		IBT_CHAN_TYPE_2A_MW_BOUND
165#define	IBT_QP_WQE_SZ_INSUFF		IBT_CHAN_WQE_SZ_INSUFF
166
167
168/*
169 * ibt_cep_path_t
170 */
171#define	cep_timeout	cep_cm_opaque1	/* 6 bits of timeout exponent */
172					/* Local ACK timeout for RC */
173
174/*
175 * Define an ibt UD Destination struct. This holds all the information
176 * needed to reach a UD destination.
177 *
178 * The ibt_ud_dest_s struct is known by the CI and IBTL.  This structure is
179 * referenced by the CI during UD work request processing.  It is defined here
180 * here so that IBTL does not need to do any data copying during ibt_post_send.
181 */
182typedef struct ibt_ud_dest_s {
183	ibt_ah_hdl_t		ud_ah;		/* Address handle */
184	ib_qpn_t		ud_dst_qpn;	/* Destination QPN */
185	ib_qkey_t		ud_qkey;	/* Q_Key */
186
187	/* The following fields are IBTL-only, i.e., opaque to the CI */
188	struct ibtl_hca_s	*ud_dest_opaque1;
189} ibt_ud_dest_t;
190
191/*
192 * Reserved For Future Use
193 * RD destination address info.
194 */
195typedef struct ibt_rd_dest_s {
196	ibt_ah_hdl_t	rd_ah;		/* Address handle */
197	ib_eecn_t	rd_eecn;	/* Local EEC Number */
198	ib_qpn_t	rd_dst_qpn;	/* Destination QP Number */
199	ib_qkey_t	rd_dst_qkey;	/* The Q_Key for the destination QP */
200} ibt_rd_dest_t;
201
202/*
203 * QP Type.
204 */
205typedef enum ibt_qp_type_e {
206	IBT_RC_RQP	= 0,
207	IBT_RD_RQP	= 1,	/* Reserved For Future Use */
208	IBT_UC_RQP	= 2,	/* Reserved For Future Use */
209	IBT_UD_RQP	= 3
210} ibt_qp_type_t;
211
212/*
213 * Special QP Type.
214 */
215typedef enum ibt_sqp_type_e {
216	IBT_SMI_SQP		= 0,
217	IBT_GSI_SQP		= 1,
218	IBT_RAWIP_SQP		= 2,	/* Reserved For Future Use */
219	IBT_RAWETHER_SQP	= 3	/* Reserved For Future Use */
220} ibt_sqp_type_t;
221
222/*
223 * QP alloc flags.
224 */
225typedef enum ibt_qp_alloc_flags_e {
226	IBT_QP_NO_FLAGS		= 0,
227	IBT_QP_USER_MAP		= (1 << 0),
228	IBT_QP_DEFER_ALLOC	= (1 << 1),
229	IBT_QP_USES_SRQ		= (1 << 2),
230	IBT_QP_USES_RSS		= (1 << 3),
231
232	/* FC variants of UD */
233	IBT_QP_USES_RFCI	= (1 << 4),
234	IBT_QP_USES_FCMD	= (1 << 5),
235	IBT_QP_USES_FEXCH	= (1 << 6)
236} ibt_qp_alloc_flags_t;
237
238/*
239 * QP Alloc Attributes definition.
240 *
241 * Contains the QP attributes that are required to create a QP.
242 */
243typedef struct ibt_qp_alloc_attr_s {
244	ibt_qp_alloc_flags_t	qp_alloc_flags;
245	ibt_cq_hdl_t		qp_scq_hdl;	/* SQ CQ IBT Hdl */
246	ibt_cq_hdl_t		qp_rcq_hdl;	/* RQ CQ IBT Hdl */
247	ibt_rdd_hdl_t		qp_rdd_hdl;	/* Reserved */
248	ibt_pd_hdl_t		qp_pd_hdl;	/* PD handle. */
249	ibt_chan_sizes_t	qp_sizes;	/* Queue and SGL */
250	ibt_attr_flags_t	qp_flags;	/* SQ Signaling Type etc */
251	ibt_opaque1_t		qp_opaque1;
252	ibt_opaque1_t		qp_opaque2;
253	ibt_srq_hdl_t		qp_srq_hdl;	/* SRQ ibt hdl */
254	ibt_opaque2_t		qp_opaque3;
255	ibt_fc_attr_t		qp_fc;
256} ibt_qp_alloc_attr_t;
257
258
259/*
260 * QP query info
261 */
262/* RC transport specific */
263typedef struct ibt_qp_rc_attr_s {
264	uint32_t		rc_sq_psn:24;	/* SQ PSN */
265	uint32_t		rc_rq_psn:24;	/* RQ PSN */
266	ib_qpn_t		rc_dst_qpn;	/* Destination QPN */
267	ibt_cep_cmstate_t	rc_mig_state;	/* Channel Migration State */
268	ibt_rnr_retry_cnt_t	rc_rnr_retry_cnt;
269	uint8_t			rc_retry_cnt:3;
270	uint8_t			rc_rdma_ra_out;	/* max RDMA-R/Atomic sent */
271						/* Number of RDMA RD's & */
272						/* Atomics outstanding */
273	uint8_t			rc_rdma_ra_in;	/* Incoming RDMA-R/Atomic */
274						/* Responder resources for */
275						/* handling incoming RDMA */
276						/* RD's & Atomics */
277	ibt_rnr_nak_time_t	rc_min_rnr_nak;	/* min RNR-NAK timer */
278	ib_mtu_t		rc_path_mtu;
279	ibt_cep_path_t		rc_path;	/* primary path */
280	ibt_cep_path_t		rc_alt_path;	/* alternate path */
281} ibt_qp_rc_attr_t;
282
283/*
284 * Reserved For Future Use.
285 * UC transport specific
286 */
287typedef struct ibt_qp_uc_attr_s {
288	uint32_t		uc_sq_psn:24;	/* SQ PSN */
289	uint32_t		uc_rq_psn:24;	/* RQ PSN */
290	ib_qpn_t		uc_dst_qpn;	/* destination QPN */
291	ibt_cep_cmstate_t	uc_mig_state;	/* Channel Migration State */
292	ib_mtu_t		uc_path_mtu;
293	ibt_cep_path_t		uc_path;	/* primary path */
294	ibt_cep_path_t		uc_alt_path;	/* alternate path */
295} ibt_qp_uc_attr_t;
296
297/*
298 * Reserved For Future Use.
299 * RD transport specific
300 */
301typedef struct ibt_qp_rd_attr_s {
302	ib_qkey_t		rd_qkey;
303	ibt_rnr_nak_time_t	rd_min_rnr_nak;	/* min RNR-NAK timer */
304} ibt_qp_rd_attr_t;
305
306/* UD transport specific */
307typedef struct ibt_qp_ud_attr_s {
308	ib_qkey_t	ud_qkey;	/* Q_Key */
309	uint32_t	ud_sq_psn:24;	/* SQ PSN */
310	uint16_t	ud_pkey_ix;	/* P_Key Index */
311	uint8_t		ud_port;	/* port */
312	ibt_rss_attr_t	ud_rss;		/* RSS stuff */
313	ibt_fc_attr_t	ud_fc;
314} ibt_qp_ud_attr_t;
315
316/*
317 * Common QP Info
318 */
319typedef struct ibt_qp_info_s {
320	uint_t			qp_sq_sz;	/* SQ WQEs */
321	uint_t			qp_rq_sz;	/* RQ WQEs */
322	ibt_cep_state_t		qp_state;	/* QP state */
323	ibt_cep_state_t		qp_current_state; /* current state for */
324						/* modify_qp to RTS state */
325	ibt_cep_flags_t		qp_flags;	/* QP flags */
326	ibt_tran_srv_t		qp_trans;	/* transport service type */
327	union {					/* transport specific */
328		ibt_qp_rc_attr_t	rc;
329		ibt_qp_rd_attr_t	rd;	/* Reserved For Future Use */
330		ibt_qp_uc_attr_t	uc;	/* Reserved For Future Use */
331		ibt_qp_ud_attr_t	ud;
332	} qp_transport;
333} ibt_qp_info_t;
334
335/*
336 * QP Query Attributes definition.
337 */
338typedef struct ibt_qp_query_attr_s {
339	ibt_cq_hdl_t		qp_sq_cq;	/* SQ CQ */
340	ibt_cq_hdl_t		qp_rq_cq;	/* RQ CQ */
341	ibt_rdd_hdl_t		qp_rdd_hdl;	/* Reserved */
342	ib_qpn_t		qp_qpn;		/* QPN */
343	uint_t			qp_sq_sgl;	/* max SQ SGL */
344	uint_t			qp_rq_sgl;	/* max RQ SGL */
345	ibt_qp_info_t		qp_info;	/* Modifiable attributes */
346	ibt_srq_hdl_t		qp_srq;		/* SRQ hdl or NULL */
347	ibt_attr_flags_t	qp_flags;
348	ibt_fexch_query_attr_t	qp_query_fexch;	/* FEXCH query only set */
349} ibt_qp_query_attr_t;
350
351
352/*
353 * Reserved For Future Use.
354 * EEC Info.
355 */
356typedef struct ibt_eec_info_s {
357	uint32_t		eec_sq_psn:24;	/* SQ PSN */
358	uint32_t		eec_rq_psn:24;	/* RQ PSN */
359	ib_eecn_t		eec_dst_eecn;	/* destination EECN */
360	ibt_cep_state_t		eec_state;	/* EEC state */
361	ibt_cep_cmstate_t	eec_mig;	/* channel migration state */
362	uint8_t			eec_rdma_ra_out;	/* RDMA-R/Atomics out */
363	uint8_t			eec_rdma_ra_in;		/* RDMA-R/Atomics in */
364	uint8_t			eec_retry_cnt:3;
365	ibt_rnr_retry_cnt_t	eec_rnr_retry_cnt;
366	ib_mtu_t		eec_path_mtu;
367	ibt_cep_path_t		eec_prim_path;	/* primary path */
368	ibt_cep_path_t		eec_alt_path;	/* alternate path */
369} ibt_eec_info_t;
370
371/*
372 * Reserved For Future Use.
373 * EEC Query Attributes definition.
374 */
375typedef struct ibt_eec_query_attr_s {
376	ib_eecn_t		eec_eecn;	/* The EEC Number */
377	ibt_rdd_hdl_t		eec_rdd_hdl;
378	ibt_eec_info_t		eec_info;	/* Modifiable attributes */
379} ibt_eec_query_attr_t;
380
381
382#define	ibt_ah_flags_t	ibt_ud_dest_flags_t
383#define	IBT_AH_NO_FLAGS		IBT_UD_DEST_NO_FLAGS
384#define	IBT_AH_USER_MAP		IBT_UD_DEST_USER_MAP
385#define	IBT_AH_DEFER_ALLOC	IBT_UD_DEST_DEFER_ALLOC
386
387
388/*
389 * ibt_hca_attr_t
390 */
391#define	hca_max_rdd		hca_opaque2	/* Max RDDs in HCA */
392#define	hca_max_eec		hca_opaque3	/* Max EEContexts in HCA */
393#define	hca_max_rd_sgl		hca_opaque4	/* Max SGL entries per RD WR */
394#define	hca_max_rdma_in_ee	hca_opaque5	/* Max RDMA Reads/Atomics in */
395						/* per EEC with HCA as target */
396#define	hca_max_rdma_out_ee	hca_opaque6	/* Max RDMA Reads/Atomics out */
397						/* per EE by this HCA */
398#define	hca_max_ipv6_qp		hca_max_ipv6_chan
399#define	hca_max_ether_qp	hca_max_ether_chan
400#define	hca_eec_max_ci_priv_sz	hca_opaque7
401#define	hca_rdd_max_ci_priv_sz	hca_opaque8
402#define	hca_max_map_per_fmr	hca_opaque9
403
404#ifdef __cplusplus
405}
406#endif
407
408#endif	/* _SYS_IB_IBTL_IBTL_CI_TYPES_H */
409