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