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
12struct mtk_eth;
13struct mtk_wed_wo;
14
15struct 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
35struct 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
43static inline void
44wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
45{
46	regmap_write(dev->hw->regs, reg, val);
47}
48
49static inline u32
50wed_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
59static inline void
60wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
61{
62	writel(val, dev->hw->wdma + reg);
63}
64
65static inline u32
66wdma_r32(struct mtk_wed_device *dev, u32 reg)
67{
68	return readl(dev->hw->wdma + reg);
69}
70
71static inline u32
72wpdma_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
80static inline void
81wpdma_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
89static inline u32
90wpdma_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
98static inline void
99wpdma_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
107static inline u32
108wpdma_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
116static inline void
117wpdma_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
125void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
126		    void __iomem *wdma, phys_addr_t wdma_phy,
127		    int index);
128void mtk_wed_exit(void);
129int mtk_wed_flow_add(int index);
130void mtk_wed_flow_remove(int index);
131void mtk_wed_fe_reset(void);
132void mtk_wed_fe_reset_complete(void);
133#else
134static inline void
135mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
136	       void __iomem *wdma, phys_addr_t wdma_phy,
137	       int index)
138{
139}
140static inline void
141mtk_wed_exit(void)
142{
143}
144static inline int mtk_wed_flow_add(int index)
145{
146	return -EINVAL;
147}
148static inline void mtk_wed_flow_remove(int index)
149{
150}
151
152static inline void mtk_wed_fe_reset(void)
153{
154}
155
156static inline void mtk_wed_fe_reset_complete(void)
157{
158}
159#endif
160
161#ifdef CONFIG_DEBUG_FS
162void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw);
163#else
164static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw)
165{
166}
167#endif
168
169#endif
170