Module Name:    src
Committed By:   ryo
Date:           Tue Aug 23 05:41:46 UTC 2022

Modified Files:
        src/sys/dev/ic: dwc_eqos.c dwc_eqos_reg.h

Log Message:
Fix eqos(4) to work on RK3588 as well.

- Several registers needed to be initialized
- Add some register definitions


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/ic/dwc_eqos.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/ic/dwc_eqos_reg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/dwc_eqos.c
diff -u src/sys/dev/ic/dwc_eqos.c:1.9 src/sys/dev/ic/dwc_eqos.c:1.10
--- src/sys/dev/ic/dwc_eqos.c:1.9	Sat Aug  6 17:53:49 2022
+++ src/sys/dev/ic/dwc_eqos.c	Tue Aug 23 05:41:46 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.9 2022/08/06 17:53:49 martin Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.10 2022/08/23 05:41:46 ryo Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -33,7 +33,7 @@
 #include "opt_net_mpsafe.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.9 2022/08/06 17:53:49 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.10 2022/08/23 05:41:46 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -552,7 +552,7 @@ eqos_init_locked(struct eqos_softc *sc)
 {
 	struct ifnet *ifp = &sc->sc_ec.ec_if;
 	struct mii_data *mii = &sc->sc_mii;
-	uint32_t val;
+	uint32_t val, tqs, rqs;
 
 	EQOS_ASSERT_LOCKED(sc);
 	EQOS_ASSERT_TXLOCKED(sc);
@@ -599,6 +599,24 @@ eqos_init_locked(struct eqos_softc *sc)
 	    GMAC_MTL_RXQ0_OPERATION_MODE_FEP |
 	    GMAC_MTL_RXQ0_OPERATION_MODE_FUP);
 
+	/*
+	 * TX/RX fifo size in hw_feature[1] are log2(n/128), and
+	 * TQS/RQS in TXQ0/RXQ0_OPERATION_MODE are n/256-1.
+	 */
+	tqs = (128 << __SHIFTOUT(sc->sc_hw_feature[1],
+	    GMAC_MAC_HW_FEATURE1_TXFIFOSIZE) / 256) - 1;
+	val = RD4(sc, GMAC_MTL_TXQ0_OPERATION_MODE);
+	val &= ~GMAC_MTL_TXQ0_OPERATION_MODE_TQS;
+	val |= __SHIFTIN(tqs, GMAC_MTL_TXQ0_OPERATION_MODE_TQS);
+	WR4(sc, GMAC_MTL_TXQ0_OPERATION_MODE, val);
+
+	rqs = (128 << __SHIFTOUT(sc->sc_hw_feature[1],
+	    GMAC_MAC_HW_FEATURE1_RXFIFOSIZE) / 256) - 1;
+	val = RD4(sc, GMAC_MTL_RXQ0_OPERATION_MODE);
+	val &= ~GMAC_MTL_RXQ0_OPERATION_MODE_RQS;
+	val |= __SHIFTIN(rqs, GMAC_MTL_RXQ0_OPERATION_MODE_RQS);
+	WR4(sc, GMAC_MTL_RXQ0_OPERATION_MODE, val);
+
 	/* Enable flow control */
 	val = RD4(sc, GMAC_MAC_Q0_TX_FLOW_CTRL);
 	val |= 0xFFFFU << GMAC_MAC_Q0_TX_FLOW_CTRL_PT_SHIFT;
@@ -608,6 +626,10 @@ eqos_init_locked(struct eqos_softc *sc)
 	val |= GMAC_MAC_RX_FLOW_CTRL_RFE;
 	WR4(sc, GMAC_MAC_RX_FLOW_CTRL, val);
 
+	/* set RX queue mode. must be in DCB mode. */
+	val = __SHIFTIN(GMAC_RXQ_CTRL0_EN_DCB, GMAC_RXQ_CTRL0_EN_MASK);
+	WR4(sc, GMAC_RXQ_CTRL0, val);
+
 	/* Enable transmitter and receiver */
 	val = RD4(sc, GMAC_MAC_CONFIGURATION);
 	val |= GMAC_MAC_CONFIGURATION_BE;

