xref: /dpdk/drivers/net/gve/base/gve_osdep.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1c9ba2cafSJunfeng Guo /* SPDX-License-Identifier: BSD-3-Clause
2c9ba2cafSJunfeng Guo  * Copyright(C) 2022 Intel Corporation
3c9ba2cafSJunfeng Guo  */
4c9ba2cafSJunfeng Guo 
5c9ba2cafSJunfeng Guo #ifndef _GVE_OSDEP_H_
6c9ba2cafSJunfeng Guo #define _GVE_OSDEP_H_
7c9ba2cafSJunfeng Guo 
8c9ba2cafSJunfeng Guo #include <string.h>
9c9ba2cafSJunfeng Guo #include <stdint.h>
10c9ba2cafSJunfeng Guo #include <stdio.h>
11c9ba2cafSJunfeng Guo #include <stdarg.h>
12c9ba2cafSJunfeng Guo #include <inttypes.h>
13c9ba2cafSJunfeng Guo #include <stdbool.h>
14c9ba2cafSJunfeng Guo 
15c9ba2cafSJunfeng Guo #include <rte_bitops.h>
16c9ba2cafSJunfeng Guo #include <rte_byteorder.h>
17c9ba2cafSJunfeng Guo #include <rte_common.h>
18c9ba2cafSJunfeng Guo #include <rte_ether.h>
19c9ba2cafSJunfeng Guo #include <rte_io.h>
20c9ba2cafSJunfeng Guo #include <rte_log.h>
21c9ba2cafSJunfeng Guo #include <rte_malloc.h>
22c9ba2cafSJunfeng Guo #include <rte_memcpy.h>
23c9ba2cafSJunfeng Guo #include <rte_memzone.h>
24748d0e7fSRushil Gupta #include <rte_version.h>
25c9ba2cafSJunfeng Guo 
26c9ba2cafSJunfeng Guo #include "../gve_logs.h"
27c9ba2cafSJunfeng Guo 
28748d0e7fSRushil Gupta #ifdef RTE_EXEC_ENV_LINUX
29748d0e7fSRushil Gupta #include <sys/utsname.h>
30748d0e7fSRushil Gupta #endif
31748d0e7fSRushil Gupta 
32f0d9e787SJoshua Washington #ifndef u8
33f0d9e787SJoshua Washington #define u8 uint8_t
34f0d9e787SJoshua Washington #endif
35f0d9e787SJoshua Washington #ifndef u16
36f0d9e787SJoshua Washington #define u16 uint16_t
37f0d9e787SJoshua Washington #endif
38f0d9e787SJoshua Washington #ifndef u32
39f0d9e787SJoshua Washington #define u32 uint32_t
40f0d9e787SJoshua Washington #endif
41f0d9e787SJoshua Washington #ifndef u64
42f0d9e787SJoshua Washington #define u64 uint64_t
43f0d9e787SJoshua Washington #endif
44c9ba2cafSJunfeng Guo 
45f0d9e787SJoshua Washington #ifndef __sum16
46f0d9e787SJoshua Washington #define __sum16 rte_be16_t
47f0d9e787SJoshua Washington #endif
48c9ba2cafSJunfeng Guo 
49f0d9e787SJoshua Washington #ifndef __be16
50f0d9e787SJoshua Washington #define __be16 rte_be16_t
51f0d9e787SJoshua Washington #endif
52f0d9e787SJoshua Washington #ifndef __be32
53f0d9e787SJoshua Washington #define __be32 rte_be32_t
54f0d9e787SJoshua Washington #endif
55f0d9e787SJoshua Washington #ifndef __be64
56f0d9e787SJoshua Washington #define __be64 rte_be64_t
57f0d9e787SJoshua Washington #endif
58c9ba2cafSJunfeng Guo 
59f0d9e787SJoshua Washington #ifndef __le16
60f0d9e787SJoshua Washington #define __le16 rte_le16_t
61f0d9e787SJoshua Washington #endif
62f0d9e787SJoshua Washington #ifndef __le32
63f0d9e787SJoshua Washington #define __le32 rte_le32_t
64f0d9e787SJoshua Washington #endif
65f0d9e787SJoshua Washington #ifndef __le64
66f0d9e787SJoshua Washington #define __le64 rte_le64_t
67f0d9e787SJoshua Washington #endif
68abf1242fSJunfeng Guo 
69f0d9e787SJoshua Washington #ifndef dma_addr_t
70f0d9e787SJoshua Washington #define dma_addr_t rte_iova_t
71f0d9e787SJoshua Washington #endif
72c9ba2cafSJunfeng Guo 
73c9ba2cafSJunfeng Guo #define ETH_MIN_MTU	RTE_ETHER_MIN_MTU
74c9ba2cafSJunfeng Guo #define ETH_ALEN	RTE_ETHER_ADDR_LEN
75c9ba2cafSJunfeng Guo 
76c9ba2cafSJunfeng Guo #ifndef PAGE_SHIFT
77c9ba2cafSJunfeng Guo #define PAGE_SHIFT	12
78c9ba2cafSJunfeng Guo #endif
79c9ba2cafSJunfeng Guo #ifndef PAGE_SIZE
80c9ba2cafSJunfeng Guo #define PAGE_SIZE	(1UL << PAGE_SHIFT)
81c9ba2cafSJunfeng Guo #endif
82c9ba2cafSJunfeng Guo 
83c9ba2cafSJunfeng Guo #define BIT(nr)		RTE_BIT32(nr)
84c9ba2cafSJunfeng Guo 
85c9ba2cafSJunfeng Guo #define be16_to_cpu(x) rte_be_to_cpu_16(x)
86c9ba2cafSJunfeng Guo #define be32_to_cpu(x) rte_be_to_cpu_32(x)
87c9ba2cafSJunfeng Guo #define be64_to_cpu(x) rte_be_to_cpu_64(x)
88c9ba2cafSJunfeng Guo 
89c9ba2cafSJunfeng Guo #define cpu_to_be16(x) rte_cpu_to_be_16(x)
90c9ba2cafSJunfeng Guo #define cpu_to_be32(x) rte_cpu_to_be_32(x)
91c9ba2cafSJunfeng Guo #define cpu_to_be64(x) rte_cpu_to_be_64(x)
92c9ba2cafSJunfeng Guo 
93c9ba2cafSJunfeng Guo #define READ_ONCE32(x) rte_read32(&(x))
94c9ba2cafSJunfeng Guo 
95c9ba2cafSJunfeng Guo #ifndef ____cacheline_aligned
96c9ba2cafSJunfeng Guo #define ____cacheline_aligned	__rte_cache_aligned
97c9ba2cafSJunfeng Guo #endif
98c9ba2cafSJunfeng Guo #ifndef __packed
99*e7750639SAndre Muezerie #define __packed		__attribute__((__packed__))
100c9ba2cafSJunfeng Guo #endif
101c9ba2cafSJunfeng Guo #define __iomem
102c9ba2cafSJunfeng Guo 
103c9ba2cafSJunfeng Guo #define msleep(ms)		rte_delay_ms(ms)
104c9ba2cafSJunfeng Guo 
105748d0e7fSRushil Gupta #define OS_VERSION_STRLEN 128
106748d0e7fSRushil Gupta struct os_version_string {
107748d0e7fSRushil Gupta 	char os_version_str1[OS_VERSION_STRLEN];
108748d0e7fSRushil Gupta 	char os_version_str2[OS_VERSION_STRLEN];
109748d0e7fSRushil Gupta };
110748d0e7fSRushil Gupta 
111c9ba2cafSJunfeng Guo /* These macros are used to generate compilation errors if a struct/union
112c9ba2cafSJunfeng Guo  * is not exactly the correct length. It gives a divide by zero error if
113c9ba2cafSJunfeng Guo  * the struct/union is not of the correct size, otherwise it creates an
114c9ba2cafSJunfeng Guo  * enum that is never used.
115c9ba2cafSJunfeng Guo  */
116c9ba2cafSJunfeng Guo #define GVE_CHECK_STRUCT_LEN(n, X) enum gve_static_assert_enum_##X \
117c9ba2cafSJunfeng Guo 	{ gve_static_assert_##X = (n) / ((sizeof(struct X) == (n)) ? 1 : 0) }
118c9ba2cafSJunfeng Guo #define GVE_CHECK_UNION_LEN(n, X) enum gve_static_asset_enum_##X \
119c9ba2cafSJunfeng Guo 	{ gve_static_assert_##X = (n) / ((sizeof(union X) == (n)) ? 1 : 0) }
120c9ba2cafSJunfeng Guo 
121c9ba2cafSJunfeng Guo static __rte_always_inline u8
122c9ba2cafSJunfeng Guo readb(volatile void *addr)
123c9ba2cafSJunfeng Guo {
124c9ba2cafSJunfeng Guo 	return rte_read8(addr);
125c9ba2cafSJunfeng Guo }
126c9ba2cafSJunfeng Guo 
127c9ba2cafSJunfeng Guo static __rte_always_inline void
128c9ba2cafSJunfeng Guo writeb(u8 value, volatile void *addr)
129c9ba2cafSJunfeng Guo {
130c9ba2cafSJunfeng Guo 	rte_write8(value, addr);
131c9ba2cafSJunfeng Guo }
132c9ba2cafSJunfeng Guo 
133c9ba2cafSJunfeng Guo static __rte_always_inline void
134c9ba2cafSJunfeng Guo writel(u32 value, volatile void *addr)
135c9ba2cafSJunfeng Guo {
136c9ba2cafSJunfeng Guo 	rte_write32(value, addr);
137c9ba2cafSJunfeng Guo }
138c9ba2cafSJunfeng Guo 
139c9ba2cafSJunfeng Guo static __rte_always_inline u32
140c9ba2cafSJunfeng Guo ioread32be(const volatile void *addr)
141c9ba2cafSJunfeng Guo {
142c9ba2cafSJunfeng Guo 	return rte_be_to_cpu_32(rte_read32(addr));
143c9ba2cafSJunfeng Guo }
144c9ba2cafSJunfeng Guo 
145c9ba2cafSJunfeng Guo static __rte_always_inline void
146c9ba2cafSJunfeng Guo iowrite32be(u32 value, volatile void *addr)
147c9ba2cafSJunfeng Guo {
148c9ba2cafSJunfeng Guo 	writel(rte_cpu_to_be_32(value), addr);
149c9ba2cafSJunfeng Guo }
150c9ba2cafSJunfeng Guo 
151c9ba2cafSJunfeng Guo /* DMA memory allocation tracking */
152c9ba2cafSJunfeng Guo struct gve_dma_mem {
153c9ba2cafSJunfeng Guo 	void *va;
154c9ba2cafSJunfeng Guo 	rte_iova_t pa;
155c9ba2cafSJunfeng Guo 	uint32_t size;
156c9ba2cafSJunfeng Guo 	const void *zone;
157c9ba2cafSJunfeng Guo };
158c9ba2cafSJunfeng Guo 
159c9ba2cafSJunfeng Guo static inline void *
160c9ba2cafSJunfeng Guo gve_alloc_dma_mem(struct gve_dma_mem *mem, u64 size)
161c9ba2cafSJunfeng Guo {
162e12a0166STyler Retzlaff 	static RTE_ATOMIC(uint16_t) gve_dma_memzone_id;
163c9ba2cafSJunfeng Guo 	const struct rte_memzone *mz = NULL;
164c9ba2cafSJunfeng Guo 	char z_name[RTE_MEMZONE_NAMESIZE];
165c9ba2cafSJunfeng Guo 
166c9ba2cafSJunfeng Guo 	if (!mem)
167c9ba2cafSJunfeng Guo 		return NULL;
168c9ba2cafSJunfeng Guo 
169c9ba2cafSJunfeng Guo 	snprintf(z_name, sizeof(z_name), "gve_dma_%u",
170e12a0166STyler Retzlaff 		 rte_atomic_fetch_add_explicit(&gve_dma_memzone_id, 1, rte_memory_order_relaxed));
171c9ba2cafSJunfeng Guo 	mz = rte_memzone_reserve_aligned(z_name, size, SOCKET_ID_ANY,
172c9ba2cafSJunfeng Guo 					 RTE_MEMZONE_IOVA_CONTIG,
173c9ba2cafSJunfeng Guo 					 PAGE_SIZE);
174c9ba2cafSJunfeng Guo 	if (!mz)
175c9ba2cafSJunfeng Guo 		return NULL;
176c9ba2cafSJunfeng Guo 
177c9ba2cafSJunfeng Guo 	mem->size = size;
178c9ba2cafSJunfeng Guo 	mem->va = mz->addr;
179c9ba2cafSJunfeng Guo 	mem->pa = mz->iova;
180c9ba2cafSJunfeng Guo 	mem->zone = mz;
181c9ba2cafSJunfeng Guo 	PMD_DRV_LOG(DEBUG, "memzone %s is allocated", mz->name);
182c9ba2cafSJunfeng Guo 
183c9ba2cafSJunfeng Guo 	return mem->va;
184c9ba2cafSJunfeng Guo }
185c9ba2cafSJunfeng Guo 
186c9ba2cafSJunfeng Guo static inline void
187c9ba2cafSJunfeng Guo gve_free_dma_mem(struct gve_dma_mem *mem)
188c9ba2cafSJunfeng Guo {
189c9ba2cafSJunfeng Guo 	PMD_DRV_LOG(DEBUG, "memzone %s to be freed",
190c9ba2cafSJunfeng Guo 		    ((const struct rte_memzone *)mem->zone)->name);
191c9ba2cafSJunfeng Guo 
192c9ba2cafSJunfeng Guo 	rte_memzone_free(mem->zone);
193c9ba2cafSJunfeng Guo 	mem->zone = NULL;
194c9ba2cafSJunfeng Guo 	mem->va = NULL;
195c9ba2cafSJunfeng Guo 	mem->pa = 0;
196c9ba2cafSJunfeng Guo }
197c9ba2cafSJunfeng Guo 
198748d0e7fSRushil Gupta static inline void
199748d0e7fSRushil Gupta populate_driver_version_strings(char *str1, char *str2)
200748d0e7fSRushil Gupta {
201748d0e7fSRushil Gupta 	struct utsname uts;
202748d0e7fSRushil Gupta 	if (uname(&uts) >= 0) {
203748d0e7fSRushil Gupta 		/* release */
204748d0e7fSRushil Gupta 		rte_strscpy(str1, uts.release,
205748d0e7fSRushil Gupta 			OS_VERSION_STRLEN);
206748d0e7fSRushil Gupta 		/* version */
207748d0e7fSRushil Gupta 		rte_strscpy(str2, uts.version,
208748d0e7fSRushil Gupta 			OS_VERSION_STRLEN);
209748d0e7fSRushil Gupta 	}
210748d0e7fSRushil Gupta }
211c9ba2cafSJunfeng Guo #endif /* _GVE_OSDEP_H_ */
212