Merge tag 'nfs-for-6.10-3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[linux-block.git] / include / linux / soc / mediatek / mtk_wed.h
1 #ifndef __MTK_WED_H
2 #define __MTK_WED_H
3
4 #include <linux/kernel.h>
5 #include <linux/rcupdate.h>
6 #include <linux/regmap.h>
7 #include <linux/pci.h>
8 #include <linux/skbuff.h>
9 #include <linux/netdevice.h>
10
11 #define MTK_WED_TX_QUEUES               2
12 #define MTK_WED_RX_QUEUES               2
13 #define MTK_WED_RX_PAGE_QUEUES          3
14
15 #define WED_WO_STA_REC                  0x6
16
17 struct mtk_wed_hw;
18 struct mtk_wdma_desc;
19
20 enum mtk_wed_wo_cmd {
21         MTK_WED_WO_CMD_WED_CFG,
22         MTK_WED_WO_CMD_WED_RX_STAT,
23         MTK_WED_WO_CMD_RRO_SER,
24         MTK_WED_WO_CMD_DBG_INFO,
25         MTK_WED_WO_CMD_DEV_INFO,
26         MTK_WED_WO_CMD_BSS_INFO,
27         MTK_WED_WO_CMD_STA_REC,
28         MTK_WED_WO_CMD_DEV_INFO_DUMP,
29         MTK_WED_WO_CMD_BSS_INFO_DUMP,
30         MTK_WED_WO_CMD_STA_REC_DUMP,
31         MTK_WED_WO_CMD_BA_INFO_DUMP,
32         MTK_WED_WO_CMD_FBCMD_Q_DUMP,
33         MTK_WED_WO_CMD_FW_LOG_CTRL,
34         MTK_WED_WO_CMD_LOG_FLUSH,
35         MTK_WED_WO_CMD_CHANGE_STATE,
36         MTK_WED_WO_CMD_CPU_STATS_ENABLE,
37         MTK_WED_WO_CMD_CPU_STATS_DUMP,
38         MTK_WED_WO_CMD_EXCEPTION_INIT,
39         MTK_WED_WO_CMD_PROF_CTRL,
40         MTK_WED_WO_CMD_STA_BA_DUMP,
41         MTK_WED_WO_CMD_BA_CTRL_DUMP,
42         MTK_WED_WO_CMD_RXCNT_CTRL,
43         MTK_WED_WO_CMD_RXCNT_INFO,
44         MTK_WED_WO_CMD_SET_CAP,
45         MTK_WED_WO_CMD_CCIF_RING_DUMP,
46         MTK_WED_WO_CMD_WED_END
47 };
48
49 struct mtk_wed_bm_desc {
50         __le32 buf0;
51         __le32 token;
52 } __packed __aligned(4);
53
54 enum mtk_wed_bus_tye {
55         MTK_WED_BUS_PCIE,
56         MTK_WED_BUS_AXI,
57 };
58
59 #define MTK_WED_RING_CONFIGURED         BIT(0)
60 struct mtk_wed_ring {
61         struct mtk_wdma_desc *desc;
62         dma_addr_t desc_phys;
63         u32 desc_size;
64         int size;
65         u32 flags;
66
67         u32 reg_base;
68         void __iomem *wpdma;
69 };
70
71 struct mtk_wed_wo_rx_stats {
72         __le16 wlan_idx;
73         __le16 tid;
74         __le32 rx_pkt_cnt;
75         __le32 rx_byte_cnt;
76         __le32 rx_err_cnt;
77         __le32 rx_drop_cnt;
78 };
79
80 struct mtk_wed_buf {
81         void *p;
82         dma_addr_t phy_addr;
83 };
84
85 struct mtk_wed_device {
86 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
87         const struct mtk_wed_ops *ops;
88         struct device *dev;
89         struct mtk_wed_hw *hw;
90         bool init_done, running;
91         int wdma_idx;
92         int irq;
93         u8 version;
94
95         /* used by wlan driver */
96         u32 rev_id;
97
98         struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES];
99         struct mtk_wed_ring rx_ring[MTK_WED_RX_QUEUES];
100         struct mtk_wed_ring txfree_ring;
101         struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES];
102         struct mtk_wed_ring rx_wdma[MTK_WED_RX_QUEUES];
103         struct mtk_wed_ring rx_rro_ring[MTK_WED_RX_QUEUES];
104         struct mtk_wed_ring rx_page_ring[MTK_WED_RX_PAGE_QUEUES];
105         struct mtk_wed_ring ind_cmd_ring;
106
107         struct {
108                 int size;
109                 struct mtk_wed_buf *pages;
110                 struct mtk_wdma_desc *desc;
111                 dma_addr_t desc_phys;
112         } tx_buf_ring;
113
114         struct {
115                 int size;
116                 struct mtk_wed_bm_desc *desc;
117                 dma_addr_t desc_phys;
118         } rx_buf_ring;
119
120         struct {
121                 struct mtk_wed_ring ring;
122                 dma_addr_t miod_phys;
123                 dma_addr_t fdbk_phys;
124         } rro;
125
126         struct {
127                 int size;
128                 struct mtk_wed_buf *pages;
129                 struct mtk_wed_bm_desc *desc;
130                 dma_addr_t desc_phys;
131         } hw_rro;
132
133         /* filled by driver: */
134         struct {
135                 union {
136                         struct platform_device *platform_dev;
137                         struct pci_dev *pci_dev;
138                 };
139                 enum mtk_wed_bus_tye bus_type;
140                 void __iomem *base;
141                 u32 phy_base;
142                 u32 id;
143
144                 u32 wpdma_phys;
145                 u32 wpdma_int;
146                 u32 wpdma_mask;
147                 u32 wpdma_tx;
148                 u32 wpdma_txfree;
149                 u32 wpdma_rx_glo;
150                 u32 wpdma_rx;
151                 u32 wpdma_rx_rro[MTK_WED_RX_QUEUES];
152                 u32 wpdma_rx_pg;
153
154                 bool wcid_512;
155                 bool hw_rro;
156                 bool msi;
157
158                 u16 token_start;
159                 unsigned int nbuf;
160                 unsigned int rx_nbuf;
161                 unsigned int rx_npkt;
162                 unsigned int rx_size;
163                 unsigned int amsdu_max_len;
164
165                 u8 tx_tbit[MTK_WED_TX_QUEUES];
166                 u8 rx_tbit[MTK_WED_RX_QUEUES];
167                 u8 rro_rx_tbit[MTK_WED_RX_QUEUES];
168                 u8 rx_pg_tbit[MTK_WED_RX_PAGE_QUEUES];
169                 u8 txfree_tbit;
170                 u8 amsdu_max_subframes;
171
172                 struct {
173                         u8 se_group_nums;
174                         u16 win_size;
175                         u16 particular_sid;
176                         u32 ack_sn_addr;
177                         dma_addr_t particular_se_phys;
178                         dma_addr_t addr_elem_phys[1024];
179                 } ind_cmd;
180
181                 u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id);
182                 int (*offload_enable)(struct mtk_wed_device *wed);
183                 void (*offload_disable)(struct mtk_wed_device *wed);
184                 u32 (*init_rx_buf)(struct mtk_wed_device *wed, int size);
185                 void (*release_rx_buf)(struct mtk_wed_device *wed);
186                 void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
187                                            struct mtk_wed_wo_rx_stats *stats);
188                 int (*reset)(struct mtk_wed_device *wed);
189                 void (*reset_complete)(struct mtk_wed_device *wed);
190         } wlan;
191 #endif
192 };
193
194 struct mtk_wed_ops {
195         int (*attach)(struct mtk_wed_device *dev);
196         int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring,
197                              void __iomem *regs, bool reset);
198         int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring,
199                              void __iomem *regs, bool reset);
200         int (*txfree_ring_setup)(struct mtk_wed_device *dev,
201                                  void __iomem *regs);
202         int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
203                           void *data, int len);
204         void (*detach)(struct mtk_wed_device *dev);
205         void (*ppe_check)(struct mtk_wed_device *dev, struct sk_buff *skb,
206                           u32 reason, u32 hash);
207
208         void (*stop)(struct mtk_wed_device *dev);
209         void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
210         void (*reset_dma)(struct mtk_wed_device *dev);
211
212         u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg);
213         void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val);
214
215         u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask);
216         void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask);
217         int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
218                         enum tc_setup_type type, void *type_data);
219         void (*start_hw_rro)(struct mtk_wed_device *dev, u32 irq_mask,
220                              bool reset);
221         void (*rro_rx_ring_setup)(struct mtk_wed_device *dev, int ring,
222                                   void __iomem *regs);
223         void (*msdu_pg_rx_ring_setup)(struct mtk_wed_device *dev, int ring,
224                                       void __iomem *regs);
225         int (*ind_rx_ring_setup)(struct mtk_wed_device *dev,
226                                  void __iomem *regs);
227 };
228
229 extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops;
230
231 static inline int
232 mtk_wed_device_attach(struct mtk_wed_device *dev)
233 {
234         int ret = -ENODEV;
235
236 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
237         rcu_read_lock();
238         dev->ops = rcu_dereference(mtk_soc_wed_ops);
239         if (dev->ops)
240                 ret = dev->ops->attach(dev);
241         else
242                 rcu_read_unlock();
243
244         if (ret)
245                 dev->ops = NULL;
246 #endif
247
248         return ret;
249 }
250
251 static inline bool mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
252 {
253 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
254         if (dev->version == 3)
255                 return dev->wlan.hw_rro;
256
257         return dev->version != 1;
258 #else
259         return false;
260 #endif
261 }
262
263 static inline bool mtk_wed_is_amsdu_supported(struct mtk_wed_device *dev)
264 {
265 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
266         return dev->version == 3;
267 #else
268         return false;
269 #endif
270 }
271
272 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
273 #define mtk_wed_device_active(_dev) !!(_dev)->ops
274 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
275 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
276 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
277         (_dev)->ops->tx_ring_setup(_dev, _ring, _regs, _reset)
278 #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \
279         (_dev)->ops->txfree_ring_setup(_dev, _regs)
280 #define mtk_wed_device_reg_read(_dev, _reg) \
281         (_dev)->ops->reg_read(_dev, _reg)
282 #define mtk_wed_device_reg_write(_dev, _reg, _val) \
283         (_dev)->ops->reg_write(_dev, _reg, _val)
284 #define mtk_wed_device_irq_get(_dev, _mask) \
285         (_dev)->ops->irq_get(_dev, _mask)
286 #define mtk_wed_device_irq_set_mask(_dev, _mask) \
287         (_dev)->ops->irq_set_mask(_dev, _mask)
288 #define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \
289         (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset)
290 #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \
291         (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash)
292 #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \
293         (_dev)->ops->msg_update(_dev, _id, _msg, _len)
294 #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
295 #define mtk_wed_device_dma_reset(_dev) (_dev)->ops->reset_dma(_dev)
296 #define mtk_wed_device_setup_tc(_dev, _netdev, _type, _type_data) \
297         (_dev)->ops->setup_tc(_dev, _netdev, _type, _type_data)
298 #define mtk_wed_device_start_hw_rro(_dev, _mask, _reset) \
299         (_dev)->ops->start_hw_rro(_dev, _mask, _reset)
300 #define mtk_wed_device_rro_rx_ring_setup(_dev, _ring, _regs) \
301         (_dev)->ops->rro_rx_ring_setup(_dev, _ring, _regs)
302 #define mtk_wed_device_msdu_pg_rx_ring_setup(_dev, _ring, _regs) \
303         (_dev)->ops->msdu_pg_rx_ring_setup(_dev, _ring, _regs)
304 #define mtk_wed_device_ind_rx_ring_setup(_dev, _regs) \
305         (_dev)->ops->ind_rx_ring_setup(_dev, _regs)
306
307 #else
308 static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
309 {
310         return false;
311 }
312 #define mtk_wed_device_detach(_dev) do {} while (0)
313 #define mtk_wed_device_start(_dev, _mask) do {} while (0)
314 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV
315 #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV
316 #define mtk_wed_device_reg_read(_dev, _reg) 0
317 #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0)
318 #define mtk_wed_device_irq_get(_dev, _mask) 0
319 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
320 #define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV
321 #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash)  do {} while (0)
322 #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV
323 #define mtk_wed_device_stop(_dev) do {} while (0)
324 #define mtk_wed_device_dma_reset(_dev) do {} while (0)
325 #define mtk_wed_device_setup_tc(_dev, _netdev, _type, _type_data) -EOPNOTSUPP
326 #define mtk_wed_device_start_hw_rro(_dev, _mask, _reset) do {} while (0)
327 #define mtk_wed_device_rro_rx_ring_setup(_dev, _ring, _regs) -ENODEV
328 #define mtk_wed_device_msdu_pg_rx_ring_setup(_dev, _ring, _regs) -ENODEV
329 #define mtk_wed_device_ind_rx_ring_setup(_dev, _regs) -ENODEV
330 #endif
331
332 #endif