1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (c) 2025 AIROHA Inc
4 * Author: Lorenzo Bianconi <lorenzo@kernel.org>
5 */
6 #ifndef AIROHA_OFFLOAD_H
7 #define AIROHA_OFFLOAD_H
8
9 #include <linux/skbuff.h>
10 #include <linux/spinlock.h>
11 #include <linux/workqueue.h>
12
13 enum {
14 PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
15 };
16
17 struct airoha_ppe_dev {
18 struct {
19 int (*setup_tc_block_cb)(struct airoha_ppe_dev *dev,
20 void *type_data);
21 void (*check_skb)(struct airoha_ppe_dev *dev,
22 struct sk_buff *skb, u16 hash,
23 bool rx_wlan);
24 } ops;
25
26 void *priv;
27 };
28
29 #if (IS_BUILTIN(CONFIG_NET_AIROHA) || IS_MODULE(CONFIG_NET_AIROHA))
30 struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev);
31 void airoha_ppe_put_dev(struct airoha_ppe_dev *dev);
32
airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev * dev,void * type_data)33 static inline int airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev *dev,
34 void *type_data)
35 {
36 return dev->ops.setup_tc_block_cb(dev, type_data);
37 }
38
airoha_ppe_dev_check_skb(struct airoha_ppe_dev * dev,struct sk_buff * skb,u16 hash,bool rx_wlan)39 static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
40 struct sk_buff *skb,
41 u16 hash, bool rx_wlan)
42 {
43 dev->ops.check_skb(dev, skb, hash, rx_wlan);
44 }
45 #else
airoha_ppe_get_dev(struct device * dev)46 static inline struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev)
47 {
48 return NULL;
49 }
50
airoha_ppe_put_dev(struct airoha_ppe_dev * dev)51 static inline void airoha_ppe_put_dev(struct airoha_ppe_dev *dev)
52 {
53 }
54
airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev * dev,void * type_data)55 static inline int airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev *dev,
56 void *type_data)
57 {
58 return -EOPNOTSUPP;
59 }
60
airoha_ppe_dev_check_skb(struct airoha_ppe_dev * dev,struct sk_buff * skb,u16 hash,bool rx_wlan)61 static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
62 struct sk_buff *skb, u16 hash,
63 bool rx_wlan)
64 {
65 }
66 #endif
67
68 #define NPU_NUM_CORES 8
69 #define NPU_NUM_IRQ 6
70 #define NPU_RX0_DESC_NUM 512
71 #define NPU_RX1_DESC_NUM 512
72
73 /* CTRL */
74 #define NPU_RX_DMA_DESC_LAST_MASK BIT(27)
75 #define NPU_RX_DMA_DESC_LEN_MASK GENMASK(26, 14)
76 #define NPU_RX_DMA_DESC_CUR_LEN_MASK GENMASK(13, 1)
77 #define NPU_RX_DMA_DESC_DONE_MASK BIT(0)
78 /* INFO */
79 #define NPU_RX_DMA_PKT_COUNT_MASK GENMASK(31, 29)
80 #define NPU_RX_DMA_PKT_ID_MASK GENMASK(28, 26)
81 #define NPU_RX_DMA_SRC_PORT_MASK GENMASK(25, 21)
82 #define NPU_RX_DMA_CRSN_MASK GENMASK(20, 16)
83 #define NPU_RX_DMA_FOE_ID_MASK GENMASK(15, 0)
84 /* DATA */
85 #define NPU_RX_DMA_SID_MASK GENMASK(31, 16)
86 #define NPU_RX_DMA_FRAG_TYPE_MASK GENMASK(15, 14)
87 #define NPU_RX_DMA_PRIORITY_MASK GENMASK(13, 10)
88 #define NPU_RX_DMA_RADIO_ID_MASK GENMASK(9, 6)
89 #define NPU_RX_DMA_VAP_ID_MASK GENMASK(5, 2)
90 #define NPU_RX_DMA_FRAME_TYPE_MASK GENMASK(1, 0)
91
92 struct airoha_npu_rx_dma_desc {
93 u32 ctrl;
94 u32 info;
95 u32 data;
96 u32 addr;
97 u64 rsv;
98 } __packed;
99
100 /* CTRL */
101 #define NPU_TX_DMA_DESC_SCHED_MASK BIT(31)
102 #define NPU_TX_DMA_DESC_LEN_MASK GENMASK(30, 18)
103 #define NPU_TX_DMA_DESC_VEND_LEN_MASK GENMASK(17, 1)
104 #define NPU_TX_DMA_DESC_DONE_MASK BIT(0)
105
106 #define NPU_TXWI_LEN 192
107
108 struct airoha_npu_tx_dma_desc {
109 u32 ctrl;
110 u32 addr;
111 u64 rsv;
112 u8 txwi[NPU_TXWI_LEN];
113 } __packed;
114
115 enum airoha_npu_wlan_set_cmd {
116 WLAN_FUNC_SET_WAIT_PCIE_ADDR,
117 WLAN_FUNC_SET_WAIT_DESC,
118 WLAN_FUNC_SET_WAIT_NPU_INIT_DONE,
119 WLAN_FUNC_SET_WAIT_TRAN_TO_CPU,
120 WLAN_FUNC_SET_WAIT_BA_WIN_SIZE,
121 WLAN_FUNC_SET_WAIT_DRIVER_MODEL,
122 WLAN_FUNC_SET_WAIT_DEL_STA,
123 WLAN_FUNC_SET_WAIT_DRAM_BA_NODE_ADDR,
124 WLAN_FUNC_SET_WAIT_PKT_BUF_ADDR,
125 WLAN_FUNC_SET_WAIT_IS_TEST_NOBA,
126 WLAN_FUNC_SET_WAIT_FLUSHONE_TIMEOUT,
127 WLAN_FUNC_SET_WAIT_FLUSHALL_TIMEOUT,
128 WLAN_FUNC_SET_WAIT_IS_FORCE_TO_CPU,
129 WLAN_FUNC_SET_WAIT_PCIE_STATE,
130 WLAN_FUNC_SET_WAIT_PCIE_PORT_TYPE,
131 WLAN_FUNC_SET_WAIT_ERROR_RETRY_TIMES,
132 WLAN_FUNC_SET_WAIT_BAR_INFO,
133 WLAN_FUNC_SET_WAIT_FAST_FLAG,
134 WLAN_FUNC_SET_WAIT_NPU_BAND0_ONCPU,
135 WLAN_FUNC_SET_WAIT_TX_RING_PCIE_ADDR,
136 WLAN_FUNC_SET_WAIT_TX_DESC_HW_BASE,
137 WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
138 WLAN_FUNC_SET_WAIT_RX_RING_FOR_TXDONE_HW_BASE,
139 WLAN_FUNC_SET_WAIT_TX_PKT_BUF_ADDR,
140 WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
141 WLAN_FUNC_SET_WAIT_INODE_DEBUG_FLAG,
142 WLAN_FUNC_SET_WAIT_INODE_HW_CFG_INFO,
143 WLAN_FUNC_SET_WAIT_INODE_STOP_ACTION,
144 WLAN_FUNC_SET_WAIT_INODE_PCIE_SWAP,
145 WLAN_FUNC_SET_WAIT_RATELIMIT_CTRL,
146 WLAN_FUNC_SET_WAIT_HWNAT_INIT,
147 WLAN_FUNC_SET_WAIT_ARHT_CHIP_INFO,
148 WLAN_FUNC_SET_WAIT_TX_BUF_CHECK_ADDR,
149 WLAN_FUNC_SET_WAIT_TOKEN_ID_SIZE,
150 };
151
152 enum airoha_npu_wlan_get_cmd {
153 WLAN_FUNC_GET_WAIT_NPU_INFO,
154 WLAN_FUNC_GET_WAIT_LAST_RATE,
155 WLAN_FUNC_GET_WAIT_COUNTER,
156 WLAN_FUNC_GET_WAIT_DBG_COUNTER,
157 WLAN_FUNC_GET_WAIT_RXDESC_BASE,
158 WLAN_FUNC_GET_WAIT_WCID_DBG_COUNTER,
159 WLAN_FUNC_GET_WAIT_DMA_ADDR,
160 WLAN_FUNC_GET_WAIT_RING_SIZE,
161 WLAN_FUNC_GET_WAIT_NPU_SUPPORT_MAP,
162 WLAN_FUNC_GET_WAIT_MDC_LOCK_ADDRESS,
163 WLAN_FUNC_GET_WAIT_NPU_VERSION,
164 };
165
166 struct airoha_npu {
167 #if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU))
168 struct device *dev;
169 struct regmap *regmap;
170
171 struct airoha_npu_core {
172 struct airoha_npu *npu;
173 /* protect concurrent npu memory accesses */
174 spinlock_t lock;
175 struct work_struct wdt_work;
176 } cores[NPU_NUM_CORES];
177
178 int irqs[NPU_NUM_IRQ];
179
180 struct airoha_foe_stats __iomem *stats;
181
182 struct {
183 int (*ppe_init)(struct airoha_npu *npu);
184 int (*ppe_deinit)(struct airoha_npu *npu);
185 int (*ppe_init_stats)(struct airoha_npu *npu,
186 dma_addr_t addr, u32 num_stats_entries);
187 int (*ppe_flush_sram_entries)(struct airoha_npu *npu,
188 dma_addr_t foe_addr,
189 int sram_num_entries);
190 int (*ppe_foe_commit_entry)(struct airoha_npu *npu,
191 dma_addr_t foe_addr,
192 u32 entry_size, u32 hash,
193 bool ppe2);
194 int (*wlan_init_reserved_memory)(struct airoha_npu *npu);
195 int (*wlan_send_msg)(struct airoha_npu *npu, int ifindex,
196 enum airoha_npu_wlan_set_cmd func_id,
197 void *data, int data_len, gfp_t gfp);
198 int (*wlan_get_msg)(struct airoha_npu *npu, int ifindex,
199 enum airoha_npu_wlan_get_cmd func_id,
200 void *data, int data_len, gfp_t gfp);
201 u32 (*wlan_get_queue_addr)(struct airoha_npu *npu, int qid,
202 bool xmit);
203 void (*wlan_set_irq_status)(struct airoha_npu *npu, u32 val);
204 u32 (*wlan_get_irq_status)(struct airoha_npu *npu, int q);
205 void (*wlan_enable_irq)(struct airoha_npu *npu, int q);
206 void (*wlan_disable_irq)(struct airoha_npu *npu, int q);
207 } ops;
208 #endif
209 };
210
211 #if (IS_BUILTIN(CONFIG_NET_AIROHA_NPU) || IS_MODULE(CONFIG_NET_AIROHA_NPU))
212 struct airoha_npu *airoha_npu_get(struct device *dev);
213 void airoha_npu_put(struct airoha_npu *npu);
214
airoha_npu_wlan_init_reserved_memory(struct airoha_npu * npu)215 static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu)
216 {
217 return npu->ops.wlan_init_reserved_memory(npu);
218 }
219
airoha_npu_wlan_send_msg(struct airoha_npu * npu,int ifindex,enum airoha_npu_wlan_set_cmd cmd,void * data,int data_len,gfp_t gfp)220 static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu,
221 int ifindex,
222 enum airoha_npu_wlan_set_cmd cmd,
223 void *data, int data_len, gfp_t gfp)
224 {
225 return npu->ops.wlan_send_msg(npu, ifindex, cmd, data, data_len, gfp);
226 }
227
airoha_npu_wlan_get_msg(struct airoha_npu * npu,int ifindex,enum airoha_npu_wlan_get_cmd cmd,void * data,int data_len,gfp_t gfp)228 static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex,
229 enum airoha_npu_wlan_get_cmd cmd,
230 void *data, int data_len, gfp_t gfp)
231 {
232 return npu->ops.wlan_get_msg(npu, ifindex, cmd, data, data_len, gfp);
233 }
234
airoha_npu_wlan_get_queue_addr(struct airoha_npu * npu,int qid,bool xmit)235 static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu,
236 int qid, bool xmit)
237 {
238 return npu->ops.wlan_get_queue_addr(npu, qid, xmit);
239 }
240
airoha_npu_wlan_set_irq_status(struct airoha_npu * npu,u32 val)241 static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu,
242 u32 val)
243 {
244 npu->ops.wlan_set_irq_status(npu, val);
245 }
246
airoha_npu_wlan_get_irq_status(struct airoha_npu * npu,int q)247 static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu, int q)
248 {
249 return npu->ops.wlan_get_irq_status(npu, q);
250 }
251
airoha_npu_wlan_enable_irq(struct airoha_npu * npu,int q)252 static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q)
253 {
254 npu->ops.wlan_enable_irq(npu, q);
255 }
256
airoha_npu_wlan_disable_irq(struct airoha_npu * npu,int q)257 static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q)
258 {
259 npu->ops.wlan_disable_irq(npu, q);
260 }
261 #else
airoha_npu_get(struct device * dev)262 static inline struct airoha_npu *airoha_npu_get(struct device *dev)
263 {
264 return NULL;
265 }
266
airoha_npu_put(struct airoha_npu * npu)267 static inline void airoha_npu_put(struct airoha_npu *npu)
268 {
269 }
270
airoha_npu_wlan_init_reserved_memory(struct airoha_npu * npu)271 static inline int airoha_npu_wlan_init_reserved_memory(struct airoha_npu *npu)
272 {
273 return -EOPNOTSUPP;
274 }
275
airoha_npu_wlan_send_msg(struct airoha_npu * npu,int ifindex,enum airoha_npu_wlan_set_cmd cmd,void * data,int data_len,gfp_t gfp)276 static inline int airoha_npu_wlan_send_msg(struct airoha_npu *npu,
277 int ifindex,
278 enum airoha_npu_wlan_set_cmd cmd,
279 void *data, int data_len, gfp_t gfp)
280 {
281 return -EOPNOTSUPP;
282 }
283
airoha_npu_wlan_get_msg(struct airoha_npu * npu,int ifindex,enum airoha_npu_wlan_get_cmd cmd,void * data,int data_len,gfp_t gfp)284 static inline int airoha_npu_wlan_get_msg(struct airoha_npu *npu, int ifindex,
285 enum airoha_npu_wlan_get_cmd cmd,
286 void *data, int data_len, gfp_t gfp)
287 {
288 return -EOPNOTSUPP;
289 }
290
airoha_npu_wlan_get_queue_addr(struct airoha_npu * npu,int qid,bool xmit)291 static inline u32 airoha_npu_wlan_get_queue_addr(struct airoha_npu *npu,
292 int qid, bool xmit)
293 {
294 return 0;
295 }
296
airoha_npu_wlan_set_irq_status(struct airoha_npu * npu,u32 val)297 static inline void airoha_npu_wlan_set_irq_status(struct airoha_npu *npu,
298 u32 val)
299 {
300 }
301
airoha_npu_wlan_get_irq_status(struct airoha_npu * npu,int q)302 static inline u32 airoha_npu_wlan_get_irq_status(struct airoha_npu *npu,
303 int q)
304 {
305 return 0;
306 }
307
airoha_npu_wlan_enable_irq(struct airoha_npu * npu,int q)308 static inline void airoha_npu_wlan_enable_irq(struct airoha_npu *npu, int q)
309 {
310 }
311
airoha_npu_wlan_disable_irq(struct airoha_npu * npu,int q)312 static inline void airoha_npu_wlan_disable_irq(struct airoha_npu *npu, int q)
313 {
314 }
315 #endif
316
317 #endif /* AIROHA_OFFLOAD_H */
318