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