diff options
| author | Jose Abreu <Jose.Abreu@synopsys.com> | 2018-08-30 10:09:48 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-09-01 20:40:22 -0400 |
| commit | ec6ea8e3eee969fb4e04e86e7abc0e662262f443 (patch) | |
| tree | ab4dd01982eac56f815aa739433dcd950021a0bd | |
| parent | 531778d0e3a371f05442830df954bc6215f1c19e (diff) | |
net: stmmac: Add CBS support in XGMAC2
XGMAC2 uses the same CBS mechanism as GMAC5, only registers offset
changes. Lets use the same TC callbacks and implement the .config_cbs
callback in XGMAC2 core.
Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Joao Pinto <jpinto@synopsys.com>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 12 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 19 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 19 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/hwif.c | 2 |
4 files changed, 50 insertions, 2 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h index 0a80fa25afe3..d6bb953685fa 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | |||
| @@ -119,11 +119,23 @@ | |||
| 119 | #define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x))) | 119 | #define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x))) |
| 120 | #define XGMAC_TQS GENMASK(25, 16) | 120 | #define XGMAC_TQS GENMASK(25, 16) |
| 121 | #define XGMAC_TQS_SHIFT 16 | 121 | #define XGMAC_TQS_SHIFT 16 |
| 122 | #define XGMAC_Q2TCMAP GENMASK(10, 8) | ||
| 123 | #define XGMAC_Q2TCMAP_SHIFT 8 | ||
| 122 | #define XGMAC_TTC GENMASK(6, 4) | 124 | #define XGMAC_TTC GENMASK(6, 4) |
| 123 | #define XGMAC_TTC_SHIFT 4 | 125 | #define XGMAC_TTC_SHIFT 4 |
| 124 | #define XGMAC_TXQEN GENMASK(3, 2) | 126 | #define XGMAC_TXQEN GENMASK(3, 2) |
| 125 | #define XGMAC_TXQEN_SHIFT 2 | 127 | #define XGMAC_TXQEN_SHIFT 2 |
| 126 | #define XGMAC_TSF BIT(1) | 128 | #define XGMAC_TSF BIT(1) |
| 129 | #define XGMAC_MTL_TCx_ETS_CONTROL(x) (0x00001110 + (0x80 * (x))) | ||
| 130 | #define XGMAC_MTL_TCx_QUANTUM_WEIGHT(x) (0x00001118 + (0x80 * (x))) | ||
| 131 | #define XGMAC_MTL_TCx_SENDSLOPE(x) (0x0000111c + (0x80 * (x))) | ||
| 132 | #define XGMAC_MTL_TCx_HICREDIT(x) (0x00001120 + (0x80 * (x))) | ||
| 133 | #define XGMAC_MTL_TCx_LOCREDIT(x) (0x00001124 + (0x80 * (x))) | ||
| 134 | #define XGMAC_CC BIT(3) | ||
| 135 | #define XGMAC_TSA GENMASK(1, 0) | ||
| 136 | #define XGMAC_SP (0x0 << 0) | ||
| 137 | #define XGMAC_CBS (0x1 << 0) | ||
| 138 | #define XGMAC_ETS (0x2 << 0) | ||
| 127 | #define XGMAC_MTL_RXQ_OPMODE(x) (0x00001140 + (0x80 * (x))) | 139 | #define XGMAC_MTL_RXQ_OPMODE(x) (0x00001140 + (0x80 * (x))) |
| 128 | #define XGMAC_RQS GENMASK(25, 16) | 140 | #define XGMAC_RQS GENMASK(25, 16) |
| 129 | #define XGMAC_RQS_SHIFT 16 | 141 | #define XGMAC_RQS_SHIFT 16 |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c index d182f82f7b58..64b8cb88ea45 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | |||
| @@ -177,6 +177,23 @@ static void dwxgmac2_map_mtl_to_dma(struct mac_device_info *hw, u32 queue, | |||
| 177 | writel(value, ioaddr + reg); | 177 | writel(value, ioaddr + reg); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static void dwxgmac2_config_cbs(struct mac_device_info *hw, | ||
| 181 | u32 send_slope, u32 idle_slope, | ||
| 182 | u32 high_credit, u32 low_credit, u32 queue) | ||
| 183 | { | ||
| 184 | void __iomem *ioaddr = hw->pcsr; | ||
| 185 | u32 value; | ||
| 186 | |||
| 187 | writel(send_slope, ioaddr + XGMAC_MTL_TCx_SENDSLOPE(queue)); | ||
| 188 | writel(idle_slope, ioaddr + XGMAC_MTL_TCx_QUANTUM_WEIGHT(queue)); | ||
| 189 | writel(high_credit, ioaddr + XGMAC_MTL_TCx_HICREDIT(queue)); | ||
| 190 | writel(low_credit, ioaddr + XGMAC_MTL_TCx_LOCREDIT(queue)); | ||
| 191 | |||
| 192 | value = readl(ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue)); | ||
| 193 | value |= XGMAC_CC | XGMAC_CBS; | ||
| 194 | writel(value, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue)); | ||
| 195 | } | ||
| 196 | |||
| 180 | static int dwxgmac2_host_irq_status(struct mac_device_info *hw, | 197 | static int dwxgmac2_host_irq_status(struct mac_device_info *hw, |
| 181 | struct stmmac_extra_stats *x) | 198 | struct stmmac_extra_stats *x) |
| 182 | { | 199 | { |
| @@ -316,7 +333,7 @@ const struct stmmac_ops dwxgmac210_ops = { | |||
| 316 | .prog_mtl_tx_algorithms = dwxgmac2_prog_mtl_tx_algorithms, | 333 | .prog_mtl_tx_algorithms = dwxgmac2_prog_mtl_tx_algorithms, |
| 317 | .set_mtl_tx_queue_weight = NULL, | 334 | .set_mtl_tx_queue_weight = NULL, |
| 318 | .map_mtl_to_dma = dwxgmac2_map_mtl_to_dma, | 335 | .map_mtl_to_dma = dwxgmac2_map_mtl_to_dma, |
| 319 | .config_cbs = NULL, | 336 | .config_cbs = dwxgmac2_config_cbs, |
| 320 | .dump_regs = NULL, | 337 | .dump_regs = NULL, |
| 321 | .host_irq_status = dwxgmac2_host_irq_status, | 338 | .host_irq_status = dwxgmac2_host_irq_status, |
| 322 | .host_mtl_irq_status = dwxgmac2_host_mtl_irq_status, | 339 | .host_mtl_irq_status = dwxgmac2_host_mtl_irq_status, |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c index 20909036e002..6c5092e7771c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | |||
| @@ -182,6 +182,9 @@ static void dwxgmac2_dma_tx_mode(void __iomem *ioaddr, int mode, | |||
| 182 | value |= 0x7 << XGMAC_TTC_SHIFT; | 182 | value |= 0x7 << XGMAC_TTC_SHIFT; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* Use static TC to Queue mapping */ | ||
| 186 | value |= (channel << XGMAC_Q2TCMAP_SHIFT) & XGMAC_Q2TCMAP; | ||
| 187 | |||
| 185 | value &= ~XGMAC_TXQEN; | 188 | value &= ~XGMAC_TXQEN; |
| 186 | if (qmode != MTL_QUEUE_AVB) | 189 | if (qmode != MTL_QUEUE_AVB) |
| 187 | value |= 0x2 << XGMAC_TXQEN_SHIFT; | 190 | value |= 0x2 << XGMAC_TXQEN_SHIFT; |
| @@ -374,6 +377,21 @@ static void dwxgmac2_enable_tso(void __iomem *ioaddr, bool en, u32 chan) | |||
| 374 | writel(value, ioaddr + XGMAC_DMA_CH_TX_CONTROL(chan)); | 377 | writel(value, ioaddr + XGMAC_DMA_CH_TX_CONTROL(chan)); |
| 375 | } | 378 | } |
| 376 | 379 | ||
| 380 | static void dwxgmac2_qmode(void __iomem *ioaddr, u32 channel, u8 qmode) | ||
| 381 | { | ||
| 382 | u32 value = readl(ioaddr + XGMAC_MTL_TXQ_OPMODE(channel)); | ||
| 383 | |||
| 384 | value &= ~XGMAC_TXQEN; | ||
| 385 | if (qmode != MTL_QUEUE_AVB) { | ||
| 386 | value |= 0x2 << XGMAC_TXQEN_SHIFT; | ||
| 387 | writel(0, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(channel)); | ||
| 388 | } else { | ||
| 389 | value |= 0x1 << XGMAC_TXQEN_SHIFT; | ||
| 390 | } | ||
| 391 | |||
| 392 | writel(value, ioaddr + XGMAC_MTL_TXQ_OPMODE(channel)); | ||
| 393 | } | ||
| 394 | |||
| 377 | static void dwxgmac2_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan) | 395 | static void dwxgmac2_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan) |
| 378 | { | 396 | { |
| 379 | u32 value; | 397 | u32 value; |
| @@ -407,5 +425,6 @@ const struct stmmac_dma_ops dwxgmac210_dma_ops = { | |||
| 407 | .set_rx_tail_ptr = dwxgmac2_set_rx_tail_ptr, | 425 | .set_rx_tail_ptr = dwxgmac2_set_rx_tail_ptr, |
| 408 | .set_tx_tail_ptr = dwxgmac2_set_tx_tail_ptr, | 426 | .set_tx_tail_ptr = dwxgmac2_set_tx_tail_ptr, |
| 409 | .enable_tso = dwxgmac2_enable_tso, | 427 | .enable_tso = dwxgmac2_enable_tso, |
| 428 | .qmode = dwxgmac2_qmode, | ||
| 410 | .set_bfsize = dwxgmac2_set_bfsize, | 429 | .set_bfsize = dwxgmac2_set_bfsize, |
| 411 | }; | 430 | }; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ethernet/stmicro/stmmac/hwif.c index 357309a6d6a5..d9a34a4d08b3 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.c +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c | |||
| @@ -201,7 +201,7 @@ static const struct stmmac_hwif_entry { | |||
| 201 | .mac = &dwxgmac210_ops, | 201 | .mac = &dwxgmac210_ops, |
| 202 | .hwtimestamp = &stmmac_ptp, | 202 | .hwtimestamp = &stmmac_ptp, |
| 203 | .mode = NULL, | 203 | .mode = NULL, |
| 204 | .tc = NULL, | 204 | .tc = &dwmac510_tc_ops, |
| 205 | .setup = dwxgmac2_setup, | 205 | .setup = dwxgmac2_setup, |
| 206 | .quirks = NULL, | 206 | .quirks = NULL, |
| 207 | }, | 207 | }, |
