123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- From 6e1df49f330dce7c58a39d6772f1385b6887bb03 Mon Sep 17 00:00:00 2001
- Message-Id: <6e1df49f330dce7c58a39d6772f1385b6887bb03.1662990860.git.lorenzo@kernel.org>
- From: Lorenzo Bianconi <[email protected]>
- Date: Thu, 8 Sep 2022 11:26:10 +0200
- Subject: [PATCH net-next] net: ethernet: mtk_eth_wed: add axi bus support
- Other than pcie bus, introduce support for axi bus to mtk wed driver.
- Axi bus is used to connect mt7986-wmac soc chip available on mt7986
- device.
- Co-developed-by: Bo Jiao <[email protected]>
- Signed-off-by: Bo Jiao <[email protected]>
- Co-developed-by: Sujuan Chen <[email protected]>
- Signed-off-by: Sujuan Chen <[email protected]>
- Signed-off-by: Lorenzo Bianconi <[email protected]>
- ---
- drivers/net/ethernet/mediatek/mtk_wed.c | 116 +++++++++++++------
- drivers/net/ethernet/mediatek/mtk_wed_regs.h | 2 +
- include/linux/soc/mediatek/mtk_wed.h | 11 +-
- 3 files changed, 91 insertions(+), 38 deletions(-)
- --- a/drivers/net/ethernet/mediatek/mtk_wed.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
- @@ -85,11 +85,31 @@ static struct mtk_wed_hw *
- mtk_wed_assign(struct mtk_wed_device *dev)
- {
- struct mtk_wed_hw *hw;
- + int i;
- +
- + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
- + hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)];
- + if (!hw)
- + return NULL;
- +
- + if (!hw->wed_dev)
- + goto out;
- +
- + if (hw->version == 1)
- + return NULL;
- +
- + /* MT7986 WED devices do not have any pcie slot restrictions */
- + }
- + /* MT7986 PCIE or AXI */
- + for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
- + hw = hw_list[i];
- + if (hw && !hw->wed_dev)
- + goto out;
- + }
-
- - hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)];
- - if (!hw || hw->wed_dev)
- - return NULL;
- + return NULL;
-
- +out:
- hw->wed_dev = dev;
- return hw;
- }
- @@ -322,7 +342,6 @@ mtk_wed_stop(struct mtk_wed_device *dev)
- static void
- mtk_wed_detach(struct mtk_wed_device *dev)
- {
- - struct device_node *wlan_node = dev->wlan.pci_dev->dev.of_node;
- struct mtk_wed_hw *hw = dev->hw;
-
- mutex_lock(&hw_lock);
- @@ -337,9 +356,14 @@ mtk_wed_detach(struct mtk_wed_device *de
- mtk_wed_free_buffer(dev);
- mtk_wed_free_tx_rings(dev);
-
- - if (of_dma_is_coherent(wlan_node) && hw->hifsys)
- - regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
- - BIT(hw->index), BIT(hw->index));
- + if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
- + struct device_node *wlan_node;
- +
- + wlan_node = dev->wlan.pci_dev->dev.of_node;
- + if (of_dma_is_coherent(wlan_node) && hw->hifsys)
- + regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
- + BIT(hw->index), BIT(hw->index));
- + }
-
- if (!hw_list[!hw->index]->wed_dev &&
- hw->eth->dma_dev != hw->eth->dev)
- @@ -356,40 +380,54 @@ mtk_wed_detach(struct mtk_wed_device *de
- static void
- mtk_wed_bus_init(struct mtk_wed_device *dev)
- {
- - struct device_node *np = dev->hw->eth->dev->of_node;
- - struct regmap *regs;
- - u32 val;
- -
- - regs = syscon_regmap_lookup_by_phandle(np, "mediatek,wed-pcie");
- - if (IS_ERR(regs))
- - return;
- + switch (dev->wlan.bus_type) {
- + case MTK_WED_BUS_PCIE: {
- + struct device_node *np = dev->hw->eth->dev->of_node;
- + struct regmap *regs;
- + u32 val;
- +
- + regs = syscon_regmap_lookup_by_phandle(np,
- + "mediatek,wed-pcie");
- + if (IS_ERR(regs))
- + break;
-
- - regmap_update_bits(regs, 0, BIT(0), BIT(0));
- + regmap_update_bits(regs, 0, BIT(0), BIT(0));
-
- - wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
- - FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
- + wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
- + FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
-
- - /* pcie interrupt control: pola/source selection */
- - wed_set(dev, MTK_WED_PCIE_INT_CTRL,
- - MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
- - FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL, 1));
- - wed_r32(dev, MTK_WED_PCIE_INT_CTRL);
- -
- - val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM);
- - val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE);
- - wed_w32(dev, MTK_WED_PCIE_CFG_INTM, PCIE_BASE_ADDR0 | 0x180);
- - wed_w32(dev, MTK_WED_PCIE_CFG_BASE, PCIE_BASE_ADDR0 | 0x184);
- -
- - val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM);
- - val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE);
- -
- - /* pcie interrupt status trigger register */
- - wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24));
- - wed_r32(dev, MTK_WED_PCIE_INT_TRIGGER);
- -
- - /* pola setting */
- - val = wed_r32(dev, MTK_WED_PCIE_INT_CTRL);
- - wed_set(dev, MTK_WED_PCIE_INT_CTRL, MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA);
- + /* pcie interrupt control: pola/source selection */
- + wed_set(dev, MTK_WED_PCIE_INT_CTRL,
- + MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
- + FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL, 1));
- + wed_r32(dev, MTK_WED_PCIE_INT_CTRL);
- +
- + val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM);
- + val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE);
- + wed_w32(dev, MTK_WED_PCIE_CFG_INTM, PCIE_BASE_ADDR0 | 0x180);
- + wed_w32(dev, MTK_WED_PCIE_CFG_BASE, PCIE_BASE_ADDR0 | 0x184);
- +
- + val = wed_r32(dev, MTK_WED_PCIE_CFG_INTM);
- + val = wed_r32(dev, MTK_WED_PCIE_CFG_BASE);
- +
- + /* pcie interrupt status trigger register */
- + wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24));
- + wed_r32(dev, MTK_WED_PCIE_INT_TRIGGER);
- +
- + /* pola setting */
- + val = wed_r32(dev, MTK_WED_PCIE_INT_CTRL);
- + wed_set(dev, MTK_WED_PCIE_INT_CTRL,
- + MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA);
- + break;
- + }
- + case MTK_WED_BUS_AXI:
- + wed_set(dev, MTK_WED_WPDMA_INT_CTRL,
- + MTK_WED_WPDMA_INT_CTRL_SIG_SRC |
- + FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_SRC_SEL, 0));
- + break;
- + default:
- + break;
- + }
- }
-
- static void
- @@ -800,12 +838,14 @@ mtk_wed_attach(struct mtk_wed_device *de
- __releases(RCU)
- {
- struct mtk_wed_hw *hw;
- + struct device *device;
- int ret = 0;
-
- RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
- "mtk_wed_attach without holding the RCU read lock");
-
- - if (pci_domain_nr(dev->wlan.pci_dev->bus) > 1 ||
- + if ((dev->wlan.bus_type == MTK_WED_BUS_PCIE &&
- + pci_domain_nr(dev->wlan.pci_dev->bus) > 1) ||
- !try_module_get(THIS_MODULE))
- ret = -ENODEV;
-
- @@ -823,8 +863,10 @@ mtk_wed_attach(struct mtk_wed_device *de
- goto out;
- }
-
- - dev_info(&dev->wlan.pci_dev->dev,
- - "attaching wed device %d version %d\n",
- + device = dev->wlan.bus_type == MTK_WED_BUS_PCIE
- + ? &dev->wlan.pci_dev->dev
- + : &dev->wlan.platform_dev->dev;
- + dev_info(device, "attaching wed device %d version %d\n",
- hw->index, hw->version);
-
- dev->hw = hw;
- --- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
- +++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
- @@ -198,6 +198,8 @@ struct mtk_wdma_desc {
-
- #define MTK_WED_WPDMA_INT_CTRL 0x520
- #define MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV BIT(21)
- +#define MTK_WED_WPDMA_INT_CTRL_SIG_SRC BIT(22)
- +#define MTK_WED_WPDMA_INT_CTRL_SRC_SEL GENMASK(17, 16)
-
- #define MTK_WED_WPDMA_INT_MASK 0x524
-
- --- a/include/linux/soc/mediatek/mtk_wed.h
- +++ b/include/linux/soc/mediatek/mtk_wed.h
- @@ -11,6 +11,11 @@
- struct mtk_wed_hw;
- struct mtk_wdma_desc;
-
- +enum mtk_wed_bus_tye {
- + MTK_WED_BUS_PCIE,
- + MTK_WED_BUS_AXI,
- +};
- +
- struct mtk_wed_ring {
- struct mtk_wdma_desc *desc;
- dma_addr_t desc_phys;
- @@ -43,7 +48,11 @@ struct mtk_wed_device {
-
- /* filled by driver: */
- struct {
- - struct pci_dev *pci_dev;
- + union {
- + struct platform_device *platform_dev;
- + struct pci_dev *pci_dev;
- + };
- + enum mtk_wed_bus_tye bus_type;
-
- u32 wpdma_phys;
- u32 wpdma_int;
|