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