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
14struct mtk_eth;
15struct mtk_wed_wo;
16
17struct 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
28struct mtk_wed_amsdu {
29 void *txd;
30 dma_addr_t txd_phy;
31};
32
33struct 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
56struct 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
65static inline bool mtk_wed_is_v1(struct mtk_wed_hw *hw)
66{
67 return hw->version == 1;
68}
69
70static inline bool mtk_wed_is_v2(struct mtk_wed_hw *hw)
71{
72 return hw->version == 2;
73}
74
75static inline bool mtk_wed_is_v3(struct mtk_wed_hw *hw)
76{
77 return hw->version == 3;
78}
79
80static inline bool mtk_wed_is_v3_or_greater(struct mtk_wed_hw *hw)
81{
82 return hw->version > 2;
83}
84
85static inline void
86wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
87{
88 regmap_write(map: dev->hw->regs, reg, val);
89}
90
91static inline u32
92wed_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
101static inline void
102wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
103{
104 writel(val, addr: dev->hw->wdma + reg);
105}
106
107static inline u32
108wdma_r32(struct mtk_wed_device *dev, u32 reg)
109{
110 return readl(addr: dev->hw->wdma + reg);
111}
112
113static inline u32
114wpdma_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
122static inline void
123wpdma_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
131static inline u32
132wpdma_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
140static inline void
141wpdma_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
149static inline u32
150wpdma_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
158static inline void
159wpdma_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
167static 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
182void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
183 void __iomem *wdma, phys_addr_t wdma_phy,
184 int index);
185void mtk_wed_exit(void);
186int mtk_wed_flow_add(int index);
187void mtk_wed_flow_remove(int index);
188void mtk_wed_fe_reset(void);
189void mtk_wed_fe_reset_complete(void);
190#else
191static inline void
192mtk_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}
197static inline void
198mtk_wed_exit(void)
199{
200}
201static inline int mtk_wed_flow_add(int index)
202{
203 return -EINVAL;
204}
205static inline void mtk_wed_flow_remove(int index)
206{
207}
208
209static inline void mtk_wed_fe_reset(void)
210{
211}
212
213static inline void mtk_wed_fe_reset_complete(void)
214{
215}
216#endif
217
218#ifdef CONFIG_DEBUG_FS
219void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw);
220#else
221static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw)
222{
223}
224#endif
225
226#endif
227

source code of linux/drivers/net/ethernet/mediatek/mtk_wed.h