net: stmmac: Improvements for -next
Subsystems (5)
PATCH v2 6/7 net: stmmac: Add basic EST support for XGMAC
In reply to Jose AbreuAdds the support for EST in XGMAC cores. This feature allows to offload scheduling of queues opening time to the IP.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 19 ++++++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 52 ++++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 3 ++ 3 files changed, 74 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +19 -0
@@ -136,6 +136,9 @@#define XGMAC_HWFEAT_TXQCNT GENMASK(9, 6)#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)#define XGMAC_HW_FEATURE3 0x00000128 +#define XGMAC_HWFEAT_ESTWID GENMASK(24, 23) +#define XGMAC_HWFEAT_ESTDEP GENMASK(22, 20) +#define XGMAC_HWFEAT_ESTSEL BIT(19)#define XGMAC_HWFEAT_ASP GENMASK(15, 14)#define XGMAC_HWFEAT_DVLAN BIT(13)#define XGMAC_HWFEAT_FRPES GENMASK(12, 11)
@@ -237,6 +240,22 @@#define XGMAC_TC_PRTY_MAP1 0x00001044#define XGMAC_PSTC (x) GENMASK((x) * 8 + 7, (x) * 8)#define XGMAC_PSTC_SHIFT (x) ((x) * 8) +#define XGMAC_MTL_EST_CONTROL 0x00001050 +#define XGMAC_PTOV GENMASK(31, 23) +#define XGMAC_PTOV_SHIFT 23 +#define XGMAC_SSWL BIT(1) +#define XGMAC_EEST BIT(0) +#define XGMAC_MTL_EST_GCL_CONTROL 0x00001080 +#define XGMAC_BTR_LOW 0x0 +#define XGMAC_BTR_HIGH 0x1 +#define XGMAC_CTR_LOW 0x2 +#define XGMAC_CTR_HIGH 0x3 +#define XGMAC_TER 0x4 +#define XGMAC_LLR 0x5 +#define XGMAC_ADDR_SHIFT 8 +#define XGMAC_GCRR BIT(2) +#define XGMAC_SRWO BIT(0) +#define XGMAC_MTL_EST_GCL_DATA 0x00001084#define XGMAC_MTL_RXP_CONTROL_STATUS 0x000010a0#define XGMAC_RXPI BIT(31)#define XGMAC_NPE GENMASK(23, 16)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +52 -0
64 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +3 -0
@@ -429,6 +429,9 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr,/* MAC HW feature 3 */ hw_cap =readl (ioaddr +XGMAC_HW_FEATURE3 ); + dma_cap->estwid = (hw_cap &XGMAC_HWFEAT_ESTWID ) >>23 ; + dma_cap->estdep = (hw_cap &XGMAC_HWFEAT_ESTDEP ) >>20 ; + dma_cap->estsel = (hw_cap &XGMAC_HWFEAT_ESTSEL ) >>19 ; dma_cap->asp = (hw_cap &XGMAC_HWFEAT_ASP ) >>14 ; dma_cap->dvlan = (hw_cap &XGMAC_HWFEAT_DVLAN ) >>13 ; dma_cap->frpes = (hw_cap &XGMAC_HWFEAT_FRPES ) >>11 ;
Signature · 1 line
2.7.4
PATCH v2 3/7 net: stmmac: Let TX and RX interrupts be independently enabled/disabled
In reply to Jose AbreuBy using this mechanism we can get rid of the not so nice method of scheduling TX NAPI when the RX was scheduled. No bandwidth reduction was seen with this change.
Changes from v1:
- Remove useless comment (Jakub)
- Do not bind the TX clean to NAPI budget (Jakub)
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Chen-Yu Tsai <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 24 ++++++++-- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 11 +++-- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 47 ++++++++++++++---- drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | 6 ++- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 22 +++++++-- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 + drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 24 ++++++++-- drivers/net/ethernet/stmicro/stmmac/hwif.h | 6 ++- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 55 +++++++++++++--------- 10 files changed, 149 insertions(+), 49 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +20 -4
@@ -335,14 +335,30 @@ static void sun8i_dwmac_dump_mac_regs(struct mac_device_info *hw, } } -static void sun8i_dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan) +static void sun8i_dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (EMAC_RX_INT |EMAC_TX_INT , ioaddr +EMAC_INT_EN ); +u32 value =readl (ioaddr +EMAC_INT_EN ); + +if (rx) + value |=EMAC_RX_INT ; +if (tx) + value |=EMAC_TX_INT ; + +writel (value, ioaddr +EMAC_INT_EN ); } -static void sun8i_dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan) +static void sun8i_dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (0 , ioaddr +EMAC_INT_EN ); +u32 value =readl (ioaddr +EMAC_INT_EN ); + +if (rx) + value &= ~EMAC_RX_INT ; +if (tx) + value &= ~EMAC_TX_INT ; + +writel (value, ioaddr +EMAC_INT_EN ); }static void sun8i_dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h +8 -3
@@ -168,6 +168,8 @@/* DMA default interrupt mask for 4.00 */ #define DMA_CHAN_INTR_DEFAULT_MASK (DMA_CHAN_INTR_NORMAL | \ DMA_CHAN_INTR_ABNORMAL) +#define DMA_CHAN_INTR_DEFAULT_RX (DMA_CHAN_INTR_ENA_RIE) +#define DMA_CHAN_INTR_DEFAULT_TX (DMA_CHAN_INTR_ENA_TIE)#define DMA_CHAN_INTR_NORMAL_4_10 (DMA_CHAN_INTR_ENA_NIE_4_10 | \ DMA_CHAN_INTR_ENA_RIE | \
@@ -178,6 +180,8 @@/* DMA default interrupt mask for 4.10a */ #define DMA_CHAN_INTR_DEFAULT_MASK_4_10 (DMA_CHAN_INTR_NORMAL_4_10 | \ DMA_CHAN_INTR_ABNORMAL_4_10) +#define DMA_CHAN_INTR_DEFAULT_RX_4_10 (DMA_CHAN_INTR_ENA_RIE) +#define DMA_CHAN_INTR_DEFAULT_TX_4_10 (DMA_CHAN_INTR_ENA_TIE)/* channel 0 specific fields */ #define DMA_CHAN0_DBG_STAT_TPS GENMASK(15, 12)
@@ -186,9 +190,10 @@#define DMA_CHAN0_DBG_STAT_RPS_SHIFT 8int dwmac4_dma_reset (void __iomem *ioaddr); -void dwmac4_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac410_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac4_disable_dma_irq (void __iomem *ioaddr,u32 chan); +void dwmac4_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac410_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac4_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac410_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx);void dwmac4_dma_start_tx (void __iomem *ioaddr,u32 chan);void dwmac4_dma_stop_tx (void __iomem *ioaddr,u32 chan);void dwmac4_dma_start_rx (void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +39 -8
60 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h +4 -2
@@ -96,6 +96,8 @@/* DMA default interrupt mask */ #define DMA_INTR_DEFAULT_MASK (DMA_INTR_NORMAL | DMA_INTR_ABNORMAL) +#define DMA_INTR_DEFAULT_RX (DMA_INTR_ENA_RIE) +#define DMA_INTR_DEFAULT_TX (DMA_INTR_ENA_TIE)/* DMA Status register defines */ #define DMA_STATUS_GLPII 0x40000000/* GMAC LPI interrupt */
@@ -130,8 +132,8 @@#define NUM_DWMAC1000_DMA_REGS 23void dwmac_enable_dma_transmission (void __iomem *ioaddr); -void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan); -void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan); +void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx); +void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx);void dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan);void dwmac_dma_stop_tx (void __iomem *ioaddr,u32 chan);void dwmac_dma_start_rx (void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +18 -4
@@ -37,14 +37,28 @@ void dwmac_enable_dma_transmission(void __iomem *ioaddr)writel (1 , ioaddr +DMA_XMT_POLL_DEMAND ); } -void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan) +void dwmac_enable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx) { -writel (DMA_INTR_DEFAULT_MASK , ioaddr +DMA_INTR_ENA ); +u32 value =readl (ioaddr +DMA_INTR_ENA ); + +if (rx) + value |=DMA_INTR_DEFAULT_RX ; +if (tx) + value |=DMA_INTR_DEFAULT_TX ; + +writel (value, ioaddr +DMA_INTR_ENA ); } -void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan) +void dwmac_disable_dma_irq (void __iomem *ioaddr,u32 chan,bool rx,bool tx) { -writel (0 , ioaddr +DMA_INTR_ENA ); +u32 value =readl (ioaddr +DMA_INTR_ENA ); + +if (rx) + value &= ~DMA_INTR_DEFAULT_RX ; +if (tx) + value &= ~DMA_INTR_DEFAULT_TX ; + +writel (value, ioaddr +DMA_INTR_ENA ); }void dwmac_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +2 -0
@@ -361,6 +361,8 @@#define XGMAC_TIE BIT(0)#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \ XGMAC_RIE | XGMAC_TIE) +#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE) +#define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)#define XGMAC_DMA_CH_Rx_WATCHDOG (x) (0x0000313c + (0x80 * (x)))#define XGMAC_RWT GENMASK(7, 0)#define XGMAC_DMA_CH_STATUS (x) (0x00003160 + (0x80 * (x)))
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +20 -4
@@ -248,14 +248,30 @@ static void dwxgmac2_dma_tx_mode(void __iomem *ioaddr, int mode,writel (value, ioaddr +XGMAC_MTL_TXQ_OPMODE (channel)); } -static void dwxgmac2_enable_dma_irq (void __iomem *ioaddr,u32 chan) +static void dwxgmac2_enable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (XGMAC_DMA_INT_DEFAULT_EN , ioaddr +XGMAC_DMA_CH_INT_EN (chan)); +u32 value =readl (ioaddr +XGMAC_DMA_CH_INT_EN (chan)); + +if (rx) + value |=XGMAC_DMA_INT_DEFAULT_RX ; +if (tx) + value |=XGMAC_DMA_INT_DEFAULT_TX ; + +writel (value, ioaddr +XGMAC_DMA_CH_INT_EN (chan)); } -static void dwxgmac2_disable_dma_irq (void __iomem *ioaddr,u32 chan) +static void dwxgmac2_disable_dma_irq (void __iomem *ioaddr,u32 chan, +bool rx,bool tx) { -writel (0 , ioaddr +XGMAC_DMA_CH_INT_EN (chan)); +u32 value =readl (ioaddr +XGMAC_DMA_CH_INT_EN (chan)); + +if (rx) + value &= ~XGMAC_DMA_INT_DEFAULT_RX ; +if (tx) + value &= ~XGMAC_DMA_INT_DEFAULT_TX ; + +writel (value, ioaddr +XGMAC_DMA_CH_INT_EN (chan)); }static void dwxgmac2_dma_start_tx (void __iomem *ioaddr,u32 chan)
drivers/net/ethernet/stmicro/stmmac/hwif.h +4 -2
@@ -187,8 +187,10 @@ struct stmmac_dma_ops {void (*dma_diagnostic_fr) (void *data,struct stmmac_extra_stats *x,void __iomem *ioaddr);void (*enable_dma_transmission) (void __iomem *ioaddr); -void (*enable_dma_irq)(void __iomem *ioaddr,u32 chan); -void (*disable_dma_irq)(void __iomem *ioaddr,u32 chan); +void (*enable_dma_irq)(void __iomem *ioaddr,u32 chan, +bool rx,bool tx); +void (*disable_dma_irq)(void __iomem *ioaddr,u32 chan, +bool rx,bool tx);void (*start_tx)(void __iomem *ioaddr,u32 chan);void (*stop_tx)(void __iomem *ioaddr,u32 chan);void (*start_rx)(void __iomem *ioaddr,u32 chan);
drivers/net/ethernet/stmicro/stmmac/stmmac.h +1 -0
@@ -88,6 +88,7 @@ struct stmmac_channel {struct napi_struct rx_napi____cacheline_aligned_in_smp ;struct napi_struct tx_napi____cacheline_aligned_in_smp ;struct stmmac_priv *priv_data; +spinlock_t lock;u32 index; };
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +33 -22
100 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 7/7 net: stmmac: Integrate EST with TAPRIO scheduler API
In reply to Jose AbreuNow that we have the EST code for XGMAC and QoS we can use it with the TAPRIO scheduler. Integrate it into the main driver and use the API to configure the EST feature.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/hwif.h | 5 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 + drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 108 ++++++++++++++++++++++ 3 files changed, 115 insertions(+)
drivers/net/ethernet/stmicro/stmmac/hwif.h +5 -0
@@ -521,6 +521,7 @@ struct stmmac_priv;struct tc_cls_u32_offload ;struct tc_cbs_qopt_offload ;struct flow_cls_offload ; +struct tc_taprio_qopt_offload ;struct stmmac_tc_ops {int (*init)(struct stmmac_priv *priv);
@@ -530,6 +531,8 @@ struct stmmac_tc_ops { struct tc_cbs_qopt_offload *qopt);int (*setup_cls)(struct stmmac_priv *priv,struct flow_cls_offload *cls); +int (*setup_taprio)(struct stmmac_priv *priv, +struct tc_taprio_qopt_offload *qopt); }; #define stmmac_tc_init(__priv, __args...) \
@@ -540,6 +543,8 @@ struct stmmac_tc_ops { stmmac_do_callback(__priv, tc, setup_cbs, __args) #define stmmac_tc_setup_cls(__priv, __args...) \ stmmac_do_callback(__priv, tc, setup_cls, __args) +#define stmmac_tc_setup_taprio(__priv, __args...) \ + stmmac_do_callback(__priv, tc, setup_taprio, __args)struct stmmac_counters ;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -0
@@ -4074,6 +4074,8 @@ static int stmmac_setup_tc(struct net_device *ndev, enum tc_setup_type type, priv, priv, true);case TC_SETUP_QDISC_CBS :return stmmac_tc_setup_cbs (priv, priv, type_data); +case TC_SETUP_QDISC_TAPRIO : +return stmmac_tc_setup_taprio (priv, priv, type_data);default :return -EOPNOTSUPP ; }
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +108 -0
117 lines not on this page · raw message
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v2 5/7 net: stmmac: Add basic EST support for GMAC5+
In reply to Jose AbreuFrom: Jose Abreu <[email protected]>
Adds the support for EST in GMAC5+ cores. This feature allows to offload scheduling of queues opening time to the IP.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/common.h | 4 + drivers/net/ethernet/stmicro/stmmac/dwmac4.h | 9 +++ drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 2 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 3 + drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 95 +++++++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwmac5.h | 19 +++++ drivers/net/ethernet/stmicro/stmmac/hwif.h | 5 ++ include/linux/stmmac.h | 11 +++ 8 files changed, 148 insertions(+)
drivers/net/ethernet/stmicro/stmmac/common.h +4 -0
@@ -363,6 +363,10 @@ struct dma_features {unsigned int dvlan;unsigned int l3l4fnum;unsigned int arpoffsel; +/* TSN Features */ +unsigned int estwid; +unsigned int estdep; +unsigned int estsel; };/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
drivers/net/ethernet/stmicro/stmmac/dwmac4.h +9 -0
@@ -176,6 +176,8 @@ enum power_event {#define GMAC_CONFIG_SARC GENMASK(30, 28)#define GMAC_CONFIG_SARC_SHIFT 28#define GMAC_CONFIG_IPC BIT(27) +#define GMAC_CONFIG_IPG GENMASK(26, 24) +#define GMAC_CONFIG_IPG_SHIFT 24#define GMAC_CONFIG_2K BIT(22)#define GMAC_CONFIG_ACS BIT(20)#define GMAC_CONFIG_BE BIT(18)
@@ -183,6 +185,7 @@ enum power_event {#define GMAC_CONFIG_JE BIT(16)#define GMAC_CONFIG_PS BIT(15)#define GMAC_CONFIG_FES BIT(14) +#define GMAC_CONFIG_FES_SHIFT 14#define GMAC_CONFIG_DM BIT(13)#define GMAC_CONFIG_LM BIT(12)#define GMAC_CONFIG_DCRS BIT(9)
@@ -190,6 +193,9 @@ enum power_event {#define GMAC_CONFIG_RE BIT(0)/* MAC extended config */ +#define GMAC_CONFIG_EIPG GENMASK(29, 25) +#define GMAC_CONFIG_EIPG_SHIFT 25 +#define GMAC_CONFIG_EIPG_EN BIT(24)#define GMAC_CONFIG_HDSMS GENMASK(22, 20)#define GMAC_CONFIG_HDSMS_SHIFT 20#define GMAC_CONFIG_HDSMS_256 (0x2 << GMAC_CONFIG_HDSMS_SHIFT)
@@ -231,6 +237,9 @@ enum power_event {/* MAC HW features3 bitmap */ #define GMAC_HW_FEAT_ASP GENMASK(29, 28) +#define GMAC_HW_FEAT_ESTWID GENMASK(21, 20) +#define GMAC_HW_FEAT_ESTDEP GENMASK(19, 17) +#define GMAC_HW_FEAT_ESTSEL BIT(16)#define GMAC_HW_FEAT_FRPES GENMASK(14, 13)#define GMAC_HW_FEAT_FRPBS GENMASK(12, 11)#define GMAC_HW_FEAT_FRPSEL BIT(10)
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +2 -0
@@ -984,6 +984,7 @@ const struct stmmac_ops dwmac410_ops = { .set_arp_offload = dwmac4_set_arp_offload, .config_l3_filter = dwmac4_config_l3_filter, .config_l4_filter = dwmac4_config_l4_filter, + .est_configure = dwmac5_est_configure, };const struct stmmac_ops dwmac510_ops = {
@@ -1027,6 +1028,7 @@ const struct stmmac_ops dwmac510_ops = { .set_arp_offload = dwmac4_set_arp_offload, .config_l3_filter = dwmac4_config_l3_filter, .config_l4_filter = dwmac4_config_l4_filter, + .est_configure = dwmac5_est_configure, };int dwmac4_setup (struct stmmac_priv *priv)
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +3 -0
@@ -404,6 +404,9 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr,/* 5.10 Features */ dma_cap->asp = (hw_cap &GMAC_HW_FEAT_ASP ) >>28 ; + dma_cap->estwid = (hw_cap &GMAC_HW_FEAT_ESTWID ) >>20 ; + dma_cap->estdep = (hw_cap &GMAC_HW_FEAT_ESTDEP ) >>17 ; + dma_cap->estsel = (hw_cap &GMAC_HW_FEAT_ESTSEL ) >>16 ; dma_cap->frpes = (hw_cap &GMAC_HW_FEAT_FRPES ) >>13 ; dma_cap->frpbs = (hw_cap &GMAC_HW_FEAT_FRPBS ) >>11 ; dma_cap->frpsel = (hw_cap &GMAC_HW_FEAT_FRPSEL ) >>10 ;
drivers/net/ethernet/stmicro/stmmac/dwmac5.c +95 -0
98 lines not on this page · raw message
drivers/net/ethernet/stmicro/stmmac/dwmac5.h +19 -0
@@ -30,6 +30,23 @@#define MAC_PPSx_INTERVAL (x) (0x00000b88 + ((x) * 0x10))#define MAC_PPSx_WIDTH (x) (0x00000b8c + ((x) * 0x10)) +#define MTL_EST_CONTROL 0x00000c50 +#define PTOV GENMASK(31, 24) +#define PTOV_SHIFT 24 +#define SSWL BIT(1) +#define EEST BIT(0) +#define MTL_EST_GCL_CONTROL 0x00000c80 +#define BTR_LOW 0x0 +#define BTR_HIGH 0x1 +#define CTR_LOW 0x2 +#define CTR_HIGH 0x3 +#define TER 0x4 +#define LLR 0x5 +#define ADDR_SHIFT 8 +#define GCRR BIT(2) +#define SRWO BIT(0) +#define MTL_EST_GCL_DATA 0x00000c84 +#define MTL_RXP_CONTROL_STATUS 0x00000ca0#define RXPI BIT(31)#define NPE GENMASK(23, 16)
@@ -83,5 +100,7 @@ int dwmac5_rxp_config(void __iomem *ioaddr, struct stmmac_tc_entry *entries,int dwmac5_flex_pps_config (void __iomem *ioaddr,int index,struct stmmac_pps_cfg *cfg,bool enable,u32 sub_second_inc,u32 systime_flags); +int dwmac5_est_configure (void __iomem *ioaddr,struct stmmac_est *cfg, +unsigned int ptp_rate);#endif /* __DWMAC5_H__ */
drivers/net/ethernet/stmicro/stmmac/hwif.h +5 -0
@@ -276,6 +276,7 @@ struct stmmac_safety_stats;struct stmmac_tc_entry ;struct stmmac_pps_cfg ;struct stmmac_rss ; +struct stmmac_est ;/* Helpers to program the MAC core */ struct stmmac_ops {
@@ -373,6 +374,8 @@ struct stmmac_ops { bool en, bool udp, bool sa, bool inv, u32 match);void (*set_arp_offload)(struct mac_device_info *hw,bool en,u32 addr); +int (*est_configure)(void __iomem *ioaddr,struct stmmac_est *cfg, +unsigned int ptp_rate); }; #define stmmac_core_init(__priv, __args...) \
@@ -459,6 +462,8 @@ struct stmmac_ops { stmmac_do_callback(__priv, mac, config_l4_filter, __args) #define stmmac_set_arp_offload(__priv, __args...) \ stmmac_do_void_callback(__priv, mac, set_arp_offload, __args) +#define stmmac_est_configure(__priv, __args...) \ + stmmac_do_callback(__priv, mac, est_configure, __args)/* PTP and HW Timer helpers */ struct stmmac_hwtimestamp {
include/linux/stmmac.h +11 -0
@@ -109,6 +109,16 @@ struct stmmac_axi {bool axi_rb; }; +#define EST_GCL 1024 +struct stmmac_est { +int enable; +u32 btr[2 ]; +u32 ctr[2 ]; +u32 ter; +u32 gcl[EST_GCL ]; +u32 gcl_size; +}; +struct stmmac_rxq_cfg {u8 mode_to_use;u32 chan;
@@ -139,6 +149,7 @@ struct plat_stmmacenet_data {struct device_node *phylink_node;struct device_node *mdio_node;struct stmmac_dma_cfg *dma_cfg; +struct stmmac_est *est;int clk_csr;int has_gmac;int enh_desc;
Signature · 1 line
2.7.4
PATCH v2 1/7 net: stmmac: Print more information in DebugFS DMA Capabilities file
In reply to Jose AbreuDMA Capabilites have grown but the DebugFS that shows this info has not been updated. Lets add the missing information.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 31 ++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +30 -1
@@ -4238,9 +4238,38 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v) priv->dma_cap.number_rx_channel);seq_printf (seq,"\tNumber of Additional TX channel: %d\n" , priv->dma_cap.number_tx_channel); +seq_printf (seq,"\tNumber of Additional RX queues: %d\n" , + priv->dma_cap.number_rx_queues); +seq_printf (seq,"\tNumber of Additional TX queues: %d\n" , + priv->dma_cap.number_tx_queues);seq_printf (seq,"\tEnhanced descriptors: %s\n" , (priv->dma_cap.enh_desc) ?"Y" :"N" ); - +seq_printf (seq,"\tTX Fifo Size: %d\n" , priv->dma_cap.tx_fifo_size); +seq_printf (seq,"\tRX Fifo Size: %d\n" , priv->dma_cap.rx_fifo_size); +seq_printf (seq,"\tHash Table Size: %d\n" , priv->dma_cap.hash_tb_sz); +seq_printf (seq,"\tTSO: %s\n" , priv->dma_cap.tsoen ?"Y" :"N" ); +seq_printf (seq,"\tNumber of PPS Outputs: %d\n" , + priv->dma_cap.pps_out_num); +seq_printf (seq,"\tSafety Features: %s\n" , + priv->dma_cap.asp ?"Y" :"N" ); +seq_printf (seq,"\tFlexible RX Parser: %s\n" , + priv->dma_cap.frpsel ?"Y" :"N" ); +seq_printf (seq,"\tEnhanced Addressing: %d\n" , + priv->dma_cap.addr64); +seq_printf (seq,"\tReceive Side Scaling: %s\n" , + priv->dma_cap.rssen ?"Y" :"N" ); +seq_printf (seq,"\tVLAN Hash Filtering: %s\n" , + priv->dma_cap.vlhash ?"Y" :"N" ); +seq_printf (seq,"\tSplit Header: %s\n" , + priv->dma_cap.sphen ?"Y" :"N" ); +seq_printf (seq,"\tVLAN TX Insertion: %s\n" , + priv->dma_cap.vlins ?"Y" :"N" ); +seq_printf (seq,"\tDouble VLAN: %s\n" , + priv->dma_cap.dvlan ?"Y" :"N" ); +seq_printf (seq,"\tNumber of L3/L4 Filters: %d\n" , + priv->dma_cap.l3l4fnum); +seq_printf (seq,"\tARP Offloading: %s\n" , + priv->dma_cap.arpoffsel ?"Y" :"N" );return 0 ; }DEFINE_SHOW_ATTRIBUTE (stmmac_dma_cap);
Signature · 1 line
2.7.4
PATCH v2 4/7 net: stmmac: Always use TX coalesce timer value when rescheduling
In reply to Jose AbreuWhen we have pending packets we re-arm the TX timer with a magic value.
This changes the re-arm of the timer from 10us to the user-defined coalesce value. As we support different speeds, having a magic value of 10us can be either too short or to large depending on the speed so we let user configure it. The default value of the timer is 1ms but it can be reconfigured by ethtool.
Changes from v1:
- Reword commit message (Jakub)
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -1975,7 +1975,7 @@ static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue)/* We still have pending packets, let's call for a new scheduling */ if (tx_q->dirty_tx != tx_q->cur_tx) -mod_timer (&tx_q->txtimer,STMMAC_COAL_TIMER (10 )); +mod_timer (&tx_q->txtimer,STMMAC_COAL_TIMER (priv->tx_coal_timer));__netif_tx_unlock_bh (netdev_get_tx_queue (priv->dev, queue));
Signature · 7 lines
2.7.4 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v2 2/7 net: stmmac: Always arm TX Timer at end of transmission start
In reply to Jose AbreuIf TX Coalesce timer is enabled we should always arm it, otherwise we may hit the case where an interrupt is missed and the TX Queue will timeout.
Arming the timer does not necessarly mean it will run the tx_clean() because this function is wrapped around NAPI launcher.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -4
@@ -3053,8 +3053,6 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) tx_q->tx_count_frames =0 ;stmmac_set_tx_ic (priv, desc); priv->xstats.tx_set_ic_bit++; - }else { -stmmac_tx_timer_arm (priv, queue); }/* We've used all descriptors we need for this skb, however,
@@ -3125,6 +3123,7 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) tx_q->tx_tail_addr = tx_q->dma_tx_phy + (tx_q->cur_tx *sizeof (*desc));stmmac_set_tx_tail_ptr (priv, priv->ioaddr, tx_q->tx_tail_addr, queue); +stmmac_tx_timer_arm (priv, queue);return NETDEV_TX_OK ;
@@ -3276,8 +3275,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) tx_q->tx_count_frames =0 ;stmmac_set_tx_ic (priv, desc); priv->xstats.tx_set_ic_bit++; - }else { -stmmac_tx_timer_arm (priv, queue); }/* We've used all descriptors we need for this skb, however,
@@ -3366,6 +3363,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) tx_q->tx_tail_addr = tx_q->dma_tx_phy + (tx_q->cur_tx *sizeof (*desc));stmmac_set_tx_tail_ptr (priv, priv->ioaddr, tx_q->tx_tail_addr, queue); +stmmac_tx_timer_arm (priv, queue);return NETDEV_TX_OK ;
Signature · 1 line
2.7.4
v2 cover net: stmmac: Improvements for -next
Improvements for stmmac.
1) Adds more information regarding HW Caps in the DebugFS file.
2) Prevents incostant bandwidth because of missed interrupts.
3) Allows interrupts to be independently enabled or disabled so that we don't have to schedule both TX and RX NAPIs.
4) Stops using a magic number in coalesce timer re-arm.
5) and 6) Implements the EST feature for GMAC5+ and XGMAC3+ cores which leads to 7) that integrates EST feature with TAPRIO API.
---
Cc: Giuseppe Cavallaro <[email protected]>
Cc: Alexandre Torgue <[email protected]>
Cc: Jose Abreu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Maxime Ripard <[email protected]>
Cc: Chen-Yu Tsai <[email protected]>
Cc: Maxime Coquelin <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
Jose Abreu (7):
net: stmmac: Print more information in DebugFS DMA Capabilities file
net: stmmac: Always arm TX Timer at end of transmission start
net: stmmac: Let TX and RX interrupts be independently
enabled/disabled
net: stmmac: Always use TX coalesce timer value when rescheduling
net: stmmac: Add basic EST support for GMAC5+
net: stmmac: Add basic EST support for XGMAC
net: stmmac: Integrate EST with TAPRIO scheduler API
drivers/net/ethernet/stmicro/stmmac/common.h | 4 + drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 24 ++++- drivers/net/ethernet/stmicro/stmmac/dwmac4.h | 9 ++ drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 2 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 3 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 11 ++- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 47 +++++++-- drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 95 ++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/dwmac5.h | 19 ++++ drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | 6 +- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 22 ++++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 21 ++++ .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 52 ++++++++++ drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 27 +++++- drivers/net/ethernet/stmicro/stmmac/hwif.h | 16 ++- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 96 ++++++++++++------ drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 108 +++++++++++++++++++++ include/linux/stmmac.h | 11 +++ 19 files changed, 519 insertions(+), 55 deletions(-)
Signature · 1 line
2.7.4
David Miller
maintainerRe: [PATCH net-next v2 2/7] net: stmmac: Always arm TX Timer at end of transmission start
In reply to Jose AbreuFrom: Jose Abreu <[email protected]>
Date: Tue, 17 Dec 2019 13:46:06 +0100
Quoted 8 lines
If TX Coalesce timer is enabled we should always arm it, otherwise we may hit the case where an interrupt is missed and the TX Queue will timeout.
Arming the timer does not necessarly mean it will run the
tx_clean()because this function is wrapped around NAPI launcher.Signed-off-by Jose Abreu <[email protected]>
This is a bug fix and thus appropriate for net not net-next.