Skip to content

Commit 8572aec

Browse files
joabreudavem330
authored andcommitted
net: stmmac: Add basic EST support for XGMAC
Adds the support for EST in XGMAC cores. This feature allows to offload scheduling of queues opening time to the IP. Signed-off-by: Jose Abreu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 504723a commit 8572aec

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@
136136
#define XGMAC_HWFEAT_TXQCNT GENMASK(9, 6)
137137
#define XGMAC_HWFEAT_RXQCNT GENMASK(3, 0)
138138
#define XGMAC_HW_FEATURE3 0x00000128
139+
#define XGMAC_HWFEAT_ESTWID GENMASK(24, 23)
140+
#define XGMAC_HWFEAT_ESTDEP GENMASK(22, 20)
141+
#define XGMAC_HWFEAT_ESTSEL BIT(19)
139142
#define XGMAC_HWFEAT_ASP GENMASK(15, 14)
140143
#define XGMAC_HWFEAT_DVLAN BIT(13)
141144
#define XGMAC_HWFEAT_FRPES GENMASK(12, 11)
@@ -237,6 +240,22 @@
237240
#define XGMAC_TC_PRTY_MAP1 0x00001044
238241
#define XGMAC_PSTC(x) GENMASK((x) * 8 + 7, (x) * 8)
239242
#define XGMAC_PSTC_SHIFT(x) ((x) * 8)
243+
#define XGMAC_MTL_EST_CONTROL 0x00001050
244+
#define XGMAC_PTOV GENMASK(31, 23)
245+
#define XGMAC_PTOV_SHIFT 23
246+
#define XGMAC_SSWL BIT(1)
247+
#define XGMAC_EEST BIT(0)
248+
#define XGMAC_MTL_EST_GCL_CONTROL 0x00001080
249+
#define XGMAC_BTR_LOW 0x0
250+
#define XGMAC_BTR_HIGH 0x1
251+
#define XGMAC_CTR_LOW 0x2
252+
#define XGMAC_CTR_HIGH 0x3
253+
#define XGMAC_TER 0x4
254+
#define XGMAC_LLR 0x5
255+
#define XGMAC_ADDR_SHIFT 8
256+
#define XGMAC_GCRR BIT(2)
257+
#define XGMAC_SRWO BIT(0)
258+
#define XGMAC_MTL_EST_GCL_DATA 0x00001084
240259
#define XGMAC_MTL_RXP_CONTROL_STATUS 0x000010a0
241260
#define XGMAC_RXPI BIT(31)
242261
#define XGMAC_NPE GENMASK(23, 16)

drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,6 +1359,57 @@ static void dwxgmac2_set_arp_offload(struct mac_device_info *hw, bool en,
13591359
writel(value, ioaddr + XGMAC_RX_CONFIG);
13601360
}
13611361

1362+
static int dwxgmac3_est_write(void __iomem *ioaddr, u32 reg, u32 val, bool gcl)
1363+
{
1364+
u32 ctrl;
1365+
1366+
writel(val, ioaddr + XGMAC_MTL_EST_GCL_DATA);
1367+
1368+
ctrl = (reg << XGMAC_ADDR_SHIFT);
1369+
ctrl |= gcl ? 0 : XGMAC_GCRR;
1370+
1371+
writel(ctrl, ioaddr + XGMAC_MTL_EST_GCL_CONTROL);
1372+
1373+
ctrl |= XGMAC_SRWO;
1374+
writel(ctrl, ioaddr + XGMAC_MTL_EST_GCL_CONTROL);
1375+
1376+
return readl_poll_timeout_atomic(ioaddr + XGMAC_MTL_EST_GCL_CONTROL,
1377+
ctrl, !(ctrl & XGMAC_SRWO), 100, 5000);
1378+
}
1379+
1380+
static int dwxgmac3_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg,
1381+
unsigned int ptp_rate)
1382+
{
1383+
int i, ret = 0x0;
1384+
u32 ctrl;
1385+
1386+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_BTR_LOW, cfg->btr[0], false);
1387+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_BTR_HIGH, cfg->btr[1], false);
1388+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_TER, cfg->ter, false);
1389+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_LLR, cfg->gcl_size, false);
1390+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_CTR_LOW, cfg->ctr[0], false);
1391+
ret |= dwxgmac3_est_write(ioaddr, XGMAC_CTR_HIGH, cfg->ctr[1], false);
1392+
if (ret)
1393+
return ret;
1394+
1395+
for (i = 0; i < cfg->gcl_size; i++) {
1396+
ret = dwxgmac3_est_write(ioaddr, i, cfg->gcl[i], true);
1397+
if (ret)
1398+
return ret;
1399+
}
1400+
1401+
ctrl = readl(ioaddr + XGMAC_MTL_EST_CONTROL);
1402+
ctrl &= ~XGMAC_PTOV;
1403+
ctrl |= ((1000000000 / ptp_rate) * 9) << XGMAC_PTOV_SHIFT;
1404+
if (cfg->enable)
1405+
ctrl |= XGMAC_EEST | XGMAC_SSWL;
1406+
else
1407+
ctrl &= ~XGMAC_EEST;
1408+
1409+
writel(ctrl, ioaddr + XGMAC_MTL_EST_CONTROL);
1410+
return 0;
1411+
}
1412+
13621413
const struct stmmac_ops dwxgmac210_ops = {
13631414
.core_init = dwxgmac2_core_init,
13641415
.set_mac = dwxgmac2_set_mac,
@@ -1402,6 +1453,7 @@ const struct stmmac_ops dwxgmac210_ops = {
14021453
.config_l3_filter = dwxgmac2_config_l3_filter,
14031454
.config_l4_filter = dwxgmac2_config_l4_filter,
14041455
.set_arp_offload = dwxgmac2_set_arp_offload,
1456+
.est_configure = dwxgmac3_est_configure,
14051457
};
14061458

14071459
int dwxgmac2_setup(struct stmmac_priv *priv)

drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,9 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr,
429429

430430
/* MAC HW feature 3 */
431431
hw_cap = readl(ioaddr + XGMAC_HW_FEATURE3);
432+
dma_cap->estwid = (hw_cap & XGMAC_HWFEAT_ESTWID) >> 23;
433+
dma_cap->estdep = (hw_cap & XGMAC_HWFEAT_ESTDEP) >> 20;
434+
dma_cap->estsel = (hw_cap & XGMAC_HWFEAT_ESTSEL) >> 19;
432435
dma_cap->asp = (hw_cap & XGMAC_HWFEAT_ASP) >> 14;
433436
dma_cap->dvlan = (hw_cap & XGMAC_HWFEAT_DVLAN) >> 13;
434437
dma_cap->frpes = (hw_cap & XGMAC_HWFEAT_FRPES) >> 11;

0 commit comments

Comments
 (0)