[HW, TOOLS] fixed a bug, causing incorrect value of max_addr_handles in query_ca...
[mirror/winof/.git] / hw / mthca / user / mlnx_uvp_verbs.h
1 /*
2  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3  * Copyright (c) 2004 Intel Corporation.  All rights reserved.
4  * Copyright (c) 2005 Cisco Systems.  All rights reserved.
5  * Copyright (c) 2005 PathScale, Inc.  All rights reserved.
6  *
7  * This software is available to you under a choice of one of two
8  * licenses.  You may choose to be licensed under the terms of the GNU
9  * General Public License (GPL) Version 2, available from the file
10  * COPYING in the main directory of this source tree, or the
11  * OpenIB.org BSD license below:
12  *
13  *     Redistribution and use in source and binary forms, with or
14  *     without modification, are permitted provided that the following
15  *     conditions are met:
16  *
17  *      - Redistributions of source code must retain the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer.
20  *
21  *      - Redistributions in binary form must reproduce the above
22  *        copyright notice, this list of conditions and the following
23  *        disclaimer in the documentation and/or other materials
24  *        provided with the distribution.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33  * SOFTWARE.
34  *
35  * $Id$
36  */
37
38 #ifndef MLNX_UVP_VERBS_H
39 #define MLNX_UVP_VERBS_H
40
41 #include <iba/ib_types.h>
42
43 #ifdef __cplusplus
44 #  define BEGIN_C_DECLS extern "C" {
45 #  define END_C_DECLS   }
46 #else /* !__cplusplus */
47 #  define BEGIN_C_DECLS
48 #  define END_C_DECLS
49 #endif /* __cplusplus */
50
51 BEGIN_C_DECLS
52
53 union ibv_gid {
54         uint8_t                 raw[16];
55         struct {
56                 uint64_t        subnet_prefix;
57                 uint64_t        interface_id;
58         } global;
59 };
60
61 enum ibv_node_type {
62         IBV_NODE_CA     = 1,
63         IBV_NODE_SWITCH,
64         IBV_NODE_ROUTER
65 };
66
67 enum ibv_device_cap_flags {
68         IBV_DEVICE_RESIZE_MAX_WR        = 1,
69         IBV_DEVICE_BAD_PKEY_CNTR        = 1 <<  1,
70         IBV_DEVICE_BAD_QKEY_CNTR        = 1 <<  2,
71         IBV_DEVICE_RAW_MULTI            = 1 <<  3,
72         IBV_DEVICE_AUTO_PATH_MIG        = 1 <<  4,
73         IBV_DEVICE_CHANGE_PHY_PORT      = 1 <<  5,
74         IBV_DEVICE_UD_AV_PORT_ENFORCE   = 1 <<  6,
75         IBV_DEVICE_CURR_QP_STATE_MOD    = 1 <<  7,
76         IBV_DEVICE_SHUTDOWN_PORT        = 1 <<  8,
77         IBV_DEVICE_INIT_TYPE            = 1 <<  9,
78         IBV_DEVICE_PORT_ACTIVE_EVENT    = 1 << 10,
79         IBV_DEVICE_SYS_IMAGE_GUID       = 1 << 11,
80         IBV_DEVICE_RC_RNR_NAK_GEN       = 1 << 12,
81         IBV_DEVICE_SRQ_RESIZE           = 1 << 13,
82         IBV_DEVICE_N_NOTIFY_CQ          = 1 << 14,
83 };
84
85 enum ibv_atomic_cap {
86         IBV_ATOMIC_NONE,
87         IBV_ATOMIC_HCA,
88         IBV_ATOMIC_GLOB
89 };
90
91 struct ibv_device_attr {
92         char                    fw_ver[64];
93         uint64_t                node_guid;
94         uint64_t                sys_image_guid;
95         uint64_t                max_mr_size;
96         uint64_t                page_size_cap;
97         uint32_t                vendor_id;
98         uint32_t                vendor_part_id;
99         uint32_t                hw_ver;
100         int                     max_qp;
101         int                     max_qp_wr;
102         int                     device_cap_flags;
103         int                     max_sge;
104         int                     max_sge_rd;
105         int                     max_cq;
106         int                     max_cqe;
107         int                     max_mr;
108         int                     max_pd;
109         int                     max_qp_rd_atom;
110         int                     max_ee_rd_atom;
111         int                     max_res_rd_atom;
112         int                     max_qp_init_rd_atom;
113         int                     max_ee_init_rd_atom;
114         enum ibv_atomic_cap     atomic_cap;
115         int                     max_ee;
116         int                     max_rdd;
117         int                     max_mw;
118         int                     max_raw_ipv6_qp;
119         int                     max_raw_ethy_qp;
120         int                     max_mcast_grp;
121         int                     max_mcast_qp_attach;
122         int                     max_total_mcast_qp_attach;
123         uint64_t        max_ah;
124         int                     max_fmr;
125         int                     max_map_per_fmr;
126         int                     max_srq;
127         int                     max_srq_wr;
128         int                     max_srq_sge;
129         uint16_t                max_pkeys;
130         uint8_t                 local_ca_ack_delay;
131         uint8_t                 phys_port_cnt;
132 };
133
134 enum ibv_mtu {
135         IBV_MTU_256  = 1,
136         IBV_MTU_512  = 2,
137         IBV_MTU_1024 = 3,
138         IBV_MTU_2048 = 4,
139         IBV_MTU_4096 = 5
140 };
141
142 enum ibv_port_state {
143         IBV_PORT_NOP            = 0,
144         IBV_PORT_DOWN           = 1,
145         IBV_PORT_INIT           = 2,
146         IBV_PORT_ARMED          = 3,
147         IBV_PORT_ACTIVE         = 4,
148         IBV_PORT_ACTIVE_DEFER   = 5
149 };
150
151 struct ibv_port_attr {
152         enum ibv_port_state     state;
153         enum ibv_mtu            max_mtu;
154         enum ibv_mtu            active_mtu;
155         int                     gid_tbl_len;
156         uint32_t                port_cap_flags;
157         uint32_t                max_msg_sz;
158         uint32_t                bad_pkey_cntr;
159         uint32_t                qkey_viol_cntr;
160         uint16_t                pkey_tbl_len;
161         uint16_t                lid;
162         uint16_t                sm_lid;
163         uint8_t                 lmc;
164         uint8_t                 max_vl_num;
165         uint8_t                 sm_sl;
166         uint8_t                 subnet_timeout;
167         uint8_t                 init_type_reply;
168         uint8_t                 active_width;
169         uint8_t                 active_speed;
170         uint8_t                 phys_state;
171 };
172
173 enum ibv_event_type {
174         IBV_EVENT_CQ_ERR,
175         IBV_EVENT_QP_FATAL,
176         IBV_EVENT_QP_REQ_ERR,
177         IBV_EVENT_QP_ACCESS_ERR,
178         IBV_EVENT_COMM_EST,
179         IBV_EVENT_SQ_DRAINED,
180         IBV_EVENT_PATH_MIG,
181         IBV_EVENT_PATH_MIG_ERR,
182         IBV_EVENT_DEVICE_FATAL,
183         IBV_EVENT_PORT_ACTIVE,
184         IBV_EVENT_PORT_ERR,
185         IBV_EVENT_LID_CHANGE,
186         IBV_EVENT_PKEY_CHANGE,
187         IBV_EVENT_SM_CHANGE,
188         IBV_EVENT_SRQ_ERR,
189         IBV_EVENT_SRQ_LIMIT_REACHED,
190         IBV_EVENT_QP_LAST_WQE_REACHED
191 };
192
193 struct ibv_async_event {
194         union {
195                 struct ibv_cq  *cq;
196                 struct ibv_qp  *qp;
197                 struct ibv_srq *srq;
198                 int             port_num;
199         } element;
200         enum ibv_event_type     event_type;
201 };
202
203 enum ibv_access_flags {
204         IBV_ACCESS_LOCAL_WRITE          = 1,
205         IBV_ACCESS_REMOTE_WRITE         = (1<<1),
206         IBV_ACCESS_REMOTE_READ          = (1<<2),
207         IBV_ACCESS_REMOTE_ATOMIC        = (1<<3),
208         IBV_ACCESS_MW_BIND              = (1<<4)
209 };
210
211 struct ibv_pd {
212         struct ibv_context     *context;
213         uint64_t                handle;
214 };
215
216 struct ibv_mr {
217         struct ibv_context     *context;
218         struct ibv_pd          *pd;
219         uint64_t                handle;
220         uint32_t                lkey;
221         uint32_t                rkey;
222 };
223
224 struct ibv_global_route {
225         ib_gid_t                dgid;
226         uint32_t                flow_label;
227         uint8_t                 sgid_index;
228         uint8_t                 hop_limit;
229         uint8_t                 traffic_class;
230 };
231
232 struct ibv_ah_attr {
233         struct ibv_global_route grh;
234         uint16_t                dlid;
235         uint8_t                 sl;
236         uint8_t                 src_path_bits;
237         uint8_t                 static_rate;
238         uint8_t                 is_global;
239         uint8_t                 port_num;
240 };
241
242
243 enum ib_cq_notify {
244         IB_CQ_SOLICITED,
245         IB_CQ_NEXT_COMP
246 };
247
248 enum ibv_srq_attr_mask {
249         IBV_SRQ_MAX_WR  = 1 << 0,
250         IBV_SRQ_LIMIT   = 1 << 1,
251 };
252
253 struct ibv_srq_attr {
254         uint32_t                max_wr;
255         uint32_t                max_sge;
256         uint32_t                srq_limit;
257 };
258
259 struct ibv_srq_init_attr {
260         void                   *srq_context;
261         struct ibv_srq_attr     attr;
262 };
263
264 struct ibv_qp_cap {
265         uint32_t                max_send_wr;
266         uint32_t                max_recv_wr;
267         uint32_t                max_send_sge;
268         uint32_t                max_recv_sge;
269         uint32_t                max_inline_data;
270 };
271
272 struct ibv_qp_init_attr {
273         void                   *qp_context;
274         struct ibv_cq          *send_cq;
275         struct ibv_cq          *recv_cq;
276         struct ibv_srq         *srq;
277         struct ibv_qp_cap       cap;
278         ib_qp_type_t    qp_type;
279         int                     sq_sig_all;
280 };
281
282 enum ibv_qp_attr_mask {
283         IBV_QP_STATE                    = 1 <<  0,
284         IBV_QP_CUR_STATE                = 1 <<  1,
285         IBV_QP_EN_SQD_ASYNC_NOTIFY      = 1 <<  2,
286         IBV_QP_ACCESS_FLAGS             = 1 <<  3,
287         IBV_QP_PKEY_INDEX               = 1 <<  4,
288         IBV_QP_PORT                     = 1 <<  5,
289         IBV_QP_QKEY                     = 1 <<  6,
290         IBV_QP_AV                       = 1 <<  7,
291         IBV_QP_PATH_MTU                 = 1 <<  8,
292         IBV_QP_TIMEOUT                  = 1 <<  9,
293         IBV_QP_RETRY_CNT                = 1 << 10,
294         IBV_QP_RNR_RETRY                = 1 << 11,
295         IBV_QP_RQ_PSN                   = 1 << 12,
296         IBV_QP_MAX_QP_RD_ATOMIC         = 1 << 13,
297         IBV_QP_ALT_PATH                 = 1 << 14,
298         IBV_QP_MIN_RNR_TIMER            = 1 << 15,
299         IBV_QP_SQ_PSN                   = 1 << 16,
300         IBV_QP_MAX_DEST_RD_ATOMIC       = 1 << 17,
301         IBV_QP_PATH_MIG_STATE           = 1 << 18,
302         IBV_QP_CAP                      = 1 << 19,
303         IBV_QP_DEST_QPN                 = 1 << 20
304 };
305
306 enum ibv_qp_state {
307         IBV_QPS_RESET,
308         IBV_QPS_INIT,
309         IBV_QPS_RTR,
310         IBV_QPS_RTS,
311         IBV_QPS_SQD,
312         IBV_QPS_SQE,
313         IBV_QPS_ERR
314 };
315
316 enum ibv_mig_state {
317         IBV_MIG_MIGRATED,
318         IBV_MIG_REARM,
319         IBV_MIG_ARMED
320 };
321
322 struct ibv_qp_attr {
323         enum ibv_qp_state       qp_state;
324         enum ibv_qp_state       cur_qp_state;
325         enum ibv_mtu            path_mtu;
326         enum ibv_mig_state      path_mig_state;
327         uint32_t                qkey;
328         uint32_t                rq_psn;
329         uint32_t                sq_psn;
330         uint32_t                dest_qp_num;
331         int                     qp_access_flags;
332         struct ibv_qp_cap       cap;
333         struct ibv_ah_attr      ah_attr;
334         struct ibv_ah_attr      alt_ah_attr;
335         uint16_t                pkey_index;
336         uint16_t                alt_pkey_index;
337         uint8_t                 en_sqd_async_notify;
338         uint8_t                 sq_draining;
339         uint8_t                 max_rd_atomic;
340         uint8_t                 max_dest_rd_atomic;
341         uint8_t                 min_rnr_timer;
342         uint8_t                 port_num;
343         uint8_t                 timeout;
344         uint8_t                 retry_cnt;
345         uint8_t                 rnr_retry;
346         uint8_t                 alt_port_num;
347         uint8_t                 alt_timeout;
348 };
349
350
351 enum ibv_send_flags {
352         IBV_SEND_FENCE          = 1 << 0,
353         IBV_SEND_SIGNALED       = 1 << 1,
354         IBV_SEND_SOLICITED      = 1 << 2,
355         IBV_SEND_INLINE         = 1 << 3
356 };
357
358 struct ibv_sge {
359         uint64_t                addr;
360         uint32_t                length;
361         uint32_t                lkey;
362 };
363
364 struct ibv_send_wr {
365         struct ibv_send_wr     *next;
366         uint64_t                wr_id;
367         struct ibv_sge         *sg_list;
368         int                     num_sge;
369         enum ibv_wr_opcode      opcode;
370         enum ibv_send_flags     send_flags;
371         uint32_t                imm_data;               /* in network byte order */
372         union {
373                 struct {
374                         uint64_t        remote_addr;
375                         uint32_t        rkey;
376                 } rdma;
377                 struct {
378                         uint64_t        remote_addr;
379                         uint64_t        compare_add;
380                         uint64_t        swap;
381                         uint32_t        rkey;
382                 } atomic;
383                 struct {
384                         struct mthca_ah  *ah;
385                         uint32_t        remote_qpn;
386                         uint32_t        remote_qkey;
387                 } ud;
388         } wr;
389 };
390
391 struct ibv_recv_wr {
392         struct ibv_recv_wr     *next;
393         uint64_t                wr_id;
394         struct ibv_sge         *sg_list;
395         int                     num_sge;
396 };
397
398 typedef enum MTHCA_QP_ACCESS_FLAGS {
399         MTHCA_ACCESS_LOCAL_WRITE        = 1,
400         MTHCA_ACCESS_REMOTE_WRITE       = (1<<1),
401         MTHCA_ACCESS_REMOTE_READ        = (1<<2),
402         MTHCA_ACCESS_REMOTE_ATOMIC      = (1<<3),
403         MTHCA_ACCESS_MW_BIND    = (1<<4)
404 } mthca_qp_access_t;
405
406
407 struct ibv_srq {
408         struct ibv_pd          *pd; 
409         uint64_t                handle;
410         struct ibv_context     *context;
411 };
412
413 struct ibv_qp {
414         struct ibv_pd          *pd; 
415         struct ibv_cq          *send_cq;
416         struct ibv_cq          *recv_cq;
417         struct ibv_srq         *srq;
418         uint64_t                handle;
419         uint32_t                qp_num;
420         enum ibv_qp_state       state;
421         ib_qp_type_t    qp_type;
422         struct ibv_context     *context;
423 };
424
425 struct ibv_cq {
426         uint64_t                handle;
427         int                     cqe;
428         struct ibv_context               *context;
429 };
430
431 struct ibv_ah {
432         struct ibv_pd *pd;
433 };
434
435 struct ibv_context_ops {
436         int                     (*query_device)(struct ibv_context *context,
437                                               struct ibv_device_attr *device_attr);
438         int                     (*query_port)(struct ibv_context *context, uint8_t port_num,
439                                               struct ibv_port_attr *port_attr);
440         struct ibv_pd *         (*alloc_pd)(struct ibv_context *context, struct ibv_alloc_pd_resp *resp_p);
441         int                     (*dealloc_pd)(struct ibv_pd *pd);
442         struct ibv_mr *         (*reg_mr)(struct ibv_pd *pd, void *addr, size_t length,
443                                           enum ibv_access_flags access);
444         int                     (*dereg_mr)(struct ibv_mr *mr);
445         struct ibv_cq * (*create_cq_pre)(struct ibv_context *context, int *cqe,
446                                struct ibv_create_cq *req);
447         struct ibv_cq * (*create_cq_post)(struct ibv_context *context, 
448                                struct ibv_create_cq_resp *resp);
449         int                     (*poll_cq)(struct ibv_cq *cq, int num_entries, struct _ib_wc *wc);
450         int                     (*poll_cq_list)( struct ibv_cq *ibcq, 
451                 struct _ib_wc** const                   pp_free_wclist,
452                 struct _ib_wc** const                   pp_done_wclist );
453         int                     (*req_notify_cq)(struct ibv_cq *cq, int solicited_only);
454         int                     (*destroy_cq)(struct ibv_cq *cq);
455         struct ibv_srq *        (*create_srq)(struct ibv_pd *pd,
456                                               struct ibv_srq_init_attr *srq_init_attr);
457         int                     (*modify_srq)(struct ibv_srq *srq,
458                                               struct ibv_srq_attr *srq_attr,
459                                               enum ibv_srq_attr_mask srq_attr_mask);
460         int                     (*destroy_srq)(struct ibv_srq *srq);
461         int                     (*post_srq_recv)(struct ibv_srq *srq,
462                                                  struct _ib_recv_wr *recv_wr,
463                                                  struct _ib_recv_wr **bad_recv_wr);
464         struct ibv_qp *(*create_qp_pre)(struct ibv_pd *pd, 
465                 struct ibv_qp_init_attr *attr, struct ibv_create_qp *req);
466         struct ibv_qp *(*create_qp_post)(struct ibv_pd *pd, 
467                 struct ibv_create_qp_resp *resp);
468         int                     (*modify_qp)(struct ibv_qp *qp, struct ibv_qp_attr *attr,
469                                              enum ibv_qp_attr_mask attr_mask);
470         int                     (*destroy_qp)(struct ibv_qp *qp);
471         int                     (*post_send)(struct ibv_qp *qp, struct _ib_send_wr *wr,
472                                              struct _ib_send_wr **bad_wr);
473         int                     (*post_recv)(struct ibv_qp *qp, struct _ib_recv_wr *wr,
474                                              struct _ib_recv_wr **bad_wr);
475         int                     (*attach_mcast)(struct ibv_qp *qp, union ibv_gid *gid,
476                                                 uint16_t lid);
477         int                     (*detach_mcast)(struct ibv_qp *qp, union ibv_gid *gid,
478                                                 uint16_t lid);
479 };
480
481 struct ibv_context {
482         struct ibv_context_ops     ops;
483         void                      *abi_compat;
484 };
485
486 int align_queue_size(struct ibv_context *context, int size, int spare);
487
488 END_C_DECLS
489
490 #endif /* INFINIBAND_VERBS_H */