1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2018 Chelsio Communications.
6 #ifndef _CXGBE_COMPAT_H_
7 #define _CXGBE_COMPAT_H_
14 #include <rte_common.h>
15 #include <rte_memcpy.h>
16 #include <rte_byteorder.h>
17 #include <rte_cycles.h>
18 #include <rte_spinlock.h>
23 #define dev_printf(level, fmt, ...) \
24 RTE_LOG(level, PMD, "rte_cxgbe_pmd: " fmt, ##__VA_ARGS__)
26 #define dev_err(x, fmt, ...) dev_printf(ERR, fmt, ##__VA_ARGS__)
27 #define dev_info(x, fmt, ...) dev_printf(INFO, fmt, ##__VA_ARGS__)
28 #define dev_warn(x, fmt, ...) dev_printf(WARNING, fmt, ##__VA_ARGS__)
30 #ifdef RTE_LIBRTE_CXGBE_DEBUG
31 #define dev_debug(x, fmt, ...) dev_printf(INFO, fmt, ##__VA_ARGS__)
33 #define dev_debug(x, fmt, ...) do { } while (0)
36 #ifdef RTE_LIBRTE_CXGBE_DEBUG_REG
37 #define CXGBE_DEBUG_REG(x, fmt, ...) \
38 dev_printf(INFO, "REG:" fmt, ##__VA_ARGS__)
40 #define CXGBE_DEBUG_REG(x, fmt, ...) do { } while (0)
43 #ifdef RTE_LIBRTE_CXGBE_DEBUG_MBOX
44 #define CXGBE_DEBUG_MBOX(x, fmt, ...) \
45 dev_printf(INFO, "MBOX:" fmt, ##__VA_ARGS__)
47 #define CXGBE_DEBUG_MBOX(x, fmt, ...) do { } while (0)
50 #ifdef RTE_LIBRTE_CXGBE_DEBUG_TX
51 #define CXGBE_DEBUG_TX(x, fmt, ...) \
52 dev_printf(INFO, "TX:" fmt, ##__VA_ARGS__)
54 #define CXGBE_DEBUG_TX(x, fmt, ...) do { } while (0)
57 #ifdef RTE_LIBRTE_CXGBE_DEBUG_RX
58 #define CXGBE_DEBUG_RX(x, fmt, ...) \
59 dev_printf(INFO, "RX:" fmt, ##__VA_ARGS__)
61 #define CXGBE_DEBUG_RX(x, fmt, ...) do { } while (0)
64 #ifdef RTE_LIBRTE_CXGBE_DEBUG
65 #define CXGBE_FUNC_TRACE() \
66 RTE_LOG(DEBUG, PMD, "CXGBE trace: %s\n", __func__)
68 #define CXGBE_FUNC_TRACE() do { } while (0)
71 #define pr_err(fmt, ...) dev_err(0, fmt, ##__VA_ARGS__)
72 #define pr_warn(fmt, ...) dev_warn(0, fmt, ##__VA_ARGS__)
73 #define pr_info(fmt, ...) dev_info(0, fmt, ##__VA_ARGS__)
74 #define BUG() pr_err("BUG at %s:%d", __func__, __LINE__)
76 #define ASSERT(x) do {\
78 rte_panic("CXGBE: x"); \
80 #define BUG_ON(x) ASSERT(!(x))
83 #define WARN_ON(x) do { \
86 pr_warn("WARN_ON: \"" #x "\" at %s:%d\n", __func__, __LINE__); \
93 #define BIT(n) (1 << (n))
96 #define L1_CACHE_SHIFT 6
97 #define L1_CACHE_BYTES BIT(L1_CACHE_SHIFT)
100 #define CXGBE_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
101 #define PTR_ALIGN(p, a) ((typeof(p))CXGBE_ALIGN((unsigned long)(p), (a)))
104 #define ETHER_ADDR_LEN 6
106 #define rmb() rte_rmb() /* dpdk rte provided rmb */
107 #define wmb() rte_wmb() /* dpdk rte provided wmb */
111 typedef uint16_t u16;
112 typedef uint32_t u32;
114 typedef uint64_t u64;
116 typedef uint64_t dma_addr_t;
119 #define __le16 uint16_t
122 #define __le32 uint32_t
125 #define __le64 uint64_t
128 #define __be16 uint16_t
131 #define __be32 uint32_t
134 #define __be64 uint64_t
140 #define __u16 uint16_t
143 #define __u32 uint32_t
146 #define __u64 uint64_t
155 #define min(a, b) RTE_MIN(a, b)
159 #define max(a, b) RTE_MAX(a, b)
163 * round up val _p to a power of 2 size _s
165 #define cxgbe_roundup(_p, _s) (((unsigned long)(_p) + (_s - 1)) & ~(_s - 1))
168 #define container_of(ptr, type, member) ({ \
169 typeof(((type *)0)->member)(*__mptr) = (ptr); \
170 (type *)((char *)__mptr - offsetof(type, member)); })
173 #define ARRAY_SIZE(arr) RTE_DIM(arr)
175 #define cpu_to_be16(o) rte_cpu_to_be_16(o)
176 #define cpu_to_be32(o) rte_cpu_to_be_32(o)
177 #define cpu_to_be64(o) rte_cpu_to_be_64(o)
178 #define cpu_to_le32(o) rte_cpu_to_le_32(o)
179 #define be16_to_cpu(o) rte_be_to_cpu_16(o)
180 #define be32_to_cpu(o) rte_be_to_cpu_32(o)
181 #define be64_to_cpu(o) rte_be_to_cpu_64(o)
182 #define le32_to_cpu(o) rte_le_to_cpu_32(o)
185 #define ntohs(o) be16_to_cpu(o)
189 #define ntohl(o) be32_to_cpu(o)
193 #define htons(o) cpu_to_be16(o)
197 #define htonl(o) cpu_to_be32(o)
201 typedef char *caddr_t;
204 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
205 #define DELAY(x) rte_delay_us(x)
206 #define udelay(x) DELAY(x)
207 #define msleep(x) DELAY(1000 * (x))
208 #define usleep_range(min, max) msleep(DIV_ROUND_UP(min, 1000))
210 static inline uint8_t hweight32(uint32_t word32)
212 uint32_t res = word32 - ((word32 >> 1) & 0x55555555);
214 res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
215 res = (res + (res >> 4)) & 0x0F0F0F0F;
216 res = res + (res >> 8);
217 return (res + (res >> 16)) & 0x000000FF;
222 * cxgbe_fls - find last (most-significant) bit set
223 * @x: the word to search
225 * This is defined the same way as ffs.
226 * Note cxgbe_fls(0) = 0, cxgbe_fls(1) = 1, cxgbe_fls(0x80000000) = 32.
228 static inline int cxgbe_fls(int x)
230 return x ? sizeof(x) * 8 - __builtin_clz(x) : 0;
233 static inline unsigned long ilog2(unsigned long n)
238 if (n & ~((1 << 8) - 1)) {
244 if (n & ~((1 << 4) - 1)) {
260 static inline void writel(unsigned int val, volatile void __iomem *addr)
262 rte_write32(val, addr);
265 static inline void writeq(u64 val, volatile void __iomem *addr)
268 writel(val >> 32, (void *)((uintptr_t)addr + 4));
271 static inline void writel_relaxed(unsigned int val, volatile void __iomem *addr)
273 rte_write32_relaxed(val, addr);
277 * Multiplies an integer by a fraction, while avoiding unnecessary
278 * overflow or loss of precision.
280 static inline unsigned int mult_frac(unsigned int x, unsigned int numer,
283 unsigned int quot = x / denom;
284 unsigned int rem = x % denom;
286 return (quot * numer) + ((rem * numer) / denom);
288 #endif /* _CXGBE_COMPAT_H_ */