[HCA] Add client reregister support.
[mirror/winof/.git] / hw / mt23108 / vapi / Hca / verbs / vapi_types.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2004-2005 Mellanox Technologies Ltd.  All rights reserved.\r
4  *\r
5  * This software is available to you under the OpenIB.org BSD license\r
6  * below:\r
7  *\r
8  *     Redistribution and use in source and binary forms, with or\r
9  *     without modification, are permitted provided that the following\r
10  *     conditions are met:\r
11  *\r
12  *      - Redistributions of source code must retain the above\r
13  *        copyright notice, this list of conditions and the following\r
14  *        disclaimer.\r
15  *\r
16  *      - Redistributions in binary form must reproduce the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer in the documentation and/or other materials\r
19  *        provided with the distribution.\r
20  *\r
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  *\r
30  * $Id$\r
31  */\r
32 \r
33 #ifndef H_VAPI_TYPES_H\r
34 #define H_VAPI_TYPES_H\r
35 \r
36 #include <mtl_common.h>\r
37 #include <ib_defs.h>\r
38 \r
39 \r
40 /* This is same as constant in MDOAL and MDHAL */\r
41 #define HCA_MAXNAME 32\r
42 \r
43 \r
44 /*\r
45  * HCA Types\r
46  *\r
47  *\r
48  */\r
49 typedef     char            VAPI_hca_id_t[HCA_MAXNAME]; /* NULL terminated string of up to HCA_MAXNAME-1 chars */\r
50 typedef     u_int32_t       VAPI_hca_hndl_t;      /* HCA handle                */\r
51 typedef     MT_ulong_ptr_t   VAPI_pd_hndl_t;       /* Protection Domain handle  */\r
52 typedef     MT_ulong_ptr_t   VAPI_ud_av_hndl_t;    /* UD Address Vector Handle  */\r
53 typedef     MT_ulong_ptr_t   VAPI_cq_hndl_t;       /* Completion Queue handle   */\r
54 typedef     MT_ulong_ptr_t   VAPI_qp_hndl_t;       /* Queue Pair handle         */\r
55 typedef     MT_ulong_ptr_t   VAPI_srq_hndl_t;      /* Shared Receive Queue handle */\r
56 typedef     u_int32_t        VAPI_devmem_hndl_t;\r
57 typedef     u_int32_t       VAPI_mr_hndl_t;       /* Memory Region Handle      */\r
58 typedef     MT_ulong_ptr_t   VAPI_mw_hndl_t;       /* Memory Window Handle      */\r
59 typedef     u_int32_t       VAPI_eec_hndl_t;      /* E2E Context Handle        */\r
60 typedef     u_int32_t       VAPI_pkey_ix_t;       /* Pkey index                */\r
61 typedef     u_int32_t       VAPI_rdd_hndl_t;      /* RD domain handle          */\r
62 typedef     u_int32_t       VAPI_key_counter_t;   /* QKEY/PKEY violation counter type */\r
63 typedef     IB_wqpn_t       VAPI_qp_num_t;        /* QP number (24 bits)       */\r
64 typedef     IB_eecn_t       VAPI_eec_num_t;       /* EEC number (24 bits)      */\r
65 typedef     u_int8_t        VAPI_sched_queue_t;   /* Schedule queue index      */\r
66 typedef     IB_psn_t        VAPI_psn_t;           /* PSN number (24 bits)      */\r
67 typedef     IB_qkey_t       VAPI_qkey_t;          /* QKey (32 bits)            */\r
68 typedef     u_int8_t        VAPI_retry_count_t;   /* Number of retries         */\r
69 typedef     u_int8_t       VAPI_timeout_t;        /* Timeout= 4.096usec * 2^<this_type> */\r
70 typedef     u_int32_t       VAPI_cqe_num_t;       /* number of entries in CQ*/\r
71 typedef     u_int32_t       VAPI_lkey_t;          /* L Key                     */\r
72 typedef     IB_rkey_t       VAPI_rkey_t;          /* R Key                     */                             \r
73 typedef     IB_virt_addr_t  VAPI_virt_addr_t;     /* Virtual Address (/Length) */\r
74 typedef     u_int64_t       VAPI_phy_addr_t;      /* Physical address (/length)*/\r
75 typedef     u_int64_t       VAPI_size_t;\r
76 typedef     u_int64_t       VAPI_wr_id_t;         /* Work request id           */\r
77 typedef     u_int32_t       VAPI_imm_data_t;      /* Immediate data            */\r
78 typedef     u_int16_t       VAPI_ethertype_t;     /* Ethertype                 */\r
79 /* TBD: Those two types below may be removed... (check references) */\r
80 typedef     IB_gid_t        VAPI_gid_t;           /* GID                       */\r
81 typedef     IB_pkey_t       VAPI_pkey_t;          /* PKey (16 bits)            */\r
82 \r
83 /* Use the following macro to init handles and denote uninitialized handles */\r
84 #define VAPI_INVAL_HNDL ((MT_long_ptr_t)-1)\r
85 #define VAPI_INVAL_SRQ_HNDL VAPI_INVAL_HNDL\r
86 #define VAPI_INVAL_PD_HNDL VAPI_INVAL_HNDL\r
87 \r
88 #define EVAPI_DEFAULT_AVS_PER_PD  0xFFFFFFFF\r
89 \r
90 /* HCA Cap Flags */\r
91 typedef enum {\r
92   VAPI_RESIZE_OUS_WQE_CAP     = 1, \r
93   VAPI_BAD_PKEY_COUNT_CAP     = (1<<1), \r
94   VAPI_BAD_QKEY_COUNT_CAP     = (1<<2),\r
95   VAPI_RAW_MULTI_CAP          = (1<<3), \r
96   VAPI_AUTO_PATH_MIG_CAP      = (1<<4),\r
97   VAPI_CHANGE_PHY_PORT_CAP    = (1<<5),   \r
98   VAPI_UD_AV_PORT_ENFORCE_CAP = (1<<6),   /* IBTA comment #1821 */\r
99   VAPI_CURR_QP_STATE_MOD_CAP  = (1<<7),   /*IB Spec 1.09 sec 11.2.1.2 */\r
100   VAPI_SHUTDOWN_PORT_CAP      = (1<<8),   /*IB Spec 1.09 sec 11.2.1.2 */\r
101   VAPI_INIT_TYPE_CAP          = (1<<9),   /*IB Spec 1.09 sec 11.2.1.2 */\r
102   VAPI_PORT_ACTIVE_EV_CAP     = (1<<10),  /*IB Spec 1.09 sec 11.2.1.2 */\r
103   VAPI_SYS_IMG_GUID_CAP       = (1<<11),  /*IB Spec 1.09 sec 11.2.1.2 */\r
104   VAPI_RC_RNR_NAK_GEN_CAP     = (1<<12)   /*IB Spec 1.09 sec 11.2.1.2 */\r
105 } VAPI_hca_cap_flags_t;\r
106 \r
107 \r
108 /* HCA attributes mask enumeration */\r
109 typedef enum {\r
110   HCA_ATTR_IS_SM              = 1,\r
111   HCA_ATTR_IS_SNMP_TUN_SUP    = 2,\r
112   HCA_ATTR_IS_DEV_MGT_SUP     = 4,\r
113   HCA_ATTR_IS_VENDOR_CLS_SUP  = 8,\r
114   HCA_ATTR_IS_CLIENT_REREGISTRATION_SUP  = 16,\r
115   HCA_ATTR_MAX                = 32 /*Dummy enum entry: always keep it the last one */\r
116 } VAPI_hca_attr_mask_enum_t;\r
117 \r
118 \r
119 /* HCA attributes mask */\r
120 typedef u_int32_t VAPI_hca_attr_mask_t;\r
121 \r
122 #define HCA_ATTR_MASK_CLR_ALL(mask)   ((mask)=0)\r
123 #define HCA_ATTR_MASK_SET_ALL(mask)   ((mask)=(HCA_ATTR_MAX-1))\r
124 #define HCA_ATTR_MASK_SET(mask,attr)  ((mask)|=(attr))\r
125 #define HCA_ATTR_MASK_CLR(mask,attr)  ((mask)&=(~(attr)))\r
126 #define HCA_ATTR_IS_FLAGS_SET(mask)   (((mask)&(\\r
127         HCA_ATTR_IS_SM|\\r
128         HCA_ATTR_IS_SNMP_TUN_SUP|\\r
129         HCA_ATTR_IS_DEV_MGT_SUP|\\r
130         HCA_ATTR_IS_VENDOR_CLS_SUP|\\r
131         HCA_ATTR_IS_CLIENT_REREGISTRATION_SUP))!=0)\r
132 #define HCA_ATTR_IS_SET(mask,attr)    (((mask)&(attr))!=0)\r
133 \r
134 /* QP attributes mask enumeration */\r
135 typedef enum {\r
136   QP_ATTR_QP_STATE            = 0x1,            /* QP next state                                                                                */\r
137   QP_ATTR_EN_SQD_ASYN_NOTIF   = 0x2,            /* Enable SQD affiliated asynchronous event notification        */\r
138   QP_ATTR_QP_NUM              = 0x4,            /* Queue Pair Number. [Mellanox specific]                                       */\r
139   QP_ATTR_REMOTE_ATOMIC_FLAGS = 0x8,            /* Enable/Disable RDMA and atomic                                                       */\r
140   QP_ATTR_PKEY_IX             = 0x10,           /* Primary PKey index                                                           */\r
141   QP_ATTR_PORT                = 0x20,           /* Primary port                                                                 */\r
142   QP_ATTR_QKEY                = 0x40,           /* QKey (UD/RD only)                                                                            */\r
143   QP_ATTR_AV                  = 0x80,           /* Primary remote node address vector (RC/UC QP only)           */\r
144   QP_ATTR_PATH_MTU            = 0x100,          /* Path MTU : 6 bits (connected services only)                          */\r
145   QP_ATTR_TIMEOUT             = 0x200,          /* Local Ack Timeout (RC only)                                                          */\r
146   QP_ATTR_RETRY_COUNT         = 0x400,          /* retry count     (RC only)                                                            */\r
147   QP_ATTR_RNR_RETRY           = 0x800,          /* RNR retry count (RC only)                                                            */\r
148   QP_ATTR_RQ_PSN              = 0x1000,         /* Packet Sequence Number for RQ                                */\r
149   QP_ATTR_QP_OUS_RD_ATOM      = 0x2000,         /* Maximum number of oust. RDMA read/atomic as target           */\r
150   QP_ATTR_ALT_PATH            = 0x4000,         /* Alternate remote node address vector                         */\r
151   QP_ATTR_RSRV_1              = 0x8000,         /* reserved                                                                                             */\r
152   QP_ATTR_RSRV_2              = 0x10000,        /* reserved                                                             */\r
153   QP_ATTR_RSRV_3              = 0x20000,        /* reserved                                                             */\r
154   QP_ATTR_RSRV_4              = 0x40000,        /* reserved                                                             */\r
155   QP_ATTR_RSRV_5              = 0x80000,        /* reserved                                     */\r
156   QP_ATTR_RSRV_6              = 0x100000,       /* reserved                                                             */\r
157   QP_ATTR_MIN_RNR_TIMER       = 0x200000,       /* Minimum RNR NAK timer                                        */\r
158   QP_ATTR_SQ_PSN              = 0x400000,       /* Packet sequence number for SQ                                */\r
159   QP_ATTR_OUS_DST_RD_ATOM     = 0x800000,       /* Number of outstanding RDMA rd/atomic ops at destination      */\r
160   QP_ATTR_PATH_MIG_STATE      = 0x1000000,      /* Migration state                                              */\r
161   QP_ATTR_CAP                 = 0x2000000,      /* QP capabilities max_sq/rq_ous_wr only valid                  */\r
162   QP_ATTR_DEST_QP_NUM         = 0x4000000,      /* Destination QP number (RC/UC)                                */\r
163   QP_ATTR_SCHED_QUEUE         = 0x8000000   /* Schedule queue for QoS association */\r
164 } VAPI_qp_attr_mask_enum_t;        \r
165 \r
166 /* QP attributes mask */\r
167 typedef u_int32_t   VAPI_qp_attr_mask_t;\r
168 \r
169 #define QP_ATTR_MASK_CLR_ALL(mask)  ((mask)=0)\r
170 #define QP_ATTR_MASK_SET_ALL(mask)  ((mask)=(0x07FFFFFF))\r
171 #define QP_ATTR_MASK_SET(mask,attr) ((mask)=((mask)|(attr)))\r
172 #define QP_ATTR_MASK_CLR(mask,attr) ((mask)=((mask)&(~(attr))))\r
173 #define QP_ATTR_IS_SET(mask,attr)   (((mask)&(attr))!=0)\r
174 \r
175 \r
176 /* HCA Atomic Operation Capabilities */\r
177 typedef enum {\r
178   VAPI_ATOMIC_CAP_NONE, /* No Atomic ops supported */\r
179   VAPI_ATOMIC_CAP_HCA,  /* Atomic cap supported within this HCA QPs */\r
180   VAPI_ATOMIC_CAP_GLOB  /* Atomicity supported among all entities in this sytem */\r
181 } VAPI_atomic_cap_t;\r
182 \r
183 /* Signalling type */\r
184 typedef enum {\r
185   VAPI_SIGNAL_ALL_WR, \r
186   VAPI_SIGNAL_REQ_WR\r
187 } VAPI_sig_type_t;\r
188 \r
189 /* Transport Service Type */\r
190 enum {\r
191   VAPI_TS_RC=IB_TS_RC,\r
192   VAPI_TS_RD=IB_TS_RD,\r
193   VAPI_TS_UC=IB_TS_UC,\r
194   VAPI_TS_UD=IB_TS_UD,\r
195   VAPI_TS_RAW=IB_TS_RAW,\r
196   VAPI_NUM_TS_TYPES\r
197 }; \r
198 typedef IB_ts_t VAPI_ts_type_t;\r
199 \r
200 /* The following value to be used for reserved GRH buffer space in UD RQ */\r
201 /* (The offset of the payload in buffers posted to the UD RQ)            */\r
202 #define VAPI_GRH_LEN 40\r
203 \r
204 /* QP state   */\r
205 enum {\r
206   VAPI_RESET,VAPI_INIT,VAPI_RTR,VAPI_RTS,VAPI_SQD,VAPI_SQE,VAPI_ERR\r
207 };\r
208 typedef u_int32_t VAPI_qp_state_t;\r
209 \r
210 /* Migration state  */\r
211 typedef enum {\r
212   VAPI_MIGRATED, VAPI_REARM, VAPI_ARMED\r
213 } VAPI_mig_state_t;\r
214 \r
215 /* Special QP Types */\r
216 enum { \r
217   VAPI_REGULAR_QP= 0, /* Encoding for non-special QP */\r
218   VAPI_SMI_QP, VAPI_GSI_QP, VAPI_RAW_IPV6_QP, VAPI_RAW_ETY_QP \r
219 };\r
220 typedef u_int32_t VAPI_special_qp_t;\r
221 \r
222 /* Just a generic name for a type used to identify QP type */\r
223 typedef VAPI_special_qp_t VAPI_qp_type_t; \r
224 \r
225 /* RDMA/Atomic Access Control */\r
226 typedef enum {\r
227   VAPI_EN_REM_WRITE=1, VAPI_EN_REM_READ=2, VAPI_EN_REM_ATOMIC_OP=4\r
228\r
229 VAPI_rdma_atom_acl_enum_t;\r
230 typedef u_int32_t VAPI_rdma_atom_acl_t;\r
231 \r
232 /* Memory region/window types */\r
233 typedef enum {\r
234   VAPI_MR,    /* Memory region */\r
235   VAPI_MW,    /* Memory Window */\r
236   VAPI_MPR,   /* Physical memory region */\r
237   VAPI_MSHAR  /* Shared memory region */\r
238 } VAPI_mrw_type_t;\r
239 \r
240 /* Remote node address type */\r
241 typedef enum {\r
242   VAPI_RNA_RD, \r
243   VAPI_RNA_UD, \r
244   VAPI_RNA_RAW_ETY, \r
245   VAPI_RNA_RAW_IPV6 \r
246 } VAPI_remote_node_addr_type_t;\r
247 \r
248 /* Memory region/window ACLs */\r
249 enum {\r
250   VAPI_EN_LOCAL_WRITE=  1, \r
251   VAPI_EN_REMOTE_WRITE= 1<<1, \r
252   VAPI_EN_REMOTE_READ=  1<<2, \r
253   VAPI_EN_REMOTE_ATOM=  1<<3, \r
254   VAPI_EN_MEMREG_BIND=  1<<4\r
255 };\r
256 typedef u_int32_t VAPI_mrw_acl_t;\r
257 \r
258 /* Memory region change type */\r
259 typedef enum {\r
260   VAPI_MR_CHANGE_TRANS= 1,\r
261   VAPI_MR_CHANGE_PD=    1<<1,\r
262   VAPI_MR_CHANGE_ACL=   1<<2\r
263 } VAPI_mr_change_flags_t; \r
264 \r
265 typedef u_int32_t VAPI_mr_change_t; /*  VAPI_mr_change_flags_t combination */\r
266 \r
267 typedef enum {\r
268     EVAPI_DEVMEM_EXT_DRAM   /* External attached SDRAM */\r
269 }EVAPI_devmem_type_t;\r
270 \r
271 \r
272 /* Work requests opcodes */\r
273 /* Note. The following enum must be maintained zero based without holes */\r
274 typedef enum {\r
275   VAPI_RDMA_WRITE,\r
276   VAPI_RDMA_WRITE_WITH_IMM,\r
277   VAPI_SEND,\r
278   VAPI_SEND_WITH_IMM,\r
279   VAPI_RDMA_READ,\r
280   VAPI_ATOMIC_CMP_AND_SWP,\r
281   VAPI_ATOMIC_FETCH_AND_ADD,\r
282   VAPI_RECEIVE,\r
283   VAPI_NUM_OPCODES\r
284 } VAPI_wr_opcode_t;\r
285 \r
286 /* Completion Opcodes */\r
287 typedef enum {\r
288   VAPI_CQE_SQ_SEND_DATA,        \r
289   VAPI_CQE_SQ_RDMA_WRITE,\r
290   VAPI_CQE_SQ_RDMA_READ,\r
291   VAPI_CQE_SQ_COMP_SWAP,\r
292   VAPI_CQE_SQ_FETCH_ADD,\r
293   VAPI_CQE_SQ_BIND_MRW,\r
294   VAPI_CQE_RQ_SEND_DATA,\r
295   VAPI_CQE_RQ_RDMA_WITH_IMM,    /* For RDMA Write Only */\r
296   VAPI_CQE_INVAL_OPCODE = 0xFFFFFFFF  /* special value to return on CQE with error */\r
297 } VAPI_cqe_opcode_t;\r
298 \r
299 \r
300 /* Work completion status */\r
301 enum {\r
302   VAPI_SUCCESS = IB_COMP_SUCCESS,\r
303   VAPI_LOC_LEN_ERR = IB_COMP_LOC_LEN_ERR,\r
304   VAPI_LOC_QP_OP_ERR = IB_COMP_LOC_QP_OP_ERR,\r
305   VAPI_LOC_EE_OP_ERR = IB_COMP_LOC_EE_OP_ERR,\r
306   VAPI_LOC_PROT_ERR = IB_COMP_LOC_PROT_ERR,\r
307   VAPI_WR_FLUSH_ERR = IB_COMP_WR_FLUSH_ERR,\r
308   VAPI_MW_BIND_ERR = IB_COMP_MW_BIND_ERR,\r
309   VAPI_BAD_RESP_ERR = IB_COMP_BAD_RESP_ERR,\r
310   VAPI_LOC_ACCS_ERR = IB_COMP_LOC_ACCS_ERR,\r
311   VAPI_REM_INV_REQ_ERR = IB_COMP_REM_INV_REQ_ERR,\r
312   VAPI_REM_ACCESS_ERR = IB_COMP_REM_ACCESS_ERR,\r
313   VAPI_REM_OP_ERR = IB_COMP_REM_OP_ERR,\r
314   VAPI_RETRY_EXC_ERR = IB_COMP_RETRY_EXC_ERR,\r
315   VAPI_RNR_RETRY_EXC_ERR = IB_COMP_RNR_RETRY_EXC_ERR,\r
316   VAPI_LOC_RDD_VIOL_ERR = IB_COMP_LOC_RDD_VIOL_ERR,\r
317   VAPI_REM_INV_RD_REQ_ERR = IB_COMP_REM_INV_RD_REQ_ERR,\r
318   VAPI_REM_ABORT_ERR= IB_COMP_REM_ABORT_ERR,\r
319   VAPI_INV_EECN_ERR = IB_COMP_INV_EECN_ERR,\r
320   VAPI_INV_EEC_STATE_ERR = IB_COMP_INV_EEC_STATE_ERR,\r
321 /*  VAPI_COMP_LOC_TOUT = IB_COMP_LOC_TOUT,*/ /* Use VAPI_RETRY_EXC_ERR instead */\r
322 /*  VAPI_COMP_RNR_TOUT = IB_COMP_RNR_TOUT,*/ /* Use VAPI_RNR_RETRY_EXC_ERR instead */\r
323 \r
324   VAPI_COMP_FATAL_ERR = IB_COMP_FATAL_ERR,\r
325   VAPI_COMP_GENERAL_ERR = IB_COMP_GENERAL_ERR\r
326 };\r
327 typedef u_int32_t VAPI_wc_status_t;\r
328 \r
329 /* Vendor specific error syndrome */\r
330 typedef u_int32_t EVAPI_vendor_err_syndrome_t;\r
331 \r
332 /* work request completion type */\r
333 typedef enum {\r
334   VAPI_SIGNALED, VAPI_UNSIGNALED\r
335 } VAPI_comp_type_t;\r
336 \r
337 /* Completion Notification Type */\r
338 typedef enum {\r
339   VAPI_NOTIF_NONE,  /* No completion notification requested */\r
340   VAPI_SOLIC_COMP,    /* Notify on solicited completion event only */\r
341   VAPI_NEXT_COMP   /* Notify on next completion */\r
342 } VAPI_cq_notif_type_t;\r
343 \r
344 typedef VAPI_cq_hndl_t  EVAPI_compl_handler_hndl_t;       /* EVAPI completion handler handle */\r
345 \r
346 typedef u_int32_t VAPI_k_cq_hndl_t; /* Kernel level CQ access */\r
347 \r
348 /* Completion Event Handler Pointer */\r
349 typedef void (MT_API *VAPI_completion_event_handler_t)(\r
350                                                 /*IN*/ VAPI_hca_hndl_t hca_hndl,\r
351                                                 /*IN*/ VAPI_cq_hndl_t cq_hndl,\r
352                                                 /*IN*/ void* private_data\r
353                                                );\r
354 \r
355 /* CQ destruction callback */\r
356 typedef void (MT_API *EVAPI_destroy_cq_cbk_t)(\r
357                                         IN VAPI_hca_hndl_t k_hca_hndl,\r
358                                         IN VAPI_k_cq_hndl_t k_cq_hndl,\r
359                                         IN void* private_data\r
360                                        );\r
361 \r
362 \r
363 typedef u_int32_t VAPI_k_qp_hndl_t; /* Kernel level QP access */\r
364 \r
365 typedef void (MT_API *EVAPI_destroy_qp_cbk_t)(\r
366                                         IN VAPI_hca_hndl_t k_hca_hndl,\r
367                                         IN VAPI_k_qp_hndl_t k_qp_hndl,\r
368                                         IN void* private_data\r
369                                        );\r
370  \r
371 \r
372 /* Event Record Event Types, valid modifier mentionned where unclear */\r
373 typedef enum {\r
374   VAPI_QP_PATH_MIGRATED,             /*QP*/\r
375   VAPI_EEC_PATH_MIGRATED,            /*EEC*/\r
376   VAPI_QP_COMM_ESTABLISHED,          /*QP*/\r
377   VAPI_EEC_COMM_ESTABLISHED,         /*EEC*/ \r
378   VAPI_SEND_QUEUE_DRAINED,           /*QP*/\r
379   VAPI_RECEIVE_QUEUE_DRAINED,        /*QP (Last WQE Reached) */\r
380   VAPI_SRQ_LIMIT_REACHED,            /*SRQ*/\r
381   VAPI_SRQ_CATASTROPHIC_ERROR,       /*SRQ*/\r
382   VAPI_CQ_ERROR,                     /*CQ*/\r
383   VAPI_LOCAL_WQ_INV_REQUEST_ERROR,   /*QP*/\r
384   VAPI_LOCAL_WQ_ACCESS_VIOL_ERROR,   /*QP*/\r
385   VAPI_LOCAL_WQ_CATASTROPHIC_ERROR,  /*QP*/\r
386   VAPI_PATH_MIG_REQ_ERROR,           /*QP*/\r
387   VAPI_LOCAL_EEC_CATASTROPHIC_ERROR, /*EEC*/\r
388   VAPI_LOCAL_CATASTROPHIC_ERROR,     /*none*/\r
389   VAPI_PORT_ERROR,                   /*PORT*/\r
390   VAPI_PORT_ACTIVE,                   /*PORT*/\r
391   VAPI_CLIENT_REREGISTER\r
392 } VAPI_event_record_type_t;\r
393 \r
394 \r
395 typedef enum {\r
396   VAPI_EV_SYNDROME_NONE, /* no special syndrom for this event */\r
397   VAPI_CATAS_ERR_FW_INTERNAL,\r
398   VAPI_CATAS_ERR_EQ_OVERFLOW,\r
399   VAPI_CATAS_ERR_MISBEHAVED_UAR_PAGE,\r
400   VAPI_CATAS_ERR_UPLINK_BUS_ERR, \r
401   VAPI_CATAS_ERR_HCA_DDR_DATA_ERR,\r
402   VAPI_CATAS_ERR_INTERNAL_PARITY_ERR,\r
403   VAPI_CATAS_ERR_MASTER_ABORT,\r
404   VAPI_CATAS_ERR_GO_BIT,\r
405   VAPI_CATAS_ERR_CMD_TIMEOUT,\r
406   VAPI_CATAS_ERR_FATAL_CR,       /* unexpected read from CR space */\r
407   VAPI_CATAS_ERR_FATAL_TOKEN,    /* invalid token on command completion */\r
408   VAPI_CATAS_ERR_GENERAL,        /* reason is not known */\r
409   VAPI_CQ_ERR_OVERRUN,\r
410   VAPI_CQ_ERR_ACCESS_VIOL,\r
411   VAPI_CATAS_ERR_FATAL_EXTERNAL  /* externally generated artificial fatal error */\r
412 } VAPI_event_syndrome_t;\r
413 \r
414  /* Event Record  */\r
415 typedef struct {\r
416   VAPI_event_record_type_t    type;           /* event record type            */\r
417   VAPI_event_syndrome_t  syndrome;\r
418   union {\r
419     VAPI_qp_hndl_t              qp_hndl;        /* Affiliated QP handle         */\r
420     VAPI_srq_hndl_t             srq_hndl;       /* Affiliated SRQ handle        */\r
421     VAPI_eec_hndl_t             eec_hndl;       /* Affiliated EEC handle        */\r
422     VAPI_cq_hndl_t              cq_hndl;        /* Affiliated CQ handle         */\r
423     IB_port_t                   port_num;       /* Affiliated Port number       */\r
424   } modifier;\r
425 }  VAPI_event_record_t;\r
426 \r
427 /* Async Event Handler */\r
428 typedef void (MT_API *VAPI_async_event_handler_t)(\r
429                                            /*IN*/ VAPI_hca_hndl_t hca_hndl,\r
430                                            /*IN*/ VAPI_event_record_t *event_record_p, \r
431                                            /*IN*/ void* private_data\r
432                                           );\r
433 \r
434 typedef u_int32_t EVAPI_async_handler_hndl_t;  /* EVAPI async event handler handle */\r
435 \r
436 \r
437 /* HCA Verbs returns values */\r
438 #define VAPI_ERROR_LIST \\r
439 VAPI_ERROR_INFO( VAPI_OK,                    = 0  ,"Operation Completed Successfully") \\r
440 VAPI_ERROR_INFO( VAPI_EGEN,                  =-255,"Generic error") \\r
441 VAPI_ERROR_INFO( VAPI_EFATAL,                EMPTY,"Fatal error (Local Catastrophic Error)") \\r
442 VAPI_ERROR_INFO( VAPI_EAGAIN,                EMPTY,"Resources temporary unavailable") \\r
443 VAPI_ERROR_INFO( VAPI_ENOMEM,                        EMPTY,"Not enough memory") \\r
444 VAPI_ERROR_INFO( VAPI_EBUSY,                 EMPTY,"Resource is busy") \\r
445 VAPI_ERROR_INFO( VAPI_ETIMEOUT,              EMPTY,"Operation timedout") \\r
446 VAPI_ERROR_INFO( VAPI_EINTR,                 EMPTY,"Operation interrupted") \\r
447 VAPI_ERROR_INFO( VAPI_EPERM,                 EMPTY,"Not enough permissions to perform operation")\\r
448 VAPI_ERROR_INFO( VAPI_ENOSYS,                EMPTY,"Not implemented") \\r
449 VAPI_ERROR_INFO( VAPI_ESYSCALL,              EMPTY,"Error in an underlying O/S call") \\r
450 VAPI_ERROR_INFO( VAPI_EINVAL_PARAM,          EMPTY,"Invalid Parameter") \\r
451 VAPI_ERROR_INFO( VAPI_EINVAL_HCA_HNDL,       EMPTY,"Invalid HCA Handle.") \\r
452 VAPI_ERROR_INFO( VAPI_EINVAL_HCA_ID,         EMPTY,"Invalid HCA identifier") \\r
453 VAPI_ERROR_INFO( VAPI_EINVAL_COUNTER,        EMPTY,"Invalid key counter index") \\r
454 VAPI_ERROR_INFO( VAPI_EINVAL_COUNT_VAL,      EMPTY,"Invalid counter value") \\r
455 VAPI_ERROR_INFO( VAPI_EINVAL_PD_HNDL,        EMPTY,"Invalid Protection Domain") \\r
456 VAPI_ERROR_INFO( VAPI_EINVAL_RD_UNSUPPORTED, EMPTY,"RD is not supported") \\r
457 VAPI_ERROR_INFO( VAPI_EINVAL_RDD_HNDL,       EMPTY,"Invalid Reliable Datagram Domain") \\r
458 VAPI_ERROR_INFO( VAPI_EINVAL_AV_HNDL,        EMPTY,"Invalid Address Vector Handle") \\r
459 VAPI_ERROR_INFO( VAPI_E2BIG_WR_NUM,          EMPTY,"Max. WR number exceeds capabilities") \\r
460 VAPI_ERROR_INFO( VAPI_E2BIG_SG_NUM,          EMPTY,"Max. SG size exceeds capabilities") \\r
461 VAPI_ERROR_INFO( VAPI_EINVAL_SERVICE_TYPE,   EMPTY,"Invalid Service Type") \\r
462 VAPI_ERROR_INFO( VAPI_ENOSYS_ATTR,           EMPTY,"Unsupported attribute") \\r
463 VAPI_ERROR_INFO( VAPI_EINVAL_ATTR,           EMPTY,"Can not change attribute") \\r
464 VAPI_ERROR_INFO( VAPI_ENOSYS_ATOMIC,         EMPTY,"Atomic operations not supported") \\r
465 VAPI_ERROR_INFO( VAPI_EINVAL_PKEY_IX,        EMPTY,"Pkey index out of range") \\r
466 VAPI_ERROR_INFO( VAPI_EINVAL_PKEY_TBL_ENTRY, EMPTY,"Pkey index point to invalid Pkey") \\r
467 VAPI_ERROR_INFO( VAPI_EINVAL_QP_HNDL,        EMPTY,"Invalid QP Handle") \\r
468 VAPI_ERROR_INFO( VAPI_EINVAL_QP_STATE,       EMPTY,"Invalid QP State") \\r
469 VAPI_ERROR_INFO( VAPI_EINVAL_SRQ_HNDL,       EMPTY,"Invalid SRQ Handle") \\r
470 VAPI_ERROR_INFO( VAPI_ESRQ,                  EMPTY,"SRQ is in error state") \\r
471 VAPI_ERROR_INFO( VAPI_EINVAL_EEC_HNDL,       EMPTY,"Invalid EE-Context Handle") \\r
472 VAPI_ERROR_INFO( VAPI_EINVAL_MIG_STATE,      EMPTY,"Invalid Path Migration State") \\r
473 VAPI_ERROR_INFO( VAPI_EINVAL_MTU,            EMPTY,"MTU violation") \\r
474 VAPI_ERROR_INFO( VAPI_EINVAL_PORT,           EMPTY,"Invalid Port Number") \\r
475 VAPI_ERROR_INFO( VAPI_EINVAL_RNR_NAK_TIMER,  EMPTY,"Invalid RNR NAK timer field") \\r
476 VAPI_ERROR_INFO( VAPI_EINVAL_LOCAL_ACK_TIMEOUT,  EMPTY,"Invalid Local ACK timeout field") \\r
477 VAPI_ERROR_INFO( VAPI_E2BIG_RAW_DGRAM_NUM,   EMPTY,"Number of raw datagrams QP exeeded") \\r
478 VAPI_ERROR_INFO( VAPI_EINVAL_QP_TYPE,        EMPTY,"Invalid special QP type") \\r
479 VAPI_ERROR_INFO( VAPI_ENOSYS_RAW,            EMPTY,"Raw datagram QP not supported") \\r
480 VAPI_ERROR_INFO( VAPI_EINVAL_CQ_HNDL,        EMPTY,"Invalid Completion Queue Handle") \\r
481 VAPI_ERROR_INFO( VAPI_E2BIG_CQ_NUM,          EMPTY,"Number of entries in CQ exceeds Cap.") \\r
482 VAPI_ERROR_INFO( VAPI_CQ_EMPTY,              EMPTY,"CQ is empty") \\r
483 VAPI_ERROR_INFO( VAPI_EINVAL_VA,             EMPTY,"Invalid Virtual Address") \\r
484 VAPI_ERROR_INFO( VAPI_EINVAL_LEN,            EMPTY,"Invalid length") \\r
485 VAPI_ERROR_INFO( VAPI_EINVAL_ACL,            EMPTY,"Invalid ACL") \\r
486 VAPI_ERROR_INFO( VAPI_EINVAL_PADDR,          EMPTY,"Invalid physical address") \\r
487 VAPI_ERROR_INFO( VAPI_EINVAL_OFST,           EMPTY,"Invalid offset") \\r
488 VAPI_ERROR_INFO( VAPI_EINVAL_MR_HNDL,        EMPTY,"Invalid Memory Region Handle") \\r
489 VAPI_ERROR_INFO( VAPI_EINVAL_MW_HNDL,        EMPTY,"Invalid Memory Window Handle") \\r
490 VAPI_ERROR_INFO( VAPI_EINVAL_OP,             EMPTY,"Invalid operation") \\r
491 VAPI_ERROR_INFO( VAPI_EINVAL_NOTIF_TYPE,     EMPTY,"Invalid completion notification type") \\r
492 VAPI_ERROR_INFO( VAPI_EINVAL_SG_FMT,         EMPTY,"Invalid scatter/gather list format") \\r
493 VAPI_ERROR_INFO( VAPI_EINVAL_SG_NUM,         EMPTY,"Invalid scatter/gather list length") \\r
494 VAPI_ERROR_INFO( VAPI_E2BIG_MCG_SIZE,        EMPTY,"Number of QPs attached to multicast groups exceeded") \\r
495 VAPI_ERROR_INFO( VAPI_EINVAL_MCG_GID,        EMPTY,"Invalid Multicast group GID") \\r
496 VAPI_ERROR_INFO( VAPI_COMPLETED,             EMPTY,"Poll Loop Completed") \\r
497 VAPI_ERROR_INFO( VAPI_POLL_NEEDED,           EMPTY,"Drain CQ with poll_cq") \\r
498 VAPI_ERROR_INFO( VAPI_EOL,                   EMPTY,"End Of List") \\r
499 VAPI_ERROR_INFO( VAPI_ERROR_MAX,             EMPTY,"Dummy max error code : put all error codes before it") \\r
500            \r
501 enum {\r
502 #define VAPI_ERROR_INFO(A, B, C) A B,\r
503   VAPI_ERROR_LIST\r
504 #undef VAPI_ERROR_INFO\r
505   VAPI_ERROR_DUMMY_CODE\r
506 };\r
507 \r
508 typedef int32_t VAPI_ret_t;\r
509 \r
510 typedef struct {\r
511   u_int32_t          vendor_id;              /* Vendor ID */\r
512   u_int32_t          vendor_part_id;         /* Vendor Part ID */\r
513   u_int32_t          hw_ver;                 /* Hardware Version */\r
514   u_int64_t          fw_ver;                 /* Device's firmware version (device specific) */\r
515 } VAPI_hca_vendor_t; \r
516 \r
517 /* HCA Port properties (port db) */\r
518 typedef struct {\r
519   IB_mtu_t        max_mtu;                  /* Max MTU */\r
520   u_int32_t       max_msg_sz;               /* Max message size                   */\r
521   IB_lid_t        lid;                      /* Base IB_LID.                       */\r
522   u_int8_t        lmc;                      /* IB_LMC for port.                   */ \r
523   IB_port_state_t state;                    /* Port state                         */\r
524   IB_port_cap_mask_t capability_mask; \r
525   u_int8_t        max_vl_num;               /* Maximum number of VL supported by this port.  */             \r
526   VAPI_key_counter_t bad_pkey_counter;      /* Bad PKey counter (if supported) */\r
527   VAPI_key_counter_t qkey_viol_counter;     /* QKey violation counter          */\r
528   IB_lid_t           sm_lid;                /* IB_LID of subnet manager to be used for this prot.     */\r
529   IB_sl_t            sm_sl;                 /* IB_SL to be used in communication with subnet manager. */\r
530   u_int16_t       pkey_tbl_len;             /* Current size of pkey table */\r
531   u_int16_t       gid_tbl_len;              /* Current size of GID table */\r
532   VAPI_timeout_t  subnet_timeout;           /* Subnet Timeout for this port (see PortInfo) */\r
533   u_int8_t        initTypeReply;            /* optional InitTypeReply value. 0 if not supported */\r
534 } VAPI_hca_port_t; \r
535 \r
536 /* HCA Capabilities Structure */\r
537 typedef struct {\r
538   u_int32_t       max_num_qp;          /* Maximum Number of QPs supported.                   */             \r
539   u_int32_t       max_qp_ous_wr;       /* Maximum Number of oustanding WR on any WQ.         */             \r
540   u_int32_t       flags;               /* Various flags (VAPI_hca_cap_flags_t)               */\r
541   u_int32_t       max_num_sg_ent;      /* Max num of scatter/gather entries for desc other than RD */\r
542   u_int32_t       max_num_sg_ent_rd;   /* Max num of scatter/gather entries for RD desc      */\r
543   u_int32_t       max_num_cq;          /* Max num of supported CQs                           */\r
544   u_int32_t       max_num_ent_cq;      /* Max num of supported entries per CQ                */\r
545   u_int32_t       max_num_mr;          /* Maximum number of memory region supported.         */             \r
546   u_int64_t       max_mr_size;         /* Largest contigous block of memory region in bytes. */             \r
547   u_int32_t       max_pd_num;          /* Maximum number of protection domains supported.    */             \r
548   u_int32_t       page_size_cap;       /* Largest page size supported by this HCA            */             \r
549   IB_port_t       phys_port_num;       /* Number of physical port of the HCA.                */             \r
550   u_int16_t       max_pkeys;           /* Maximum number of partitions supported .           */\r
551   IB_guid_t       node_guid;           /* Node GUID for this hca                             */\r
552   VAPI_timeout_t  local_ca_ack_delay;  /* Log2 4.096usec Max. RX to ACK or NAK delay */\r
553   u_int8_t        max_qp_ous_rd_atom;  /* Maximum number of oust. RDMA read/atomic as target */             \r
554   u_int8_t        max_ee_ous_rd_atom;  /* EE Maximum number of outs. RDMA read/atomic as target      */             \r
555   u_int8_t        max_res_rd_atom;     /* Max. Num. of resources used for RDMA read/atomic as target */\r
556   u_int8_t        max_qp_init_rd_atom; /* Max. Num. of outs. RDMA read/atomic as initiator           */\r
557   u_int8_t        max_ee_init_rd_atom; /* EE Max. Num. of outs. RDMA read/atomic as initiator        */\r
558   VAPI_atomic_cap_t   atomic_cap;        /* Level of Atomicity supported                */\r
559   u_int32_t           max_ee_num;                   /* Maximum number of EEC supported.            */\r
560   u_int32_t           max_rdd_num;                  /* Maximum number of IB_RDD supported             */\r
561   u_int32_t           max_mw_num;                   /* Maximum Number of memory windows supported  */\r
562   u_int32_t           max_raw_ipv6_qp;              /* Maximum number of Raw IPV6 QPs supported */ \r
563   u_int32_t           max_raw_ethy_qp;              /* Maximum number of Raw Ethertypes QPs supported */ \r
564   u_int32_t           max_mcast_grp_num;            /* Maximum Number of multicast groups           */       \r
565   u_int32_t           max_mcast_qp_attach_num;      /* Maximum number of QP per multicast group    */ \r
566   u_int32_t           max_total_mcast_qp_attach_num;/* Maximum number of QPs which can be attached to a mcast grp */\r
567   u_int32_t           max_ah_num;                   /* Maximum number of address vector handles */\r
568 \r
569   /* Extended HCA capabilities */\r
570 \r
571   /* FMRs (Fast Memory Regions) */\r
572   u_int32_t      max_num_fmr;         /* maximum number FMRs  */\r
573   u_int32_t      max_num_map_per_fmr; /* Maximum number of (re)maps per FMR before \r
574                                          an unmap operation in required */\r
575   /* SRQs (Shared Receive Queues) */\r
576   u_int32_t      max_num_srq;         /* Maximum number of SRQs. Zero if SRQs are not supported. */\r
577   u_int32_t      max_wqe_per_srq;     /* Maximum number of WRs per SRQ.*/\r
578   u_int32_t      max_srq_sentries;    /* Maximum scatter entries per SRQ WQE */\r
579   MT_bool        srq_resize_supported;/* Ability to modify the maximum number of WRs per SRQ.*/\r
580 \r
581 } VAPI_hca_cap_t;\r
582 \r
583 \r
584 /* HCA Properties for Modify HCA verb */\r
585 typedef struct {\r
586   MT_bool      reset_qkey_counter;       /* TRUE=> reset counter.  FALSE=> do nothing */\r
587   /* attributes in Capability Mask of port info that can be modified */\r
588   MT_bool      is_sm;                  \r
589   MT_bool      is_snmp_tun_sup;\r
590   MT_bool      is_dev_mgt_sup;\r
591   MT_bool      is_vendor_cls_sup;\r
592   MT_bool      is_client_reregister_sup;\r
593 } VAPI_hca_attr_t;  \r
594 \r
595 \r
596 /* Address Vector (For UD AV as well as address-path in connected QPs */\r
597 typedef struct {                              \r
598   IB_gid_t            dgid MT_BYTE_ALIGN(4); /* Destination GID (alignment for IA64) */\r
599   IB_sl_t             sl;              /* Service Level 4 bits      */\r
600   IB_lid_t            dlid;            /* Destination LID           */\r
601   u_int8_t            src_path_bits;   /* Source path bits 7 bits   */\r
602   IB_static_rate_t    static_rate;     /* Maximum static rate : 6 bits  */\r
603 \r
604   MT_bool             grh_flag;        /* Send GRH flag             */\r
605   /* For global destination or Multicast address:*/ \r
606   u_int8_t            traffic_class;   /* TClass 8 bits             */\r
607   u_int8_t            hop_limit;       /* Hop Limit 8 bits          */\r
608   u_int32_t           flow_label;      /* Flow Label 20 bits        */\r
609   u_int8_t            sgid_index;      /* SGID index in SGID table  */\r
610 \r
611   IB_port_t           port;      /* egress port (valid for UD AV only) */\r
612   /* Following IBTA comment 1567 - should match QP's when UD AV port is enforced */\r
613 \r
614 } VAPI_ud_av_t; \r
615 \r
616 \r
617 /* QP Capabilities */\r
618 typedef struct {\r
619   u_int32_t          max_oust_wr_sq;   /* Max outstanding WR on the SQ */\r
620   u_int32_t          max_oust_wr_rq;   /* Max outstanding WR on the RQ */\r
621   u_int32_t          max_sg_size_sq;   /* Max scatter/gather descriptor entries on the SQ */\r
622   u_int32_t          max_sg_size_rq;   /* Max scatter/gather descriptor entries on the RQ */\r
623   u_int32_t          max_inline_data_sq;  /* Max bytes in inline data on the SQ */\r
624   /* max_inline_data_sq is currently valid only for VAPI_query_qp (ignored for VAPI_create_qp) */\r
625   /* In order to enlarge the max_inline_data_sq capability, enlarge the max_sg_size_sq parameter */\r
626 } VAPI_qp_cap_t;  \r
627 \r
628 /* Queue Pair Creation Attributes */\r
629 typedef struct {\r
630   VAPI_cq_hndl_t  sq_cq_hndl;      /* CQ handle for the SQ            */\r
631   VAPI_cq_hndl_t  rq_cq_hndl;      /* CQ handle for the RQ            */\r
632   VAPI_qp_cap_t   cap;             /* Requested QP capabilities       */\r
633   VAPI_rdd_hndl_t rdd_hndl;        /* Reliable Datagram Domain handle */\r
634   VAPI_sig_type_t sq_sig_type;     /* SQ Signalling type (SIGNAL_ALL_WR, SIGNAL_REQ_WR) */\r
635   VAPI_sig_type_t rq_sig_type;     /* RQ Signalling type (SIGNAL_ALL_WR, SIGNAL_REQ_WR) [Mellanox Specific]*/\r
636   VAPI_pd_hndl_t  pd_hndl;         /* Protection domain handle        */\r
637   VAPI_ts_type_t  ts_type;         /* Transport Services Type         */\r
638 } VAPI_qp_init_attr_t;\r
639 \r
640 typedef struct {\r
641   VAPI_srq_hndl_t srq_hndl;  /* Set to VAPI_INVAL_SRQ_HNDL when QP is not associated with a SRQ */\r
642 } VAPI_qp_init_attr_ext_t;\r
643 \r
644 /* Init. the extended attributes structure with the macro below to assure forward compatibility */\r
645 #define VAPI_QP_INIT_ATTR_EXT_T_INIT(qp_ext_attr_p)  (qp_ext_attr_p)->srq_hndl= VAPI_INVAL_SRQ_HNDL\r
646 \r
647 /* Queue Pair Creation Returned actual Attributes */\r
648 typedef struct {\r
649   VAPI_qp_num_t   qp_num;            /* QP number              */\r
650   VAPI_qp_cap_t   cap;               /* Actual QP capabilities */\r
651 } VAPI_qp_prop_t;\r
652 \r
653 \r
654 /* Queue Pair Full Attributes (for modify QP) */\r
655 typedef struct {\r
656   VAPI_qp_state_t     qp_state;            /* QP next state      */\r
657   MT_bool             en_sqd_asyn_notif;   /* Enable SQD affiliated asynchronous event notification */\r
658   MT_bool                         sq_draining;             /* query only - when (qp_state == VAPI_SQD) indicates whether sq is in drain process (TRUE), or drained.*/\r
659   VAPI_qp_num_t       qp_num;              /* Queue Pair Number. [Mellanox specific] */\r
660   VAPI_rdma_atom_acl_t remote_atomic_flags;/* Enable/Disable RDMA and atomic */\r
661   VAPI_qkey_t         qkey;                /* QKey (UD/RD only) */\r
662   IB_mtu_t            path_mtu;            /* Path MTU : 6 bits (connected services only) */\r
663   VAPI_mig_state_t    path_mig_state;      /* Migration state                                    */\r
664   VAPI_psn_t          rq_psn;              /* Packet Sequence Number for RQ                      */\r
665   VAPI_psn_t          sq_psn;              /* Packet sequence number for SQ                      */\r
666   u_int8_t            qp_ous_rd_atom;      /* Maximum number of oust. RDMA read/atomic as target */\r
667   u_int8_t            ous_dst_rd_atom;     /* Number of outstanding RDMA rd/atomic ops at destination */\r
668   IB_rnr_nak_timer_code_t min_rnr_timer;   /* Minimum RNR NAK timer                              */\r
669   VAPI_qp_cap_t       cap;                 /* QP capabilities max_sq/rq_ous_wr only valid        */\r
670   VAPI_qp_num_t       dest_qp_num;         /* Destination QP number (RC/UC)                      */\r
671   VAPI_sched_queue_t  sched_queue;         /* Schedule queue (optional) */\r
672 \r
673   /* Primary path (RC/UC only) */\r
674   VAPI_pkey_ix_t      pkey_ix;             /* Primary PKey index                 */\r
675   IB_port_t           port;                /* Primary port                       */\r
676   VAPI_ud_av_t        av;                  /* Primary remote node address vector (RC/UC QP only)*/\r
677   VAPI_timeout_t      timeout;             /* Local Ack Timeout (RC only) */\r
678   VAPI_retry_count_t  retry_count;         /* retry count     (RC only) */\r
679   VAPI_retry_count_t  rnr_retry;           /* RNR retry count (RC only) */\r
680   \r
681   /* Alternate path (RC/UC only) */\r
682   VAPI_pkey_ix_t      alt_pkey_ix;         /* Alternative PKey index                             */\r
683   IB_port_t           alt_port;            /* Alternative port                       */\r
684   VAPI_ud_av_t        alt_av;              /* Alternate remote node address vector               */ \r
685   VAPI_timeout_t      alt_timeout;         /* Local Ack Timeout (RC only) */\r
686 } VAPI_qp_attr_t;\r
687 \r
688 /* SRQ's attributes */\r
689 typedef struct {\r
690   VAPI_pd_hndl_t     pd_hndl;     /* SRQ's PD. (Ignored on VAPI_modify_srq). */\r
691   u_int32_t          max_outs_wr; /* Max. outstanding WQEs */\r
692   u_int32_t          max_sentries;/* Max. scatter entries  (Ignored on VAPI_modify_srq) */\r
693   u_int32_t          srq_limit;   /* SRQ's limit (Ignored on VAPI_create_srq) */\r
694 } VAPI_srq_attr_t;\r
695 \r
696 #define VAPI_SRQ_ATTR_T_INIT(srq_attr_p)  {  \\r
697   (srq_attr_p)->pd_hndl= VAPI_INVAL_PD_HNDL;  \\r
698   (srq_attr_p)->max_outs_wr= 0;                \\r
699   (srq_attr_p)->max_sentries= 0;               \\r
700   (srq_attr_p)->srq_limit= 0;                  \\r
701 }\r
702 \r
703 /* VAPI_modify_srq attributes mask */\r
704 #define VAPI_SRQ_ATTR_LIMIT       (1)\r
705 #define VAPI_SRQ_ATTR_MAX_OUTS_WR (1<<1)\r
706 typedef u_int8_t VAPI_srq_attr_mask_t;\r
707 \r
708 \r
709 /* Physical memory buffer */\r
710 typedef struct {\r
711   VAPI_phy_addr_t     start;\r
712   VAPI_phy_addr_t     size;\r
713 } VAPI_phy_buf_t;\r
714 \r
715 \r
716 /* Memory Region/Window */\r
717 typedef struct {\r
718   VAPI_mrw_type_t     type;  /* But not VAPI_MW */\r
719   VAPI_lkey_t         l_key; \r
720   VAPI_rkey_t         r_key;\r
721   VAPI_virt_addr_t    start;\r
722   VAPI_size_t         size;\r
723   VAPI_pd_hndl_t      pd_hndl;\r
724   VAPI_mrw_acl_t      acl; \r
725   /* Physical buffers list : for physical memory region only (type==VAPI_MPR) */\r
726   MT_size_t           pbuf_list_len;\r
727   VAPI_phy_buf_t      *pbuf_list_p;\r
728   VAPI_phy_addr_t     iova_offset;  /* Offset of "start" in first buffer */\r
729 } VAPI_mr_t;\r
730 \r
731 typedef VAPI_mr_t  VAPI_mrw_t; /* for backward compatibility */\r
732 \r
733 typedef struct\r
734 {\r
735   VAPI_lkey_t     mr_lkey; /* L-Key of memory region to bind to */\r
736   IB_virt_addr_t  start;   /* Memory window's virtual byte address */\r
737   VAPI_size_t     size;    /* Size of memory window in bytes */\r
738   VAPI_mrw_acl_t  acl;     /* Access Control (R/W permission - local/remote) */\r
739 } VAPI_mw_bind_t;\r
740 \r
741 \r
742 /* Scatter/ Gather Entry */\r
743 typedef struct {\r
744   VAPI_virt_addr_t    addr;\r
745   u_int32_t           len;\r
746   VAPI_lkey_t         lkey;\r
747 } VAPI_sg_lst_entry_t;\r
748 \r
749 /* Send Request Descriptor */\r
750 typedef struct {\r
751   VAPI_wr_id_t         id;\r
752   VAPI_wr_opcode_t     opcode;\r
753   VAPI_comp_type_t     comp_type;\r
754   VAPI_sg_lst_entry_t *sg_lst_p;\r
755   u_int32_t            sg_lst_len;\r
756   VAPI_imm_data_t      imm_data;\r
757   MT_bool              fence;\r
758   VAPI_ud_av_hndl_t    remote_ah;\r
759   VAPI_qp_num_t        remote_qp;\r
760   VAPI_qkey_t          remote_qkey;\r
761   VAPI_ethertype_t     ethertype;\r
762   IB_eecn_t            eecn;\r
763   MT_bool              set_se;\r
764   VAPI_virt_addr_t     remote_addr;\r
765   VAPI_rkey_t          r_key;\r
766    /* atomic_operands */\r
767   u_int64_t compare_add; /* First operand: Used for both "Compare & Swap" and "Fetch & Add" */\r
768   u_int64_t swap;        /* Second operand: Used for "Compare & Swap" */\r
769   /* Atomic's "data segment" is the scather list defined in sg_lst_p+sg_lst_len (like RDMA-Read) */\r
770 } VAPI_sr_desc_t;\r
771 \r
772 /* Receive Request Descriptor */\r
773 typedef struct {\r
774   VAPI_wr_id_t         id;\r
775   VAPI_wr_opcode_t     opcode;      /* RECEIVE */\r
776   VAPI_comp_type_t     comp_type;   /* Mellanox Specific */\r
777   VAPI_sg_lst_entry_t *sg_lst_p;\r
778   u_int32_t            sg_lst_len;\r
779 } VAPI_rr_desc_t;\r
780 \r
781 /* Remote node address for completion entry */\r
782 typedef struct {\r
783   VAPI_remote_node_addr_type_t  type;\r
784   IB_lid_t                      slid;\r
785   IB_sl_t                       sl;\r
786 \r
787   union {\r
788     VAPI_qp_num_t      qp;  /* source QP (valid on type==RD,UD) */\r
789     VAPI_ethertype_t   ety; /* ethertype (valid on type==RAW_ETY) */\r
790   } qp_ety;\r
791 \r
792   union {\r
793     VAPI_eec_num_t     loc_eecn; /* local EEC number (valid on type==RD) */\r
794     u_int8_t           dst_path_bits; /* dest path bits (valid on type==UD and RAW* ) */\r
795   } ee_dlid;\r
796 } VAPI_remote_node_addr_t;\r
797 \r
798 \r
799 /* Work Completion Descriptor */\r
800 typedef struct {\r
801   VAPI_wc_status_t        status;\r
802   VAPI_wr_id_t            id;\r
803   IB_wqpn_t               local_qp_num;   /* QP number this completion was generated for */\r
804   VAPI_cqe_opcode_t       opcode;    \r
805   u_int32_t               byte_len;       /* Num. of bytes transferred */\r
806   MT_bool                 imm_data_valid; /* Imm. data indicator */\r
807   VAPI_imm_data_t         imm_data;\r
808   VAPI_remote_node_addr_t remote_node_addr;\r
809   MT_bool                 grh_flag;       \r
810   VAPI_pkey_ix_t          pkey_ix;        /* for GSI */\r
811   /* Vendor specific error syndrome (valid when status != VAPI_SUCCESS) */\r
812   EVAPI_vendor_err_syndrome_t vendor_err_syndrome; \r
813   u_int32_t               free_res_count;\r
814 } VAPI_wc_desc_t;\r
815 \r
816 \r
817 \r
818 /**********************************/\r
819 /* Fast memory regions data types */\r
820 /**********************************/\r
821 \r
822 typedef struct {\r
823   VAPI_pd_hndl_t    pd_hndl;\r
824   VAPI_mrw_acl_t    acl; \r
825   u_int32_t         max_pages;  /* Maximum number of pages that can be mapped using this region *\r
826                                  *(virtual mapping only)                                        */\r
827   u_int8_t          log2_page_sz;       /* Fixed page size for all maps on a given FMR */\r
828   u_int32_t         max_outstanding_maps; /* Maximum maps before invoking unmap for this region */\r
829 } EVAPI_fmr_t;\r
830 \r
831 typedef struct {\r
832   VAPI_virt_addr_t     start;                     /* Mapped memory virtual address */\r
833   VAPI_size_t          size;                      /*  Size of memory mapped to this region */\r
834   MT_size_t            page_array_len;    /* If >0 then no memory locking is done and page table is taken from array below */\r
835   VAPI_phy_addr_t     *page_array;                /* Page size is set in EVAPI_alloc_fmr by log2_page_sz field */ \r
836 } EVAPI_fmr_map_t;\r
837 \r
838 typedef VAPI_mr_hndl_t EVAPI_fmr_hndl_t;\r
839 \r
840 \r
841 typedef struct {\r
842     VAPI_size_t         total_mem;\r
843         VAPI_size_t         free_mem;\r
844         VAPI_size_t         largest_chunk;\r
845 } EVAPI_devmem_info_t;\r
846 \r
847 \r
848 \r
849 /*EVAPI_process_local_mad options*/\r
850 \r
851 /* enumeration of options (effectively, bits in a bitmask) */\r
852 typedef enum {\r
853   EVAPI_MAD_IGNORE_MKEY       = 1  /* process_local_mad will not validate the MKEY */\r
854 } EVAPI_proc_mad_opt_enum_t;\r
855 \r
856 /* Associated "bitmask" type for use in structs and argument lists */\r
857 typedef u_int32_t EVAPI_proc_mad_opt_t;\r
858 \r
859 \r
860 /* profile typedef */\r
861 \r
862 typedef struct EVAPI_hca_profile_t {\r
863     u_int32_t   num_qp;   /* min number of QPs to configure */\r
864     u_int32_t   num_cq;   /* min number of CQs to configure */\r
865     u_int32_t   num_pd;   /* min number of PDs to configure */\r
866     u_int32_t   num_mr;   /* min number of mem regions to configure */\r
867     u_int32_t   num_mw;   /* min number of mem windows to configure */\r
868     u_int32_t   max_qp_ous_rd_atom; /* max outstanding read/atomic operations as target PER QP */\r
869     u_int32_t   max_mcg;  /* max number of multicast groups for this HCA */\r
870     u_int32_t   qp_per_mcg;  /* max number of QPs per mcg */\r
871     MT_bool     require;  /* if TRUE, EVAPI_open_hca will fail if cannot use exact profile values\r
872                              to open the HCA */\r
873 } EVAPI_hca_profile_t;\r
874 \r
875 \r
876 #endif /*H_VAPI_TYPES_H*/\r
877 \r