1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* Copyright (C) 2021 Felix Fietkau <nbd@nbd.name> */ |
3 | |
4 | #ifndef __MTK_WED_PRIV_H |
5 | #define __MTK_WED_PRIV_H |
6 | |
7 | #include <linux/soc/mediatek/mtk_wed.h> |
8 | #include <linux/debugfs.h> |
9 | #include <linux/regmap.h> |
10 | #include <linux/netdevice.h> |
11 | |
12 | #include "mtk_wed_regs.h" |
13 | |
14 | struct mtk_eth; |
15 | struct mtk_wed_wo; |
16 | |
17 | struct mtk_wed_soc_data { |
18 | struct { |
19 | u32 tx_bm_tkid; |
20 | u32 wpdma_rx_ring0; |
21 | u32 reset_idx_tx_mask; |
22 | u32 reset_idx_rx_mask; |
23 | } regmap; |
24 | u32 tx_ring_desc_size; |
25 | u32 wdma_desc_size; |
26 | }; |
27 | |
28 | struct mtk_wed_amsdu { |
29 | void *txd; |
30 | dma_addr_t txd_phy; |
31 | }; |
32 | |
33 | struct mtk_wed_hw { |
34 | const struct mtk_wed_soc_data *soc; |
35 | struct device_node *node; |
36 | struct mtk_eth *eth; |
37 | struct regmap *regs; |
38 | struct regmap *hifsys; |
39 | struct device *dev; |
40 | void __iomem *wdma; |
41 | phys_addr_t wdma_phy; |
42 | struct regmap *mirror; |
43 | struct dentry *debugfs_dir; |
44 | struct mtk_wed_device *wed_dev; |
45 | struct mtk_wed_wo *wed_wo; |
46 | struct mtk_wed_amsdu *wed_amsdu; |
47 | u32 pcie_base; |
48 | u32 debugfs_reg; |
49 | u32 num_flows; |
50 | u8 version; |
51 | char dirname[5]; |
52 | int irq; |
53 | int index; |
54 | }; |
55 | |
56 | struct mtk_wdma_info { |
57 | u8 wdma_idx; |
58 | u8 queue; |
59 | u16 wcid; |
60 | u8 bss; |
61 | u8 amsdu; |
62 | }; |
63 | |
64 | #ifdef CONFIG_NET_MEDIATEK_SOC_WED |
65 | static inline bool mtk_wed_is_v1(struct mtk_wed_hw *hw) |
66 | { |
67 | return hw->version == 1; |
68 | } |
69 | |
70 | static inline bool mtk_wed_is_v2(struct mtk_wed_hw *hw) |
71 | { |
72 | return hw->version == 2; |
73 | } |
74 | |
75 | static inline bool mtk_wed_is_v3(struct mtk_wed_hw *hw) |
76 | { |
77 | return hw->version == 3; |
78 | } |
79 | |
80 | static inline bool mtk_wed_is_v3_or_greater(struct mtk_wed_hw *hw) |
81 | { |
82 | return hw->version > 2; |
83 | } |
84 | |
85 | static inline void |
86 | wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val) |
87 | { |
88 | regmap_write(map: dev->hw->regs, reg, val); |
89 | } |
90 | |
91 | static inline u32 |
92 | wed_r32(struct mtk_wed_device *dev, u32 reg) |
93 | { |
94 | unsigned int val; |
95 | |
96 | regmap_read(map: dev->hw->regs, reg, val: &val); |
97 | |
98 | return val; |
99 | } |
100 | |
101 | static inline void |
102 | wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val) |
103 | { |
104 | writel(val, addr: dev->hw->wdma + reg); |
105 | } |
106 | |
107 | static inline u32 |
108 | wdma_r32(struct mtk_wed_device *dev, u32 reg) |
109 | { |
110 | return readl(addr: dev->hw->wdma + reg); |
111 | } |
112 | |
113 | static inline u32 |
114 | wpdma_tx_r32(struct mtk_wed_device *dev, int ring, u32 reg) |
115 | { |
116 | if (!dev->tx_ring[ring].wpdma) |
117 | return 0; |
118 | |
119 | return readl(addr: dev->tx_ring[ring].wpdma + reg); |
120 | } |
121 | |
122 | static inline void |
123 | wpdma_tx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val) |
124 | { |
125 | if (!dev->tx_ring[ring].wpdma) |
126 | return; |
127 | |
128 | writel(val, addr: dev->tx_ring[ring].wpdma + reg); |
129 | } |
130 | |
131 | static inline u32 |
132 | wpdma_rx_r32(struct mtk_wed_device *dev, int ring, u32 reg) |
133 | { |
134 | if (!dev->rx_ring[ring].wpdma) |
135 | return 0; |
136 | |
137 | return readl(addr: dev->rx_ring[ring].wpdma + reg); |
138 | } |
139 | |
140 | static inline void |
141 | wpdma_rx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val) |
142 | { |
143 | if (!dev->rx_ring[ring].wpdma) |
144 | return; |
145 | |
146 | writel(val, addr: dev->rx_ring[ring].wpdma + reg); |
147 | } |
148 | |
149 | static inline u32 |
150 | wpdma_txfree_r32(struct mtk_wed_device *dev, u32 reg) |
151 | { |
152 | if (!dev->txfree_ring.wpdma) |
153 | return 0; |
154 | |
155 | return readl(addr: dev->txfree_ring.wpdma + reg); |
156 | } |
157 | |
158 | static inline void |
159 | wpdma_txfree_w32(struct mtk_wed_device *dev, u32 reg, u32 val) |
160 | { |
161 | if (!dev->txfree_ring.wpdma) |
162 | return; |
163 | |
164 | writel(val, addr: dev->txfree_ring.wpdma + reg); |
165 | } |
166 | |
167 | static inline u32 mtk_wed_get_pcie_base(struct mtk_wed_device *dev) |
168 | { |
169 | if (!mtk_wed_is_v3_or_greater(hw: dev->hw)) |
170 | return MTK_WED_PCIE_BASE; |
171 | |
172 | switch (dev->hw->index) { |
173 | case 1: |
174 | return MTK_WED_PCIE_BASE1; |
175 | case 2: |
176 | return MTK_WED_PCIE_BASE2; |
177 | default: |
178 | return MTK_WED_PCIE_BASE0; |
179 | } |
180 | } |
181 | |
182 | void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, |
183 | void __iomem *wdma, phys_addr_t wdma_phy, |
184 | int index); |
185 | void mtk_wed_exit(void); |
186 | int mtk_wed_flow_add(int index); |
187 | void mtk_wed_flow_remove(int index); |
188 | void mtk_wed_fe_reset(void); |
189 | void mtk_wed_fe_reset_complete(void); |
190 | #else |
191 | static inline void |
192 | mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth, |
193 | void __iomem *wdma, phys_addr_t wdma_phy, |
194 | int index) |
195 | { |
196 | } |
197 | static inline void |
198 | mtk_wed_exit(void) |
199 | { |
200 | } |
201 | static inline int mtk_wed_flow_add(int index) |
202 | { |
203 | return -EINVAL; |
204 | } |
205 | static inline void mtk_wed_flow_remove(int index) |
206 | { |
207 | } |
208 | |
209 | static inline void mtk_wed_fe_reset(void) |
210 | { |
211 | } |
212 | |
213 | static inline void mtk_wed_fe_reset_complete(void) |
214 | { |
215 | } |
216 | #endif |
217 | |
218 | #ifdef CONFIG_DEBUG_FS |
219 | void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw); |
220 | #else |
221 | static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw) |
222 | { |
223 | } |
224 | #endif |
225 | |
226 | #endif |
227 | |