189214fe9SHaiyue Wang /* SPDX-License-Identifier: BSD-3-Clause 27815caa6SQi Zhang * Copyright(c) 2017-2021 Intel Corporation 389214fe9SHaiyue Wang */ 489214fe9SHaiyue Wang 589214fe9SHaiyue Wang #ifndef _IAVF_OSDEP_H_ 689214fe9SHaiyue Wang #define _IAVF_OSDEP_H_ 789214fe9SHaiyue Wang 889214fe9SHaiyue Wang #include <string.h> 989214fe9SHaiyue Wang #include <stdint.h> 1089214fe9SHaiyue Wang #include <stdbool.h> 1189214fe9SHaiyue Wang #include <stdio.h> 1289214fe9SHaiyue Wang #include <stdarg.h> 1389214fe9SHaiyue Wang 1489214fe9SHaiyue Wang #include <rte_common.h> 1589214fe9SHaiyue Wang #include <rte_memcpy.h> 1689214fe9SHaiyue Wang #include <rte_memzone.h> 1789214fe9SHaiyue Wang #include <rte_malloc.h> 1889214fe9SHaiyue Wang #include <rte_byteorder.h> 1989214fe9SHaiyue Wang #include <rte_cycles.h> 2089214fe9SHaiyue Wang #include <rte_spinlock.h> 2189214fe9SHaiyue Wang #include <rte_log.h> 2289214fe9SHaiyue Wang #include <rte_io.h> 2389214fe9SHaiyue Wang 24186a1de6SHaiyue Wang #ifndef __INTEL_NET_BASE_OSDEP__ 25186a1de6SHaiyue Wang #define __INTEL_NET_BASE_OSDEP__ 26186a1de6SHaiyue Wang 2789214fe9SHaiyue Wang #define INLINE inline 2889214fe9SHaiyue Wang #define STATIC static 2989214fe9SHaiyue Wang 3089214fe9SHaiyue Wang typedef uint8_t u8; 3189214fe9SHaiyue Wang typedef int8_t s8; 3289214fe9SHaiyue Wang typedef uint16_t u16; 33186a1de6SHaiyue Wang typedef int16_t s16; 3489214fe9SHaiyue Wang typedef uint32_t u32; 3589214fe9SHaiyue Wang typedef int32_t s32; 3689214fe9SHaiyue Wang typedef uint64_t u64; 37186a1de6SHaiyue Wang typedef uint64_t s64; 3889214fe9SHaiyue Wang 3989214fe9SHaiyue Wang #ifndef __le16 4089214fe9SHaiyue Wang #define __le16 uint16_t 4189214fe9SHaiyue Wang #endif 4289214fe9SHaiyue Wang #ifndef __le32 4389214fe9SHaiyue Wang #define __le32 uint32_t 4489214fe9SHaiyue Wang #endif 4589214fe9SHaiyue Wang #ifndef __le64 4689214fe9SHaiyue Wang #define __le64 uint64_t 4789214fe9SHaiyue Wang #endif 4889214fe9SHaiyue Wang #ifndef __be16 4989214fe9SHaiyue Wang #define __be16 uint16_t 5089214fe9SHaiyue Wang #endif 5189214fe9SHaiyue Wang #ifndef __be32 5289214fe9SHaiyue Wang #define __be32 uint32_t 5389214fe9SHaiyue Wang #endif 5489214fe9SHaiyue Wang #ifndef __be64 5589214fe9SHaiyue Wang #define __be64 uint64_t 5689214fe9SHaiyue Wang #endif 5789214fe9SHaiyue Wang 5838d78656SPallavi Kadam /* Avoid macro redefinition warning on Windows */ 5938d78656SPallavi Kadam #ifdef RTE_EXEC_ENV_WINDOWS 6038d78656SPallavi Kadam #ifdef min 6138d78656SPallavi Kadam #undef min 6238d78656SPallavi Kadam #endif 6338d78656SPallavi Kadam #ifdef max 6438d78656SPallavi Kadam #undef max 6538d78656SPallavi Kadam #endif 6638d78656SPallavi Kadam #endif 6789214fe9SHaiyue Wang #define min(a, b) RTE_MIN(a, b) 6889214fe9SHaiyue Wang #define max(a, b) RTE_MAX(a, b) 6989214fe9SHaiyue Wang 70186a1de6SHaiyue Wang #define FIELD_SIZEOF(t, f) RTE_SIZEOF_FIELD(t, f) 71186a1de6SHaiyue Wang #define ARRAY_SIZE(arr) RTE_DIM(arr) 7289214fe9SHaiyue Wang 7389214fe9SHaiyue Wang #define CPU_TO_LE16(o) rte_cpu_to_le_16(o) 7489214fe9SHaiyue Wang #define CPU_TO_LE32(s) rte_cpu_to_le_32(s) 7589214fe9SHaiyue Wang #define CPU_TO_LE64(h) rte_cpu_to_le_64(h) 7689214fe9SHaiyue Wang #define LE16_TO_CPU(a) rte_le_to_cpu_16(a) 7789214fe9SHaiyue Wang #define LE32_TO_CPU(c) rte_le_to_cpu_32(c) 7889214fe9SHaiyue Wang #define LE64_TO_CPU(k) rte_le_to_cpu_64(k) 7989214fe9SHaiyue Wang 80186a1de6SHaiyue Wang #define CPU_TO_BE16(o) rte_cpu_to_be_16(o) 81186a1de6SHaiyue Wang #define CPU_TO_BE32(o) rte_cpu_to_be_32(o) 82186a1de6SHaiyue Wang #define CPU_TO_BE64(o) rte_cpu_to_be_64(o) 83186a1de6SHaiyue Wang 84186a1de6SHaiyue Wang #define NTOHS(a) rte_be_to_cpu_16(a) 85186a1de6SHaiyue Wang #define NTOHL(a) rte_be_to_cpu_32(a) 86186a1de6SHaiyue Wang #define HTONS(a) rte_cpu_to_be_16(a) 87186a1de6SHaiyue Wang #define HTONL(a) rte_cpu_to_be_32(a) 88186a1de6SHaiyue Wang 89186a1de6SHaiyue Wang static __rte_always_inline uint32_t 90186a1de6SHaiyue Wang readl(volatile void *addr) 91186a1de6SHaiyue Wang { 92186a1de6SHaiyue Wang return rte_le_to_cpu_32(rte_read32(addr)); 93186a1de6SHaiyue Wang } 94186a1de6SHaiyue Wang 95186a1de6SHaiyue Wang static __rte_always_inline void 96186a1de6SHaiyue Wang writel(uint32_t value, volatile void *addr) 97186a1de6SHaiyue Wang { 98186a1de6SHaiyue Wang rte_write32(rte_cpu_to_le_32(value), addr); 99186a1de6SHaiyue Wang } 100186a1de6SHaiyue Wang 101186a1de6SHaiyue Wang static __rte_always_inline void 102186a1de6SHaiyue Wang writel_relaxed(uint32_t value, volatile void *addr) 103186a1de6SHaiyue Wang { 104186a1de6SHaiyue Wang rte_write32_relaxed(rte_cpu_to_le_32(value), addr); 105186a1de6SHaiyue Wang } 106186a1de6SHaiyue Wang 107186a1de6SHaiyue Wang static __rte_always_inline uint64_t 108186a1de6SHaiyue Wang readq(volatile void *addr) 109186a1de6SHaiyue Wang { 110186a1de6SHaiyue Wang return rte_le_to_cpu_64(rte_read64(addr)); 111186a1de6SHaiyue Wang } 112186a1de6SHaiyue Wang 113186a1de6SHaiyue Wang static __rte_always_inline void 114186a1de6SHaiyue Wang writeq(uint64_t value, volatile void *addr) 115186a1de6SHaiyue Wang { 116186a1de6SHaiyue Wang rte_write64(rte_cpu_to_le_64(value), addr); 117186a1de6SHaiyue Wang } 118186a1de6SHaiyue Wang 119186a1de6SHaiyue Wang #define wr32(a, reg, value) writel((value), (a)->hw_addr + (reg)) 120186a1de6SHaiyue Wang #define rd32(a, reg) readl((a)->hw_addr + (reg)) 121186a1de6SHaiyue Wang #define wr64(a, reg, value) writeq((value), (a)->hw_addr + (reg)) 122186a1de6SHaiyue Wang #define rd64(a, reg) readq((a)->hw_addr + (reg)) 123186a1de6SHaiyue Wang 124186a1de6SHaiyue Wang #endif /* __INTEL_NET_BASE_OSDEP__ */ 12589214fe9SHaiyue Wang 12689214fe9SHaiyue Wang #define iavf_memset(a, b, c, d) memset((a), (b), (c)) 12789214fe9SHaiyue Wang #define iavf_memcpy(a, b, c, d) rte_memcpy((a), (b), (c)) 12889214fe9SHaiyue Wang 12989214fe9SHaiyue Wang #define iavf_usec_delay(x) rte_delay_us_sleep(x) 13089214fe9SHaiyue Wang #define iavf_msec_delay(x) iavf_usec_delay(1000 * (x)) 13189214fe9SHaiyue Wang 132186a1de6SHaiyue Wang #define IAVF_PCI_REG_WRITE(reg, value) writel(value, reg) 133186a1de6SHaiyue Wang #define IAVF_PCI_REG_WRITE_RELAXED(reg, value) writel_relaxed(value, reg) 13489214fe9SHaiyue Wang 135b5fcebb2SGordon Noonan #define IAVF_PCI_REG_WC_WRITE(reg, value) \ 136b5fcebb2SGordon Noonan rte_write32_wc((rte_cpu_to_le_32(value)), reg) 137b5fcebb2SGordon Noonan #define IAVF_PCI_REG_WC_WRITE_RELAXED(reg, value) \ 138b5fcebb2SGordon Noonan rte_write32_wc_relaxed((rte_cpu_to_le_32(value)), reg) 139b5fcebb2SGordon Noonan 140186a1de6SHaiyue Wang #define IAVF_READ_REG(hw, reg) rd32(hw, reg) 141186a1de6SHaiyue Wang #define IAVF_WRITE_REG(hw, reg, value) wr32(hw, reg, value) 14289214fe9SHaiyue Wang 143186a1de6SHaiyue Wang #define IAVF_WRITE_FLUSH(a) IAVF_READ_REG(a, IAVF_VFGEN_RSTAT) 14489214fe9SHaiyue Wang 14589214fe9SHaiyue Wang extern int iavf_common_logger; 1463cd9f24dSDavid Marchand #define RTE_LOGTYPE_IAVF_COMMON iavf_common_logger 14789214fe9SHaiyue Wang 1483cd9f24dSDavid Marchand #define DEBUGOUT(S, ...) RTE_LOG(DEBUG, IAVF_COMMON, S, ## __VA_ARGS__) 1493cd9f24dSDavid Marchand #define DEBUGOUT2(S, ...) DEBUGOUT(S, ## __VA_ARGS__) 15089214fe9SHaiyue Wang #define DEBUGFUNC(F) DEBUGOUT(F "\n") 15189214fe9SHaiyue Wang 15289214fe9SHaiyue Wang #define iavf_debug(h, m, s, ...) \ 15389214fe9SHaiyue Wang do { \ 15489214fe9SHaiyue Wang if (((m) & (h)->debug_mask)) \ 1553cd9f24dSDavid Marchand DEBUGOUT("iavf %02x.%x " s, \ 15689214fe9SHaiyue Wang (h)->bus.device, (h)->bus.func, \ 15789214fe9SHaiyue Wang ##__VA_ARGS__); \ 15889214fe9SHaiyue Wang } while (0) 15989214fe9SHaiyue Wang 16089214fe9SHaiyue Wang /* memory allocation tracking */ 161*e7750639SAndre Muezerie struct __rte_packed_begin iavf_dma_mem { 16289214fe9SHaiyue Wang void *va; 16389214fe9SHaiyue Wang u64 pa; 16489214fe9SHaiyue Wang u32 size; 16589214fe9SHaiyue Wang const void *zone; 166*e7750639SAndre Muezerie } __rte_packed_end; 16789214fe9SHaiyue Wang 168*e7750639SAndre Muezerie struct __rte_packed_begin iavf_virt_mem { 16989214fe9SHaiyue Wang void *va; 17089214fe9SHaiyue Wang u32 size; 171*e7750639SAndre Muezerie } __rte_packed_end; 17289214fe9SHaiyue Wang 17389214fe9SHaiyue Wang #define iavf_allocate_dma_mem(h, m, unused, s, a) \ 17489214fe9SHaiyue Wang iavf_allocate_dma_mem_d(h, m, s, a) 17589214fe9SHaiyue Wang #define iavf_free_dma_mem(h, m) iavf_free_dma_mem_d(h, m) 17689214fe9SHaiyue Wang 17789214fe9SHaiyue Wang #define iavf_allocate_virt_mem(h, m, s) iavf_allocate_virt_mem_d(h, m, s) 17889214fe9SHaiyue Wang #define iavf_free_virt_mem(h, m) iavf_free_virt_mem_d(h, m) 17989214fe9SHaiyue Wang 180d9ebf5ddSDavid Marchand /* SW spinlock */ 181d9ebf5ddSDavid Marchand struct iavf_spinlock { 182d9ebf5ddSDavid Marchand rte_spinlock_t spinlock; 183d9ebf5ddSDavid Marchand }; 18489214fe9SHaiyue Wang 185d9ebf5ddSDavid Marchand #define iavf_init_spinlock(sp) rte_spinlock_init(&(sp)->spinlock) 186d9ebf5ddSDavid Marchand #define iavf_acquire_spinlock(sp) rte_spinlock_lock(&(sp)->spinlock) 187d9ebf5ddSDavid Marchand #define iavf_release_spinlock(sp) rte_spinlock_unlock(&(sp)->spinlock) 188d9ebf5ddSDavid Marchand #define iavf_destroy_spinlock(sp) RTE_SET_USED(sp) 18989214fe9SHaiyue Wang 19089214fe9SHaiyue Wang #endif /* _IAVF_OSDEP_H_ */ 191