xref: /dpdk/drivers/common/iavf/iavf_osdep.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
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