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(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(dev->hw->regs, reg, &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, dev->hw->wdma + reg); 105} 106 107static inline u32 108wdma_r32(struct mtk_wed_device *dev, u32 reg) 109{ 110 return readl(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(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, 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(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, 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(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, 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(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