[MLX4] 1) added support for sending large multi-parameter messages to System Event...
[mirror/winof/.git] / hw / mlx4 / kernel / inc / l2w.h
1 #pragma once
2
3 #ifndef L2W_H
4 #define L2W_H
5
6 ////////////////////////////////////////////////////////
7 //
8 // GENERAL INCLUDES
9 //
10 ////////////////////////////////////////////////////////
11
12 // OS
13 #include <ntddk.h>
14 //#include <iointex.h>
15 #include <stdio.h>
16 #include <stdarg.h>
17 #include <stdlib.h>
18 #include <errno.h>
19 #define NTSTRSAFE_LIB
20 #include <ntstrsafe.h>
21
22 // complib
23 #include <complib/cl_timer.h>
24 #include <complib/cl_qlist.h>
25
26 // mlx4
27 #include "vc.h"
28
29
30 ////////////////////////////////////////////////////////
31 //
32 // LITERALS
33 //
34 ////////////////////////////////////////////////////////
35
36 #define BITS_PER_LONG           32
37 #define N_BARS                          3
38 #define HZ                                      1000000 /* 1 sec in usecs */
39 #define EOPNOTSUPP                      95
40
41
42 ////////////////////////////////////////////////////////
43 //
44 // SUBSTITUTIONS
45 //
46 ////////////////////////////////////////////////////////
47
48 #define BUG_ON(exp)             ASSERT(!(exp)) /* in Linux follows here panic() !*/ 
49 #define snprintf                _snprintf
50 #define printk                  cl_dbg_out
51 #define KERN_ERR                "err:"
52 #define KERN_WARNING    "warn:"
53 #define KERN_DEBUG              "dbg:"
54
55 // memory barriers
56 #define wmb KeMemoryBarrier
57 #define rmb KeMemoryBarrier
58 #define mb KeMemoryBarrier
59 // TODO: can we make it empty ?  I saw in Linux, it is an empty macro for x86 & x64
60 #define mmiowb KeMemoryBarrier
61
62 // linker 
63 #define EXPORT_SYMBOL_GPL(a)
64
65 // gcc compiler attributes
66 #define __devinit
67 #define __devinitdata
68 #define __init
69 #define __exit
70 #define __force
71 #define __iomem
72 #define __attribute_const__
73 #define likely(x)                       (x)
74 #define unlikely(x)                     (x)
75 #define __attribute__(a)
76 #define __bitwise
77
78 // container_of
79 #define container_of            CONTAINING_RECORD
80
81 // inline 
82 #define inline  __inline
83
84 // new Linux event mechanism
85 #define complete(a)                                     wake_up(a)
86
87 // convert
88 #define __constant_htons                CL_HTON16
89 #define __constant_cpu_to_be32  CL_HTON32
90
91 // various
92 #define __always_inline                         inline
93
94 ////////////////////////////////////////////////////////
95 //
96 // TYPES
97 //
98 ////////////////////////////////////////////////////////
99
100 // basic types
101 typedef unsigned char                   u8, __u8;
102 typedef unsigned short int      u16, __u16;
103 typedef unsigned int                            u32, __u32;
104 typedef unsigned __int64                u64, __u64;
105 typedef char                    s8, __s8;
106 typedef short int       s16, __s16;
107 typedef int                             s32, __s32;
108 typedef __int64         s64, __s64;
109
110 // inherited
111 typedef u16  __le16;
112 typedef u16  __be16;
113 typedef u32  __le32;
114 typedef u32  __be32;
115 typedef u64  __le64;
116 typedef u64  __be64;
117 typedef u64 io_addr_t;
118
119 // dummy function
120 typedef void (*MT_EMPTY_FUNC)();
121
122 // PCI BAR descriptor
123 typedef enum _hca_bar_type
124 {
125         HCA_BAR_TYPE_HCR,
126         HCA_BAR_TYPE_UAR,
127         HCA_BAR_TYPE_DDR,
128         HCA_BAR_TYPE_MAX
129
130 }       hca_bar_type_t;
131
132
133 typedef struct _hca_bar
134 {
135         uint64_t                        phys;
136         void                            *virt;
137         SIZE_T                          size;
138
139 }       hca_bar_t;
140
141 struct msix_saved_info {
142         PVOID   vca;            /* MSI-X Vector Table card address */
143         PVOID   mca;            /* MSI-X Mask Table card address */
144         PVOID   vsa;            /* MSI-X Vector Table saved address */
145         PVOID   msa;            /* MSI-X Mask Table saved address */
146         ULONG   vsz;            /* MSI-X Vector Table size */
147         ULONG   msz;            /* MSI-X Mask Table size */
148         int             num;            /* number of supported MSI-X vectors */
149         int             valid;          /* the structure is valid */
150 };
151
152 struct msix_map {
153         KAFFINITY       cpu;            /* affinity of this MSI-X vector */
154         int                     eq_ix;          /* EQ index in the array of EQs */
155         int                     ref_cnt;        /* number of users */
156 };
157
158 // interface structure between Upper and Low Layers of the driver
159 struct pci_dev
160 {
161         // driver: OS/platform resources
162         BUS_INTERFACE_STANDARD                  bus_pci_ifc;
163         PCI_COMMON_CONFIG                               pci_cfg_space;
164         struct msix_saved_info                  msix_info;
165         struct msix_map*                                p_msix_map;
166         uplink_info_t                                   uplink_info;
167         // driver: card resources
168         hca_bar_t                                               bar[N_BARS];
169         CM_PARTIAL_RESOURCE_DESCRIPTOR  int_info;       /* HCA interrupt resources */
170         // driver: various objects and info
171         USHORT                                                  ven_id;
172         USHORT                                                  dev_id;
173         USHORT                                                  sub_vendor_id;
174         USHORT                                                  sub_system_id;
175         UCHAR                                                   revision_id;
176         DMA_ADAPTER             *                               p_dma_adapter;  /* HCA adapter object */
177         DEVICE_OBJECT   *                               p_self_do;              /* mlx4_bus's FDO */
178         DEVICE_OBJECT   *                               pdo;                    /* mlx4_bus's PDO */
179         // mlx4_ib: various objects and info    
180         struct ib_device *                              ib_dev;
181         // mlx4_net: various objects and info   
182         struct mlx4_dev *                               dev;
183         volatile long                                   dpc_lock;
184         PUCHAR                                                  vpd;
185         int                                                             vpd_size;
186         WCHAR                                                   location[36];           /* bus+func+dev */
187 #ifdef USE_WDM_INTERRUPTS
188         PKINTERRUPT                                             int_obj;                /* HCA interrupt object */
189         KSPIN_LOCK                                              isr_lock;               /* lock for the ISR */
190         // MSI-X interrupts
191         u8                                                              n_msi_vectors_alloc;/* number of allocated MSI vectors */
192         u8                                                              n_msi_vectors;          /* number of MSI vectors; 0 - no MSI */
193         ULONG                                                   version;
194         int                                                     legacy_connect;
195 #endif  
196 };
197
198 /* DPC */
199 typedef void (*dpc_t)( struct _KDPC *, PVOID, PVOID, PVOID );
200
201
202 ////////////////////////////////////////////////////////
203 //
204 // MACROS
205 //
206 ////////////////////////////////////////////////////////
207
208 // conversions
209 #define swab32(a)                       _byteswap_ulong((ULONG)(a))
210 #define cpu_to_be16(a)          _byteswap_ushort((USHORT)(a))
211 #define be16_to_cpu(a)          _byteswap_ushort((USHORT)(a))
212 #define cpu_to_be32(a)          _byteswap_ulong((ULONG)(a))
213 #define be32_to_cpu(a)          _byteswap_ulong((ULONG)(a))
214 #define cpu_to_be64(a)          _byteswap_uint64((UINT64)(a))
215 #define be64_to_cpu(a)          _byteswap_uint64((UINT64)(a))
216 #define be64_to_cpup(p)         _byteswap_uint64(*(PUINT64)(p))
217 #define be32_to_cpup(p)         _byteswap_ulong(*(PULONG)(p))
218 #define be16_to_cpup(p)         _byteswap_ushort(*(PUSHORT)(p))
219
220 // ARRAY_SIZE
221 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
222
223 // ALIGN
224 #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
225 #define PTR_ALIGN(size) (((size) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))
226
227 // there is a bug in Microsoft compiler, that when _byteswap_uint64() gets an expression
228 // it executes the expression but doesn't swap tte dwords
229 // So, there's a workaround
230 #ifdef BYTESWAP_UINT64_BUG_FIXED
231 #define CPU_2_BE64_PREP         
232 #define CPU_2_BE64(x)                   cl_hton64(x)
233 #else
234 #define CPU_2_BE64_PREP unsigned __int64 __tmp__        
235 #define CPU_2_BE64(x)                   ( __tmp__ = x, cl_hton64(__tmp__) )
236 #endif
237
238 #define ERR_PTR(error)          ((void*)(LONG_PTR)(error))
239 #define PTR_ERR(ptr)                    ((long)(LONG_PTR)(void*)(ptr))
240 //TODO: there are 2 assumptions here:
241 // - pointer can't be too big (around -1)
242 // - error can't be bigger than 1000
243 #define IS_ERR(ptr)                             ((ULONG_PTR)ptr > (ULONG_PTR)-1000L)
244
245 #define BITS_TO_LONGS(bits) \
246          (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
247
248 #ifndef ETIMEDOUT
249 #define ETIMEDOUT               (110)
250 #endif
251
252 #ifdef PAGE_ALIGN
253 #undef PAGE_ALIGN
254 #define PAGE_ALIGN(Va) ((u64)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
255 #endif
256
257 #define NEXT_PAGE_ALIGN(addr)   (((addr)+PAGE_SIZE-1)&PAGE_MASK)
258
259 /* typed minimum */
260 #define min_t(type,x,y)         ((type)(x) < (type)(y) ? (type)(x) : (type)(y))
261
262 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
263
264 #define EXPORT_SYMBOL(name)
265 #ifndef USE_WDM_INTERRUPTS
266 #define free_irq(pdev)
267 #endif
268
269 static inline NTSTATUS errno_to_ntstatus(int err)
270 {
271 #define MAP_ERR(err,ntstatus)   case err: status = ntstatus; break
272         NTSTATUS status;
273
274         if (!err) 
275                 return STATUS_SUCCESS;
276
277         if (err < 0)
278                 err = -err;
279         switch (err) {
280                 MAP_ERR( ENOENT, STATUS_NOT_FOUND );
281                 MAP_ERR( EAGAIN, STATUS_DEVICE_BUSY );
282                 MAP_ERR( ENOMEM, STATUS_NO_MEMORY );
283                 MAP_ERR( EACCES, STATUS_ACCESS_DENIED );
284                 MAP_ERR( EFAULT, STATUS_DRIVER_INTERNAL_ERROR );
285                 MAP_ERR( EBUSY, STATUS_INSUFFICIENT_RESOURCES );
286                 MAP_ERR( ENODEV, STATUS_NOT_SUPPORTED );
287                 MAP_ERR( EINVAL, STATUS_INVALID_PARAMETER );
288                 MAP_ERR( ENOSYS, STATUS_NOT_SUPPORTED );
289                 default:
290                         status = STATUS_UNSUCCESSFUL;
291                         break;
292         }
293         return status;
294 }
295
296
297 ////////////////////////////////////////////////////////
298 //
299 // PROTOTYPES
300 //
301 ////////////////////////////////////////////////////////
302
303 SIZE_T strlcpy(char *dest, const void *src, SIZE_T size);
304 int core_init();
305 void core_cleanup();
306
307
308 ////////////////////////////////////////////////////////
309 //
310 // SPECIFIC INCLUDES
311 //
312 ////////////////////////////////////////////////////////
313
314 struct mlx4_dev;
315 struct mlx4_priv;
316
317 #include <l2w_atomic.h>
318 #include <l2w_bit.h>
319 #include <l2w_bitmap.h>
320 #include "l2w_debug.h"
321 #include <l2w_memory.h>
322 #include <l2w_umem.h>
323 #include <l2w_list.h>
324 #include <l2w_pci.h>
325 #include <l2w_pcipool.h>
326 #include "l2w_radix.h"
327 #include <l2w_spinlock.h>
328 #include <l2w_sync.h>
329 #include <l2w_time.h>
330
331 #include "device.h"
332
333 static inline int mlx4_is_livefish(struct mlx4_dev *dev)
334 {
335         if (dev == NULL) {
336                 return TRUE;
337         }
338         return !!(dev->flags & MLX4_FLAG_LIVEFISH);
339 }
340
341 static inline int mlx4_is_barred(struct mlx4_dev *dev)
342 {
343         return dev->flags &  MLX4_FLAG_RESET_DRIVER;
344 }
345
346 static inline int mlx4_is_in_reset(struct mlx4_dev *dev)
347 {
348         return dev->flags & MLX4_FLAG_RESET_STARTED;
349 }
350
351 #endif