forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/drivers/net/ethernet/stmicro/stmmac/dwmac5.c
....@@ -550,3 +550,78 @@
550550 writel(val, ioaddr + MAC_PPS_CONTROL);
551551 return 0;
552552 }
553
+
554
+static int dwmac5_est_write(void __iomem *ioaddr, u32 reg, u32 val, bool gcl)
555
+{
556
+ u32 ctrl;
557
+
558
+ writel(val, ioaddr + MTL_EST_GCL_DATA);
559
+
560
+ ctrl = (reg << ADDR_SHIFT);
561
+ ctrl |= gcl ? 0 : GCRR;
562
+
563
+ writel(ctrl, ioaddr + MTL_EST_GCL_CONTROL);
564
+
565
+ ctrl |= SRWO;
566
+ writel(ctrl, ioaddr + MTL_EST_GCL_CONTROL);
567
+
568
+ return readl_poll_timeout(ioaddr + MTL_EST_GCL_CONTROL,
569
+ ctrl, !(ctrl & SRWO), 100, 5000);
570
+}
571
+
572
+int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg,
573
+ unsigned int ptp_rate)
574
+{
575
+ int i, ret = 0x0;
576
+ u32 ctrl;
577
+
578
+ ret |= dwmac5_est_write(ioaddr, BTR_LOW, cfg->btr[0], false);
579
+ ret |= dwmac5_est_write(ioaddr, BTR_HIGH, cfg->btr[1], false);
580
+ ret |= dwmac5_est_write(ioaddr, TER, cfg->ter, false);
581
+ ret |= dwmac5_est_write(ioaddr, LLR, cfg->gcl_size, false);
582
+ ret |= dwmac5_est_write(ioaddr, CTR_LOW, cfg->ctr[0], false);
583
+ ret |= dwmac5_est_write(ioaddr, CTR_HIGH, cfg->ctr[1], false);
584
+ if (ret)
585
+ return ret;
586
+
587
+ for (i = 0; i < cfg->gcl_size; i++) {
588
+ ret = dwmac5_est_write(ioaddr, i, cfg->gcl[i], true);
589
+ if (ret)
590
+ return ret;
591
+ }
592
+
593
+ ctrl = readl(ioaddr + MTL_EST_CONTROL);
594
+ ctrl &= ~PTOV;
595
+ ctrl |= ((1000000000 / ptp_rate) * 6) << PTOV_SHIFT;
596
+ if (cfg->enable)
597
+ ctrl |= EEST | SSWL;
598
+ else
599
+ ctrl &= ~EEST;
600
+
601
+ writel(ctrl, ioaddr + MTL_EST_CONTROL);
602
+ return 0;
603
+}
604
+
605
+void dwmac5_fpe_configure(void __iomem *ioaddr, u32 num_txq, u32 num_rxq,
606
+ bool enable)
607
+{
608
+ u32 value;
609
+
610
+ if (!enable) {
611
+ value = readl(ioaddr + MAC_FPE_CTRL_STS);
612
+
613
+ value &= ~EFPE;
614
+
615
+ writel(value, ioaddr + MAC_FPE_CTRL_STS);
616
+ return;
617
+ }
618
+
619
+ value = readl(ioaddr + GMAC_RXQ_CTRL1);
620
+ value &= ~GMAC_RXQCTRL_FPRQ;
621
+ value |= (num_rxq - 1) << GMAC_RXQCTRL_FPRQ_SHIFT;
622
+ writel(value, ioaddr + GMAC_RXQ_CTRL1);
623
+
624
+ value = readl(ioaddr + MAC_FPE_CTRL_STS);
625
+ value |= EFPE;
626
+ writel(value, ioaddr + MAC_FPE_CTRL_STS);
627
+}