[mlx4] Prepare for support in msi for windows 2008
[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                  DbgPrint
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
142 // interface structure between Upper and Low Layers of the driver
143 struct pci_dev
144 {
145         // driver: OS/platform resources
146         BUS_INTERFACE_STANDARD                  bus_pci_ifc;
147         PCI_COMMON_CONFIG                               pci_cfg_space;
148         uplink_info_t                                   uplink_info;
149         // driver: card resources
150         hca_bar_t                                               bar[N_BARS];
151         CM_PARTIAL_RESOURCE_DESCRIPTOR  int_info;       /* HCA interrupt resources */
152         // driver: various objects and info
153         USHORT                                                  ven_id;
154         USHORT                                                  dev_id;
155         DMA_ADAPTER             *                               p_dma_adapter;  /* HCA adapter object */
156         DEVICE_OBJECT   *                               p_self_do;              /* mlx4 FDO */
157         // mlx4_ib: various objects and info    
158         struct ib_device *                              ib_dev;
159         // mlx4_net: various objects and info   
160         struct mlx4_dev *                               dev;
161         volatile long                                   dpc_lock;
162 #ifdef USE_WDM_INTERRUPTS
163         PKINTERRUPT                                             int_obj;                /* HCA interrupt object */
164         KSPIN_LOCK                                              isr_lock;               /* lock for the ISR */
165         int                                                             msi_used;               /* connected to MSI interrupts */
166 #endif  
167 };
168
169 /* DPC */
170 typedef void (*dpc_t)( struct _KDPC *, PVOID, PVOID, PVOID );
171
172
173 ////////////////////////////////////////////////////////
174 //
175 // MACROS
176 //
177 ////////////////////////////////////////////////////////
178
179 // conversions
180 #define swab32(a)                       _byteswap_ulong((ULONG)(a))
181 #define cpu_to_be16(a)          _byteswap_ushort((USHORT)(a))
182 #define be16_to_cpu(a)          _byteswap_ushort((USHORT)(a))
183 #define cpu_to_be32(a)          _byteswap_ulong((ULONG)(a))
184 #define be32_to_cpu(a)          _byteswap_ulong((ULONG)(a))
185 #define cpu_to_be64(a)          _byteswap_uint64((UINT64)(a))
186 #define be64_to_cpu(a)          _byteswap_uint64((UINT64)(a))
187 #define be64_to_cpup(p)         _byteswap_uint64(*(PUINT64)(p))
188 #define be32_to_cpup(p)         _byteswap_ulong(*(PULONG)(p))
189 #define be16_to_cpup(p)         _byteswap_ushort(*(PUSHORT)(p))
190
191 // ARRAY_SIZE
192 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
193
194 // ALIGN
195 #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
196 #define PTR_ALIGN(size) (((size) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))
197
198 // there is a bug in Microsoft compiler, that when _byteswap_uint64() gets an expression
199 // it executes the expression but doesn't swap tte dwords
200 // So, there's a workaround
201 #ifdef BYTESWAP_UINT64_BUG_FIXED
202 #define CPU_2_BE64_PREP         
203 #define CPU_2_BE64(x)                   cl_hton64(x)
204 #else
205 #define CPU_2_BE64_PREP unsigned __int64 __tmp__        
206 #define CPU_2_BE64(x)                   ( __tmp__ = x, cl_hton64(__tmp__) )
207 #endif
208
209 #define ERR_PTR(error)          ((void*)(LONG_PTR)(error))
210 #define PTR_ERR(ptr)                    ((long)(LONG_PTR)(void*)(ptr))
211 //TODO: there are 2 assumptions here:
212 // - pointer can't be too big (around -1)
213 // - error can't be bigger than 1000
214 #define IS_ERR(ptr)                             ((ULONG_PTR)ptr > (ULONG_PTR)-1000L)
215
216 #define BITS_TO_LONGS(bits) \
217          (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
218
219 #ifndef ETIMEDOUT
220 #define ETIMEDOUT               (110)
221 #endif
222
223 #ifdef PAGE_ALIGN
224 #undef PAGE_ALIGN
225 #define PAGE_ALIGN(Va) ((u64)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
226 #endif
227
228 #define NEXT_PAGE_ALIGN(addr)   (((addr)+PAGE_SIZE-1)&PAGE_MASK)
229
230 /* typed minimum */
231 #define min_t(type,x,y)         ((type)(x) < (type)(y) ? (type)(x) : (type)(y))
232
233 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
234
235 #define EXPORT_SYMBOL(name)
236 #ifndef USE_WDM_INTERRUPTS
237 #define free_irq(pdev)
238 #endif
239
240 static inline NTSTATUS errno_to_ntstatus(int err)
241 {
242 #define MAP_ERR(err,ntstatus)   case err: status = ntstatus; break
243         NTSTATUS status;
244
245         if (!err) 
246                 return STATUS_SUCCESS;
247
248         if (err < 0)
249                 err = -err;
250         switch (err) {
251                 MAP_ERR( ENOENT, STATUS_NOT_FOUND );
252                 MAP_ERR( EAGAIN, STATUS_DEVICE_BUSY );
253                 MAP_ERR( ENOMEM, STATUS_NO_MEMORY );
254                 MAP_ERR( EACCES, STATUS_ACCESS_DENIED );
255                 MAP_ERR( EFAULT, STATUS_DRIVER_INTERNAL_ERROR );
256                 MAP_ERR( EBUSY, STATUS_INSUFFICIENT_RESOURCES );
257                 MAP_ERR( ENODEV, STATUS_NOT_SUPPORTED );
258                 MAP_ERR( EINVAL, STATUS_INVALID_PARAMETER );
259                 MAP_ERR( ENOSYS, STATUS_NOT_SUPPORTED );
260                 default:
261                         status = STATUS_UNSUCCESSFUL;
262                         break;
263         }
264         return status;
265 }
266
267
268 ////////////////////////////////////////////////////////
269 //
270 // PROTOTYPES
271 //
272 ////////////////////////////////////////////////////////
273
274 SIZE_T strlcpy(char *dest, const void *src, SIZE_T size);
275 int core_init();
276 void core_cleanup();
277
278
279 ////////////////////////////////////////////////////////
280 //
281 // SPECIFIC INCLUDES
282 //
283 ////////////////////////////////////////////////////////
284
285 struct mlx4_dev;
286 struct mlx4_priv;
287
288 #include <l2w_atomic.h>
289 #include <l2w_bit.h>
290 #include <l2w_bitmap.h>
291 #include "l2w_debug.h"
292 #include <l2w_memory.h>
293 #include <l2w_umem.h>
294 #include <l2w_list.h>
295 #include <l2w_pci.h>
296 #include <l2w_pcipool.h>
297 #include "l2w_radix.h"
298 #include <l2w_spinlock.h>
299 #include <l2w_sync.h>
300 #include <l2w_time.h>
301
302 #include "device.h"
303
304 static inline int mlx4_is_livefish(struct mlx4_dev *dev)
305 {
306         return !!(dev->flags & MLX4_FLAG_LIVEFISH);
307 }
308
309 static inline int mlx4_is_barred(struct mlx4_dev *dev)
310 {
311         return dev->flags & (MLX4_FLAG_RESET_CLIENT | MLX4_FLAG_RESET_DRIVER);
312 }
313
314 static inline int mlx4_is_in_reset(struct mlx4_dev *dev)
315 {
316         return dev->flags & MLX4_FLAG_RESET_STARTED;
317 }
318
319 #endif