Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2023 Mucse IC Design Ltd.
3 : : */
4 : :
5 : : #ifndef _RNP_OSDEP_H
6 : : #define _RNP_OSDEP_H
7 : :
8 : : #include <stdint.h>
9 : : #include <stdbool.h>
10 : : #include <inttypes.h>
11 : :
12 : : #include <rte_io.h>
13 : : #include <rte_bitops.h>
14 : : #include <rte_log.h>
15 : : #include <rte_cycles.h>
16 : : #include <rte_byteorder.h>
17 : : #include <rte_spinlock.h>
18 : : #include <rte_common.h>
19 : : #include <rte_memzone.h>
20 : : #include <rte_memory.h>
21 : : #include <rte_string_fns.h>
22 : : #include <rte_dev.h>
23 : :
24 : : #include "../rnp_logs.h"
25 : :
26 : : typedef uint8_t u8;
27 : : typedef int8_t s8;
28 : : typedef uint16_t u16;
29 : : typedef uint32_t u32;
30 : : typedef uint64_t u64;
31 : :
32 : : #ifndef dma_addr_t
33 : : #define dma_addr_t rte_iova_t
34 : : #endif
35 : :
36 : : #define mb() rte_mb()
37 : : #define wmb() rte_wmb()
38 : : #define rmb() rte_rmb()
39 : : #ifndef ffs
40 : : #define ffs(x) (rte_fls_u32((x) & (-x)))
41 : : #endif
42 : :
43 : : #define udelay(x) rte_delay_us(x)
44 : : #define mdelay(x) rte_delay_ms(x)
45 : :
46 : : #ifndef upper_32_bits
47 : : #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
48 : : #define lower_32_bits(n) ((u32)((n) & 0xffffffff))
49 : : #endif
50 : :
51 : : #ifndef cpu_to_le32
52 : : #define cpu_to_le16(v) rte_cpu_to_le_16((u16)(v))
53 : : #define cpu_to_le32(v) rte_cpu_to_le_32((u32)(v))
54 : : #endif
55 : :
56 : : #ifndef DIV_ROUND_UP
57 : : #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
58 : : #define BITS_PER_BYTE (8)
59 : : #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
60 : : #endif
61 : :
62 : : #define fls(n) rte_fls_u32(n)
63 : :
64 : : #ifndef VLAN_N_VID
65 : : #define VLAN_N_VID (4096)
66 : : #define VLAN_VID_MASK (0x0fff)
67 : : #endif
68 : :
69 : : #define spinlock_t rte_spinlock_t
70 : : #define spin_lock_init(spinlock_v) rte_spinlock_init(spinlock_v)
71 : : #define spin_lock(spinlock_v) rte_spinlock_lock(spinlock_v)
72 : : #define spin_unlock(spinlock_v) rte_spinlock_unlock(spinlock_v)
73 : :
74 : : #define _RING_(off) ((off) + (0x08000))
75 : : #define _ETH_(off) ((off) + (0x10000))
76 : : #define _NIC_(off) ((off) + (0x30000))
77 : : #define _MAC_(off) ((off) + (0x60000))
78 : : #define _MSI_(off) ((off) + (0xA0000))
79 : :
80 : : #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
81 : : #error "__BIG_ENDIAN is not support now."
82 : : #endif
83 : :
84 : : #define FALSE 0
85 : : #define TRUE 1
86 : :
87 : : #define __iomem
88 : : static inline u32
89 : : rnp_reg_read32(const void *base, size_t offset)
90 : : {
91 : 0 : u32 v = rte_read32(((const u8 *)base + offset));
92 : :
93 : : RNP_PMD_REG_LOG(DEBUG, "offset=%p val=%#"PRIx32"", offset, v);
94 : : return v;
95 : : }
96 : :
97 : : static inline void
98 : 0 : rnp_reg_write32(volatile void *base, size_t offset, u32 val)
99 : : {
100 : : RNP_PMD_REG_LOG(DEBUG, "offset=%p val=%#"PRIx32"", offset, val);
101 : 0 : rte_write32(val, ((volatile u8 *)base + offset));
102 : 0 : }
103 : :
104 : : struct rnp_dma_mem {
105 : : void *va;
106 : : dma_addr_t pa;
107 : : u32 size;
108 : : const void *mz;
109 : : };
110 : :
111 : : struct rnp_hw;
112 : :
113 : : static inline void *
114 : 0 : rnp_dma_mem_alloc(__rte_unused struct rnp_hw *hw,
115 : : struct rnp_dma_mem *mem, u64 size, const char *name)
116 : : {
117 : : static RTE_ATOMIC(uint64_t)rnp_dma_memzone_id;
118 : 0 : char z_name[RTE_MEMZONE_NAMESIZE] = "";
119 : : const struct rte_memzone *mz = NULL;
120 : :
121 [ # # ]: 0 : if (!mem)
122 : : return NULL;
123 [ # # ]: 0 : if (name) {
124 : 0 : rte_strscpy(z_name, name, RTE_MEMZONE_NAMESIZE);
125 : 0 : mz = rte_memzone_lookup((const char *)z_name);
126 [ # # ]: 0 : if (mz)
127 : 0 : return mem->va;
128 : : } else {
129 : 0 : snprintf(z_name, sizeof(z_name), "rnp_dma_%" PRIu64,
130 : : (uint64_t)rte_atomic_fetch_add_explicit(&rnp_dma_memzone_id, 1,
131 : : rte_memory_order_relaxed));
132 : : }
133 : 0 : mz = rte_memzone_reserve_bounded(z_name, size, SOCKET_ID_ANY, 0,
134 : : 0, RTE_PGSIZE_2M);
135 [ # # ]: 0 : if (!mz)
136 : : return NULL;
137 : :
138 : 0 : mem->size = size;
139 : 0 : mem->va = mz->addr;
140 : 0 : mem->pa = mz->iova;
141 : 0 : mem->mz = (const void *)mz;
142 : 0 : RNP_PMD_DRV_LOG(DEBUG, "memzone %s allocated with physical address: "
143 : : "%"PRIu64, mz->name, mem->pa);
144 : :
145 : 0 : return mem->va;
146 : : }
147 : :
148 : : static inline void
149 : 0 : rnp_dma_mem_free(__rte_unused struct rnp_hw *hw,
150 : : struct rnp_dma_mem *mem)
151 : : {
152 : 0 : RNP_PMD_DRV_LOG(DEBUG, "memzone %s to be freed with physical address: "
153 : : "%"PRIu64, ((const struct rte_memzone *)mem->mz)->name,
154 : : mem->pa);
155 [ # # ]: 0 : if (mem->mz) {
156 : 0 : rte_memzone_free((const struct rte_memzone *)mem->mz);
157 : 0 : mem->mz = NULL;
158 : 0 : mem->va = NULL;
159 : 0 : mem->pa = (dma_addr_t)0;
160 : : }
161 : 0 : }
162 : :
163 : : #define RNP_REG_RD(base, offset) rnp_reg_read32(base, offset)
164 : : #define RNP_REG_WR(base, offset, value) rnp_reg_write32(base, offset, value)
165 : : #define RNP_E_REG_WR(hw, off, value) rnp_reg_write32((hw)->e_ctrl, (off), (value))
166 : : #define RNP_E_REG_RD(hw, off) rnp_reg_read32((hw)->e_ctrl, (off))
167 : : #define RNP_C_REG_WR(hw, off, value) \
168 : : rnp_reg_write32((hw)->c_ctrl, ((off) & ((hw)->c_blen - 1)), (value))
169 : : #define RNP_C_REG_RD(hw, off) \
170 : : rnp_reg_read32((hw)->c_ctrl, ((off) & ((hw)->c_blen - 1)))
171 : : #define RNP_MAC_REG_WR(hw, lane, off, value) \
172 : : rnp_reg_write32((hw)->mac_base[lane], (off), (value))
173 : : #define RNP_MAC_REG_RD(hw, lane, off) \
174 : : rnp_reg_read32((hw)->mac_base[lane], (off))
175 : :
176 : : #endif /* _RNP_OSDEP_H_ */
|