New upstream version 17.11-rc3
[deb_dpdk.git] / drivers / net / i40e / base / i40e_osdep.h
1 /******************************************************************************
2
3   Copyright (c) 2001-2015, Intel Corporation
4   All rights reserved.
5
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31 ******************************************************************************/
32
33 #ifndef _I40E_OSDEP_H_
34 #define _I40E_OSDEP_H_
35
36 #include <string.h>
37 #include <stdint.h>
38 #include <stdbool.h>
39 #include <stdio.h>
40 #include <stdarg.h>
41
42 #include <rte_common.h>
43 #include <rte_memcpy.h>
44 #include <rte_byteorder.h>
45 #include <rte_cycles.h>
46 #include <rte_spinlock.h>
47 #include <rte_log.h>
48 #include <rte_io.h>
49
50 #include "../i40e_logs.h"
51
52 #define INLINE inline
53 #define STATIC static
54
55 typedef uint8_t         u8;
56 typedef int8_t          s8;
57 typedef uint16_t        u16;
58 typedef uint32_t        u32;
59 typedef int32_t         s32;
60 typedef uint64_t        u64;
61
62 typedef enum i40e_status_code i40e_status;
63 #define __iomem
64 #define hw_dbg(hw, S, A...) do {} while (0)
65 #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
66 #define lower_32_bits(n) ((u32)(n))
67 #define low_16_bits(x)   ((x) & 0xFFFF)
68 #define high_16_bits(x)  (((x) & 0xFFFF0000) >> 16)
69
70 #ifndef ETH_ADDR_LEN
71 #define ETH_ADDR_LEN                  6
72 #endif
73
74 #ifndef __le16
75 #define __le16          uint16_t
76 #endif
77 #ifndef __le32
78 #define __le32          uint32_t
79 #endif
80 #ifndef __le64
81 #define __le64          uint64_t
82 #endif
83 #ifndef __be16
84 #define __be16          uint16_t
85 #endif
86 #ifndef __be32
87 #define __be32          uint32_t
88 #endif
89 #ifndef __be64
90 #define __be64          uint64_t
91 #endif
92
93 #define FALSE           0
94 #define TRUE            1
95 #define false           0
96 #define true            1
97
98 #define min(a,b) RTE_MIN(a,b)
99 #define max(a,b) RTE_MAX(a,b)
100
101 #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
102
103 #define DEBUGOUT(S)        PMD_DRV_LOG_RAW(DEBUG, S)
104 #define DEBUGOUT1(S, A...) PMD_DRV_LOG_RAW(DEBUG, S, ##A)
105
106 #define DEBUGFUNC(F) DEBUGOUT(F "\n")
107 #define DEBUGOUT2 DEBUGOUT1
108 #define DEBUGOUT3 DEBUGOUT2
109 #define DEBUGOUT6 DEBUGOUT3
110 #define DEBUGOUT7 DEBUGOUT6
111
112 #define i40e_debug(h, m, s, ...)                                \
113 do {                                                            \
114         if (((m) & (h)->debug_mask))                            \
115                 PMD_DRV_LOG_RAW(DEBUG, "i40e %02x.%x " s,       \
116                         (h)->bus.device, (h)->bus.func,         \
117                                         ##__VA_ARGS__);         \
118 } while (0)
119
120 /* AQ commands based interfaces of i40e_read_rx_ctl() and i40e_write_rx_ctl()
121  * are required for reading/writing below registers, as reading/writing it
122  * directly may not function correctly if the device is under heavy small
123  * packet traffic. Note that those interfaces are available from FVL5 and not
124  * suitable before the AdminQ is ready during initialization.
125  *
126  * I40E_PFQF_CTL_0
127  * I40E_PFQF_HENA
128  * I40E_PFQF_FDALLOC
129  * I40E_PFQF_HREGION
130  * I40E_PFLAN_QALLOC
131  * I40E_VPQF_CTL
132  * I40E_VFQF_HENA
133  * I40E_VFQF_HREGION
134  * I40E_VSIQF_CTL
135  * I40E_VSILAN_QBASE
136  * I40E_VSILAN_QTABLE
137  * I40E_VSIQF_TCREGION
138  * I40E_PFQF_HKEY
139  * I40E_VFQF_HKEY
140  * I40E_PRTQF_CTL_0
141  * I40E_GLFCOE_RCTL
142  * I40E_GLFCOE_RSOF
143  * I40E_GLQF_CTL
144  * I40E_GLQF_SWAP
145  * I40E_GLQF_HASH_MSK
146  * I40E_GLQF_HASH_INSET
147  * I40E_GLQF_HSYM
148  * I40E_GLQF_FC_MSK
149  * I40E_GLQF_FC_INSET
150  * I40E_GLQF_FD_MSK
151  * I40E_PRTQF_FD_INSET
152  * I40E_PRTQF_FD_FLXINSET
153  * I40E_PRTQF_FD_MSK
154  */
155
156 #define I40E_PCI_REG(reg)               rte_read32(reg)
157 #define I40E_PCI_REG_ADDR(a, reg) \
158         ((volatile uint32_t *)((char *)(a)->hw_addr + (reg)))
159 static inline uint32_t i40e_read_addr(volatile void *addr)
160 {
161         return rte_le_to_cpu_32(I40E_PCI_REG(addr));
162 }
163
164 #define I40E_PCI_REG_WRITE(reg, value)          \
165         rte_write32((rte_cpu_to_le_32(value)), reg)
166 #define I40E_PCI_REG_WRITE_RELAXED(reg, value)  \
167         rte_write32_relaxed((rte_cpu_to_le_32(value)), reg)
168
169 #define I40E_WRITE_FLUSH(a) I40E_READ_REG(a, I40E_GLGEN_STAT)
170 #define I40EVF_WRITE_FLUSH(a) I40E_READ_REG(a, I40E_VFGEN_RSTAT)
171
172 #define I40E_READ_REG(hw, reg) i40e_read_addr(I40E_PCI_REG_ADDR((hw), (reg)))
173 #define I40E_WRITE_REG(hw, reg, value) \
174         I40E_PCI_REG_WRITE(I40E_PCI_REG_ADDR((hw), (reg)), (value))
175
176 #define rd32(a, reg) i40e_read_addr(I40E_PCI_REG_ADDR((a), (reg)))
177 #define wr32(a, reg, value) \
178         I40E_PCI_REG_WRITE(I40E_PCI_REG_ADDR((a), (reg)), (value))
179 #define flush(a) i40e_read_addr(I40E_PCI_REG_ADDR((a), (I40E_GLGEN_STAT)))
180
181 #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
182
183 /* memory allocation tracking */
184 struct i40e_dma_mem {
185         void *va;
186         u64 pa;
187         u32 size;
188         const void *zone;
189 } __attribute__((packed));
190
191 #define i40e_allocate_dma_mem(h, m, unused, s, a) \
192                         i40e_allocate_dma_mem_d(h, m, s, a)
193 #define i40e_free_dma_mem(h, m) i40e_free_dma_mem_d(h, m)
194
195 struct i40e_virt_mem {
196         void *va;
197         u32 size;
198 } __attribute__((packed));
199
200 #define i40e_allocate_virt_mem(h, m, s) i40e_allocate_virt_mem_d(h, m, s)
201 #define i40e_free_virt_mem(h, m) i40e_free_virt_mem_d(h, m)
202
203 #define CPU_TO_LE16(o) rte_cpu_to_le_16(o)
204 #define CPU_TO_LE32(s) rte_cpu_to_le_32(s)
205 #define CPU_TO_LE64(h) rte_cpu_to_le_64(h)
206 #define LE16_TO_CPU(a) rte_le_to_cpu_16(a)
207 #define LE32_TO_CPU(c) rte_le_to_cpu_32(c)
208 #define LE64_TO_CPU(k) rte_le_to_cpu_64(k)
209
210 #define cpu_to_le16(o) rte_cpu_to_le_16(o)
211 #define cpu_to_le32(s) rte_cpu_to_le_32(s)
212 #define cpu_to_le64(h) rte_cpu_to_le_64(h)
213 #define le16_to_cpu(a) rte_le_to_cpu_16(a)
214 #define le32_to_cpu(c) rte_le_to_cpu_32(c)
215 #define le64_to_cpu(k) rte_le_to_cpu_64(k)
216
217 /* SW spinlock */
218 struct i40e_spinlock {
219         rte_spinlock_t spinlock;
220 };
221
222 #define i40e_init_spinlock(_sp) i40e_init_spinlock_d(_sp)
223 #define i40e_acquire_spinlock(_sp) i40e_acquire_spinlock_d(_sp)
224 #define i40e_release_spinlock(_sp) i40e_release_spinlock_d(_sp)
225 #define i40e_destroy_spinlock(_sp) i40e_destroy_spinlock_d(_sp)
226
227 #define I40E_NTOHS(a) rte_be_to_cpu_16(a)
228 #define I40E_NTOHL(a) rte_be_to_cpu_32(a)
229 #define I40E_HTONS(a) rte_cpu_to_be_16(a)
230 #define I40E_HTONL(a) rte_cpu_to_be_32(a)
231
232 #define i40e_memset(a, b, c, d) memset((a), (b), (c))
233 #define i40e_memcpy(a, b, c, d) rte_memcpy((a), (b), (c))
234
235 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
236 #define DELAY(x) rte_delay_us(x)
237 #define i40e_usec_delay(x) rte_delay_us(x)
238 #define i40e_msec_delay(x) rte_delay_us(1000*(x))
239 #define udelay(x) DELAY(x)
240 #define msleep(x) DELAY(1000*(x))
241 #define usleep_range(min, max) msleep(DIV_ROUND_UP(min, 1000))
242
243 #endif /* _I40E_OSDEP_H_ */