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