aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJose Abreu <Jose.Abreu@synopsys.com>2018-08-30 10:09:48 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-01 20:40:22 -0400
commitec6ea8e3eee969fb4e04e86e7abc0e662262f443 (patch)
treeab4dd01982eac56f815aa739433dcd950021a0bd
parent531778d0e3a371f05442830df954bc6215f1c19e (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.h12
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c19
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c19
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/hwif.c2
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
180static 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
180static int dwxgmac2_host_irq_status(struct mac_device_info *hw, 197static 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
380static 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
377static void dwxgmac2_set_bfsize(void __iomem *ioaddr, int bfsize, u32 chan) 395static 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 },