[IBAL, HW] Remove pointers from ci_umv_buf_t.
[mirror/winof/.git] / hw / mthca / user / mlnx_uvp.h
1 /*\r
2  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.\r
3  * Copyright (c) 2005 Cisco Systems.  All rights reserved.\r
4  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
5  *\r
6  * This software is available to you under a choice of one of two\r
7  * licenses.  You may choose to be licensed under the terms of the GNU\r
8  * General Public License (GPL) Version 2, available from the file\r
9  * COPYING in the main directory of this source tree, or the\r
10  * OpenIB.org BSD license below:\r
11  *\r
12  *     Redistribution and use in source and binary forms, with or\r
13  *     without modification, are permitted provided that the following\r
14  *     conditions are met:\r
15  *\r
16  *      - Redistributions of source code must retain the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer.\r
19  *\r
20  *      - Redistributions in binary form must reproduce the above\r
21  *        copyright notice, this list of conditions and the following\r
22  *        disclaimer in the documentation and/or other materials\r
23  *        provided with the distribution.\r
24  *\r
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
32  * SOFTWARE.\r
33  *\r
34  * $Id$\r
35  */\r
36 \r
37 #ifndef MTHCA_H\r
38 #define MTHCA_H\r
39 \r
40 #include <cl_spinlock.h>\r
41 #include <mlnx_uvp_verbs.h>\r
42 #include <arch.h>\r
43 #include "mlnx_uvp_debug.h"\r
44 \r
45 #define PFX             "mthca: "\r
46 \r
47 enum mthca_hca_type {\r
48         MTHCA_TAVOR,\r
49         MTHCA_ARBEL,\r
50         MTHCA_LIVEFISH\r
51 };\r
52 \r
53 enum {\r
54         MTHCA_CQ_ENTRY_SIZE = 0x20,\r
55         MTHCA_BYTES_PER_ATOMIC_COMPL = 0x8\r
56 };\r
57 \r
58 enum {\r
59         MTHCA_QP_TABLE_BITS = 8,\r
60         MTHCA_QP_TABLE_SIZE = 1 << MTHCA_QP_TABLE_BITS,\r
61         MTHCA_QP_TABLE_MASK = MTHCA_QP_TABLE_SIZE - 1\r
62 };\r
63 \r
64 enum {\r
65         MTHCA_DB_REC_PAGE_SIZE = 4096,\r
66         MTHCA_DB_REC_PER_PAGE  = MTHCA_DB_REC_PAGE_SIZE / 8\r
67 };\r
68 \r
69 enum mthca_db_type {\r
70         MTHCA_DB_TYPE_INVALID   = 0x0,\r
71         MTHCA_DB_TYPE_CQ_SET_CI = 0x1,\r
72         MTHCA_DB_TYPE_CQ_ARM    = 0x2,\r
73         MTHCA_DB_TYPE_SQ        = 0x3,\r
74         MTHCA_DB_TYPE_RQ        = 0x4,\r
75         MTHCA_DB_TYPE_SRQ       = 0x5,\r
76         MTHCA_DB_TYPE_GROUP_SEP = 0x7\r
77 };\r
78 \r
79 enum mthca_wr_opcode {\r
80         MTHCA_OPCODE_NOP            = 0x00,\r
81         MTHCA_OPCODE_RDMA_WRITE     = 0x08,\r
82         MTHCA_OPCODE_RDMA_WRITE_IMM = 0x09,\r
83         MTHCA_OPCODE_SEND           = 0x0a,\r
84         MTHCA_OPCODE_SEND_IMM       = 0x0b,\r
85         MTHCA_OPCODE_RDMA_READ      = 0x10,\r
86         MTHCA_OPCODE_ATOMIC_CS      = 0x11,\r
87         MTHCA_OPCODE_ATOMIC_FA      = 0x12,\r
88         MTHCA_OPCODE_BIND_MW        = 0x18,\r
89         MTHCA_OPCODE_INVALID        = 0xff\r
90 };\r
91 \r
92 struct mthca_ah_page;\r
93 \r
94 struct mthca_db_table;\r
95 \r
96 struct mthca_context {\r
97         struct ibv_context     ibv_ctx;\r
98         void                  *uar;\r
99         cl_spinlock_t     uar_lock;\r
100         struct mthca_db_table *db_tab;\r
101         struct ibv_pd         *pd;\r
102         struct {\r
103                 struct mthca_qp **table;\r
104                 int               refcnt;\r
105         }                      qp_table[MTHCA_QP_TABLE_SIZE];\r
106         HANDLE        qp_table_mutex;\r
107         int                    num_qps;\r
108         int                    qp_table_shift;\r
109         int                    qp_table_mask;\r
110         enum mthca_hca_type hca_type;\r
111 };\r
112 \r
113 struct mthca_pd {\r
114         struct ibv_pd         ibv_pd;\r
115         struct mthca_ah_page *ah_list;\r
116         HANDLE       ah_mutex;\r
117         uint32_t              pdn;\r
118 };\r
119 \r
120 struct mthca_cq {\r
121         struct ibv_cq      ibv_cq;\r
122         void              *buf;\r
123         cl_spinlock_t lock;\r
124         struct ibv_mr     mr;\r
125         uint32_t           cqn;\r
126         uint32_t           cons_index;\r
127 \r
128         /* Next fields are mem-free only */\r
129         int                set_ci_db_index;\r
130         uint32_t          *set_ci_db;\r
131         int                arm_db_index;\r
132         uint32_t          *arm_db;\r
133         int                u_arm_db_index;\r
134         uint32_t          *p_u_arm_sn;\r
135 };\r
136 \r
137 struct mthca_srq {\r
138         struct ibv_srq     ibv_srq;\r
139         void              *buf;\r
140         void              *last;\r
141         cl_spinlock_t lock;\r
142         struct ibv_mr     mr;\r
143         uint64_t          *wrid;\r
144         uint32_t           srqn;\r
145         int                max;\r
146         int                max_gs;\r
147         int                wqe_shift;\r
148         int                first_free;\r
149         int                last_free;\r
150         int                buf_size;\r
151 \r
152         /* Next fields are mem-free only */\r
153         int                db_index;\r
154         uint32_t          *db;\r
155         uint16_t           counter;\r
156 };\r
157 \r
158 struct mthca_wq {\r
159         cl_spinlock_t lock;\r
160         int                max;\r
161         unsigned           next_ind;\r
162         unsigned           last_comp;\r
163         unsigned           head;\r
164         unsigned           tail;\r
165         void              *last;\r
166         int                max_gs;\r
167         int                wqe_shift;\r
168 \r
169         /* Next fields are mem-free only */\r
170         int                db_index;\r
171         uint32_t          *db;\r
172 };\r
173 \r
174 struct mthca_qp {\r
175         struct ibv_qp    ibv_qp;\r
176         uint8_t            *buf;\r
177         uint64_t        *wrid;\r
178         int              send_wqe_offset;\r
179         int              max_inline_data;\r
180         int              buf_size;\r
181         struct mthca_wq  sq;\r
182         struct mthca_wq  rq;\r
183         struct ibv_mr   mr;\r
184         int              sq_sig_all;\r
185 };\r
186 \r
187 struct mthca_av {\r
188         uint32_t port_pd;\r
189         uint8_t  reserved1;\r
190         uint8_t  g_slid;\r
191         uint16_t dlid;\r
192         uint8_t  reserved2;\r
193         uint8_t  gid_index;\r
194         uint8_t  msg_sr;\r
195         uint8_t  hop_limit;\r
196         uint32_t sl_tclass_flowlabel;\r
197         uint32_t dgid[4];\r
198 };\r
199 \r
200 struct mthca_ah {\r
201         struct mthca_av      *av;\r
202         ib_av_attr_t            av_attr;\r
203         ib_pd_handle_t  h_uvp_pd;\r
204         struct mthca_ah_page *page;\r
205         uint32_t              key;\r
206         int     in_kernel;\r
207 };\r
208 \r
209 #pragma warning( disable : 4200)\r
210 struct mthca_ah_page {\r
211         struct mthca_ah_page *prev, *next;\r
212         void                 *buf;\r
213         struct ibv_mr        mr;\r
214         int                   use_cnt;\r
215         unsigned              free[0];\r
216 };\r
217 #pragma warning( default  : 4200)\r
218 \r
219 \r
220 static inline uintptr_t db_align(uint32_t *db)\r
221 {\r
222         return (uintptr_t) db & ~((uintptr_t) MTHCA_DB_REC_PAGE_SIZE - 1);\r
223 }\r
224 \r
225 #define to_mxxx(xxx, type)                                              \\r
226         ((struct mthca_##type *)                                        \\r
227          ((uint8_t *) ib##xxx - offsetof(struct mthca_##type, ibv_##xxx)))\r
228 \r
229 static inline struct mthca_context *to_mctx(struct ibv_context *ibctx)\r
230 {\r
231         return to_mxxx(ctx, context);\r
232 }\r
233 \r
234 static inline struct mthca_pd *to_mpd(struct ibv_pd *ibpd)\r
235 {\r
236         return to_mxxx(pd, pd);\r
237 }\r
238 \r
239 static inline struct mthca_cq *to_mcq(struct ibv_cq *ibcq)\r
240 {\r
241         return to_mxxx(cq, cq);\r
242 }\r
243 \r
244 static inline struct mthca_srq *to_msrq(struct ibv_srq *ibsrq)\r
245 {\r
246         return to_mxxx(srq, srq);\r
247 }\r
248 \r
249 static inline struct mthca_qp *to_mqp(struct ibv_qp *ibqp)\r
250 {\r
251         return to_mxxx(qp, qp);\r
252 }\r
253 \r
254 static inline int mthca_is_memfree(struct ibv_context *ibctx)\r
255 {\r
256         return to_mctx(ibctx)->hca_type == MTHCA_ARBEL;\r
257 }\r
258 \r
259 int mthca_alloc_db(struct mthca_db_table *db_tab, enum mthca_db_type type,\r
260                           uint32_t **db);\r
261 void mthca_set_db_qn(uint32_t *db, enum mthca_db_type type, uint32_t qn);\r
262 void mthca_free_db(struct mthca_db_table *db_tab, enum mthca_db_type type, int db_index);\r
263 struct mthca_db_table *mthca_alloc_db_tab(int uarc_size);\r
264 void mthca_free_db_tab(struct mthca_db_table *db_tab);\r
265 \r
266 int mthca_query_device(struct ibv_context *context,\r
267                               struct ibv_device_attr *attr);\r
268 int mthca_query_port(struct ibv_context *context, uint8_t port,\r
269                             struct ibv_port_attr *attr);\r
270 \r
271         struct ibv_pd *mthca_alloc_pd(struct ibv_context *context, \r
272         struct ibv_alloc_pd_resp *resp_p);\r
273 \r
274 int mthca_free_pd(struct ibv_pd *pd);\r
275 \r
276 struct ibv_cq *mthca_create_cq_pre(struct ibv_context *context, int *cqe,\r
277                                  struct ibv_create_cq *req);\r
278 struct ibv_cq *mthca_create_cq_post(struct ibv_context *context, \r
279                                  struct ibv_create_cq_resp *resp);\r
280 int mthca_destroy_cq(struct ibv_cq *cq);\r
281 int mthca_poll_cq(struct ibv_cq *cq, int ne, struct _ib_wc *wc);\r
282 int mthca_poll_cq_list(struct ibv_cq *ibcq, \r
283         struct _ib_wc** const pp_free_wclist,\r
284         struct _ib_wc** const pp_done_wclist );\r
285 int mthca_tavor_arm_cq(struct ibv_cq *cq, int solicited);\r
286 int mthca_arbel_arm_cq(struct ibv_cq *cq, int solicited);\r
287 void mthca_cq_clean(struct mthca_cq *cq, uint32_t qpn,\r
288                            struct mthca_srq *srq);\r
289 void mthca_init_cq_buf(struct mthca_cq *cq, int nent);\r
290 \r
291 struct ibv_srq *mthca_create_srq(struct ibv_pd *pd,\r
292                                         struct ibv_srq_init_attr *attr);\r
293 int mthca_modify_srq(struct ibv_srq *srq,\r
294                             struct ibv_srq_attr *attr,\r
295                             enum ibv_srq_attr_mask mask);\r
296 int mthca_destroy_srq(struct ibv_srq *srq);\r
297 int mthca_alloc_srq_buf(struct ibv_pd *pd, struct ibv_srq_attr *attr,\r
298                                struct mthca_srq *srq);\r
299 void mthca_free_srq_wqe(struct mthca_srq *srq, int ind);\r
300 int mthca_tavor_post_srq_recv(struct ibv_srq *ibsrq,\r
301                                      struct _ib_recv_wr *wr,\r
302                                      struct _ib_recv_wr **bad_wr);\r
303 int mthca_arbel_post_srq_recv(struct ibv_srq *ibsrq,\r
304                                      struct _ib_recv_wr *wr,\r
305                                      struct _ib_recv_wr **bad_wr);\r
306 struct ibv_qp *mthca_create_qp_pre(struct ibv_pd *pd, \r
307         struct ibv_qp_init_attr *attr, struct ibv_create_qp *req);\r
308 struct ibv_qp *mthca_create_qp_post(struct ibv_pd *pd, \r
309         struct ibv_create_qp_resp *resp);\r
310 int mthca_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,\r
311                            enum ibv_qp_attr_mask attr_mask);\r
312 void mthca_destroy_qp_pre(struct ibv_qp *qp);\r
313 void mthca_destroy_qp_post(struct ibv_qp *qp, int ret);\r
314 void mthca_init_qp_indices(struct mthca_qp *qp);\r
315 int mthca_tavor_post_send(struct ibv_qp *ibqp, struct _ib_send_wr *wr,\r
316                                  struct _ib_send_wr **bad_wr);\r
317 int mthca_tavor_post_recv(struct ibv_qp *ibqp, struct _ib_recv_wr *wr,\r
318                                  struct _ib_recv_wr **bad_wr);\r
319 int mthca_arbel_post_send(struct ibv_qp *ibqp, struct _ib_send_wr *wr,\r
320                                  struct _ib_send_wr **bad_wr);\r
321 int mthca_arbel_post_recv(struct ibv_qp *ibqp, struct _ib_recv_wr *wr,\r
322                                  struct _ib_recv_wr **bad_wr);\r
323 int mthca_alloc_qp_buf(struct ibv_pd *pd, struct ibv_qp_cap *cap,\r
324                               ib_qp_type_t type, struct mthca_qp *qp);\r
325 struct mthca_qp *mthca_find_qp(struct mthca_context *ctx, uint32_t qpn);\r
326 int mthca_store_qp(struct mthca_context *ctx, uint32_t qpn, struct mthca_qp *qp);\r
327 void mthca_clear_qp(struct mthca_context *ctx, uint32_t qpn);\r
328 int mthca_free_err_wqe(struct mthca_qp *qp, int is_send,\r
329                               int index, int *dbd, uint32_t *new_wqe);\r
330 int mthca_alloc_av(struct mthca_pd *pd, struct ibv_ah_attr *attr,\r
331                           struct mthca_ah *ah, struct ibv_create_ah_resp *resp);\r
332 void mthca_free_av(struct mthca_ah *ah);\r
333 int mthca_attach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid);\r
334 int mthca_detach_mcast(struct ibv_qp *qp, union ibv_gid *gid, uint16_t lid);\r
335 struct ibv_context *mthca_alloc_context(struct ibv_get_context_resp *resp_p);\r
336 void mthca_free_context(struct ibv_context *ibctx);\r
337 \r
338 #endif /* MTHCA_H */\r