brintos

brintos / linux-shallow public Read only

0
0
Text · 4.1 KiB · c1f0479 Raw
227 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* Copyright (C) 2021 Felix Fietkau <nbd@nbd.name> */3 4#ifndef __MTK_WED_PRIV_H5#define __MTK_WED_PRIV_H6 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_WED65static 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 void86wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val)87{88	regmap_write(dev->hw->regs, reg, val);89}90 91static inline u3292wed_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 void102wdma_w32(struct mtk_wed_device *dev, u32 reg, u32 val)103{104	writel(val, dev->hw->wdma + reg);105}106 107static inline u32108wdma_r32(struct mtk_wed_device *dev, u32 reg)109{110	return readl(dev->hw->wdma + reg);111}112 113static inline u32114wpdma_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 void123wpdma_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 u32132wpdma_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 void141wpdma_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 u32150wpdma_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 void159wpdma_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#else191static inline void192mtk_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 void198mtk_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#endif217 218#ifdef CONFIG_DEBUG_FS219void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw);220#else221static inline void mtk_wed_hw_add_debugfs(struct mtk_wed_hw *hw)222{223}224#endif225 226#endif227