.. | .. |
---|
520 | 520 | return 0; |
---|
521 | 521 | } |
---|
522 | 522 | |
---|
523 | | - val |= PPSCMDx(index, 0x2); |
---|
524 | 523 | val |= TRGTMODSELx(index, 0x2); |
---|
525 | 524 | val |= PPSEN0; |
---|
| 525 | + writel(val, ioaddr + MAC_PPS_CONTROL); |
---|
526 | 526 | |
---|
527 | 527 | writel(cfg->start.tv_sec, ioaddr + MAC_PPSx_TARGET_TIME_SEC(index)); |
---|
528 | 528 | |
---|
.. | .. |
---|
547 | 547 | writel(period - 1, ioaddr + MAC_PPSx_WIDTH(index)); |
---|
548 | 548 | |
---|
549 | 549 | /* Finally, activate it */ |
---|
| 550 | + val |= PPSCMDx(index, 0x2); |
---|
550 | 551 | writel(val, ioaddr + MAC_PPS_CONTROL); |
---|
551 | 552 | return 0; |
---|
552 | 553 | } |
---|
| 554 | + |
---|
| 555 | +static int dwmac5_est_write(void __iomem *ioaddr, u32 reg, u32 val, bool gcl) |
---|
| 556 | +{ |
---|
| 557 | + u32 ctrl; |
---|
| 558 | + |
---|
| 559 | + writel(val, ioaddr + MTL_EST_GCL_DATA); |
---|
| 560 | + |
---|
| 561 | + ctrl = (reg << ADDR_SHIFT); |
---|
| 562 | + ctrl |= gcl ? 0 : GCRR; |
---|
| 563 | + |
---|
| 564 | + writel(ctrl, ioaddr + MTL_EST_GCL_CONTROL); |
---|
| 565 | + |
---|
| 566 | + ctrl |= SRWO; |
---|
| 567 | + writel(ctrl, ioaddr + MTL_EST_GCL_CONTROL); |
---|
| 568 | + |
---|
| 569 | + return readl_poll_timeout(ioaddr + MTL_EST_GCL_CONTROL, |
---|
| 570 | + ctrl, !(ctrl & SRWO), 100, 5000); |
---|
| 571 | +} |
---|
| 572 | + |
---|
| 573 | +int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg, |
---|
| 574 | + unsigned int ptp_rate) |
---|
| 575 | +{ |
---|
| 576 | + int i, ret = 0x0; |
---|
| 577 | + u32 ctrl; |
---|
| 578 | + |
---|
| 579 | + ret |= dwmac5_est_write(ioaddr, BTR_LOW, cfg->btr[0], false); |
---|
| 580 | + ret |= dwmac5_est_write(ioaddr, BTR_HIGH, cfg->btr[1], false); |
---|
| 581 | + ret |= dwmac5_est_write(ioaddr, TER, cfg->ter, false); |
---|
| 582 | + ret |= dwmac5_est_write(ioaddr, LLR, cfg->gcl_size, false); |
---|
| 583 | + ret |= dwmac5_est_write(ioaddr, CTR_LOW, cfg->ctr[0], false); |
---|
| 584 | + ret |= dwmac5_est_write(ioaddr, CTR_HIGH, cfg->ctr[1], false); |
---|
| 585 | + if (ret) |
---|
| 586 | + return ret; |
---|
| 587 | + |
---|
| 588 | + for (i = 0; i < cfg->gcl_size; i++) { |
---|
| 589 | + ret = dwmac5_est_write(ioaddr, i, cfg->gcl[i], true); |
---|
| 590 | + if (ret) |
---|
| 591 | + return ret; |
---|
| 592 | + } |
---|
| 593 | + |
---|
| 594 | + ctrl = readl(ioaddr + MTL_EST_CONTROL); |
---|
| 595 | + ctrl &= ~PTOV; |
---|
| 596 | + ctrl |= ((1000000000 / ptp_rate) * 6) << PTOV_SHIFT; |
---|
| 597 | + if (cfg->enable) |
---|
| 598 | + ctrl |= EEST | SSWL; |
---|
| 599 | + else |
---|
| 600 | + ctrl &= ~EEST; |
---|
| 601 | + |
---|
| 602 | + writel(ctrl, ioaddr + MTL_EST_CONTROL); |
---|
| 603 | + return 0; |
---|
| 604 | +} |
---|
| 605 | + |
---|
| 606 | +void dwmac5_fpe_configure(void __iomem *ioaddr, u32 num_txq, u32 num_rxq, |
---|
| 607 | + bool enable) |
---|
| 608 | +{ |
---|
| 609 | + u32 value; |
---|
| 610 | + |
---|
| 611 | + if (!enable) { |
---|
| 612 | + value = readl(ioaddr + MAC_FPE_CTRL_STS); |
---|
| 613 | + |
---|
| 614 | + value &= ~EFPE; |
---|
| 615 | + |
---|
| 616 | + writel(value, ioaddr + MAC_FPE_CTRL_STS); |
---|
| 617 | + return; |
---|
| 618 | + } |
---|
| 619 | + |
---|
| 620 | + value = readl(ioaddr + GMAC_RXQ_CTRL1); |
---|
| 621 | + value &= ~GMAC_RXQCTRL_FPRQ; |
---|
| 622 | + value |= (num_rxq - 1) << GMAC_RXQCTRL_FPRQ_SHIFT; |
---|
| 623 | + writel(value, ioaddr + GMAC_RXQ_CTRL1); |
---|
| 624 | + |
---|
| 625 | + value = readl(ioaddr + MAC_FPE_CTRL_STS); |
---|
| 626 | + value |= EFPE; |
---|
| 627 | + writel(value, ioaddr + MAC_FPE_CTRL_STS); |
---|
| 628 | +} |
---|