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 struct mtk_eth;
13 struct mtk_wed_wo;
14 
15 struct mtk_wed_hw {
16 	struct device_node *node;
17 	struct mtk_eth *eth;
18 	struct regmap *regs;
19 	struct regmap *hifsys;
20 	struct device *dev;
21 	void __iomem *wdma;
22 	phys_addr_t wdma_phy;
23 	struct regmap *mirror;
24 	struct dentry *debugfs_dir;
25 	struct mtk_wed_device *wed_dev;
26 	struct mtk_wed_wo *wed_wo;
27 	u32 debugfs_reg;
28 	u32 num_flows;
29 	u8 version;
30 	char dirname[5];
31 	int irq;
32 	int index;
33 };
34 
35 struct mtk_wdma_info {
36 	u8 wdma_idx;
37 	u8 queue;
38 	u16 wcid;
39 	u8 bss;
40 };
41 
42 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
43 static inline void
44 wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
45 {
46 	regmap_write(dev->hw->regs, reg, val);
47 }
48 
49 static inline u32
50 wed_r32(struct mtk_wed_device *dev, u32 reg)
51 {
52 	unsigned int val;
53 
54 	regmap_read(dev->hw->regs, reg, &val);
55 
56 	return val;
57 }
58 
59 static inline void
60 wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
61 {
62 	writel(val, dev->hw->wdma + reg);
63 }
64 
65 static inline u32
66 wdma_r32(struct mtk_wed_device *dev, u32 reg)
67 {
68 	return readl(dev->hw->wdma + reg);
69 }
70 
71 static inline u32
72 wpdma_tx_r32(struct mtk_wed_device *dev, int ring, u32 reg)
73 {
74 	if (!dev->tx_ring[ring].wpdma)
75 		return 0;
76 
77 	return readl(dev->tx_ring[ring].wpdma + reg);
78 }
79 
80 static inline void
81 wpdma_tx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val)
82 {
83 	if (!dev->tx_ring[ring].wpdma)
84 		return;
85 
86 	writel(val, dev->tx_ring[ring].wpdma + reg);
87 }
88 
89 static inline u32
90 wpdma_rx_r32(struct mtk_wed_device *dev, int ring, u32 reg)
91 {
92 	if (!dev->rx_ring[ring].wpdma)
93 		return 0;
94 
95 	return readl(dev->rx_ring[ring].wpdma + reg);
96 }
97 
98 static inline void
99 wpdma_rx_w32(struct mtk_wed_device *dev, int ring, u32 reg, u32 val)
100 {
101 	if (!dev->rx_ring[ring].wpdma)
102 		return;
103 
104 	writel(val, dev->rx_ring[ring].wpdma + reg);
105 }
106 
107 static inline u32
108 wpdma_txfree_r32(struct mtk_wed_device *dev, u32 reg)
109 {
110 	if (!dev->txfree_ring.wpdma)
111 		return 0;
112 
113 	return readl(dev->txfree_ring.wpdma + reg);
114 }
115 
116 static inline void
117 wpdma_txfree_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
118 {
119 	if (!dev->txfree_ring.wpdma)
120 		return;
121 
122 	writel(val, dev->txfree_ring.wpdma + reg);
123 }
124 
125 void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
126 		    void __iomem *wdma, phys_addr_t wdma_phy,
127 		    int index);
128 void mtk_wed_exit(void);
129 int mtk_wed_flow_add(int index);
130 void mtk_wed_flow_remove(int index);
131 #else
132 static inline void
133 mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
134 	       void __iomem *wdma, phys_addr_t wdma_phy,
135 	       int index)
136 {
137 }
138 static inline void
139 mtk_wed_exit(void)
140 {
141 }
142 static inline int mtk_wed_flow_add(int index)
143 {
144 	return -EINVAL;
145 }
146 static inline void mtk_wed_flow_remove(int index)
147 {
148 }
149 
150 #endif
151 
152 #ifdef CONFIG_DEBUG_FS
153 void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw);
154 #else
155 static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw)
156 {
157 }
158 #endif
159 
160 #endif
161