1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2014-2018 Chelsio Communications. 3 * All rights reserved. 4 */ 5 6 #ifndef _CXGBE_COMPAT_H_ 7 #define _CXGBE_COMPAT_H_ 8 9 #include <string.h> 10 #include <stdint.h> 11 #include <stdio.h> 12 #include <stdarg.h> 13 #include <stdbool.h> 14 15 #include <rte_common.h> 16 #include <rte_memcpy.h> 17 #include <rte_byteorder.h> 18 #include <rte_cycles.h> 19 #include <rte_spinlock.h> 20 #include <rte_log.h> 21 #include <rte_io.h> 22 #include <rte_net.h> 23 24 extern int cxgbe_logtype; 25 extern int cxgbe_mbox_logtype; 26 27 #define dev_printf(level, logtype, fmt, ...) \ 28 rte_log(RTE_LOG_ ## level, logtype, \ 29 "rte_cxgbe_pmd: " fmt, ##__VA_ARGS__) 30 31 #define dev_err(x, fmt, ...) \ 32 dev_printf(ERR, cxgbe_logtype, fmt, ##__VA_ARGS__) 33 #define dev_info(x, fmt, ...) \ 34 dev_printf(INFO, cxgbe_logtype, fmt, ##__VA_ARGS__) 35 #define dev_warn(x, fmt, ...) \ 36 dev_printf(WARNING, cxgbe_logtype, fmt, ##__VA_ARGS__) 37 #define dev_debug(x, fmt, ...) \ 38 dev_printf(DEBUG, cxgbe_logtype, fmt, ##__VA_ARGS__) 39 40 #define CXGBE_DEBUG_MBOX(x, fmt, ...) \ 41 dev_printf(DEBUG, cxgbe_mbox_logtype, "MBOX:" fmt, ##__VA_ARGS__) 42 43 #define CXGBE_FUNC_TRACE() \ 44 dev_printf(DEBUG, cxgbe_logtype, "CXGBE trace: %s\n", __func__) 45 46 #define pr_err(fmt, ...) dev_err(0, fmt, ##__VA_ARGS__) 47 #define pr_warn(fmt, ...) dev_warn(0, fmt, ##__VA_ARGS__) 48 #define pr_info(fmt, ...) dev_info(0, fmt, ##__VA_ARGS__) 49 #define BUG() pr_err("BUG at %s:%d", __func__, __LINE__) 50 51 #define ASSERT(x) do {\ 52 if (!(x)) \ 53 rte_panic("CXGBE: x"); \ 54 } while (0) 55 #define BUG_ON(x) ASSERT(!(x)) 56 57 #ifndef WARN_ON 58 #define WARN_ON(x) do { \ 59 int ret = !!(x); \ 60 if (unlikely(ret)) \ 61 pr_warn("WARN_ON: \"" #x "\" at %s:%d\n", __func__, __LINE__); \ 62 } while (0) 63 #endif 64 65 #define __iomem 66 67 #ifndef BIT 68 #define BIT(n) (1 << (n)) 69 #endif 70 71 #define L1_CACHE_SHIFT 6 72 #define L1_CACHE_BYTES BIT(L1_CACHE_SHIFT) 73 74 #define PAGE_SHIFT 12 75 #define CXGBE_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) 76 #define PTR_ALIGN(p, a) ((typeof(p))CXGBE_ALIGN((unsigned long)(p), (a))) 77 78 #define VLAN_HLEN 4 79 #define ETHER_ADDR_LEN 6 80 81 #define rmb() rte_rmb() /* dpdk rte provided rmb */ 82 #define wmb() rte_wmb() /* dpdk rte provided wmb */ 83 84 typedef uint8_t u8; 85 typedef int8_t s8; 86 typedef uint16_t u16; 87 typedef uint32_t u32; 88 typedef int32_t s32; 89 typedef uint64_t u64; 90 typedef uint64_t dma_addr_t; 91 92 #ifndef __le16 93 #define __le16 uint16_t 94 #endif 95 #ifndef __le32 96 #define __le32 uint32_t 97 #endif 98 #ifndef __le64 99 #define __le64 uint64_t 100 #endif 101 #ifndef __be16 102 #define __be16 uint16_t 103 #endif 104 #ifndef __be32 105 #define __be32 uint32_t 106 #endif 107 #ifndef __be64 108 #define __be64 uint64_t 109 #endif 110 #ifndef __u8 111 #define __u8 uint8_t 112 #endif 113 #ifndef __u16 114 #define __u16 uint16_t 115 #endif 116 #ifndef __u32 117 #define __u32 uint32_t 118 #endif 119 #ifndef __u64 120 #define __u64 uint64_t 121 #endif 122 123 #define FALSE 0 124 #define TRUE 1 125 126 #ifndef min 127 #define min(a, b) RTE_MIN(a, b) 128 #endif 129 130 #ifndef max 131 #define max(a, b) RTE_MAX(a, b) 132 #endif 133 134 /* 135 * round up val _p to a power of 2 size _s 136 */ 137 #define cxgbe_roundup(_p, _s) (((unsigned long)(_p) + (_s - 1)) & ~(_s - 1)) 138 139 #ifndef container_of 140 #define container_of(ptr, type, member) ({ \ 141 typeof(((type *)0)->member)(*__mptr) = (ptr); \ 142 (type *)((char *)__mptr - offsetof(type, member)); }) 143 #endif 144 145 #define ARRAY_SIZE(arr) RTE_DIM(arr) 146 147 #define cpu_to_be16(o) rte_cpu_to_be_16(o) 148 #define cpu_to_be32(o) rte_cpu_to_be_32(o) 149 #define cpu_to_be64(o) rte_cpu_to_be_64(o) 150 #define cpu_to_le32(o) rte_cpu_to_le_32(o) 151 #define be16_to_cpu(o) rte_be_to_cpu_16(o) 152 #define be32_to_cpu(o) rte_be_to_cpu_32(o) 153 #define be64_to_cpu(o) rte_be_to_cpu_64(o) 154 #define le32_to_cpu(o) rte_le_to_cpu_32(o) 155 156 #ifndef ntohs 157 #define ntohs(o) be16_to_cpu(o) 158 #endif 159 160 #ifndef ntohl 161 #define ntohl(o) be32_to_cpu(o) 162 #endif 163 164 #ifndef htons 165 #define htons(o) cpu_to_be16(o) 166 #endif 167 168 #ifndef htonl 169 #define htonl(o) cpu_to_be32(o) 170 #endif 171 172 #ifndef caddr_t 173 typedef char *caddr_t; 174 #endif 175 176 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 177 #define DELAY(x) rte_delay_us(x) 178 #define udelay(x) DELAY(x) 179 #define msleep(x) DELAY(1000 * (x)) 180 #define usleep_range(min, max) msleep(DIV_ROUND_UP(min, 1000)) 181 182 static inline uint8_t hweight32(uint32_t word32) 183 { 184 uint32_t res = word32 - ((word32 >> 1) & 0x55555555); 185 186 res = (res & 0x33333333) + ((res >> 2) & 0x33333333); 187 res = (res + (res >> 4)) & 0x0F0F0F0F; 188 res = res + (res >> 8); 189 return (res + (res >> 16)) & 0x000000FF; 190 191 } /* weight32 */ 192 193 /** 194 * cxgbe_fls - find last (most-significant) bit set 195 * @x: the word to search 196 * 197 * This is defined the same way as ffs. 198 * Note cxgbe_fls(0) = 0, cxgbe_fls(1) = 1, cxgbe_fls(0x80000000) = 32. 199 */ 200 static inline int cxgbe_fls(int x) 201 { 202 return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; 203 } 204 205 static inline unsigned long ilog2(unsigned long n) 206 { 207 unsigned int e = 0; 208 209 while (n) { 210 if (n & ~((1 << 8) - 1)) { 211 e += 8; 212 n >>= 8; 213 continue; 214 } 215 216 if (n & ~((1 << 4) - 1)) { 217 e += 4; 218 n >>= 4; 219 } 220 221 for (;;) { 222 n >>= 1; 223 if (n == 0) 224 break; 225 e++; 226 } 227 } 228 229 return e; 230 } 231 232 static inline void writel(unsigned int val, volatile void __iomem *addr) 233 { 234 rte_write32(val, addr); 235 } 236 237 static inline void writeq(u64 val, volatile void __iomem *addr) 238 { 239 writel(val, addr); 240 writel(val >> 32, (void *)((uintptr_t)addr + 4)); 241 } 242 243 static inline void writel_relaxed(unsigned int val, volatile void __iomem *addr) 244 { 245 rte_write32_relaxed(val, addr); 246 } 247 248 /* 249 * Multiplies an integer by a fraction, while avoiding unnecessary 250 * overflow or loss of precision. 251 */ 252 static inline unsigned int mult_frac(unsigned int x, unsigned int numer, 253 unsigned int denom) 254 { 255 unsigned int quot = x / denom; 256 unsigned int rem = x % denom; 257 258 return (quot * numer) + ((rem * numer) / denom); 259 } 260 #endif /* _CXGBE_COMPAT_H_ */ 261