[MLX4] fix to the previous patch. [mlnx: 4417]
[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         DMA_ADAPTER             *                               p_dma_adapter;  /* HCA adapter object */
176         DEVICE_OBJECT   *                               p_self_do;              /* mlx4_bus's FDO */
177         DEVICE_OBJECT   *                               pdo;                    /* mlx4_bus's PDO */
178         // mlx4_ib: various objects and info    
179         struct ib_device *                              ib_dev;
180         // mlx4_net: various objects and info   
181         struct mlx4_dev *                               dev;
182         volatile long                                   dpc_lock;
183 #ifdef USE_WDM_INTERRUPTS
184         PKINTERRUPT                                             int_obj;                /* HCA interrupt object */
185         KSPIN_LOCK                                              isr_lock;               /* lock for the ISR */
186         // MSI-X interrupts
187         u8                                                              n_msi_vectors_alloc;/* number of allocated MSI vectors */
188         u8                                                              n_msi_vectors;          /* number of MSI vectors; 0 - no MSI */
189         ULONG                                                   version;
190         int                                                     legacy_connect;
191 #endif  
192 };
193
194 /* DPC */
195 typedef void (*dpc_t)( struct _KDPC *, PVOID, PVOID, PVOID );
196
197
198 ////////////////////////////////////////////////////////
199 //
200 // MACROS
201 //
202 ////////////////////////////////////////////////////////
203
204 // conversions
205 #define swab32(a)                       _byteswap_ulong((ULONG)(a))
206 #define cpu_to_be16(a)          _byteswap_ushort((USHORT)(a))
207 #define be16_to_cpu(a)          _byteswap_ushort((USHORT)(a))
208 #define cpu_to_be32(a)          _byteswap_ulong((ULONG)(a))
209 #define be32_to_cpu(a)          _byteswap_ulong((ULONG)(a))
210 #define cpu_to_be64(a)          _byteswap_uint64((UINT64)(a))
211 #define be64_to_cpu(a)          _byteswap_uint64((UINT64)(a))
212 #define be64_to_cpup(p)         _byteswap_uint64(*(PUINT64)(p))
213 #define be32_to_cpup(p)         _byteswap_ulong(*(PULONG)(p))
214 #define be16_to_cpup(p)         _byteswap_ushort(*(PUSHORT)(p))
215
216 // ARRAY_SIZE
217 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
218
219 // ALIGN
220 #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
221 #define PTR_ALIGN(size) (((size) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))
222
223 // there is a bug in Microsoft compiler, that when _byteswap_uint64() gets an expression
224 // it executes the expression but doesn't swap tte dwords
225 // So, there's a workaround
226 #ifdef BYTESWAP_UINT64_BUG_FIXED
227 #define CPU_2_BE64_PREP         
228 #define CPU_2_BE64(x)                   cl_hton64(x)
229 #else
230 #define CPU_2_BE64_PREP unsigned __int64 __tmp__        
231 #define CPU_2_BE64(x)                   ( __tmp__ = x, cl_hton64(__tmp__) )
232 #endif
233
234 #define ERR_PTR(error)          ((void*)(LONG_PTR)(error))
235 #define PTR_ERR(ptr)                    ((long)(LONG_PTR)(void*)(ptr))
236 //TODO: there are 2 assumptions here:
237 // - pointer can't be too big (around -1)
238 // - error can't be bigger than 1000
239 #define IS_ERR(ptr)                             ((ULONG_PTR)ptr > (ULONG_PTR)-1000L)
240
241 #define BITS_TO_LONGS(bits) \
242          (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
243
244 #ifndef ETIMEDOUT
245 #define ETIMEDOUT               (110)
246 #endif
247
248 #ifdef PAGE_ALIGN
249 #undef PAGE_ALIGN
250 #define PAGE_ALIGN(Va) ((u64)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
251 #endif
252
253 #define NEXT_PAGE_ALIGN(addr)   (((addr)+PAGE_SIZE-1)&PAGE_MASK)
254
255 /* typed minimum */
256 #define min_t(type,x,y)         ((type)(x) < (type)(y) ? (type)(x) : (type)(y))
257
258 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
259
260 #define EXPORT_SYMBOL(name)
261 #ifndef USE_WDM_INTERRUPTS
262 #define free_irq(pdev)
263 #endif
264
265 static inline NTSTATUS errno_to_ntstatus(int err)
266 {
267 #define MAP_ERR(err,ntstatus)   case err: status = ntstatus; break
268         NTSTATUS status;
269
270         if (!err) 
271                 return STATUS_SUCCESS;
272
273         if (err < 0)
274                 err = -err;
275         switch (err) {
276                 MAP_ERR( ENOENT, STATUS_NOT_FOUND );
277                 MAP_ERR( EAGAIN, STATUS_DEVICE_BUSY );
278                 MAP_ERR( ENOMEM, STATUS_NO_MEMORY );
279                 MAP_ERR( EACCES, STATUS_ACCESS_DENIED );
280                 MAP_ERR( EFAULT, STATUS_DRIVER_INTERNAL_ERROR );
281                 MAP_ERR( EBUSY, STATUS_INSUFFICIENT_RESOURCES );
282                 MAP_ERR( ENODEV, STATUS_NOT_SUPPORTED );
283                 MAP_ERR( EINVAL, STATUS_INVALID_PARAMETER );
284                 MAP_ERR( ENOSYS, STATUS_NOT_SUPPORTED );
285                 default:
286                         status = STATUS_UNSUCCESSFUL;
287                         break;
288         }
289         return status;
290 }
291
292
293 ////////////////////////////////////////////////////////
294 //
295 // PROTOTYPES
296 //
297 ////////////////////////////////////////////////////////
298
299 SIZE_T strlcpy(char *dest, const void *src, SIZE_T size);
300 int core_init();
301 void core_cleanup();
302
303
304 ////////////////////////////////////////////////////////
305 //
306 // SPECIFIC INCLUDES
307 //
308 ////////////////////////////////////////////////////////
309
310 struct mlx4_dev;
311 struct mlx4_priv;
312
313 #include <l2w_atomic.h>
314 #include <l2w_bit.h>
315 #include <l2w_bitmap.h>
316 #include "l2w_debug.h"
317 #include <l2w_memory.h>
318 #include <l2w_umem.h>
319 #include <l2w_list.h>
320 #include <l2w_pci.h>
321 #include <l2w_pcipool.h>
322 #include "l2w_radix.h"
323 #include <l2w_spinlock.h>
324 #include <l2w_sync.h>
325 #include <l2w_time.h>
326
327 #include "device.h"
328
329 static inline int mlx4_is_livefish(struct mlx4_dev *dev)
330 {
331         if (dev == NULL) {
332                 return TRUE;
333         }
334         return !!(dev->flags & MLX4_FLAG_LIVEFISH);
335 }
336
337 static inline int mlx4_is_barred(struct mlx4_dev *dev)
338 {
339         return dev->flags &  MLX4_FLAG_RESET_DRIVER;
340 }
341
342 static inline int mlx4_is_in_reset(struct mlx4_dev *dev)
343 {
344         return dev->flags & MLX4_FLAG_RESET_STARTED;
345 }
346
347 #endif