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