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