xref: /linux/include/linux/soc/airoha/airoha_offload.h (revision 9e995c573b63453a904f3157813dc8cde4a6aba4)
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