Index: src/sys/dev/ic/dwc_eqos_reg.h
diff -u src/sys/dev/ic/dwc_eqos_reg.h:1.4 src/sys/dev/ic/dwc_eqos_reg.h:1.5
--- src/sys/dev/ic/dwc_eqos_reg.h:1.4	Thu Mar 17 05:45:23 2022
+++ src/sys/dev/ic/dwc_eqos_reg.h	Tue Aug 23 05:41:46 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos_reg.h,v 1.4 2022/03/17 05:45:23 mrg Exp $ */
+/* $NetBSD: dwc_eqos_reg.h,v 1.5 2022/08/23 05:41:46 ryo Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -66,8 +66,10 @@
 #define	 GMAC_MAC_RX_FLOW_CTRL_RFE		(1U << 0)
 #define	GMAC_RXQ_CTRL0				0x00A0
 #define	 GMAC_RXQ_CTRL0_EN_MASK			0x3
+#define	 GMAC_RXQ_CTRL0_EN_AVB			0x1
 #define	 GMAC_RXQ_CTRL0_EN_DCB			0x2
 #define	GMAC_RXQ_CTRL1				0x00A4
+#define	GMAC_RXQ_CTRL2				0x00A8
 #define	GMAC_MAC_INTERRUPT_STATUS		0x00B0
 #define	GMAC_MAC_INTERRUPT_ENABLE		0x00B4
 #define	GMAC_MAC_RX_TX_STATUS			0x00B8
@@ -91,6 +93,8 @@
 #define	 GMAC_MAC_VERSION_SNPSVER_MASK		0xFFU
 #define	GMAC_MAC_DEBUG				0x0114
 #define	GMAC_MAC_HW_FEATURE(n)			(0x011C + 0x4 * (n))
+#define	 GMAC_MAC_HW_FEATURE1_TXFIFOSIZE	__BITS(10,6)
+#define	 GMAC_MAC_HW_FEATURE1_RXFIFOSIZE	__BITS(5,0)
 #define	 GMAC_MAC_HW_FEATURE1_ADDR64_SHIFT	14
 #define	 GMAC_MAC_HW_FEATURE1_ADDR64_MASK	(0x3U << GMAC_MAC_HW_FEATURE1_ADDR64_SHIFT)
 #define	 GMAC_MAC_HW_FEATURE1_ADDR64_32BIT	(0x0U << GMAC_MAC_HW_FEATURE1_ADDR64_SHIFT)
@@ -196,6 +200,8 @@
 #define	 GMAC_MTL_INTERRUPT_STATUS_DBGIS	(1U << 17)
 #define	 GMAC_MTL_INTERRUPT_STATUS_Q0IS		(1U << 0)
 #define	GMAC_MTL_TXQ0_OPERATION_MODE		0x0D00
+#define	 GMAC_MTL_TXQ0_OPERATION_MODE_TQS		__BITS(24,16)
+#define	 GMAC_MTL_TXQ0_OPERATION_MODE_TTC		__BITS(6,4)
 #define	 GMAC_MTL_TXQ0_OPERATION_MODE_TXQEN_SHIFT	2
 #define	 GMAC_MTL_TXQ0_OPERATION_MODE_TXQEN_MASK	(0x3U << GMAC_MTL_TXQ0_OPERATION_MODE_TXQEN_SHIFT)
 #define	 GMAC_MTL_TXQ0_OPERATION_MODE_TXQEN_EN		(2U << GMAC_MTL_TXQ0_OPERATION_MODE_TXQEN_SHIFT)
@@ -209,6 +215,10 @@
 #define	 GMAC_MTL_Q0_INTERRUPT_CTRL_STATUS_TXUIE	(1U << 8)
 #define	 GMAC_MTL_Q0_INTERRUPT_CTRL_STATUS_TXUNFIS	(1U << 0)
 #define	GMAC_MTL_RXQ0_OPERATION_MODE		0x0D30
+#define  GMAC_MTL_RXQ0_OPERATION_MODE_RQS		__BITS(29,20)
+#define  GMAC_MTL_RXQ0_OPERATION_MODE_RFD		__BITS(19,14)
+#define  GMAC_MTL_RXQ0_OPERATION_MODE_RFA		__BITS(13,8)
+#define	 GMAC_MTL_RXQ0_OPERATION_MODE_EHFC		(1U << 7)
 #define	 GMAC_MTL_RXQ0_OPERATION_MODE_RSF		(1U << 5)
 #define	 GMAC_MTL_RXQ0_OPERATION_MODE_FEP		(1U << 4)
 #define	 GMAC_MTL_RXQ0_OPERATION_MODE_FUP		(1U << 3)

Reply via email to