introduce mt7986 ethernet support
Subsystems (5)
Lorenzo Bianconi
maintainerv3 cover introduce mt7986 ethernet support
Add support for mt7986-eth driver available on mt7986 soc.
Changes since v2:
- rely on GFP_KERNEL whenever possible
- define mtk_reg_map struct to introduce soc register map and avoid macros
- improve comments
Changes since v1:
- drop SRAM option
- convert ring->dma to void
- convert scratch_ring to void
- enable port4
- fix irq dts bindings
- drop gmac1 support from mt7986a-rfb dts for the moment
Lorenzo Bianconi (16):
arm64: dts: mediatek: mt7986: introduce ethernet nodes
dt-bindings: net: mediatek,net: add mt7986-eth binding
net: ethernet: mtk_eth_soc: rely on GFP_KERNEL for dma_alloc_coherent
whenever possible
net: ethernet: mtk_eth_soc: move tx dma desc configuration in
mtk_tx_set_dma_desc
net: ethernet: mtk_eth_soc: add txd_size to mtk_soc_data
net: ethernet: mtk_eth_soc: rely on txd_size in
mtk_tx_alloc/mtk_tx_clean
net: ethernet: mtk_eth_soc: rely on txd_size in mtk_desc_to_tx_buf
net: ethernet: mtk_eth_soc: rely on txd_size in txd_to_idx
net: ethernet: mtk_eth_soc: add rxd_size to mtk_soc_data
net: ethernet: mtk_eth_soc: rely on txd_size field in
mtk_poll_tx/mtk_poll_rx
net: ethernet: mtk_eth_soc: rely on rxd_size field in
mtk_rx_alloc/mtk_rx_clean
net: ethernet: mtk_eth_soc: introduce device register map
net: ethernet: mtk_eth_soc: introduce MTK_NETSYS_V2 support
net: ethernet: mtk_eth_soc: convert ring dma pointer to void
net: ethernet: mtk_eth_soc: convert scratch_ring pointer to void
net: ethernet: mtk_eth_soc: introduce support for mt7986 chipset
.../devicetree/bindings/net/mediatek,net.yaml | 141 ++- arch/arm64/boot/dts/mediatek/mt7986a-rfb.dts | 74 ++ arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 39 + arch/arm64/boot/dts/mediatek/mt7986b-rfb.dts | 70 ++ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 834 +++++++++++++----- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 305 ++++--- 6 files changed, 1113 insertions(+), 350 deletions(-)
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 1/16 arm64: dts: mediatek: mt7986: introduce ethernet nodes
Introduce ethernet nodes in mt7986 bindings in order to enable mt7986a/mt7986b ethernet support.
--- arch/arm64/boot/dts/mediatek/mt7986a-rfb.dts | 74 ++++++++++++++++++++ arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 39 +++++++++++ arch/arm64/boot/dts/mediatek/mt7986b-rfb.dts | 70 ++++++++++++++++++ 3 files changed, 183 insertions(+)
arch/arm64/boot/dts/mediatek/mt7986a-rfb.dts +74 -0
@@ -25,6 +25,80 @@ memory@40000000 { }; }; +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +&mdio { + switch: switch@0 { + compatible = "mediatek,mt7531"; + reg = <31>; + reset-gpios = <&pio 5 0>; + }; +}; + +&switch { + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + label = "lan0"; + }; + + port@1 { + reg = <1>; + label = "lan1"; + }; + + port@2 { + reg = <2>; + label = "lan2"; + }; + + port@3 { + reg = <3>; + label = "lan3"; + }; + + port@4 { + reg = <4>; + label = "lan4"; + }; + + port@6 { + reg = <6>; + label = "cpu"; + ethernet = <&gmac0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + }; +}; + &uart0 { status = "okay"; };
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +39 -0
@@ -222,6 +222,45 @@ ethsys: syscon@15000000 { #reset-cells = <1>; }; + eth: ethernet@15100000 { + compatible = "mediatek,mt7986-eth"; + reg = <0 0x15100000 0 0x80000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>; + clocks = <ðsys CLK_ETH_FE_EN>, + <ðsys CLK_ETH_GP2_EN>, + <ðsys CLK_ETH_GP1_EN>, + <ðsys CLK_ETH_WOCPU1_EN>, + <ðsys CLK_ETH_WOCPU0_EN>, + <&sgmiisys0 CLK_SGMII0_TX250M_EN>, + <&sgmiisys0 CLK_SGMII0_RX250M_EN>, + <&sgmiisys0 CLK_SGMII0_CDR_REF>, + <&sgmiisys0 CLK_SGMII0_CDR_FB>, + <&sgmiisys1 CLK_SGMII1_TX250M_EN>, + <&sgmiisys1 CLK_SGMII1_RX250M_EN>, + <&sgmiisys1 CLK_SGMII1_CDR_REF>, + <&sgmiisys1 CLK_SGMII1_CDR_FB>, + <&topckgen CLK_TOP_NETSYS_SEL>, + <&topckgen CLK_TOP_NETSYS_500M_SEL>; + clock-names = "fe", "gp2", "gp1", "wocpu1", "wocpu0", + "sgmii_tx250m", "sgmii_rx250m", + "sgmii_cdr_ref", "sgmii_cdr_fb", + "sgmii2_tx250m", "sgmii2_rx250m", + "sgmii2_cdr_ref", "sgmii2_cdr_fb", + "netsys0", "netsys1"; + assigned-clocks = <&topckgen CLK_TOP_NETSYS_2X_SEL>, + <&topckgen CLK_TOP_SGM_325M_SEL>; + assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>, + <&apmixedsys CLK_APMIXED_SGMPLL>; + mediatek,ethsys = <ðsys>; + mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>; + #reset-cells = <1>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; }; };
arch/arm64/boot/dts/mediatek/mt7986b-rfb.dts +70 -0
73 lines not on this page · raw message
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 2/16 dt-bindings: net: mediatek,net: add mt7986-eth binding
In reply to Lorenzo BianconiIntroduce dts bindings for mt7986 soc in mediatek,net.yaml.
--- .../devicetree/bindings/net/mediatek,net.yaml | 141 +++++++++++++++++- 1 file changed, 139 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/net/mediatek,net.yaml +139 -2
@@ -21,6 +21,7 @@ properties: - mediatek,mt7623-eth - mediatek,mt7622-eth - mediatek,mt7629-eth + - mediatek,mt7986-eth - ralink,rt5350-eth reg:
@@ -28,7 +29,7 @@ properties: interrupts: minItems: 3 - maxItems: 3 + maxItems: 4 power-domains: maxItems: 1
@@ -88,6 +89,9 @@ allOf: - mediatek,mt7623-eth then: properties: + interrupts: + maxItems: 3 + clocks: minItems: 4 maxItems: 4
@@ -112,6 +116,9 @@ allOf: const: mediatek,mt7622-eth then: properties: + interrupts: + maxItems: 3 + clocks: minItems: 11 maxItems: 11
@@ -155,6 +162,9 @@ allOf: const: mediatek,mt7629-eth then: properties: + interrupts: + maxItems: 3 + clocks: minItems: 17 maxItems: 17
@@ -189,6 +199,42 @@ allOf: minItems: 2 maxItems: 2 + - if: + properties: + compatible: + contains: + const: mediatek,mt7986-eth + then: + properties: + interrupts: + minItems: 4 + + clocks: + minItems: 15 + maxItems: 15 + + clock-names: + items: + - const: fe + - const: gp2 + - const: gp1 + - const: wocpu1 + - const: wocpu0 + - const: sgmii_tx250m + - const: sgmii_rx250m + - const: sgmii_cdr_ref + - const: sgmii_cdr_fb + - const: sgmii2_tx250m + - const: sgmii2_rx250m + - const: sgmii2_cdr_ref + - const: sgmii2_cdr_fb + - const: netsys0 + - const: netsys1 + + mediatek,sgmiisys: + minItems: 2 + maxItems: 2 + patternProperties: "^mac@[0-1]$": type: object
@@ -219,7 +265,6 @@ required: - interrupts - clocks - clock-names - - power-domains - mediatek,ethsys unevaluatedProperties: false
@@ -295,3 +340,95 @@ examples: }; }; }; + + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/interrupt-controller/irq.h> + #include <dt-bindings/clock/mt7622-clk.h> + + soc { + #address-cells = <2>; + #size-cells = <2>; + + eth: ethernet@15100000 { + #define CLK_ETH_FE_EN 0 + #define CLK_ETH_WOCPU1_EN 3 + #define CLK_ETH_WOCPU0_EN 4 + #define CLK_TOP_NETSYS_SEL 43 + #define CLK_TOP_NETSYS_500M_SEL 44 + #define CLK_TOP_NETSYS_2X_SEL 46 + #define CLK_TOP_SGM_325M_SEL 47 + #define CLK_APMIXED_NET2PLL 1 + #define CLK_APMIXED_SGMPLL 3 + + compatible = "mediatek,mt7986-eth"; + reg = <0 0x15100000 0 0x80000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>; + clocks = <ðsys CLK_ETH_FE_EN>, + <ðsys CLK_ETH_GP2_EN>, + <ðsys CLK_ETH_GP1_EN>, + <ðsys CLK_ETH_WOCPU1_EN>, + <ðsys CLK_ETH_WOCPU0_EN>, + <&sgmiisys0 CLK_SGMII_TX250M_EN>, + <&sgmiisys0 CLK_SGMII_RX250M_EN>, + <&sgmiisys0 CLK_SGMII_CDR_REF>, + <&sgmiisys0 CLK_SGMII_CDR_FB>, + <&sgmiisys1 CLK_SGMII_TX250M_EN>, + <&sgmiisys1 CLK_SGMII_RX250M_EN>, + <&sgmiisys1 CLK_SGMII_CDR_REF>, + <&sgmiisys1 CLK_SGMII_CDR_FB>, + <&topckgen CLK_TOP_NETSYS_SEL>, + <&topckgen CLK_TOP_NETSYS_SEL>; + clock-names = "fe", "gp2", "gp1", "wocpu1", "wocpu0", + "sgmii_tx250m", "sgmii_rx250m", + "sgmii_cdr_ref", "sgmii_cdr_fb", + "sgmii2_tx250m", "sgmii2_rx250m", + "sgmii2_cdr_ref", "sgmii2_cdr_fb", + "netsys0", "netsys1"; + mediatek,ethsys = <ðsys>; + mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>; + assigned-clocks = <&topckgen CLK_TOP_NETSYS_2X_SEL>, + <&topckgen CLK_TOP_SGM_325M_SEL>; + assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>, + <&apmixedsys CLK_APMIXED_SGMPLL>; + + #address-cells = <1>; + #size-cells = <0>; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + + phy5: ethernet-phy@0 { + compatible = "ethernet-phy-id67c9.de0a"; + phy-mode = "2500base-x"; + reset-gpios = <&pio 6 1>; + reset-deassert-us = <20000>; + reg = <5>; + }; + + phy6: ethernet-phy@1 { + compatible = "ethernet-phy-id67c9.de0a"; + phy-mode = "2500base-x"; + reg = <6>; + }; + }; + + mac0: mac@0 { + compatible = "mediatek,eth-mac"; + phy-mode = "2500base-x"; + phy-handle = <&phy5>; + reg = <0>; + }; + + mac1: mac@1 { + compatible = "mediatek,eth-mac"; + phy-mode = "2500base-x"; + phy-handle = <&phy6>; + reg = <1>; + }; + }; + };
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 3/16 net: ethernet: mtk_eth_soc: rely on GFP_KERNEL for dma_alloc_coherent whenever possible
In reply to Lorenzo BianconiRely on GFP_KERNEL for dma descriptors mappings in mtk_tx_alloc(), mtk_rx_alloc() and mtk_init_fq_dma() since they are run in non-irq context.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +4 -5
@@ -816,7 +816,7 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) eth->scratch_ring =dma_alloc_coherent (eth->dma_dev, cnt *sizeof (struct mtk_tx_dma ), ð->phy_scratch_ring, -GFP_ATOMIC ); +GFP_KERNEL );if (unlikely (!eth->scratch_ring))return -ENOMEM ;
@@ -1591,7 +1591,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth) goto no_tx_mem; ring->dma =dma_alloc_coherent (eth->dma_dev,MTK_DMA_SIZE * sz, - &ring->phys,GFP_ATOMIC ); + &ring->phys,GFP_KERNEL );if (!ring->dma) goto no_tx_mem;
@@ -1609,8 +1609,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)*/ if (!MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { ring->dma_pdma =dma_alloc_coherent (eth->dma_dev,MTK_DMA_SIZE * sz, - &ring->phys_pdma, -GFP_ATOMIC ); + &ring->phys_pdma,GFP_KERNEL );if (!ring->dma_pdma) goto no_tx_mem;
@@ -1722,7 +1721,7 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) ring->dma =dma_alloc_coherent (eth->dma_dev, rx_dma_size *sizeof (*ring->dma), - &ring->phys,GFP_ATOMIC ); + &ring->phys,GFP_KERNEL );if (!ring->dma)return -ENOMEM ;
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 4/16 net: ethernet: mtk_eth_soc: move tx dma desc configuration in mtk_tx_set_dma_desc
In reply to Lorenzo BianconiMove tx dma descriptor configuration in mtk_tx_set_dma_desc routine. This is a preliminary patch to introduce mt7986 ethernet support since it relies on a different tx dma descriptor layout.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 105 +++++++++++--------- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 11 ++ 2 files changed, 67 insertions(+), 49 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +56 -49
@@ -942,18 +942,51 @@ static void setup_tx_buf(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, } } +static void mtk_tx_set_dma_desc (struct net_device *dev,struct mtk_tx_dma *desc, +struct mtk_tx_dma_desc_info *info) +{ +struct mtk_mac *mac =netdev_priv (dev); +u32 data; + +WRITE_ONCE (desc->txd1, info->addr); + + data =TX_DMA_SWC |TX_DMA_PLEN0 (info->size); +if (info->last) + data |=TX_DMA_LS0 ; +WRITE_ONCE (desc->txd3, data); + + data = (mac->id +1 ) <<TX_DMA_FPORT_SHIFT ;/* forward port */ +if (info->first) { +if (info->gso) + data |=TX_DMA_TSO ; +/* tx checksum offload */ +if (info->csum) + data |=TX_DMA_CHKSUM ; +/* vlan header offload */ +if (info->vlan) + data |=TX_DMA_INS_VLAN | info->vlan_tci; + } +WRITE_ONCE (desc->txd4, data); +} +static int mtk_tx_map (struct sk_buff *skb,struct net_device *dev,int tx_num,struct mtk_tx_ring *ring,bool gso) { +struct mtk_tx_dma_desc_info txd_info = { + .size =skb_headlen (skb), + .gso = gso, + .csum = skb->ip_summed ==CHECKSUM_PARTIAL , + .vlan =skb_vlan_tag_present (skb), + .vlan_tci =skb_vlan_tag_get (skb), + .first = true, + .last = !skb_is_nonlinear (skb), + };struct mtk_mac *mac =netdev_priv (dev);struct mtk_eth *eth = mac->hw;struct mtk_tx_dma *itxd, *txd;struct mtk_tx_dma *itxd_pdma, *txd_pdma;struct mtk_tx_buf *itx_buf, *tx_buf; -dma_addr_t mapped_addr; -unsigned int nr_frags;int i, n_desc =1 ; -u32 txd4 =0 , fport;int k =0 ; itxd = ring->next_free;
@@ -961,49 +994,32 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,if (itxd == ring->last_free)return -ENOMEM ; -/* set the forward port */ - fport = (mac->id +1 ) <<TX_DMA_FPORT_SHIFT ; - txd4 |= fport; - itx_buf =mtk_desc_to_tx_buf (ring, itxd);memset (itx_buf,0 ,sizeof (*itx_buf)); -if (gso) - txd4 |=TX_DMA_TSO ; - -/* TX Checksum offload */ -if (skb->ip_summed ==CHECKSUM_PARTIAL ) - txd4 |=TX_DMA_CHKSUM ; - -/* VLAN header offload */ -if (skb_vlan_tag_present (skb)) - txd4 |=TX_DMA_INS_VLAN |skb_vlan_tag_get (skb); - - mapped_addr =dma_map_single (eth->dma_dev, skb->data, -skb_headlen (skb),DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (eth->dma_dev, mapped_addr))) + txd_info.addr =dma_map_single (eth->dma_dev, skb->data, txd_info.size, +DMA_TO_DEVICE ); +if (unlikely (dma_mapping_error (eth->dma_dev, txd_info.addr)))return -ENOMEM ; -WRITE_ONCE (itxd->txd1, mapped_addr); +mtk_tx_set_dma_desc (dev, itxd, &txd_info); + itx_buf->flags |=MTK_TX_FLAGS_SINGLE0 ; itx_buf->flags |= (!mac->id) ?MTK_TX_FLAGS_FPORT0 :MTK_TX_FLAGS_FPORT1 ; -setup_tx_buf (eth, itx_buf, itxd_pdma, mapped_addr,skb_headlen (skb), +setup_tx_buf (eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, k++);/* TX SG offload */ txd = itxd; txd_pdma =qdma_to_pdma (ring, txd); - nr_frags =skb_shinfo (skb)->nr_frags; -for (i =0 ; i < nr_frags; i++) { +for (i =0 ; i <skb_shinfo (skb)->nr_frags; i++) {skb_frag_t *frag = &skb_shinfo (skb)->frags[i];unsigned int offset =0 ;int frag_size =skb_frag_size (frag);while (frag_size) { -bool last_frag = false; -unsigned int frag_map_size;bool new_desc = true; if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA) ||
@@ -1018,23 +1034,17 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, new_desc = false; } - - frag_map_size =min (frag_size,MTK_TX_DMA_BUF_LEN ); - mapped_addr =skb_frag_dma_map (eth->dma_dev, frag, offset, - frag_map_size, -DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (eth->dma_dev, mapped_addr))) +memset (&txd_info,0 ,sizeof (struct mtk_tx_dma_desc_info )); + txd_info.size =min (frag_size,MTK_TX_DMA_BUF_LEN ); + txd_info.last = i ==skb_shinfo (skb)->nr_frags -1 && + !(frag_size - txd_info.size); + txd_info.addr =skb_frag_dma_map (eth->dma_dev, frag, + offset, txd_info.size, +DMA_TO_DEVICE ); +if (unlikely (dma_mapping_error (eth->dma_dev, txd_info.addr))) goto err_dma; -if (i == nr_frags -1 && - (frag_size - frag_map_size) ==0 ) - last_frag = true; - -WRITE_ONCE (txd->txd1, mapped_addr); -WRITE_ONCE (txd->txd3, (TX_DMA_SWC | -TX_DMA_PLEN0 (frag_map_size) | - last_frag *TX_DMA_LS0 )); -WRITE_ONCE (txd->txd4, fport); +mtk_tx_set_dma_desc (dev, txd, &txd_info); tx_buf =mtk_desc_to_tx_buf (ring, txd);if (new_desc)
@@ -1044,20 +1054,17 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, tx_buf->flags |= (!mac->id) ?MTK_TX_FLAGS_FPORT0 :MTK_TX_FLAGS_FPORT1 ; -setup_tx_buf (eth, tx_buf, txd_pdma, mapped_addr, - frag_map_size, k++); +setup_tx_buf (eth, tx_buf, txd_pdma, txd_info.addr, + txd_info.size, k++); - frag_size -= frag_map_size; - offset += frag_map_size; + frag_size -= txd_info.size; + offset += txd_info.size; } }/* store skb to cleanup */ itx_buf->skb = skb; -WRITE_ONCE (itxd->txd4, txd4); -WRITE_ONCE (itxd->txd3, (TX_DMA_SWC |TX_DMA_PLEN0 (skb_headlen (skb)) | - (!nr_frags *TX_DMA_LS0 )));if (!MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) {if (k &0x1 ) txd_pdma->txd2 |=TX_DMA_LS0 ;
drivers/net/ethernet/mediatek/mtk_eth_soc.h +11 -0
@@ -846,6 +846,17 @@ enum mkt_eth_capabilities { MTK_MUX_U3_GMAC2_TO_QPHY | \ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) +struct mtk_tx_dma_desc_info { +dma_addr_t addr; +u32 size; +u16 vlan_tci; +u8 gso:1 ; +u8 csum:1 ; +u8 vlan:1 ; +u8 first:1 ; +u8 last:1 ; +}; +/* struct mtk_eth_data - This is the structure holding all differences * among various plaforms * @ana_rgc3: The offset for register ANA_RGC3 related to
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 5/16 net: ethernet: mtk_eth_soc: add txd_size to mtk_soc_data
In reply to Lorenzo BianconiIn order to remove mtk_tx_dma size dependency, introduce txd_size in mtk_soc_data data structure. Rely on txd_size in mtk_init_fq_dma() and mtk_dma_free() routines.
This is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 47 +++++++++++++++------ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++ 2 files changed, 38 insertions(+), 13 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +34 -13
@@ -808,20 +808,20 @@ static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd,/* the qdma core needs scratch memory to be setup */ static int mtk_init_fq_dma (struct mtk_eth *eth) { +const struct mtk_soc_data *soc = eth->soc;dma_addr_t phy_ring_tail;int cnt =MTK_DMA_SIZE ;dma_addr_t dma_addr;int i; eth->scratch_ring =dma_alloc_coherent (eth->dma_dev, - cnt *sizeof (struct mtk_tx_dma ), + cnt * soc->txrx.txd_size, ð->phy_scratch_ring,GFP_KERNEL );if (unlikely (!eth->scratch_ring))return -ENOMEM ; - eth->scratch_head =kcalloc (cnt,MTK_QDMA_PAGE_SIZE , -GFP_KERNEL ); + eth->scratch_head =kcalloc (cnt,MTK_QDMA_PAGE_SIZE ,GFP_KERNEL );if (unlikely (!eth->scratch_head))return -ENOMEM ;
@@ -831,16 +831,19 @@ static int mtk_init_fq_dma(struct mtk_eth *eth)if (unlikely (dma_mapping_error (eth->dma_dev, dma_addr)))return -ENOMEM ; - phy_ring_tail = eth->phy_scratch_ring + - (sizeof (struct mtk_tx_dma ) * (cnt -1 )); + phy_ring_tail = eth->phy_scratch_ring + soc->txrx.txd_size * (cnt -1 );for (i =0 ; i < cnt; i++) { - eth->scratch_ring[i].txd1 = - (dma_addr + (i *MTK_QDMA_PAGE_SIZE )); +struct mtk_tx_dma *txd; + + txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; + txd->txd1 = dma_addr + i *MTK_QDMA_PAGE_SIZE ;if (i < cnt -1 ) - eth->scratch_ring[i].txd2 = (eth->phy_scratch_ring + - ((i +1 ) *sizeof (struct mtk_tx_dma ))); - eth->scratch_ring[i].txd3 =TX_DMA_SDL (MTK_QDMA_PAGE_SIZE ); + txd->txd2 = eth->phy_scratch_ring + + (i +1 ) * soc->txrx.txd_size; + + txd->txd3 =TX_DMA_PLEN0 (MTK_QDMA_PAGE_SIZE ); + txd->txd4 =0 ; }mtk_w32 (eth, eth->phy_scratch_ring,MTK_QDMA_FQ_HEAD );
@@ -2131,6 +2134,7 @@ static int mtk_dma_init(struct mtk_eth *eth)static void mtk_dma_free (struct mtk_eth *eth) { +const struct mtk_soc_data *soc = eth->soc;int i;for (i =0 ; i <MTK_MAC_COUNT ; i++)
@@ -2138,9 +2142,8 @@ static void mtk_dma_free(struct mtk_eth *eth)netdev_reset_queue (eth->netdev[i]);if (eth->scratch_ring) {dma_free_coherent (eth->dma_dev, -MTK_DMA_SIZE *sizeof (struct mtk_tx_dma ), - eth->scratch_ring, - eth->phy_scratch_ring); +MTK_DMA_SIZE * soc->txrx.txd_size, + eth->scratch_ring, eth->phy_scratch_ring); eth->scratch_ring =NULL ; eth->phy_scratch_ring =0 ; }
@@ -3373,6 +3376,9 @@ static const struct mtk_soc_data mt2701_data = { .hw_features = MTK_HW_FEATURES, .required_clks = MT7623_CLKS_BITMAP, .required_pctl = true, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };static const struct mtk_soc_data mt7621_data = {
@@ -3381,6 +3387,9 @@ static const struct mtk_soc_data mt7621_data = { .required_clks = MT7621_CLKS_BITMAP, .required_pctl = false, .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };static const struct mtk_soc_data mt7622_data = {
@@ -3390,6 +3399,9 @@ static const struct mtk_soc_data mt7622_data = { .required_clks = MT7622_CLKS_BITMAP, .required_pctl = false, .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };static const struct mtk_soc_data mt7623_data = {
@@ -3398,6 +3410,9 @@ static const struct mtk_soc_data mt7623_data = { .required_clks = MT7623_CLKS_BITMAP, .required_pctl = true, .offload_version = 2, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };static const struct mtk_soc_data mt7629_data = {
@@ -3406,6 +3421,9 @@ static const struct mtk_soc_data mt7629_data = { .hw_features = MTK_HW_FEATURES, .required_clks = MT7629_CLKS_BITMAP, .required_pctl = false, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };static const struct mtk_soc_data rt5350_data = {
@@ -3413,6 +3431,9 @@ static const struct mtk_soc_data rt5350_data = { .hw_features = MTK_HW_FEATURES_MT7628, .required_clks = MT7628_CLKS_BITMAP, .required_pctl = false, + .txrx = { + .txd_size = sizeof(struct mtk_tx_dma), + }, };const struct of_device_id of_mtk_match[] = {
drivers/net/ethernet/mediatek/mtk_eth_soc.h +4 -0
@@ -867,6 +867,7 @@ struct mtk_tx_dma_desc_info {* the target SoC * @required_pctl A bool value to show whether the SoC requires * the extra setup for those pins used by GMAC. +* @txd_size Tx DMA descriptor size. */ struct mtk_soc_data {u32 ana_rgc3;
@@ -875,6 +876,9 @@ struct mtk_soc_data {bool required_pctl;u8 offload_version;netdev_features_t hw_features; +struct { +u32 txd_size; + } txrx; };/* currently no SoC has more than 2 macs */
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 6/16 net: ethernet: mtk_eth_soc: rely on txd_size in mtk_tx_alloc/mtk_tx_clean
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +13 -10
@@ -1592,8 +1592,10 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget)static int mtk_tx_alloc (struct mtk_eth *eth) { +const struct mtk_soc_data *soc = eth->soc;struct mtk_tx_ring *ring = ð->tx_ring; -int i, sz =sizeof (*ring->dma); +int i, sz = soc->txrx.txd_size; +struct mtk_tx_dma *txd; ring->buf =kcalloc (MTK_DMA_SIZE ,sizeof (*ring->buf),GFP_KERNEL );
@@ -1609,8 +1611,10 @@ static int mtk_tx_alloc(struct mtk_eth *eth)int next = (i +1 ) %MTK_DMA_SIZE ;u32 next_ptr = ring->phys + next * sz; - ring->dma[i].txd2 = next_ptr; - ring->dma[i].txd3 =TX_DMA_LS0 |TX_DMA_OWNER_CPU ; + txd = (void *)ring->dma + i * sz; + txd->txd2 = next_ptr; + txd->txd3 =TX_DMA_LS0 |TX_DMA_OWNER_CPU ; + txd->txd4 =0 ; }/* On MT7688 (PDMA only) this driver uses the ring->dma structs
@@ -1632,7 +1636,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth) ring->dma_size =MTK_DMA_SIZE ;atomic_set (&ring->free_count,MTK_DMA_SIZE -2 ); ring->next_free = &ring->dma[0 ]; - ring->last_free = &ring->dma[MTK_DMA_SIZE -1 ]; + ring->last_free = (void *)txd; ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE -1 ) * sz)); ring->thresh =MAX_SKB_FRAGS ;
@@ -1665,6 +1669,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)static void mtk_tx_clean (struct mtk_eth *eth) { +const struct mtk_soc_data *soc = eth->soc;struct mtk_tx_ring *ring = ð->tx_ring;int i;
@@ -1677,17 +1682,15 @@ static void mtk_tx_clean(struct mtk_eth *eth)if (ring->dma) {dma_free_coherent (eth->dma_dev, -MTK_DMA_SIZE *sizeof (*ring->dma), - ring->dma, - ring->phys); +MTK_DMA_SIZE * soc->txrx.txd_size, + ring->dma, ring->phys); ring->dma =NULL ; }if (ring->dma_pdma) {dma_free_coherent (eth->dma_dev, -MTK_DMA_SIZE *sizeof (*ring->dma_pdma), - ring->dma_pdma, - ring->phys_pdma); +MTK_DMA_SIZE * soc->txrx.txd_size, + ring->dma_pdma, ring->phys_pdma); ring->dma_pdma =NULL ; } }
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 7/16 net: ethernet: mtk_eth_soc: rely on txd_size in mtk_desc_to_tx_buf
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 26 ++++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +15 -11
@@ -861,10 +861,11 @@ static inline void *mtk_qdma_phys_to_virt(struct mtk_tx_ring *ring, u32 desc)return ret + (desc - ring->phys); } -static inline struct mtk_tx_buf *mtk_desc_to_tx_buf (struct mtk_tx_ring *ring, -struct mtk_tx_dma *txd) +static struct mtk_tx_buf *mtk_desc_to_tx_buf (struct mtk_tx_ring *ring, +struct mtk_tx_dma *txd, +u32 txd_size) { -int idx = txd - ring->dma; +int idx = ((void *)txd - (void *)ring->dma) / txd_size;return &ring->buf[idx]; }
@@ -986,6 +987,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, };struct mtk_mac *mac =netdev_priv (dev);struct mtk_eth *eth = mac->hw; +const struct mtk_soc_data *soc = eth->soc;struct mtk_tx_dma *itxd, *txd;struct mtk_tx_dma *itxd_pdma, *txd_pdma;struct mtk_tx_buf *itx_buf, *tx_buf;
@@ -997,7 +999,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,if (itxd == ring->last_free)return -ENOMEM ; - itx_buf =mtk_desc_to_tx_buf (ring, itxd); + itx_buf =mtk_desc_to_tx_buf (ring, itxd, soc->txrx.txd_size);memset (itx_buf,0 ,sizeof (*itx_buf)); txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size,
@@ -1025,7 +1027,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,while (frag_size) {bool new_desc = true; -if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA ) || +if (MTK_HAS_CAPS (soc->caps,MTK_QDMA ) || (i &0x1 )) { txd =mtk_qdma_phys_to_virt (ring, txd->txd2); txd_pdma =qdma_to_pdma (ring, txd);
@@ -1049,7 +1051,8 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,mtk_tx_set_dma_desc (dev, txd, &txd_info); - tx_buf =mtk_desc_to_tx_buf (ring, txd); + tx_buf =mtk_desc_to_tx_buf (ring, txd, + soc->txrx.txd_size);if (new_desc)memset (tx_buf,0 ,sizeof (*tx_buf)); tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC ;
@@ -1068,7 +1071,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,/* store skb to cleanup */ itx_buf->skb = skb; -if (!MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { +if (!MTK_HAS_CAPS (soc->caps,MTK_QDMA )) {if (k &0x1 ) txd_pdma->txd2 |=TX_DMA_LS0 ;else
@@ -1086,7 +1089,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,*/ wmb (); -if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { +if (MTK_HAS_CAPS (soc->caps,MTK_QDMA )) {if (netif_xmit_stopped (netdev_get_tx_queue (dev,0 )) || !netdev_xmit_more ())mtk_w32 (eth, txd->txd2,MTK_QTX_CTX_PTR );
@@ -1100,13 +1103,13 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, err_dma: do { - tx_buf = mtk_desc_to_tx_buf(ring, itxd); + tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->txrx.txd_size); /* unmap dma */ mtk_tx_unmap(eth, tx_buf, false); itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) + if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) itxd_pdma->txd2 = TX_DMA_DESP2_DEF; itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2);
@@ -1417,7 +1420,8 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,if ((desc->txd3 &TX_DMA_OWNER_CPU ) ==0 )break ; - tx_buf =mtk_desc_to_tx_buf (ring, desc); + tx_buf =mtk_desc_to_tx_buf (ring, desc, + eth->soc->txrx.txd_size);if (tx_buf->flags &MTK_TX_FLAGS_FPORT1 ) mac =1 ;
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 8/16 net: ethernet: mtk_eth_soc: rely on txd_size in txd_to_idx
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +7 -4
@@ -876,9 +876,10 @@ static struct mtk_tx_dma *qdma_to_pdma(struct mtk_tx_ring *ring,return ring->dma_pdma - ring->dma + dma; } -static int txd_to_idx (struct mtk_tx_ring *ring,struct mtk_tx_dma *dma) +static int txd_to_idx (struct mtk_tx_ring *ring,struct mtk_tx_dma *dma, +u32 txd_size) { -return ((void *)dma - (void *)ring->dma) /sizeof (*dma); +return ((void *)dma - (void *)ring->dma) / txd_size; } static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf,
@@ -1094,8 +1095,10 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, !netdev_xmit_more())mtk_w32 (eth, txd->txd2,MTK_QTX_CTX_PTR ); }else { -int next_idx =NEXT_DESP_IDX (txd_to_idx (ring, txd), - ring->dma_size); +int next_idx; + + next_idx =NEXT_DESP_IDX (txd_to_idx (ring, txd, soc->txrx.txd_size), + ring->dma_size);mtk_w32 (eth, next_idx,MT7628_TX_CTX_IDX0 ); }
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 9/16 net: ethernet: mtk_eth_soc: add rxd_size to mtk_soc_data
In reply to Lorenzo BianconiSimilar to tx counterpart, introduce rxd_size in mtk_soc_data data structure.
This is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 13 +++++++++---- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +9 -4
@@ -1740,7 +1740,7 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) } ring->dma =dma_alloc_coherent (eth->dma_dev, - rx_dma_size *sizeof (*ring->dma), + rx_dma_size * eth->soc->txrx.rxd_size, &ring->phys,GFP_KERNEL );if (!ring->dma)return -ENOMEM ;
@@ -1798,9 +1798,8 @@ static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring)if (ring->dma) {dma_free_coherent (eth->dma_dev, - ring->dma_size *sizeof (*ring->dma), - ring->dma, - ring->phys); + ring->dma_size * eth->soc->txrx.rxd_size, + ring->dma, ring->phys); ring->dma =NULL ; } }
@@ -3388,6 +3387,7 @@ static const struct mtk_soc_data mt2701_data = { .required_pctl = true, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
@@ -3399,6 +3399,7 @@ static const struct mtk_soc_data mt7621_data = { .offload_version = 2, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
@@ -3411,6 +3412,7 @@ static const struct mtk_soc_data mt7622_data = { .offload_version = 2, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
@@ -3422,6 +3424,7 @@ static const struct mtk_soc_data mt7623_data = { .offload_version = 2, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
@@ -3433,6 +3436,7 @@ static const struct mtk_soc_data mt7629_data = { .required_pctl = false, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
@@ -3443,6 +3447,7 @@ static const struct mtk_soc_data rt5350_data = { .required_pctl = false, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), + .rxd_size = sizeof(struct mtk_rx_dma), }, };
drivers/net/ethernet/mediatek/mtk_eth_soc.h +2 -0
@@ -868,6 +868,7 @@ struct mtk_tx_dma_desc_info {* @required_pctl A bool value to show whether the SoC requires * the extra setup for those pins used by GMAC. * @txd_size Tx DMA descriptor size. +* @rxd_size Rx DMA descriptor size. */ struct mtk_soc_data {u32 ana_rgc3;
@@ -878,6 +879,7 @@ struct mtk_soc_data {netdev_features_t hw_features;struct {u32 txd_size; +u32 rxd_size; } txrx; };
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 10/16 net: ethernet: mtk_eth_soc: rely on txd_size field in mtk_poll_tx/mtk_poll_rx
In reply to Lorenzo BianconiThis is a preliminary to ad mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +6 -3
@@ -1235,9 +1235,12 @@ static struct mtk_rx_ring *mtk_get_rx_ring(struct mtk_eth *eth)return ð->rx_ring[0 ];for (i =0 ; i <MTK_MAX_RX_RING_NUM ; i++) { +struct mtk_rx_dma *rxd; + ring = ð->rx_ring[i]; idx =NEXT_DESP_IDX (ring->calc_idx, ring->dma_size); -if (ring->dma[idx].rxd2 &RX_DMA_DONE ) { + rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; +if (rxd->rxd2 &RX_DMA_DONE ) { ring->calc_idx_update = true;return ring; }
@@ -1288,7 +1291,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, goto rx_done; idx =NEXT_DESP_IDX (ring->calc_idx, ring->dma_size); - rxd = &ring->dma[idx]; + rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; data = ring->data[idx];if (!mtk_rx_get_desc (&trxd, rxd))
@@ -1477,7 +1480,7 @@ static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget,mtk_tx_unmap (eth, tx_buf, true); - desc = &ring->dma[cpu]; + desc = (void *)ring->dma + cpu * eth->soc->txrx.txd_size; ring->last_free = desc;atomic_inc (&ring->free_count);
Signature · 7 lines
2.35.3 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH v3 11/16 net: ethernet: mtk_eth_soc: rely on rxd_size field in mtk_rx_alloc/mtk_rx_clean
In reply to Lorenzo BianconiRemove mtk_rx_dma structure layout dependency in mtk_rx_alloc/mtk_rx_clean. Initialize to 0 rxd3 and rxd4 in mtk_rx_alloc.
This is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 26 ++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +18 -8
@@ -1749,18 +1749,25 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)return -ENOMEM ;for (i =0 ; i < rx_dma_size; i++) { +struct mtk_rx_dma *rxd; +dma_addr_t dma_addr =dma_map_single (eth->dma_dev, ring->data[i] +NET_SKB_PAD + eth->ip_align, ring->buf_size,DMA_FROM_DEVICE );if (unlikely (dma_mapping_error (eth->dma_dev, dma_addr)))return -ENOMEM ; - ring->dma[i].rxd1 = (unsigned int )dma_addr; + + rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; + rxd->rxd1 = (unsigned int )dma_addr;if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) - ring->dma[i].rxd2 =RX_DMA_LSO ; + rxd->rxd2 =RX_DMA_LSO ;else - ring->dma[i].rxd2 =RX_DMA_PLEN0 (ring->buf_size); + rxd->rxd2 =RX_DMA_PLEN0 (ring->buf_size); + + rxd->rxd3 =0 ; + rxd->rxd4 =0 ; } ring->dma_size = rx_dma_size; ring->calc_idx_update = false;
@@ -1785,14 +1792,17 @@ static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring)if (ring->data && ring->dma) {for (i =0 ; i < ring->dma_size; i++) { +struct mtk_rx_dma *rxd; +if (!ring->data[i])continue ; -if (!ring->dma[i].rxd1) + + rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; +if (!rxd->rxd1)continue ; -dma_unmap_single (eth->dma_dev, - ring->dma[i].rxd1, - ring->buf_size, -DMA_FROM_DEVICE ); + +dma_unmap_single (eth->dma_dev, rxd->rxd1, + ring->buf_size,DMA_FROM_DEVICE );skb_free_frag (ring->data[i]); }kfree (ring->data);
Signature · 7 lines
2.35.3 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH v3 12/16 net: ethernet: mtk_eth_soc: introduce device register map
In reply to Lorenzo BianconiIntroduce reg_map structure to add the capability to support different register definitions. Move register definitions in mtk_regmap structure. This is a preliminary patch to introduce mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 223 +++++++++++++------- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 146 ++++--------- 2 files changed, 188 insertions(+), 181 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +142 -81
@@ -34,6 +34,59 @@ MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");#define MTK_ETHTOOL_STAT (x) { #x, \ offsetof(struct mtk_hw_stats, x) / sizeof(u64) } +static const struct mtk_reg_map mtk_reg_map = { + .tx_irq_mask =0x1a1c , + .tx_irq_status =0x1a18 , + .pdma = { + .rx_ptr =0x0900 , + .rx_cnt_cfg =0x0904 , + .pcrx_ptr =0x0908 , + .glo_cfg =0x0a04 , + .rst_idx =0x0a08 , + .delay_irq =0x0a0c , + .irq_status =0x0a20 , + .irq_mask =0x0a28 , + .int_grp =0x0a50 , + }, + .qdma = { + .qtx_cfg =0x1800 , + .rx_ptr =0x1900 , + .rx_cnt_cfg =0x1904 , + .qcrx_ptr =0x1908 , + .glo_cfg =0x1a04 , + .rst_idx =0x1a08 , + .delay_irq =0x1a0c , + .fc_th =0x1a10 , + .int_grp =0x1a20 , + .hred =0x1a44 , + .ctx_ptr =0x1b00 , + .dtx_ptr =0x1b04 , + .crx_ptr =0x1b10 , + .drx_ptr =0x1b14 , + .fq_head =0x1b20 , + .fq_tail =0x1b24 , + .fq_count =0x1b28 , + .fq_blen =0x1b2c , + }, + .gdm1_cnt =0x2400 , +}; + +static const struct mtk_reg_map mt7628_reg_map = { + .tx_irq_mask =0x0a28 , + .tx_irq_status =0x0a20 , + .pdma = { + .rx_ptr =0x0900 , + .rx_cnt_cfg =0x0904 , + .pcrx_ptr =0x0908 , + .glo_cfg =0x0a04 , + .rst_idx =0x0a08 , + .delay_irq =0x0a0c , + .irq_status =0x0a20 , + .irq_mask =0x0a28 , + .int_grp =0x0a50 , + }, +}; +/* strings used by ethtool */ static const struct mtk_ethtool_stats { char str[ETH_GSTRING_LEN];
@@ -600,8 +653,8 @@ static inline void mtk_tx_irq_disable(struct mtk_eth *eth, u32 mask)u32 val;spin_lock_irqsave (ð->tx_irq_lock, flags); - val =mtk_r32 (eth, eth->tx_int_mask_reg); -mtk_w32 (eth, val & ~mask, eth->tx_int_mask_reg); + val =mtk_r32 (eth, eth->soc->reg_map->tx_irq_mask); +mtk_w32 (eth, val & ~mask, eth->soc->reg_map->tx_irq_mask);spin_unlock_irqrestore (ð->tx_irq_lock, flags); }
@@ -611,8 +664,8 @@ static inline void mtk_tx_irq_enable(struct mtk_eth *eth, u32 mask)u32 val;spin_lock_irqsave (ð->tx_irq_lock, flags); - val =mtk_r32 (eth, eth->tx_int_mask_reg); -mtk_w32 (eth, val | mask, eth->tx_int_mask_reg); + val =mtk_r32 (eth, eth->soc->reg_map->tx_irq_mask); +mtk_w32 (eth, val | mask, eth->soc->reg_map->tx_irq_mask);spin_unlock_irqrestore (ð->tx_irq_lock, flags); }
@@ -622,8 +675,8 @@ static inline void mtk_rx_irq_disable(struct mtk_eth *eth, u32 mask)u32 val;spin_lock_irqsave (ð->rx_irq_lock, flags); - val =mtk_r32 (eth,MTK_PDMA_INT_MASK ); -mtk_w32 (eth, val & ~mask,MTK_PDMA_INT_MASK ); + val =mtk_r32 (eth, eth->soc->reg_map->pdma.irq_mask); +mtk_w32 (eth, val & ~mask, eth->soc->reg_map->pdma.irq_mask);spin_unlock_irqrestore (ð->rx_irq_lock, flags); }
@@ -633,8 +686,8 @@ static inline void mtk_rx_irq_enable(struct mtk_eth *eth, u32 mask)u32 val;spin_lock_irqsave (ð->rx_irq_lock, flags); - val =mtk_r32 (eth,MTK_PDMA_INT_MASK ); -mtk_w32 (eth, val | mask,MTK_PDMA_INT_MASK ); + val =mtk_r32 (eth, eth->soc->reg_map->pdma.irq_mask); +mtk_w32 (eth, val | mask, eth->soc->reg_map->pdma.irq_mask);spin_unlock_irqrestore (ð->rx_irq_lock, flags); }
@@ -685,39 +738,39 @@ void mtk_stats_update_mac(struct mtk_mac *mac) hw_stats->rx_checksum_errors +=mtk_r32 (mac->hw,MT7628_SDM_CS_ERR ); }else { +const struct mtk_reg_map *reg_map = eth->soc->reg_map;unsigned int offs = hw_stats->reg_offset;u64 stats; - hw_stats->rx_bytes +=mtk_r32 (mac->hw, -MTK_GDM1_RX_GBCNT_L + offs); - stats =mtk_r32 (mac->hw,MTK_GDM1_RX_GBCNT_H + offs); + hw_stats->rx_bytes +=mtk_r32 (mac->hw, reg_map->gdm1_cnt + offs); + stats =mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x4 + offs);if (stats) hw_stats->rx_bytes += (stats <<32 ); hw_stats->rx_packets += -mtk_r32 (mac->hw,MTK_GDM1_RX_GPCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x8 + offs); hw_stats->rx_overflow += -mtk_r32 (mac->hw,MTK_GDM1_RX_OERCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x10 + offs); hw_stats->rx_fcs_errors += -mtk_r32 (mac->hw,MTK_GDM1_RX_FERCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x14 + offs); hw_stats->rx_short_errors += -mtk_r32 (mac->hw,MTK_GDM1_RX_SERCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x18 + offs); hw_stats->rx_long_errors += -mtk_r32 (mac->hw,MTK_GDM1_RX_LENCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x1c + offs); hw_stats->rx_checksum_errors += -mtk_r32 (mac->hw,MTK_GDM1_RX_CERCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x20 + offs); hw_stats->rx_flow_control_packets += -mtk_r32 (mac->hw,MTK_GDM1_RX_FCCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x24 + offs); hw_stats->tx_skip += -mtk_r32 (mac->hw,MTK_GDM1_TX_SKIPCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x28 + offs); hw_stats->tx_collisions += -mtk_r32 (mac->hw,MTK_GDM1_TX_COLCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x2c + offs); hw_stats->tx_bytes += -mtk_r32 (mac->hw,MTK_GDM1_TX_GBCNT_L + offs); - stats =mtk_r32 (mac->hw,MTK_GDM1_TX_GBCNT_H + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x30 + offs); + stats =mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x34 + offs);if (stats) hw_stats->tx_bytes += (stats <<32 ); hw_stats->tx_packets += -mtk_r32 (mac->hw,MTK_GDM1_TX_GPCNT + offs); +mtk_r32 (mac->hw, reg_map->gdm1_cnt +0x38 + offs); }u64_stats_update_end (&hw_stats->syncp);
@@ -846,10 +899,10 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) txd->txd4 =0 ; } -mtk_w32 (eth, eth->phy_scratch_ring,MTK_QDMA_FQ_HEAD ); -mtk_w32 (eth, phy_ring_tail,MTK_QDMA_FQ_TAIL ); -mtk_w32 (eth, (cnt <<16 ) | cnt,MTK_QDMA_FQ_CNT ); -mtk_w32 (eth,MTK_QDMA_PAGE_SIZE <<16 ,MTK_QDMA_FQ_BLEN ); +mtk_w32 (eth, eth->phy_scratch_ring, soc->reg_map->qdma.fq_head); +mtk_w32 (eth, phy_ring_tail, soc->reg_map->qdma.fq_tail); +mtk_w32 (eth, (cnt <<16 ) | cnt, soc->reg_map->qdma.fq_count); +mtk_w32 (eth,MTK_QDMA_PAGE_SIZE <<16 , soc->reg_map->qdma.fq_blen);return 0 ; }
@@ -1093,7 +1146,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,if (MTK_HAS_CAPS (soc->caps,MTK_QDMA )) {if (netif_xmit_stopped (netdev_get_tx_queue (dev,0 )) || !netdev_xmit_more ()) -mtk_w32 (eth, txd->txd2,MTK_QTX_CTX_PTR ); +mtk_w32 (eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); }else {int next_idx;
@@ -1407,6 +1460,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,static int mtk_poll_tx_qdma (struct mtk_eth *eth,int budget,unsigned int *done,unsigned int *bytes) { +const struct mtk_reg_map *reg_map = eth->soc->reg_map;struct mtk_tx_ring *ring = ð->tx_ring;struct mtk_tx_dma *desc;struct sk_buff *skb;
@@ -1414,7 +1468,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,u32 cpu, dma; cpu = ring->last_free_ptr; - dma =mtk_r32 (eth,MTK_QTX_DRX_PTR ); + dma =mtk_r32 (eth, reg_map->qdma.drx_ptr); desc =mtk_qdma_phys_to_virt (ring, cpu);
@@ -1449,7 +1503,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget, } ring->last_free_ptr = cpu; -mtk_w32 (eth, cpu,MTK_QTX_CRX_PTR ); +mtk_w32 (eth, cpu, reg_map->qdma.crx_ptr);return budget; }
@@ -1542,24 +1596,25 @@ static void mtk_handle_status_irq(struct mtk_eth *eth)static int mtk_napi_tx (struct napi_struct *napi,int budget) { struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi); +const struct mtk_reg_map *reg_map = eth->soc->reg_map;int tx_done =0 ;if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA ))mtk_handle_status_irq (eth); -mtk_w32 (eth,MTK_TX_DONE_INT , eth->tx_int_status_reg); +mtk_w32 (eth,MTK_TX_DONE_INT , reg_map->tx_irq_status); tx_done =mtk_poll_tx (eth, budget);if (unlikely (netif_msg_intr (eth))) {dev_info (eth->dev,"done tx %d, intr 0x%08x/0x%x\n" , tx_done, -mtk_r32 (eth, eth->tx_int_status_reg), -mtk_r32 (eth, eth->tx_int_mask_reg)); +mtk_r32 (eth, reg_map->tx_irq_status), +mtk_r32 (eth, reg_map->tx_irq_mask)); }if (tx_done == budget)return budget; -if (mtk_r32 (eth, eth->tx_int_status_reg) &MTK_TX_DONE_INT ) +if (mtk_r32 (eth, reg_map->tx_irq_status) &MTK_TX_DONE_INT )return budget;if (napi_complete_done (napi, tx_done))
@@ -1571,6 +1626,7 @@ static int mtk_napi_tx(struct napi_struct *napi, int budget)static int mtk_napi_rx (struct napi_struct *napi,int budget) { struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi); +const struct mtk_reg_map *reg_map = eth->soc->reg_map;int rx_done_total =0 ;mtk_handle_status_irq (eth);
@@ -1578,21 +1634,21 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget)do {int rx_done; -mtk_w32 (eth,MTK_RX_DONE_INT ,MTK_PDMA_INT_STATUS ); +mtk_w32 (eth,MTK_RX_DONE_INT , reg_map->pdma.irq_status); rx_done =mtk_poll_rx (napi, budget - rx_done_total, eth); rx_done_total += rx_done;if (unlikely (netif_msg_intr (eth))) {dev_info (eth->dev,"done rx %d, intr 0x%08x/0x%x\n" , rx_done, -mtk_r32 (eth,MTK_PDMA_INT_STATUS ), -mtk_r32 (eth,MTK_PDMA_INT_MASK )); +mtk_r32 (eth, reg_map->pdma.irq_status), +mtk_r32 (eth, reg_map->pdma.irq_mask)); }if (rx_done_total == budget)return budget; - }while (mtk_r32 (eth,MTK_PDMA_INT_STATUS ) &MTK_RX_DONE_INT ); + }while (mtk_r32 (eth, reg_map->pdma.irq_status) &MTK_RX_DONE_INT );if (napi_complete_done (napi, rx_done_total))mtk_rx_irq_enable (eth,MTK_RX_DONE_INT );
@@ -1655,20 +1711,20 @@ static int mtk_tx_alloc(struct mtk_eth *eth)*/ wmb (); -if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { -mtk_w32 (eth, ring->phys,MTK_QTX_CTX_PTR ); -mtk_w32 (eth, ring->phys,MTK_QTX_DTX_PTR ); +if (MTK_HAS_CAPS (soc->caps,MTK_QDMA )) { +mtk_w32 (eth, ring->phys, soc->reg_map->qdma.ctx_ptr); +mtk_w32 (eth, ring->phys, soc->reg_map->qdma.dtx_ptr);mtk_w32 (eth, ring->phys + ((MTK_DMA_SIZE -1 ) * sz), -MTK_QTX_CRX_PTR ); -mtk_w32 (eth, ring->last_free_ptr,MTK_QTX_DRX_PTR ); + soc->reg_map->qdma.crx_ptr); +mtk_w32 (eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr);mtk_w32 (eth, (QDMA_RES_THRES <<8 ) |QDMA_RES_THRES , -MTK_QTX_CFG (0 )); + soc->reg_map->qdma.qtx_cfg); }else {mtk_w32 (eth, ring->phys_pdma,MT7628_TX_BASE_PTR0 );mtk_w32 (eth,MTK_DMA_SIZE ,MT7628_TX_MAX_CNT0 );mtk_w32 (eth,0 ,MT7628_TX_CTX_IDX0 ); -mtk_w32 (eth,MT7628_PST_DTX_IDX0 ,MTK_PDMA_RST_IDX ); +mtk_w32 (eth,MT7628_PST_DTX_IDX0 , soc->reg_map->pdma.rst_idx); }return 0 ;
@@ -1707,6 +1763,7 @@ static void mtk_tx_clean(struct mtk_eth *eth)static int mtk_rx_alloc (struct mtk_eth *eth,int ring_no,int rx_flag) { +const struct mtk_reg_map *reg_map = eth->soc->reg_map;struct mtk_rx_ring *ring;int rx_data_len, rx_dma_size;int i;
@@ -1772,16 +1829,18 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) ring->dma_size = rx_dma_size; ring->calc_idx_update = false; ring->calc_idx = rx_dma_size -1 ; - ring->crx_idx_reg =MTK_PRX_CRX_IDX_CFG (ring_no); + ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + ring_no *MTK_QRX_OFFSET ;/* make sure that all changes to the dma ring are flushed before we * continue */ wmb (); -mtk_w32 (eth, ring->phys,MTK_PRX_BASE_PTR_CFG (ring_no) + offset); -mtk_w32 (eth, rx_dma_size,MTK_PRX_MAX_CNT_CFG (ring_no) + offset); +mtk_w32 (eth, ring->phys, + reg_map->pdma.rx_ptr + ring_no *MTK_QRX_OFFSET + offset); +mtk_w32 (eth, rx_dma_size, + reg_map->pdma.rx_cnt_cfg + ring_no *MTK_QRX_OFFSET + offset);mtk_w32 (eth, ring->calc_idx, ring->crx_idx_reg + offset); -mtk_w32 (eth,MTK_PST_DRX_IDX_CFG (ring_no),MTK_PDMA_RST_IDX + offset); +mtk_w32 (eth,MTK_PST_DRX_IDX_CFG (ring_no), reg_map->pdma.rst_idx + offset);return 0 ; }
@@ -2087,9 +2146,9 @@ static int mtk_dma_busy_wait(struct mtk_eth *eth)u32 val;if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) - reg =MTK_QDMA_GLO_CFG ; + reg = eth->soc->reg_map->qdma.glo_cfg;else - reg =MTK_PDMA_GLO_CFG ; + reg = eth->soc->reg_map->pdma.glo_cfg; ret = readx_poll_timeout_atomic(__raw_readl, eth->base + reg, val, !(val & (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)),
@@ -2147,8 +2206,8 @@ static int mtk_dma_init(struct mtk_eth *eth)* automatically */ mtk_w32 (eth,FC_THRES_DROP_MODE |FC_THRES_DROP_EN | -FC_THRES_MIN ,MTK_QDMA_FC_THRES ); -mtk_w32 (eth,0x0 ,MTK_QDMA_HRED2 ); +FC_THRES_MIN , eth->soc->reg_map->qdma.fc_th); +mtk_w32 (eth,0x0 , eth->soc->reg_map->qdma.hred); }return 0 ;
@@ -2222,13 +2281,14 @@ static irqreturn_t mtk_handle_irq_tx(int irq, void *_eth)static irqreturn_t mtk_handle_irq (int irq,void *_eth) {struct mtk_eth *eth = _eth; +const struct mtk_reg_map *reg_map = eth->soc->reg_map; -if (mtk_r32 (eth,MTK_PDMA_INT_MASK ) &MTK_RX_DONE_INT ) { -if (mtk_r32 (eth,MTK_PDMA_INT_STATUS ) &MTK_RX_DONE_INT ) +if (mtk_r32 (eth, reg_map->pdma.irq_mask) &MTK_RX_DONE_INT ) { +if (mtk_r32 (eth, reg_map->pdma.irq_status) &MTK_RX_DONE_INT )mtk_handle_irq_rx (irq, _eth); } -if (mtk_r32 (eth, eth->tx_int_mask_reg) &MTK_TX_DONE_INT ) { -if (mtk_r32 (eth, eth->tx_int_status_reg) &MTK_TX_DONE_INT ) +if (mtk_r32 (eth, reg_map->tx_irq_mask) &MTK_TX_DONE_INT ) { +if (mtk_r32 (eth, reg_map->tx_irq_status) &MTK_TX_DONE_INT )mtk_handle_irq_tx (irq, _eth); }
@@ -2252,6 +2312,7 @@ static void mtk_poll_controller(struct net_device *dev)static int mtk_start_dma (struct mtk_eth *eth) {u32 rx_2b_offset = (NET_IP_ALIGN ==2 ) ?MTK_RX_2B_OFFSET :0 ; +const struct mtk_reg_map *reg_map = eth->soc->reg_map;int err; err =mtk_dma_init (eth);
@@ -2266,16 +2327,15 @@ static int mtk_start_dma(struct mtk_eth *eth)MTK_TX_BT_32DWORDS |MTK_NDP_CO_PRO |MTK_RX_DMA_EN |MTK_RX_2B_OFFSET |MTK_RX_BT_32DWORDS , - MTK_QDMA_GLO_CFG); - + reg_map->qdma.glo_cfg);mtk_w32 (eth,MTK_RX_DMA_EN | rx_2b_offset |MTK_RX_BT_32DWORDS |MTK_MULTI_EN , -MTK_PDMA_GLO_CFG ); + reg_map->pdma.glo_cfg); }else {mtk_w32 (eth,MTK_TX_WB_DDONE |MTK_TX_DMA_EN |MTK_RX_DMA_EN |MTK_MULTI_EN |MTK_PDMA_SIZE_8DWORDS , -MTK_PDMA_GLO_CFG ); + reg_map->pdma.glo_cfg); }return 0 ;
@@ -2398,8 +2458,8 @@ static int mtk_stop(struct net_device *dev)cancel_work_sync (ð->tx_dim.work);if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) -mtk_stop_dma (eth,MTK_QDMA_GLO_CFG ); -mtk_stop_dma (eth,MTK_PDMA_GLO_CFG ); +mtk_stop_dma (eth, eth->soc->reg_map->qdma.glo_cfg); +mtk_stop_dma (eth, eth->soc->reg_map->pdma.glo_cfg);mtk_dma_free (eth);
@@ -2453,6 +2513,7 @@ static void mtk_dim_rx(struct work_struct *work) { struct dim *dim = container_of(work, struct dim, work); struct mtk_eth *eth = container_of(dim, struct mtk_eth, rx_dim); +const struct mtk_reg_map *reg_map = eth->soc->reg_map;struct dim_cq_moder cur_profile;u32 val, cur;
@@ -2460,7 +2521,7 @@ static void mtk_dim_rx(struct work_struct *work) dim->profile_ix);spin_lock_bh (ð->dim_lock); - val =mtk_r32 (eth,MTK_PDMA_DELAY_INT ); + val =mtk_r32 (eth, reg_map->pdma.delay_irq); val &=MTK_PDMA_DELAY_TX_MASK ; val |=MTK_PDMA_DELAY_RX_EN ;
@@ -2470,9 +2531,9 @@ static void mtk_dim_rx(struct work_struct *work) cur =min_t (u32, cur_profile.pkts,MTK_PDMA_DELAY_PINT_MASK ); val |= cur <<MTK_PDMA_DELAY_RX_PINT_SHIFT ; -mtk_w32 (eth, val,MTK_PDMA_DELAY_INT ); +mtk_w32 (eth, val, reg_map->pdma.delay_irq);if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) -mtk_w32 (eth, val,MTK_QDMA_DELAY_INT ); +mtk_w32 (eth, val, reg_map->qdma.delay_irq);spin_unlock_bh (ð->dim_lock);
@@ -2483,6 +2544,7 @@ static void mtk_dim_tx(struct work_struct *work) { struct dim *dim = container_of(work, struct dim, work); struct mtk_eth *eth = container_of(dim, struct mtk_eth, tx_dim); +const struct mtk_reg_map *reg_map = eth->soc->reg_map;struct dim_cq_moder cur_profile;u32 val, cur;
@@ -2490,7 +2552,7 @@ static void mtk_dim_tx(struct work_struct *work) dim->profile_ix);spin_lock_bh (ð->dim_lock); - val =mtk_r32 (eth,MTK_PDMA_DELAY_INT ); + val =mtk_r32 (eth, reg_map->pdma.delay_irq); val &=MTK_PDMA_DELAY_RX_MASK ; val |=MTK_PDMA_DELAY_TX_EN ;
@@ -2500,9 +2562,9 @@ static void mtk_dim_tx(struct work_struct *work) cur =min_t (u32, cur_profile.pkts,MTK_PDMA_DELAY_PINT_MASK ); val |= cur <<MTK_PDMA_DELAY_TX_PINT_SHIFT ; -mtk_w32 (eth, val,MTK_PDMA_DELAY_INT ); +mtk_w32 (eth, val, reg_map->pdma.delay_irq);if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) -mtk_w32 (eth, val,MTK_QDMA_DELAY_INT ); +mtk_w32 (eth, val, reg_map->qdma.delay_irq);spin_unlock_bh (ð->dim_lock);
@@ -2513,6 +2575,7 @@ static int mtk_hw_init(struct mtk_eth *eth) {u32 dma_mask =ETHSYS_DMA_AG_MAP_PDMA |ETHSYS_DMA_AG_MAP_QDMA |ETHSYS_DMA_AG_MAP_PPE ; +const struct mtk_reg_map *reg_map = eth->soc->reg_map;int i, val, ret;if (test_and_set_bit (MTK_HW_INIT , ð->state))
@@ -2587,10 +2650,10 @@ static int mtk_hw_init(struct mtk_eth *eth)mtk_rx_irq_disable (eth, ~0 );/* FE int grouping */ -mtk_w32 (eth,MTK_TX_DONE_INT ,MTK_PDMA_INT_GRP1 ); -mtk_w32 (eth,MTK_RX_DONE_INT ,MTK_PDMA_INT_GRP2 ); -mtk_w32 (eth,MTK_TX_DONE_INT ,MTK_QDMA_INT_GRP1 ); -mtk_w32 (eth,MTK_RX_DONE_INT ,MTK_QDMA_INT_GRP2 ); +mtk_w32 (eth,MTK_TX_DONE_INT , reg_map->pdma.int_grp); +mtk_w32 (eth,MTK_RX_DONE_INT , reg_map->pdma.int_grp +4 ); +mtk_w32 (eth,MTK_TX_DONE_INT , reg_map->qdma.int_grp); +mtk_w32 (eth,MTK_RX_DONE_INT , reg_map->qdma.int_grp +4 );mtk_w32 (eth,0x21021000 ,MTK_FE_INT_GRP );return 0 ;
@@ -3153,14 +3216,6 @@ static int mtk_probe(struct platform_device *pdev)if (IS_ERR (eth->base))return PTR_ERR (eth->base); -if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { - eth->tx_int_mask_reg =MTK_QDMA_INT_MASK ; - eth->tx_int_status_reg =MTK_QDMA_INT_STATUS ; - }else { - eth->tx_int_mask_reg =MTK_PDMA_INT_MASK ; - eth->tx_int_status_reg =MTK_PDMA_INT_STATUS ; - } -if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) { eth->rx_dma_l4_valid =RX_DMA_L4_VALID_PDMA ; eth->ip_align =NET_IP_ALIGN ;
@@ -3394,6 +3449,7 @@ static int mtk_remove(struct platform_device *pdev) }static const struct mtk_soc_data mt2701_data = { + .reg_map = &mtk_reg_map, .caps =MT7623_CAPS |MTK_HWLRO , .hw_features =MTK_HW_FEATURES , .required_clks =MT7623_CLKS_BITMAP ,
@@ -3405,6 +3461,7 @@ static const struct mtk_soc_data mt2701_data = { };static const struct mtk_soc_data mt7621_data = { + .reg_map = &mtk_reg_map, .caps =MT7621_CAPS , .hw_features =MTK_HW_FEATURES , .required_clks =MT7621_CLKS_BITMAP ,
@@ -3417,6 +3474,7 @@ static const struct mtk_soc_data mt7621_data = { };static const struct mtk_soc_data mt7622_data = { + .reg_map = &mtk_reg_map, .ana_rgc3 =0x2028 , .caps =MT7622_CAPS |MTK_HWLRO , .hw_features =MTK_HW_FEATURES ,
@@ -3430,6 +3488,7 @@ static const struct mtk_soc_data mt7622_data = { };static const struct mtk_soc_data mt7623_data = { + .reg_map = &mtk_reg_map, .caps =MT7623_CAPS |MTK_HWLRO , .hw_features =MTK_HW_FEATURES , .required_clks =MT7623_CLKS_BITMAP ,
@@ -3442,6 +3501,7 @@ static const struct mtk_soc_data mt7623_data = { };static const struct mtk_soc_data mt7629_data = { + .reg_map = &mtk_reg_map, .ana_rgc3 =0x128 , .caps =MT7629_CAPS |MTK_HWLRO , .hw_features =MTK_HW_FEATURES ,
@@ -3454,6 +3514,7 @@ static const struct mtk_soc_data mt7629_data = { };static const struct mtk_soc_data rt5350_data = { + .reg_map = &mt7628_reg_map, .caps =MT7628_CAPS , .hw_features =MTK_HW_FEATURES_MT7628 , .required_clks =MT7628_CLKS_BITMAP ,
drivers/net/ethernet/mediatek/mtk_eth_soc.h +46 -100
230 lines not on this page · raw message
Signature · 7 lines
2.35.3 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH v3 13/16 net: ethernet: mtk_eth_soc: introduce MTK_NETSYS_V2 support
In reply to Lorenzo BianconiIntroduce MTK_NETSYS_V2 support. MTK_NETSYS_V2 defines 32B TX/RX DMA descriptors.
This is a preliminary patch to add mt7986 ethernet support.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 321 ++++++++++++++++---- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 126 +++++++- 2 files changed, 372 insertions(+), 75 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +255 -66
@@ -844,8 +844,8 @@ static inline int mtk_max_buf_size(int frag_size)return buf_size; } -static inline bool mtk_rx_get_desc (struct mtk_rx_dma *rxd, -struct mtk_rx_dma *dma_rxd) +static bool mtk_rx_get_desc (struct mtk_eth *eth,struct mtk_rx_dma_v2 *rxd, +struct mtk_rx_dma_v2 *dma_rxd) { rxd->rxd2 =READ_ONCE (dma_rxd->rxd2);if (!(rxd->rxd2 &RX_DMA_DONE ))
@@ -854,6 +854,10 @@ static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd, rxd->rxd1 =READ_ONCE (dma_rxd->rxd1); rxd->rxd3 =READ_ONCE (dma_rxd->rxd3); rxd->rxd4 =READ_ONCE (dma_rxd->rxd4); +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { + rxd->rxd5 =READ_ONCE (dma_rxd->rxd5); + rxd->rxd6 =READ_ONCE (dma_rxd->rxd6); + }return true; }
@@ -887,7 +891,7 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) phy_ring_tail = eth->phy_scratch_ring + soc->txrx.txd_size * (cnt -1 );for (i =0 ; i < cnt; i++) { -struct mtk_tx_dma *txd; +struct mtk_tx_dma_v2 *txd; txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; txd->txd1 = dma_addr + i *MTK_QDMA_PAGE_SIZE ;
@@ -897,6 +901,12 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) txd->txd3 =TX_DMA_PLEN0 (MTK_QDMA_PAGE_SIZE ); txd->txd4 =0 ; +if (MTK_HAS_CAPS (soc->caps,MTK_NETSYS_V2 )) { + txd->txd5 =0 ; + txd->txd6 =0 ; + txd->txd7 =0 ; + txd->txd8 =0 ; + } }mtk_w32 (eth, eth->phy_scratch_ring, soc->reg_map->qdma.fq_head);
@@ -1000,10 +1010,12 @@ static void setup_tx_buf(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, } } -static void mtk_tx_set_dma_desc (struct net_device *dev,struct mtk_tx_dma *desc, -struct mtk_tx_dma_desc_info *info) +static void mtk_tx_set_dma_desc_v1 (struct net_device *dev,void *txd, +struct mtk_tx_dma_desc_info *info) {struct mtk_mac *mac =netdev_priv (dev); +struct mtk_eth *eth = mac->hw; +struct mtk_tx_dma *desc = txd;u32 data;WRITE_ONCE (desc->txd1, info->addr);
@@ -1027,6 +1039,59 @@ static void mtk_tx_set_dma_desc(struct net_device *dev, struct mtk_tx_dma *desc,WRITE_ONCE (desc->txd4, data); } +static void mtk_tx_set_dma_desc_v2 (struct net_device *dev,void *txd, +struct mtk_tx_dma_desc_info *info) +{ +struct mtk_mac *mac =netdev_priv (dev); +struct mtk_tx_dma_v2 *desc = txd; +struct mtk_eth *eth = mac->hw; +u32 data; + +WRITE_ONCE (desc->txd1, info->addr); + + data =TX_DMA_PLEN0 (info->size); +if (info->last) + data |=TX_DMA_LS0 ; +WRITE_ONCE (desc->txd3, data); + +if (!info->qid && mac->id) + info->qid =MTK_QDMA_GMAC2_QID ; + + data = (mac->id +1 ) <<TX_DMA_FPORT_SHIFT_V2 ;/* forward port */ + data |=TX_DMA_SWC_V2 |QID_BITS_V2 (info->qid); +WRITE_ONCE (desc->txd4, data); + + data =0 ; +if (info->first) { +if (info->gso) + data |=TX_DMA_TSO_V2 ; +/* tx checksum offload */ +if (info->csum) + data |=TX_DMA_CHKSUM_V2 ; + } +WRITE_ONCE (desc->txd5, data); + + data =0 ; +if (info->first && info->vlan) + data |=TX_DMA_INS_VLAN_V2 | info->vlan_tci; +WRITE_ONCE (desc->txd6, data); + +WRITE_ONCE (desc->txd7,0 ); +WRITE_ONCE (desc->txd8,0 ); +} + +static void mtk_tx_set_dma_desc (struct net_device *dev,void *txd, +struct mtk_tx_dma_desc_info *info) +{ +struct mtk_mac *mac =netdev_priv (dev); +struct mtk_eth *eth = mac->hw; + +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) +mtk_tx_set_dma_desc_v2 (dev, txd, info); +else +mtk_tx_set_dma_desc_v1 (dev, txd, info); +} +static int mtk_tx_map (struct sk_buff *skb,struct net_device *dev,int tx_num,struct mtk_tx_ring *ring,bool gso) {
@@ -1035,6 +1100,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, .gso = gso, .csum = skb->ip_summed == CHECKSUM_PARTIAL, .vlan = skb_vlan_tag_present(skb), + .qid = skb->mark & MTK_QDMA_TX_MASK, .vlan_tci = skb_vlan_tag_get(skb), .first = true, .last = !skb_is_nonlinear(skb),
@@ -1094,7 +1160,9 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, }memset (&txd_info,0 ,sizeof (struct mtk_tx_dma_desc_info )); - txd_info.size =min (frag_size,MTK_TX_DMA_BUF_LEN ); + txd_info.size = min_t(unsigned int, frag_size, + soc->txrx.dma_max_len); + txd_info.qid = skb->mark &MTK_QDMA_TX_MASK ; txd_info.last = i ==skb_shinfo (skb)->nr_frags -1 && !(frag_size - txd_info.size); txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag,
@@ -1175,17 +1243,16 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,return -ENOMEM ; } -static inline int mtk_cal_txd_req (struct sk_buff *skb) +static int mtk_cal_txd_req (struct mtk_eth *eth,struct sk_buff *skb) { -int i, nfrags; +int i, nfrags =1 ;skb_frag_t *frag; - nfrags =1 ;if (skb_is_gso (skb)) {for (i =0 ; i <skb_shinfo (skb)->nr_frags; i++) { frag = &skb_shinfo (skb)->frags[i]; nfrags +=DIV_ROUND_UP (skb_frag_size (frag), -MTK_TX_DMA_BUF_LEN ); + eth->soc->txrx.dma_max_len); } }else { nfrags +=skb_shinfo (skb)->nr_frags;
@@ -1237,7 +1304,7 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)if (unlikely (test_bit (MTK_RESETTING , ð->state))) goto drop; - tx_num =mtk_cal_txd_req (skb); + tx_num =mtk_cal_txd_req (eth, skb);if (unlikely (atomic_read (&ring->free_count) <= tx_num)) {netif_stop_queue (dev); netif_err(eth, tx_queued, dev,
@@ -1329,7 +1396,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,int idx;struct sk_buff *skb;u8 *data, *new_data; -struct mtk_rx_dma *rxd, trxd; +struct mtk_rx_dma_v2 *rxd, trxd;int done =0 , bytes =0 ;while (done < budget) {
@@ -1337,7 +1404,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,unsigned int pktlen;dma_addr_t dma_addr;u32 hash, reason; -int mac; +int mac =0 ; ring =mtk_get_rx_ring (eth);if (unlikely (!ring))
@@ -1347,16 +1414,15 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; data = ring->data[idx]; -if (!mtk_rx_get_desc (&trxd, rxd)) +if (!mtk_rx_get_desc (eth, &trxd, rxd))break ;/* find out which mac the packet come from. values start at 1 */ -if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 ) || - (trxd.rxd4 &RX_DMA_SPECIAL_TAG )) - mac =0 ; -else - mac = ((trxd.rxd4 >>RX_DMA_FPORT_SHIFT ) & -RX_DMA_FPORT_MASK ) -1 ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) + mac =RX_DMA_GET_SPORT_V2 (trxd.rxd5) -1 ; +else if (!MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 ) && + !(trxd.rxd4 &RX_DMA_SPECIAL_TAG )) + mac =RX_DMA_GET_SPORT (trxd.rxd4) -1 ;if (unlikely (mac <0 || mac >=MTK_MAC_COUNT || !eth->netdev[mac]))
@@ -1399,7 +1465,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, pktlen =RX_DMA_GET_PLEN0 (trxd.rxd2); skb->dev = netdev;skb_put (skb, pktlen); -if (trxd.rxd4 & eth->rx_dma_l4_valid) +if (trxd.rxd4 & eth->soc->txrx.rx_dma_l4_valid) skb->ip_summed =CHECKSUM_UNNECESSARY ;else skb_checksum_none_assert (skb);
@@ -1417,10 +1483,25 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,mtk_ppe_check_skb (eth->ppe, skb, trxd.rxd4 &MTK_RXD4_FOE_ENTRY ); -if (netdev->features &NETIF_F_HW_VLAN_CTAG_RX && - (trxd.rxd2 &RX_DMA_VTAG )) -__vlan_hwaccel_put_tag (skb,htons (ETH_P_8021Q ), -RX_DMA_VID (trxd.rxd3)); +if (netdev->features &NETIF_F_HW_VLAN_CTAG_RX ) { +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { +if (trxd.rxd3 &RX_DMA_VTAG_V2 ) +__vlan_hwaccel_put_tag (skb, +htons (RX_DMA_VPID (trxd.rxd4)), +RX_DMA_VID (trxd.rxd4)); + }else if (trxd.rxd2 &RX_DMA_VTAG ) { +__vlan_hwaccel_put_tag (skb,htons (ETH_P_8021Q ), +RX_DMA_VID (trxd.rxd3)); + } + +/* If the device is attached to a dsa switch, the special +* tag inserted in VLAN field by hw switch can * be offloaded +* by RX HW VLAN offload. Clear vlan info. +*/ +if (netdev_uses_dsa (netdev)) +__vlan_hwaccel_clear_tag (skb); + } +skb_record_rx_queue (skb,0 );napi_gro_receive (napi, skb);
@@ -1432,7 +1513,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) rxd->rxd2 =RX_DMA_LSO ;else - rxd->rxd2 =RX_DMA_PLEN0 (ring->buf_size); + rxd->rxd2 =RX_DMA_PREP_PLEN0 (ring->buf_size); ring->calc_idx = idx;
@@ -1634,7 +1715,8 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget) do { int rx_done; - mtk_w32(eth, MTK_RX_DONE_INT, reg_map->pdma.irq_status); + mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, + reg_map->pdma.irq_status); rx_done = mtk_poll_rx(napi, budget - rx_done_total, eth); rx_done_total += rx_done;
@@ -1648,10 +1730,11 @@ static int mtk_napi_rx(struct napi_struct *napi, int budget)if (rx_done_total == budget)return budget; - }while (mtk_r32 (eth, reg_map->pdma.irq_status) &MTK_RX_DONE_INT ); + }while (mtk_r32 (eth, reg_map->pdma.irq_status) & + eth->soc->txrx.rx_irq_done_mask);if (napi_complete_done (napi, rx_done_total)) -mtk_rx_irq_enable (eth,MTK_RX_DONE_INT ); +mtk_rx_irq_enable (eth, eth->soc->txrx.rx_irq_done_mask);return rx_done_total; }
@@ -1661,7 +1744,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)const struct mtk_soc_data *soc = eth->soc;struct mtk_tx_ring *ring = ð->tx_ring;int i, sz = soc->txrx.txd_size; -struct mtk_tx_dma *txd; +struct mtk_tx_dma_v2 *txd; ring->buf =kcalloc (MTK_DMA_SIZE ,sizeof (*ring->buf),GFP_KERNEL );
@@ -1681,13 +1764,19 @@ static int mtk_tx_alloc(struct mtk_eth *eth) txd->txd2 = next_ptr; txd->txd3 =TX_DMA_LS0 |TX_DMA_OWNER_CPU ; txd->txd4 =0 ; +if (MTK_HAS_CAPS (soc->caps,MTK_NETSYS_V2 )) { + txd->txd5 =0 ; + txd->txd6 =0 ; + txd->txd7 =0 ; + txd->txd8 =0 ; + } }/* On MT7688 (PDMA only) this driver uses the ring->dma structs * only as the framework. The real HW descriptors are the PDMA * descriptors in ring->dma_pdma. */ -if (!MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { +if (!MTK_HAS_CAPS (soc->caps,MTK_QDMA )) { ring->dma_pdma =dma_alloc_coherent (eth->dma_dev,MTK_DMA_SIZE * sz, &ring->phys_pdma,GFP_KERNEL );if (!ring->dma_pdma)
@@ -1767,13 +1856,11 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)struct mtk_rx_ring *ring;int rx_data_len, rx_dma_size;int i; -u32 offset =0 ;if (rx_flag ==MTK_RX_FLAGS_QDMA ) {if (ring_no)return -EINVAL ; ring = ð->rx_ring_qdma; - offset =0x1000 ; }else { ring = ð->rx_ring[ring_no]; }
@@ -1806,7 +1893,7 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)return -ENOMEM ;for (i =0 ; i < rx_dma_size; i++) { -struct mtk_rx_dma *rxd; +struct mtk_rx_dma_v2 *rxd; dma_addr_t dma_addr = dma_map_single(eth->dma_dev, ring->data[i] + NET_SKB_PAD + eth->ip_align,
@@ -1821,26 +1908,47 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) rxd->rxd2 =RX_DMA_LSO ;else - rxd->rxd2 =RX_DMA_PLEN0 (ring->buf_size); + rxd->rxd2 =RX_DMA_PREP_PLEN0 (ring->buf_size); rxd->rxd3 =0 ; rxd->rxd4 =0 ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { + rxd->rxd5 =0 ; + rxd->rxd6 =0 ; + rxd->rxd7 =0 ; + rxd->rxd8 =0 ; + } } ring->dma_size = rx_dma_size; ring->calc_idx_update = false; ring->calc_idx = rx_dma_size -1 ; - ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + ring_no *MTK_QRX_OFFSET ; +if (rx_flag ==MTK_RX_FLAGS_QDMA ) + ring->crx_idx_reg = reg_map->qdma.qcrx_ptr + + ring_no *MTK_QRX_OFFSET ; +else + ring->crx_idx_reg = reg_map->pdma.pcrx_ptr + + ring_no *MTK_QRX_OFFSET ;/* make sure that all changes to the dma ring are flushed before we * continue */ wmb (); -mtk_w32 (eth, ring->phys, - reg_map->pdma.rx_ptr + ring_no *MTK_QRX_OFFSET + offset); -mtk_w32 (eth, rx_dma_size, - reg_map->pdma.rx_cnt_cfg + ring_no *MTK_QRX_OFFSET + offset); -mtk_w32 (eth, ring->calc_idx, ring->crx_idx_reg + offset); -mtk_w32 (eth,MTK_PST_DRX_IDX_CFG (ring_no), reg_map->pdma.rst_idx + offset); +if (rx_flag ==MTK_RX_FLAGS_QDMA ) { +mtk_w32 (eth, ring->phys, + reg_map->qdma.rx_ptr + ring_no *MTK_QRX_OFFSET ); +mtk_w32 (eth, rx_dma_size, + reg_map->qdma.rx_cnt_cfg + ring_no *MTK_QRX_OFFSET ); +mtk_w32 (eth,MTK_PST_DRX_IDX_CFG (ring_no), + reg_map->qdma.rst_idx); + }else { +mtk_w32 (eth, ring->phys, + reg_map->pdma.rx_ptr + ring_no *MTK_QRX_OFFSET ); +mtk_w32 (eth, rx_dma_size, + reg_map->pdma.rx_cnt_cfg + ring_no *MTK_QRX_OFFSET ); +mtk_w32 (eth,MTK_PST_DRX_IDX_CFG (ring_no), + reg_map->pdma.rst_idx); + } +mtk_w32 (eth, ring->calc_idx, ring->crx_idx_reg);return 0 ; }
@@ -2259,7 +2367,7 @@ static irqreturn_t mtk_handle_irq_rx(int irq, void *_eth) eth->rx_events++;if (likely (napi_schedule_prep (ð->rx_napi))) {__napi_schedule (ð->rx_napi); -mtk_rx_irq_disable (eth,MTK_RX_DONE_INT ); +mtk_rx_irq_disable (eth, eth->soc->txrx.rx_irq_done_mask); }return IRQ_HANDLED ;
@@ -2283,8 +2391,10 @@ static irqreturn_t mtk_handle_irq(int irq, void *_eth)struct mtk_eth *eth = _eth;const struct mtk_reg_map *reg_map = eth->soc->reg_map; -if (mtk_r32 (eth, reg_map->pdma.irq_mask) &MTK_RX_DONE_INT ) { -if (mtk_r32 (eth, reg_map->pdma.irq_status) &MTK_RX_DONE_INT ) +if (mtk_r32 (eth, reg_map->pdma.irq_mask) & + eth->soc->txrx.rx_irq_done_mask) { +if (mtk_r32 (eth, reg_map->pdma.irq_status) & + eth->soc->txrx.rx_irq_done_mask)mtk_handle_irq_rx (irq, _eth); }if (mtk_r32 (eth, reg_map->tx_irq_mask) &MTK_TX_DONE_INT ) {
@@ -2302,16 +2412,16 @@ static void mtk_poll_controller(struct net_device *dev)struct mtk_eth *eth = mac->hw;mtk_tx_irq_disable (eth,MTK_TX_DONE_INT ); -mtk_rx_irq_disable (eth,MTK_RX_DONE_INT ); +mtk_rx_irq_disable (eth, eth->soc->txrx.rx_irq_done_mask);mtk_handle_irq_rx (eth->irq[2 ], dev);mtk_tx_irq_enable (eth,MTK_TX_DONE_INT ); - mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); + mtk_rx_irq_enable(eth, eth->soc->txrx.rx_irq_done_mask); }#endif static int mtk_start_dma (struct mtk_eth *eth) { -u32 rx_2b_offset = (NET_IP_ALIGN ==2 ) ?MTK_RX_2B_OFFSET :0 ; +u32 val, rx_2b_offset = (NET_IP_ALIGN ==2 ) ?MTK_RX_2B_OFFSET :0 ;const struct mtk_reg_map *reg_map = eth->soc->reg_map;int err;
@@ -2322,12 +2432,19 @@ static int mtk_start_dma(struct mtk_eth *eth) }if (MTK_HAS_CAPS (eth->soc->caps,MTK_QDMA )) { -mtk_w32 (eth, -MTK_TX_WB_DDONE |MTK_TX_DMA_EN | -MTK_TX_BT_32DWORDS |MTK_NDP_CO_PRO | -MTK_RX_DMA_EN |MTK_RX_2B_OFFSET | -MTK_RX_BT_32DWORDS , - reg_map->qdma.glo_cfg); + val =mtk_r32 (eth, reg_map->qdma.glo_cfg); + val |=MTK_TX_DMA_EN |MTK_RX_DMA_EN | +MTK_TX_BT_32DWORDS |MTK_NDP_CO_PRO | +MTK_RX_2B_OFFSET |MTK_TX_WB_DDONE ; + +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) + val |=MTK_MUTLI_CNT |MTK_RESV_BUF | +MTK_WCOMP_EN |MTK_DMAD_WR_WDONE | +MTK_CHK_DDONE_EN ; +else + val |=MTK_RX_BT_32DWORDS ; +mtk_w32 (eth, val, reg_map->qdma.glo_cfg); + mtk_w32(eth, MTK_RX_DMA_EN | rx_2b_offset | MTK_RX_BT_32DWORDS | MTK_MULTI_EN,
@@ -2398,7 +2515,7 @@ static int mtk_open(struct net_device *dev)napi_enable (ð->tx_napi);napi_enable (ð->rx_napi);mtk_tx_irq_enable (eth,MTK_TX_DONE_INT ); -mtk_rx_irq_enable (eth,MTK_RX_DONE_INT ); +mtk_rx_irq_enable (eth, eth->soc->txrx.rx_irq_done_mask);refcount_set (ð->dma_refcnt,1 ); }else
@@ -2450,7 +2567,7 @@ static int mtk_stop(struct net_device *dev)mtk_gdm_config (eth,MTK_GDMA_DROP_ALL );mtk_tx_irq_disable (eth,MTK_TX_DONE_INT ); -mtk_rx_irq_disable (eth,MTK_RX_DONE_INT ); +mtk_rx_irq_disable (eth, eth->soc->txrx.rx_irq_done_mask);napi_disable (ð->tx_napi);napi_disable (ð->rx_napi);
@@ -2610,9 +2727,25 @@ static int mtk_hw_init(struct mtk_eth *eth)return 0 ; } -/* Non-MT7628 handling... */ -ethsys_reset (eth,RSTCTRL_FE ); -ethsys_reset (eth,RSTCTRL_PPE ); + val =RSTCTRL_FE |RSTCTRL_PPE ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { +regmap_write (eth->ethsys,ETHSYS_FE_RST_CHK_IDLE_EN ,0 ); + + val |=RSTCTRL_ETH ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_RSTCTRL_PPE1 )) + val |=RSTCTRL_PPE1 ; + } + +ethsys_reset (eth, val); + +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { +regmap_write (eth->ethsys,ETHSYS_FE_RST_CHK_IDLE_EN , +0x3ffffff ); + +/* Set FE to PDMAv2 if necessary */ + val =mtk_r32 (eth,MTK_FE_GLO_MISC ); +mtk_w32 (eth, val |BIT (4 ),MTK_FE_GLO_MISC ); + }if (eth->pctl) {/* Set GE2 driving and slew rate */
@@ -2651,11 +2784,47 @@ static int mtk_hw_init(struct mtk_eth *eth)/* FE int grouping */ mtk_w32 (eth,MTK_TX_DONE_INT , reg_map->pdma.int_grp); -mtk_w32 (eth,MTK_RX_DONE_INT , reg_map->pdma.int_grp +4 ); +mtk_w32 (eth, eth->soc->txrx.rx_irq_done_mask, reg_map->pdma.int_grp +4 );mtk_w32 (eth,MTK_TX_DONE_INT , reg_map->qdma.int_grp); -mtk_w32 (eth,MTK_RX_DONE_INT , reg_map->qdma.int_grp +4 ); +mtk_w32 (eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp +4 );mtk_w32 (eth,0x21021000 ,MTK_FE_INT_GRP ); +if (MTK_HAS_CAPS (eth->soc->caps,MTK_NETSYS_V2 )) { +/* PSE should not drop port8 and port9 packets */ +mtk_w32 (eth,0x00000300 ,PSE_DROP_CFG ); + +/* PSE Free Queue Flow Control */ +mtk_w32 (eth,0x01fa01f4 ,PSE_FQFC_CFG2 ); + +/* PSE config input queue threshold */ +mtk_w32 (eth,0x001a000e ,PSE_IQ_REV (1 )); +mtk_w32 (eth,0x01ff001a ,PSE_IQ_REV (2 )); +mtk_w32 (eth,0x000e01ff ,PSE_IQ_REV (3 )); +mtk_w32 (eth,0x000e000e ,PSE_IQ_REV (4 )); +mtk_w32 (eth,0x000e000e ,PSE_IQ_REV (5 )); +mtk_w32 (eth,0x000e000e ,PSE_IQ_REV (6 )); +mtk_w32 (eth,0x000e000e ,PSE_IQ_REV (7 )); +mtk_w32 (eth,0x000e000e ,PSE_IQ_REV (8 )); + +/* PSE config output queue threshold */ +mtk_w32 (eth,0x000f000a ,PSE_OQ_TH (1 )); +mtk_w32 (eth,0x001a000f ,PSE_OQ_TH (2 )); +mtk_w32 (eth,0x000f001a ,PSE_OQ_TH (3 )); +mtk_w32 (eth,0x01ff000f ,PSE_OQ_TH (4 )); +mtk_w32 (eth,0x000f000f ,PSE_OQ_TH (5 )); +mtk_w32 (eth,0x0006000f ,PSE_OQ_TH (6 )); +mtk_w32 (eth,0x00060006 ,PSE_OQ_TH (7 )); +mtk_w32 (eth,0x00060006 ,PSE_OQ_TH (8 )); + +/* GDM and CDM Threshold */ +mtk_w32 (eth,0x00000004 ,MTK_GDM2_THRES ); +mtk_w32 (eth,0x00000004 ,MTK_CDMW0_THRES ); +mtk_w32 (eth,0x00000004 ,MTK_CDMW1_THRES ); +mtk_w32 (eth,0x00000004 ,MTK_CDME0_THRES ); +mtk_w32 (eth,0x00000004 ,MTK_CDME1_THRES ); +mtk_w32 (eth,0x00000004 ,MTK_CDMM_THRES ); + } +return 0 ; err_disable_pm:
@@ -3216,12 +3385,8 @@ static int mtk_probe(struct platform_device *pdev)if (IS_ERR (eth->base))return PTR_ERR (eth->base); -if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) { - eth->rx_dma_l4_valid =RX_DMA_L4_VALID_PDMA ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) eth->ip_align =NET_IP_ALIGN ; - }else { - eth->rx_dma_l4_valid =RX_DMA_L4_VALID ; - }spin_lock_init (ð->page_lock);spin_lock_init (ð->tx_irq_lock);
@@ -3457,6 +3622,10 @@ static const struct mtk_soc_data mt2701_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
@@ -3470,6 +3639,10 @@ static const struct mtk_soc_data mt7621_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
@@ -3484,6 +3657,10 @@ static const struct mtk_soc_data mt7622_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
@@ -3497,6 +3674,10 @@ static const struct mtk_soc_data mt7623_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
@@ -3510,6 +3691,10 @@ static const struct mtk_soc_data mt7629_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
@@ -3522,6 +3707,10 @@ static const struct mtk_soc_data rt5350_data = { .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma), + .rx_irq_done_mask = MTK_RX_DONE_INT, + .rx_dma_l4_valid = RX_DMA_L4_VALID_PDMA, + .dma_max_len = MTK_TX_DMA_BUF_LEN, + .dma_len_offset = 16, }, };
drivers/net/ethernet/mediatek/mtk_eth_soc.h +117 -9
248 lines not on this page · raw message
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 14/16 net: ethernet: mtk_eth_soc: convert ring dma pointer to void
In reply to Lorenzo BianconiSimplify the code converting {tx,rx} ring dma pointer to void
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 32 +++++++++------------ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 +-- 2 files changed, 16 insertions(+), 20 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +14 -18
@@ -917,18 +917,15 @@ static int mtk_init_fq_dma(struct mtk_eth *eth)return 0 ; } -static inline void *mtk_qdma_phys_to_virt (struct mtk_tx_ring *ring,u32 desc) +static void *mtk_qdma_phys_to_virt (struct mtk_tx_ring *ring,u32 desc) { -void *ret = ring->dma; - -return ret + (desc - ring->phys); +return ring->dma + (desc - ring->phys); }static struct mtk_tx_buf *mtk_desc_to_tx_buf (struct mtk_tx_ring *ring, -struct mtk_tx_dma *txd, -u32 txd_size) +void *txd,u32 txd_size) { -int idx = ((void *)txd - (void *)ring->dma) / txd_size; +int idx = (txd - ring->dma) / txd_size;return &ring->buf[idx]; }
@@ -936,13 +933,12 @@ static struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring,static struct mtk_tx_dma *qdma_to_pdma (struct mtk_tx_ring *ring,struct mtk_tx_dma *dma) { -return ring->dma_pdma - ring->dma + dma; +return ring->dma_pdma - (struct mtk_tx_dma *)ring->dma + dma; } -static int txd_to_idx (struct mtk_tx_ring *ring,struct mtk_tx_dma *dma, -u32 txd_size) +static int txd_to_idx (struct mtk_tx_ring *ring,void *dma,u32 txd_size) { -return ((void *)dma - (void *)ring->dma) / txd_size; +return (dma - ring->dma) / txd_size; } static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf,
@@ -1359,7 +1355,7 @@ static struct mtk_rx_ring *mtk_get_rx_ring(struct mtk_eth *eth) ring = ð->rx_ring[i]; idx =NEXT_DESP_IDX (ring->calc_idx, ring->dma_size); - rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; + rxd = ring->dma + idx * eth->soc->txrx.rxd_size;if (rxd->rxd2 &RX_DMA_DONE ) { ring->calc_idx_update = true;return ring;
@@ -1411,7 +1407,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, goto rx_done; idx =NEXT_DESP_IDX (ring->calc_idx, ring->dma_size); - rxd = (void *)ring->dma + idx * eth->soc->txrx.rxd_size; + rxd = ring->dma + idx * eth->soc->txrx.rxd_size; data = ring->data[idx];if (!mtk_rx_get_desc (eth, &trxd, rxd))
@@ -1615,7 +1611,7 @@ static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget,mtk_tx_unmap (eth, tx_buf, true); - desc = (void *)ring->dma + cpu * eth->soc->txrx.txd_size; + desc = ring->dma + cpu * eth->soc->txrx.txd_size; ring->last_free = desc;atomic_inc (&ring->free_count);
@@ -1760,7 +1756,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)int next = (i +1 ) %MTK_DMA_SIZE ;u32 next_ptr = ring->phys + next * sz; - txd = (void *)ring->dma + i * sz; + txd = ring->dma + i * sz; txd->txd2 = next_ptr; txd->txd3 =TX_DMA_LS0 |TX_DMA_OWNER_CPU ; txd->txd4 =0 ;
@@ -1790,7 +1786,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth) ring->dma_size =MTK_DMA_SIZE ;atomic_set (&ring->free_count,MTK_DMA_SIZE -2 ); - ring->next_free = &ring->dma[0 ]; + ring->next_free = ring->dma; ring->last_free = (void *)txd; ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE -1 ) * sz)); ring->thresh =MAX_SKB_FRAGS ;
@@ -1902,7 +1898,7 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)if (unlikely (dma_mapping_error (eth->dma_dev, dma_addr)))return -ENOMEM ; - rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; + rxd = ring->dma + i * eth->soc->txrx.rxd_size; rxd->rxd1 = (unsigned int )dma_addr;if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 ))
@@ -1964,7 +1960,7 @@ static void mtk_rx_clean(struct mtk_eth *eth, struct mtk_rx_ring *ring)if (!ring->data[i])continue ; - rxd = (void *)ring->dma + i * eth->soc->txrx.rxd_size; + rxd = ring->dma + i * eth->soc->txrx.rxd_size;if (!rxd->rxd1)continue ;
drivers/net/ethernet/mediatek/mtk_eth_soc.h +2 -2
@@ -692,7 +692,7 @@ struct mtk_tx_buf {* are present */ struct mtk_tx_ring { -struct mtk_tx_dma *dma; +void *dma;struct mtk_tx_buf *buf;dma_addr_t phys;struct mtk_tx_dma *next_free;
@@ -722,7 +722,7 @@ enum mtk_rx_flags {* @calc_idx: The current head of ring */ struct mtk_rx_ring { -struct mtk_rx_dma *dma; +void *dma;u8 **data;dma_addr_t phys;u16 frag_size;
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 15/16 net: ethernet: mtk_eth_soc: convert scratch_ring pointer to void
In reply to Lorenzo BianconiSimplify the code converting scratch_ring pointer to void
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +1 -1
@@ -893,7 +893,7 @@ static int mtk_init_fq_dma(struct mtk_eth *eth)for (i =0 ; i < cnt; i++) {struct mtk_tx_dma_v2 *txd; - txd = (void *)eth->scratch_ring + i * soc->txrx.txd_size; + txd = eth->scratch_ring + i * soc->txrx.txd_size; txd->txd1 = dma_addr + i *MTK_QDMA_PAGE_SIZE ;if (i < cnt -1 ) txd->txd2 = eth->phy_scratch_ring +
drivers/net/ethernet/mediatek/mtk_eth_soc.h +1 -1
@@ -1033,7 +1033,7 @@ struct mtk_eth {struct mtk_rx_ring rx_ring_qdma;struct napi_struct tx_napi;struct napi_struct rx_napi; -struct mtk_tx_dma *scratch_ring; +void *scratch_ring;dma_addr_t phy_scratch_ring;void *scratch_head;struct clk *clks[MTK_CLK_MAX ];
Signature · 1 line
2.35.3
Lorenzo Bianconi
maintainerPATCH v3 16/16 net: ethernet: mtk_eth_soc: introduce support for mt7986 chipset
In reply to Lorenzo BianconiAdd support for mt7986-eth driver available on mt7986 soc.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 55 ++++++++++++++++++++- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 18 +++++++ 2 files changed, 72 insertions(+), 1 deletion(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +54 -1
@@ -87,6 +87,43 @@ static const struct mtk_reg_map mt7628_reg_map = { }, }; +static const struct mtk_reg_map mt7986_reg_map = { + .tx_irq_mask =0x461c , + .tx_irq_status =0x4618 , + .pdma = { + .rx_ptr =0x6100 , + .rx_cnt_cfg =0x6104 , + .pcrx_ptr =0x6108 , + .glo_cfg =0x6204 , + .rst_idx =0x6208 , + .delay_irq =0x620c , + .irq_status =0x6220 , + .irq_mask =0x6228 , + .int_grp =0x6250 , + }, + .qdma = { + .qtx_cfg =0x4400 , + .rx_ptr =0x4500 , + .rx_cnt_cfg =0x4504 , + .qcrx_ptr =0x4508 , + .glo_cfg =0x4604 , + .rst_idx =0x4608 , + .delay_irq =0x460c , + .fc_th =0x4610 , + .int_grp =0x4620 , + .hred =0x4644 , + .ctx_ptr =0x4700 , + .dtx_ptr =0x4704 , + .crx_ptr =0x4710 , + .drx_ptr =0x4714 , + .fq_head =0x4720 , + .fq_tail =0x4724 , + .fq_count =0x4728 , + .fq_blen =0x472c , + }, + .gdm1_cnt =0x1c00 , +}; +/* strings used by ethtool */ static const struct mtk_ethtool_stats { char str[ETH_GSTRING_LEN];
@@ -110,7 +147,7 @@ static const char * const mtk_clks_source_name[] = {"ethif" ,"sgmiitop" ,"esw" ,"gp0" ,"gp1" ,"gp2" ,"fe" ,"trgpll" ,"sgmii_tx250m" ,"sgmii_rx250m" ,"sgmii_cdr_ref" ,"sgmii_cdr_fb" ,"sgmii2_tx250m" ,"sgmii2_rx250m" ,"sgmii2_cdr_ref" ,"sgmii2_cdr_fb" , - "sgmii_ck", "eth2pll", +"sgmii_ck" ,"eth2pll" ,"wocpu0" ,"wocpu1" ,"netsys0" ,"netsys1" };void mtk_w32 (struct mtk_eth *eth,u32 val,unsigned reg)
@@ -3694,6 +3731,21 @@ static const struct mtk_soc_data mt7629_data = { }, }; +static const struct mtk_soc_data mt7986_data = { + .reg_map = &mt7986_reg_map, + .ana_rgc3 =0x128 , + .caps =MT7986_CAPS , + .required_clks =MT7986_CLKS_BITMAP , + .required_pctl = false, + .txrx = { + .txd_size =sizeof (struct mtk_tx_dma_v2 ), + .rxd_size =sizeof (struct mtk_rx_dma_v2 ), + .rx_irq_done_mask =MTK_RX_DONE_INT_V2 , + .dma_max_len =MTK_TX_DMA_BUF_LEN_V2 , + .dma_len_offset =8 , + }, +}; +static const struct mtk_soc_data rt5350_data = { .reg_map = &mt7628_reg_map, .caps =MT7628_CAPS ,
@@ -3716,6 +3768,7 @@ const struct of_device_id of_mtk_match[] = { { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, + { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, { .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, {}, };
drivers/net/ethernet/mediatek/mtk_eth_soc.h +18 -0
@@ -627,6 +627,10 @@ enum mtk_clks_map {MTK_CLK_SGMII2_CDR_FB ,MTK_CLK_SGMII_CK ,MTK_CLK_ETH2PLL , +MTK_CLK_WOCPU0 , +MTK_CLK_WOCPU1 , +MTK_CLK_NETSYS0 , +MTK_CLK_NETSYS1 , MTK_CLK_MAX };
@@ -657,6 +661,16 @@ enum mtk_clks_map { BIT(MTK_CLK_SGMII2_CDR_FB) | \ BIT(MTK_CLK_SGMII_CK) | \ BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) +#define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ + BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ + BIT(MTK_CLK_SGMII_TX_250M) | \ + BIT(MTK_CLK_SGMII_RX_250M) | \ + BIT(MTK_CLK_SGMII_CDR_REF) | \ + BIT(MTK_CLK_SGMII_CDR_FB) | \ + BIT(MTK_CLK_SGMII2_TX_250M) | \ + BIT(MTK_CLK_SGMII2_RX_250M) | \ + BIT(MTK_CLK_SGMII2_CDR_REF) | \ + BIT(MTK_CLK_SGMII2_CDR_FB))enum mtk_dev_state {MTK_HW_INIT ,
@@ -855,6 +869,10 @@ enum mkt_eth_capabilities { MTK_MUX_U3_GMAC2_TO_QPHY | \ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) +#define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) +struct mtk_tx_dma_desc_info {dma_addr_t addr;u32 size;
Signature · 1 line
2.35.3
Quoted 7 lines · On Fri, 20 May 2022 20:11:23 +0200 Lorenzo Bianconi wrote:
Add support for mt7986-eth driver available on mt7986 soc.
Changes since v2:
- rely onGFP_KERNELwhenever possible
- definemtk_reg_mapstruct to introduce soc register map and avoid macros
- improve comments
Quoted 7 lines
Changes since v1:
- drop SRAM option
- convertring->dmato void
- convertscratch_ringto void
- enable port4
- fix irq dts bindings
- drop gmac1 support from mt7986a-rfb dts for the moment
👍
_______________________________________________
Linux-mediatek mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-mediatek