84a2e00899222c25a518355e94fd11effac9d2fb
[mirror/winof/.git] / hw / mthca / 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  *\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: hca_data.h 148 2005-07-12 07:48:46Z sleybo $\r
31  */\r
32 \r
33 #ifndef __HCA_DATA_H__\r
34 #define __HCA_DATA_H__\r
35 \r
36 \r
37 #include <iba/ib_ci.h>\r
38 #include <complib/comp_lib.h>\r
39 #include <mt_l2w.h>\r
40 #include <mthca_provider.h>\r
41 \r
42 \r
43 extern char                             mlnx_uvp_lib_name[];\r
44 extern uint32_t                 g_skip_tavor_reset;\r
45 extern uint32_t                 g_disable_tavor_reset;\r
46 \r
47 \r
48 #define MLNX_MAX_HCA   4\r
49 #define MLNX_NUM_HOBKL MLNX_MAX_HCA\r
50 #define MLNX_NUM_HOBUL MLNX_MAX_HCA\r
51 #define MLNX_NUM_CB_THR     1\r
52 #define MLNX_SIZE_CB_POOL 256\r
53 #define MLNX_UAL_ALLOC_HCA_UL_RES 1\r
54 #define MLNX_UAL_FREE_HCA_UL_RES 2\r
55 \r
56 \r
57 // Defines for QP ops\r
58 #define MLNX_MAX_NUM_SGE 8\r
59 #define MLNX_MAX_WRS_PER_CHAIN 4\r
60 \r
61 #define MLNX_NUM_RESERVED_QPS 16\r
62 \r
63 /*\r
64  * Completion model.\r
65  *      0: No DPC processor assignment\r
66  *      1: DPCs per-CQ, processor affinity set at CQ initialization time.\r
67  *      2: DPCs per-CQ, processor affinity set at runtime.\r
68  *      3: DPCs per-CQ, no processor affinity set.\r
69  */\r
70 #define MLNX_COMP_MODEL         3\r
71 \r
72 #ifdef DBG\r
73 #define VALIDATE_INDEX(index, limit, error, label) \\r
74         {                  \\r
75                 if (index >= limit) \\r
76                 {                   \\r
77                         status = error;   \\r
78                         HCA_PRINT(TRACE_LEVEL_ERROR  , g_mlnx_dbg_lvl  ,("file %s line %d\n", __FILE__, __LINE__)));\\r
79                         goto label;       \\r
80                 }                   \\r
81         }\r
82 #else\r
83 #define VALIDATE_INDEX(index, limit, error, label)\r
84 #endif\r
85 \r
86 \r
87 \r
88 // Typedefs\r
89 \r
90 typedef enum {\r
91         E_EV_CA=1,\r
92         E_EV_QP,\r
93         E_EV_CQ,\r
94         E_EV_LAST\r
95 } ENUM_EVENT_CLASS;\r
96 \r
97 typedef enum {\r
98         E_MARK_CA=1, // Channel Adaptor\r
99         E_MARK_PD, // Protection Domain\r
100         E_MARK_CQ, // Completion Queue\r
101         E_MARK_QP, // Queue Pair\r
102         E_MARK_AV, // Address Vector (UD)\r
103         E_MARK_MG, // Multicast Group\r
104         E_MARK_MR, // Memory Region\r
105         E_MARK_MW, // Memory Windows\r
106         E_MARK_INVALID,\r
107 } ENUM_MARK;\r
108 \r
109 typedef enum {\r
110         E_MR_PHYS=1,\r
111         E_MR_SHARED,\r
112         E_MR_ANY,\r
113         E_MR_INVALID\r
114 } ENUM_MR_TYPE;\r
115 \r
116 /*\r
117  * Attribute cache for port info saved to expedite local MAD processing.\r
118  * Note that the cache accounts for the worst case GID and PKEY table size\r
119  * but is allocated from paged pool, so it's nothing to worry about.\r
120  */\r
121 \r
122 typedef struct _guid_block\r
123 {\r
124         boolean_t                               valid;\r
125         ib_guid_info_t                  tbl;\r
126 \r
127 }       mlnx_guid_block_t;\r
128 \r
129 typedef struct _port_info_cache\r
130 {\r
131         boolean_t                               valid;\r
132         ib_port_info_t                  info;\r
133 \r
134 }       mlnx_port_info_cache_t;\r
135 \r
136 typedef struct _pkey_block\r
137 {\r
138         boolean_t                               valid;\r
139         ib_pkey_table_info_t    tbl;\r
140 \r
141 }       mlnx_pkey_block_t;\r
142 \r
143 typedef struct _sl_vl_cache\r
144 {\r
145         boolean_t                               valid;\r
146         ib_slvl_table_t                 tbl;\r
147 \r
148 }       mlnx_sl_vl_cache_t;\r
149 \r
150 typedef struct _vl_arb_block\r
151 {\r
152         boolean_t                               valid;\r
153         ib_vl_arb_table_t               tbl;\r
154 \r
155 }       mlnx_vl_arb_block_t;\r
156 \r
157 typedef struct _attr_cache\r
158 {\r
159         mlnx_guid_block_t               guid_block[32];\r
160         mlnx_port_info_cache_t  port_info;\r
161         mlnx_pkey_block_t               pkey_tbl[2048];\r
162         mlnx_sl_vl_cache_t              sl_vl;\r
163         mlnx_vl_arb_block_t             vl_arb[4];\r
164 \r
165 }       mlnx_cache_t;\r
166 \r
167 typedef struct _ib_ca {\r
168         ENUM_MARK           mark;\r
169         ci_completion_cb_t  comp_cb_p;\r
170         ci_async_event_cb_t async_cb_p;\r
171         const void          *ca_context;\r
172         void                *cl_device_h;\r
173         uint32_t           index;\r
174         cl_async_proc_t     *async_proc_mgr_p;\r
175         mlnx_cache_t            *cache; // Cached port attributes.\r
176 } mlnx_hob_t;\r
177 \r
178 typedef struct HOBUL_t {\r
179         int dummy;\r
180 #ifdef WIN_TO_BE_REMOVED        \r
181         pd_info_t         *pd_info_tbl;\r
182         HH_hca_hndl_t     hh_hndl;                /* For HH direct access */\r
183         HHUL_hca_hndl_t   hhul_hndl;              /* user level HCA resources handle for HH */\r
184         uint32_t         cq_idx_mask;            /*                                                */\r
185         uint32_t         qp_idx_mask;            /*                                                */\r
186         uint32_t         vendor_id;              /* \                                              */\r
187         uint32_t         device_id;              /*  >  3 items needed for initializing user level */\r
188         void              *hca_ul_resources_p;    /* /                                              */\r
189         MT_size_t         cq_ul_resources_sz;     /* Needed for allocating user resources for CQs  */\r
190         MT_size_t         qp_ul_resources_sz;     /* Needed for allocating user resources for QPs  */\r
191         MT_size_t         pd_ul_resources_sz;     /* Needed for allocating user resources for PDs  */\r
192         uint32_t         max_cq;                 /* Max num. of CQs - size of following table */\r
193         cq_info_t         *cq_info_tbl;\r
194         uint32_t         max_qp;                 /* Max num. of QPs - size of following table */\r
195         qp_info_t         *qp_info_tbl;\r
196         uint32_t         max_pd;                 /* Max num. of PDs - size of following table */\r
197         uint32_t         log2_mpt_size;\r
198         atomic32_t        count;\r
199 #endif  \r
200 } mlnx_hobul_t, *mlnx_hobul_hndl_t;\r
201 \r
202 typedef struct _ib_mcast {\r
203         ib_gid_t         mcast_gid;\r
204         struct ib_qp *ib_qp_p;\r
205         uint16_t                        mcast_lid;\r
206 } mlnx_mcast_t;\r
207 \r
208 typedef struct _mlnx_hca_t {\r
209         cl_list_item_t  list_item;                      // to include in the HCA chain\r
210         net64_t                 guid;                                   // HCA node Guid\r
211         struct mthca_dev *mdev;         // VP Driver device\r
212         uint32_t                        hw_ver;                         // HCA HW version\r
213         mlnx_hob_t              hob;                                    // HOB - IBAL-related HCA resources\r
214 \r
215 #ifdef WIN_TO_BE_REMOVED \r
216         // removed as it is found in p_ext->cl_ext.p_pdo\r
217         const void* __ptr64     p_dev_obj;              // Driver PDO\r
218 #endif  \r
219 } mlnx_hca_t;\r
220 \r
221 \r
222 typedef mlnx_hob_t *mlnx_hca_h;\r
223 \r
224 // Global Variables\r
225 //extern mlnx_hca_t       mlnx_hca_array[];\r
226 //extern uint32_t         mlnx_num_hca;\r
227 \r
228 extern mlnx_hob_t   mlnx_hob_array[];\r
229 extern mlnx_hobul_t *mlnx_hobul_array[];\r
230 \r
231 // Functions\r
232 void\r
233 setup_ci_interface(\r
234         IN              const   ib_net64_t                                      ca_guid,\r
235         IN              const   int                                                     is_livefish,\r
236                 OUT                     ci_interface_t                          *p_interface );\r
237 \r
238 void\r
239 mlnx_hca_insert(\r
240         IN                              mlnx_hca_t                                      *p_hca );\r
241 \r
242 void\r
243 mlnx_hca_remove(\r
244         IN                              mlnx_hca_t                                      *p_hca );\r
245 \r
246 mlnx_hca_t*\r
247 mlnx_hca_from_guid(\r
248         IN                              ib_net64_t                                      guid );\r
249 \r
250 /*\r
251 void\r
252 mlnx_names_from_guid(\r
253         IN                              ib_net64_t                                      guid,\r
254                 OUT                     char                                            **hca_name_p,\r
255                 OUT                     char                                            **dev_name_p);\r
256 */\r
257 \r
258 cl_status_t\r
259 mlnx_hcas_init( void );\r
260 \r
261 cl_status_t\r
262 mlnx_hobs_init( void );\r
263 \r
264 ib_api_status_t\r
265 mlnx_hobs_insert(\r
266         IN                              mlnx_hca_t                                      *p_hca,\r
267                 OUT                     mlnx_hob_t                                      **hob_p);\r
268 \r
269 \r
270 ib_api_status_t\r
271 mlnx_hobs_set_cb(\r
272         IN                              mlnx_hob_t                                      *hob_p, \r
273         IN                              ci_completion_cb_t                      comp_cb_p,\r
274         IN                              ci_async_event_cb_t                     async_cb_p,\r
275         IN              const   void* const                                     ib_context);\r
276 \r
277 ib_api_status_t\r
278 mlnx_hobs_get_context(\r
279         IN                              mlnx_hob_t                                      *hob_p,\r
280                 OUT                     void                                            **context_p);\r
281 \r
282 ib_api_status_t\r
283 mlnx_hobs_create_device(\r
284         IN                              mlnx_hob_t                                      *hob_p,\r
285                 OUT                     char*                                           dev_name);\r
286 \r
287 void\r
288 mlnx_hobs_remove(\r
289         IN                              mlnx_hob_t                                      *hob_p);\r
290 \r
291 mlnx_hobul_t *\r
292 mlnx_hobs_get_hobul(\r
293         IN                              mlnx_hob_t                                      *hob_p);\r
294 \r
295 void\r
296 mlnx_hobul_get(\r
297         IN                              mlnx_hob_t                                      *hob_p,\r
298                 OUT                     void                                            **resources_p );\r
299 \r
300 void\r
301 mlnx_hobul_delete(\r
302         IN                              mlnx_hob_t                                      *hob_p);\r
303 \r
304 void\r
305 mlnx_conv_hca_cap(\r
306         IN                              struct ib_device *ib_dev,\r
307         IN                              struct ib_device_attr *hca_info_p,\r
308         IN                              struct ib_port_attr  *hca_ports,\r
309         OUT                     ib_ca_attr_t                            *ca_attr_p);\r
310 \r
311 ib_api_status_t\r
312 mlnx_local_mad (\r
313         IN              const   ib_ca_handle_t                          h_ca,\r
314         IN              const   uint8_t                                         port_num,\r
315         IN              const   ib_mad_t                                        *p_mad_in,\r
316                 OUT                     ib_mad_t                                        *p_mad_out );\r
317 \r
318 void\r
319 mlnx_memory_if(\r
320         IN      OUT                     ci_interface_t                          *p_interface );\r
321 \r
322 void\r
323 mlnx_memory_if_livefish(\r
324         IN      OUT                     ci_interface_t                          *p_interface );\r
325 \r
326 void\r
327 mlnx_ecc_if(\r
328         IN      OUT                     ci_interface_t                          *p_interface );\r
329 \r
330 void\r
331 mlnx_direct_if(\r
332         IN      OUT                     ci_interface_t                          *p_interface );\r
333 \r
334 void\r
335 mlnx_mcast_if(\r
336         IN      OUT                     ci_interface_t                          *p_interface );\r
337 \r
338 ib_api_status_t\r
339 fw_access_ctrl(\r
340         IN              const   void* __ptr64                           context,\r
341         IN              const   void* __ptr64* const            handle_array    OPTIONAL,\r
342         IN                              uint32_t                                        num_handles,\r
343         IN                              ib_ci_op_t* const                       p_ci_op,\r
344         IN      OUT                     ci_umv_buf_t                            *p_umv_buf              OPTIONAL);\r
345 \r
346 void unmap_crspace_for_all( struct ib_ucontext *p_context );\r
347 \r
348 void cq_comp_handler(struct ib_cq *cq, void *context);\r
349 \r
350 void ca_event_handler(struct ib_event *ev, void *context);\r
351 \r
352 void qp_event_handler(struct ib_event *ev, void *context);\r
353 \r
354 void cq_event_handler(struct ib_event *ev, void *context);\r
355 \r
356 ib_qp_state_t mlnx_qps_to_ibal(enum ib_qp_state qps);\r
357 \r
358 enum ib_qp_state mlnx_qps_from_ibal(ib_qp_state_t ib_qps);\r
359 \r
360 ib_api_status_t\r
361 mlnx_conv_qp_modify_attr(\r
362         IN       const  struct ib_qp *ib_qp_p,\r
363         IN                              ib_qp_type_t    qp_type,\r
364         IN       const  ib_qp_mod_t *modify_attr_p,             \r
365         OUT     struct ib_qp_attr *qp_attr_p,\r
366         OUT     int *qp_attr_mask_p\r
367         );\r
368 \r
369 int\r
370 mlnx_conv_ibal_av(\r
371         IN              const   struct ib_device *ib_dev_p,\r
372         IN              const   ib_av_attr_t                            *ibal_av_p,\r
373         OUT                     struct ib_ah_attr       *ah_attr_p);\r
374 \r
375 int\r
376 mlnx_conv_mthca_av(\r
377         IN              const   struct ib_ah *ib_ah_p,\r
378         OUT                     ib_av_attr_t                            *ibal_av_p);\r
379 \r
380 void\r
381 mlnx_modify_ah(\r
382         IN              const   struct ib_ah *ib_ah_p,\r
383         IN      const   struct ib_ah_attr *ah_attr_p);\r
384 \r
385 void set_skip_tavor_reset();\r
386 \r
387 #endif\r