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