6f8e79e9a87fda82d79d727fb1ddac5ad98c1d77
[mirror/winof/.git] / hw / mlx4 / kernel / hca / data.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2004-2005 Mellanox Technologies, Inc. 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 the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id: hca_data.h 2036 2007-07-25 14:27:12Z leonid $\r
32  */\r
33 \r
34 #pragma once\r
35 \r
36 #include <iba/ib_ci.h>\r
37 #include <complib/comp_lib.h>\r
38 \r
39 extern char                             mlnx_uvp_lib_name[];\r
40 \r
41 \r
42 #define MLNX_MAX_HCA   4\r
43 #define MLNX_NUM_HOBKL MLNX_MAX_HCA\r
44 #define MLNX_NUM_CB_THR     1\r
45 #define MLNX_SIZE_CB_POOL 256\r
46 #define MLNX_UAL_ALLOC_HCA_UL_RES 1\r
47 #define MLNX_UAL_FREE_HCA_UL_RES 2\r
48 \r
49 \r
50 // Defines for QP ops\r
51 #define MLNX_MAX_NUM_SGE 8\r
52 #define MLNX_MAX_WRS_PER_CHAIN 4\r
53 \r
54 #define MLNX_NUM_RESERVED_QPS 16\r
55 \r
56 /*\r
57  * Completion model.\r
58  *      0: No DPC processor assignment\r
59  *      1: DPCs per-CQ, processor affinity set at CQ initialization time.\r
60  *      2: DPCs per-CQ, processor affinity set at runtime.\r
61  *      3: DPCs per-CQ, no processor affinity set.\r
62  */\r
63 #define MLNX_COMP_MODEL         3\r
64 \r
65 #ifdef DBG\r
66 #define VALIDATE_INDEX(index, limit, error, label) \\r
67         {                  \\r
68                 if (index >= limit) \\r
69                 {                   \\r
70                         status = error;   \\r
71                         HCA_PRINT(TRACE_LEVEL_ERROR  , g_mlnx_dbg_lvl  ,("file %s line %d\n", __FILE__, __LINE__)));\\r
72                         goto label;       \\r
73                 }                   \\r
74         }\r
75 #else\r
76 #define VALIDATE_INDEX(index, limit, error, label)\r
77 #endif\r
78 \r
79 \r
80 \r
81 // Typedefs\r
82 \r
83 typedef enum {\r
84         E_EV_CA=1,\r
85         E_EV_QP,\r
86         E_EV_CQ,\r
87         E_EV_LAST\r
88 } ENUM_EVENT_CLASS;\r
89 \r
90 typedef enum {\r
91         E_MR_PHYS=1,\r
92         E_MR_SHARED,\r
93         E_MR_ANY,\r
94         E_MR_INVALID\r
95 } ENUM_MR_TYPE;\r
96 \r
97 /*\r
98  * Attribute cache for port info saved to expedite local MAD processing.\r
99  * Note that the cache accounts for the worst case GID and PKEY table size\r
100  * but is allocated from paged pool, so it's nothing to worry about.\r
101  */\r
102 \r
103 typedef struct _guid_block\r
104 {\r
105         boolean_t                               valid;\r
106         ib_guid_info_t                  tbl;\r
107 \r
108 }       mlnx_guid_block_t;\r
109 \r
110 typedef struct _port_info_cache\r
111 {\r
112         boolean_t                               valid;\r
113         ib_port_info_t                  info;\r
114 \r
115 }       mlnx_port_info_cache_t;\r
116 \r
117 typedef struct _pkey_block\r
118 {\r
119         boolean_t                               valid;\r
120         ib_pkey_table_t tbl;\r
121 \r
122 }       mlnx_pkey_block_t;\r
123 \r
124 typedef struct _sl_vl_cache\r
125 {\r
126         boolean_t                               valid;\r
127         ib_slvl_table_t                 tbl;\r
128 \r
129 }       mlnx_sl_vl_cache_t;\r
130 \r
131 typedef struct _vl_arb_block\r
132 {\r
133         boolean_t                               valid;\r
134         ib_vl_arb_table_t               tbl;\r
135 \r
136 }       mlnx_vl_arb_block_t;\r
137 \r
138 typedef struct _attr_cache\r
139 {\r
140         mlnx_guid_block_t               guid_block[32];\r
141         mlnx_port_info_cache_t  port_info;\r
142         mlnx_pkey_block_t               pkey_tbl[2048];\r
143         mlnx_sl_vl_cache_t              sl_vl;\r
144         mlnx_vl_arb_block_t             vl_arb[4];\r
145 \r
146 }       mlnx_cache_t;\r
147 \r
148 typedef struct _ib_mcast {\r
149         ib_gid_t         mcast_gid;\r
150         struct ib_qp    *p_ib_qp;\r
151         uint16_t         mcast_lid;\r
152 } mlnx_mcast_t;\r
153 \r
154 typedef struct _mlnx_hca_t {\r
155         cl_list_item_t  list_item;                      // to include in the HCA chain\r
156         net64_t                 guid;                                   // HCA node Guid\r
157         uint32_t                        hw_ver;                         // HCA HW version\r
158         // HOB\r
159         ci_completion_cb_t  comp_cb_p;\r
160         ci_async_event_cb_t async_cb_p;\r
161         const void          *ca_context;\r
162         void                *cl_device_h;\r
163         uint32_t           index;\r
164         cl_async_proc_t     *async_proc_mgr_p;\r
165 } mlnx_hca_t;\r
166 \r
167 // Functions\r
168 void\r
169 setup_ci_interface(\r
170         IN              const   ib_net64_t                                      ca_guid,\r
171         IN              const   int                                                     is_livefish,\r
172                 OUT                     ci_interface_t                          *p_interface );\r
173 \r
174 void\r
175 mlnx_hca_insert(\r
176         IN                              mlnx_hca_t                                      *p_hca );\r
177 \r
178 void\r
179 mlnx_hca_remove(\r
180         IN                              mlnx_hca_t                                      *p_hca );\r
181 \r
182 mlnx_hca_t*\r
183 mlnx_hca_from_guid(\r
184         IN                              ib_net64_t                                      guid );\r
185 \r
186 /*\r
187 void\r
188 mlnx_names_from_guid(\r
189         IN                              ib_net64_t                                      guid,\r
190                 OUT                     char                                            **hca_name_p,\r
191                 OUT                     char                                            **dev_name_p);\r
192 */\r
193 \r
194 cl_status_t\r
195 mlnx_hcas_init( void );\r
196 \r
197 ib_api_status_t\r
198 mlnx_set_cb(\r
199         IN                              mlnx_hca_t                              *       p_hca, \r
200         IN                              ci_completion_cb_t                      comp_cb_p,\r
201         IN                              ci_async_event_cb_t                     async_cb_p,\r
202         IN              const   void* const                                     ib_context);\r
203 \r
204 void\r
205 mlnx_reset_cb(\r
206         IN                              mlnx_hca_t                              *       p_hca);\r
207 \r
208 void\r
209 from_hca_cap(\r
210         IN                              struct ib_device *ib_dev,\r
211         IN                              struct ib_device_attr *hca_info_p,\r
212         IN                              struct ib_port_attr  *hca_ports,\r
213         OUT                     ib_ca_attr_t                            *ca_attr_p);\r
214 \r
215 ib_api_status_t\r
216 mlnx_local_mad (\r
217         IN              const   ib_ca_handle_t                          h_ca,\r
218         IN              const   uint8_t                                         port_num,\r
219         IN              const   ib_av_attr_t                            *p_src_av_attr,\r
220         IN              const   ib_mad_t                                        *p_mad_in,\r
221                 OUT                     ib_mad_t                                        *p_mad_out );\r
222 \r
223 ib_api_status_t\r
224 fw_access_ctrl(\r
225         IN              const   void*                                           context,\r
226         IN              const   void** const                            handle_array    OPTIONAL,\r
227         IN                              uint32_t                                        num_handles,\r
228         IN                              ib_ci_op_t* const                       p_ci_op,\r
229         IN      OUT                     ci_umv_buf_t                            *p_umv_buf              OPTIONAL);\r
230 \r
231 void unmap_crspace_for_all( struct ib_ucontext *p_context );\r
232 \r
233 void cq_comp_handler(struct ib_cq *cq, void *context);\r
234 \r
235 void ca_event_handler(struct ib_event *ev, void *context);\r
236 \r
237 void srq_event_handler(struct ib_event *ev, void *context);\r
238 \r
239 void qp_event_handler(struct ib_event *ev, void *context);\r
240 \r
241 void cq_event_handler(struct ib_event *ev, void *context);\r
242 \r
243 ib_api_status_t\r
244 to_qp_attr(\r
245         IN       const  struct ib_qp *ib_qp_p,\r
246         IN                              ib_qp_type_t    qp_type,\r
247         IN       const  ib_qp_mod_t *modify_attr_p,             \r
248         OUT     struct ib_qp_attr *qp_attr_p,\r
249         OUT     int *qp_attr_mask_p\r
250         );\r
251 \r
252 ib_api_status_t\r
253 from_qp_attr(\r
254         IN       const  struct ib_qp    *p_ib_qp,\r
255         IN      struct ib_qp_attr               *p_ib_qp_attr,\r
256         OUT     ib_qp_attr_t            *p_qp_attr\r
257         );\r
258 \r
259 enum ib_qp_type to_qp_type(ib_qp_type_t qp_type);\r
260 \r
261 ib_qp_type_t from_qp_type(enum ib_qp_type ib_qp_type);\r
262 \r
263 int\r
264 to_av(\r
265         IN              const   struct ib_device        *p_ib_dev,\r
266         IN              const   ib_av_attr_t            *p_ib_av_attr,\r
267         OUT                     struct ib_ah_attr               *p_ib_ah_attr);\r
268 \r
269 int from_av(\r
270         IN              const   struct ib_device        *p_ib_dev,\r
271         IN                      struct ib_qp_attr               *p_ib_qp_attr,\r
272         IN                      struct ib_ah_attr               *p_ib_ah_attr,\r
273         OUT                             ib_av_attr_t            *p_ib_av_attr);\r
274 \r
275 enum ib_access_flags\r
276 to_qp_acl(\r
277         IN                              ib_access_t                                     ibal_acl);\r
278 \r
279 static inline int from_umv_buf(void *dest, ci_umv_buf_t* const p_umv_buf, size_t len)\r
280 {\r
281         RtlCopyMemory(dest, p_umv_buf->p_inout_buf,  len);\r
282         return 0;\r
283 }\r
284 \r
285 static inline int to_umv_buf(ci_umv_buf_t* const p_umv_buf, void *src, size_t len)\r
286 {\r
287         if (p_umv_buf->output_size < len) {\r
288                 p_umv_buf->status = IB_INSUFFICIENT_MEMORY;\r
289                 p_umv_buf->output_size = 0;\r
290                 return -EFAULT;\r
291         }\r
292         RtlCopyMemory(p_umv_buf->p_inout_buf,  src, len);\r
293         p_umv_buf->status = IB_SUCCESS;\r
294         p_umv_buf->output_size = (uint32_t)len;\r
295         return 0;\r
296 }\r
297 \r
298 \r
299 /* interface */\r
300 \r
301 void\r
302 mlnx_ca_if(\r
303         IN      OUT                     ci_interface_t                          *p_interface );\r
304 \r
305 void\r
306 mlnx_pd_if(\r
307         IN      OUT                     ci_interface_t                          *p_interface );\r
308 \r
309 void\r
310 mlnx_av_if(\r
311         IN      OUT                     ci_interface_t                          *p_interface );\r
312 \r
313 void\r
314 mlnx_cq_if(\r
315         IN      OUT                     ci_interface_t                          *p_interface );\r
316 \r
317 void\r
318 mlnx_qp_if(\r
319         IN      OUT                     ci_interface_t                          *p_interface );\r
320 \r
321 void\r
322 mlnx_srq_if(\r
323         IN      OUT                     ci_interface_t                          *p_interface );\r
324 \r
325 void\r
326 mlnx_mr_if(\r
327         IN      OUT                     ci_interface_t                          *p_interface );\r
328 \r
329 void\r
330 mlnx_direct_if(\r
331         IN      OUT                     ci_interface_t                          *p_interface );\r
332 \r
333 void\r
334 mlnx_mcast_if(\r
335         IN      OUT                     ci_interface_t                          *p_interface );\r
336 \r
337 void\r
338 mlnx_ca_if_livefish(\r
339         IN      OUT                     ci_interface_t                          *p_interface );\r
340 \r
341 void\r
342 mlnx_mr_if_livefish(\r
343         IN      OUT                     ci_interface_t                          *p_interface );\r
344 \r
345 \r