Module Name: src
Committed By: msaitoh
Date: Thu Oct 26 18:02:51 UTC 2023
Modified Files:
src/sys/dev/ic: dwc_eqos.c dwc_eqos_reg.h dwc_eqos_var.h
src/sys/dev/pci: if_eqos_pci.c
Log Message:
eqos(4): Set TX/RX DMA burst length to improve performance.
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/ic/dwc_eqos.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/ic/dwc_eqos_reg.h
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/ic/dwc_eqos_var.h
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/if_eqos_pci.c
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.26 src/sys/dev/ic/dwc_eqos.c:1.27
--- src/sys/dev/ic/dwc_eqos.c:1.26 Thu Oct 26 13:00:13 2023
+++ src/sys/dev/ic/dwc_eqos.c Thu Oct 26 18:02:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.26 2023/10/26 13:00:13 msaitoh Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.27 2023/10/26 18:02:50 msaitoh Exp $ */
/*-
* Copyright (c) 2022 Jared McNeill <[email protected]>
@@ -38,7 +38,7 @@
#include "opt_net_mpsafe.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.26 2023/10/26 13:00:13 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.27 2023/10/26 18:02:50 msaitoh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -612,12 +612,16 @@ eqos_init_locked(struct eqos_softc *sc)
val |= GMAC_DMA_CHAN0_CONTROL_PBLX8;
WR4(sc, GMAC_DMA_CHAN0_CONTROL, val);
val = RD4(sc, GMAC_DMA_CHAN0_TX_CONTROL);
+ val &= ~GMAC_DMA_CHAN0_TX_CONTROL_TXPBL_MASK;
+ val |= (sc->sc_dma_txpbl << GMAC_DMA_CHAN0_TX_CONTROL_TXPBL_SHIFT);
val |= GMAC_DMA_CHAN0_TX_CONTROL_OSP;
val |= GMAC_DMA_CHAN0_TX_CONTROL_START;
WR4(sc, GMAC_DMA_CHAN0_TX_CONTROL, val);
val = RD4(sc, GMAC_DMA_CHAN0_RX_CONTROL);
- val &= ~GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_MASK;
+ val &= ~(GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_MASK |
+ GMAC_DMA_CHAN0_RX_CONTROL_RXPBL_MASK);
val |= (MCLBYTES << GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_SHIFT);
+ val |= (sc->sc_dma_rxpbl << GMAC_DMA_CHAN0_RX_CONTROL_RXPBL_SHIFT);
val |= GMAC_DMA_CHAN0_RX_CONTROL_START;
WR4(sc, GMAC_DMA_CHAN0_RX_CONTROL, val);
@@ -1259,6 +1263,24 @@ eqos_get_eaddr(struct eqos_softc *sc, ui
}
static void
+eqos_get_dma_pbl(struct eqos_softc *sc)
+{
+ prop_dictionary_t prop = device_properties(sc->sc_dev);
+ uint32_t pbl;
+
+ /* Set default values. */
+ sc->sc_dma_txpbl = sc->sc_dma_rxpbl = EQOS_DMA_PBL_DEFAULT;
+
+ /* Get values from props. */
+ if (prop_dictionary_get_uint32(prop, "snps,pbl", &pbl) && pbl)
+ sc->sc_dma_txpbl = sc->sc_dma_rxpbl = pbl;
+ if (prop_dictionary_get_uint32(prop, "snps,txpbl", &pbl) && pbl)
+ sc->sc_dma_txpbl = pbl;
+ if (prop_dictionary_get_uint32(prop, "snps,rxpbl", &pbl) && pbl)
+ sc->sc_dma_rxpbl = pbl;
+}
+
+static void
eqos_axi_configure(struct eqos_softc *sc)
{
prop_dictionary_t prop = device_properties(sc->sc_dev);
@@ -1493,6 +1515,9 @@ eqos_attach(struct eqos_softc *sc)
return error;
}
+ /* Get DMA burst length */
+ eqos_get_dma_pbl(sc);
+
/* Configure AXI Bus mode parameters */
eqos_axi_configure(sc);
Index: src/sys/dev/ic/dwc_eqos_reg.h
diff -u src/sys/dev/ic/dwc_eqos_reg.h:1.7 src/sys/dev/ic/dwc_eqos_reg.h:1.8
--- src/sys/dev/ic/dwc_eqos_reg.h:1.7 Tue Oct 17 10:23:00 2023
+++ src/sys/dev/ic/dwc_eqos_reg.h Thu Oct 26 18:02:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos_reg.h,v 1.7 2023/10/17 10:23:00 msaitoh Exp $ */
+/* $NetBSD: dwc_eqos_reg.h,v 1.8 2023/10/26 18:02:50 msaitoh Exp $ */
/*-
* Copyright (c) 2022 Jared McNeill <[email protected]>
@@ -250,9 +250,13 @@
#define GMAC_DMA_CHAN0_CONTROL_DSL_MASK (0x7U << GMAC_DMA_CHAN0_CONTROL_DSL_SHIFT)
#define GMAC_DMA_CHAN0_CONTROL_PBLX8 (1U << 16)
#define GMAC_DMA_CHAN0_TX_CONTROL 0x1104
+#define GMAC_DMA_CHAN0_TX_CONTROL_TXPBL_SHIFT 16
+#define GMAC_DMA_CHAN0_TX_CONTROL_TXPBL_MASK (0x3FU << GMAC_DMA_CHAN0_TX_CONTROL_TXPBL_SHIFT)
#define GMAC_DMA_CHAN0_TX_CONTROL_OSP (1U << 4)
#define GMAC_DMA_CHAN0_TX_CONTROL_START (1U << 0)
#define GMAC_DMA_CHAN0_RX_CONTROL 0x1108
+#define GMAC_DMA_CHAN0_RX_CONTROL_RXPBL_SHIFT 16
+#define GMAC_DMA_CHAN0_RX_CONTROL_RXPBL_MASK (0x3FU << GMAC_DMA_CHAN0_RX_CONTROL_RXPBL_SHIFT)
#define GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_SHIFT 1
#define GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_MASK (0x3FFFU << GMAC_DMA_CHAN0_RX_CONTROL_RBSZ_SHIFT)
#define GMAC_DMA_CHAN0_RX_CONTROL_START (1U << 0)
Index: src/sys/dev/ic/dwc_eqos_var.h
diff -u src/sys/dev/ic/dwc_eqos_var.h:1.5 src/sys/dev/ic/dwc_eqos_var.h:1.6
--- src/sys/dev/ic/dwc_eqos_var.h:1.5 Mon Oct 23 15:29:38 2023
+++ src/sys/dev/ic/dwc_eqos_var.h Thu Oct 26 18:02:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos_var.h,v 1.5 2023/10/23 15:29:38 msaitoh Exp $ */
+/* $NetBSD: dwc_eqos_var.h,v 1.6 2023/10/26 18:02:50 msaitoh Exp $ */
/*-
* Copyright (c) 2022 Jared McNeill <[email protected]>
@@ -36,6 +36,7 @@
#include <dev/ic/dwc_eqos_reg.h>
#define EQOS_DMA_DESC_COUNT 256
+#define EQOS_DMA_PBL_DEFAULT 8
struct eqos_bufmap {
bus_dmamap_t map;
@@ -60,8 +61,9 @@ struct eqos_softc {
int sc_phy_id;
uint32_t sc_csr_clock;
uint32_t sc_clock_range;
-
uint32_t sc_hw_feature[4];
+ uint32_t sc_dma_txpbl;
+ uint32_t sc_dma_rxpbl;
struct ethercom sc_ec;
struct mii_data sc_mii;
Index: src/sys/dev/pci/if_eqos_pci.c
diff -u src/sys/dev/pci/if_eqos_pci.c:1.1 src/sys/dev/pci/if_eqos_pci.c:1.2
--- src/sys/dev/pci/if_eqos_pci.c:1.1 Fri Oct 20 10:09:43 2023
+++ src/sys/dev/pci/if_eqos_pci.c Thu Oct 26 18:02:51 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_eqos_pci.c,v 1.1 2023/10/20 10:09:43 msaitoh Exp $ */
+/* $NetBSD: if_eqos_pci.c,v 1.2 2023/10/26 18:02:51 msaitoh Exp $ */
/*-
* Copyright (c) 2023 Masanobu SAITOH <[email protected]>
@@ -35,7 +35,7 @@
#include "opt_net_mpsafe.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_eqos_pci.c,v 1.1 2023/10/20 10:09:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_eqos_pci.c,v 1.2 2023/10/26 18:02:51 msaitoh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -105,6 +105,7 @@ eqos_pci_attach(device_t parent, device_
struct pci_attach_args *pa =aux;
const pci_chipset_tag_t pc = pa->pa_pc;
const pcitag_t tag = pa->pa_tag;
+ prop_dictionary_t prop;
bus_space_tag_t memt;
bus_space_handle_t memh;
int counts[PCI_INTR_TYPE_SIZE];
@@ -112,6 +113,7 @@ eqos_pci_attach(device_t parent, device_
bus_size_t memsize;
pcireg_t memtype;
const char *intrstr;
+ uint32_t dma_pbl = 0;
psc->sc_pc = pc;
psc->sc_tag = tag;
@@ -126,6 +128,7 @@ eqos_pci_attach(device_t parent, device_
sc->sc_dev = self;
sc->sc_bst = memt;
sc->sc_bsh = memh;
+ prop = device_properties(sc->sc_dev);
#if 0 /* I don't know why dmat64 doesn't work... */
if (pci_dma64_available(pa)) {
@@ -142,6 +145,7 @@ eqos_pci_attach(device_t parent, device_
switch (psc->sc_pcidevid) {
case PCI_PRODUCT_INTEL_EHL_ETH:
sc->sc_csr_clock = 204800000;
+ dma_pbl = 32;
break;
case PCI_PRODUCT_INTEL_EHL_PSE_ETH_0_RGMII:
case PCI_PRODUCT_INTEL_EHL_PSE_ETH_1_RGMII:
@@ -150,10 +154,21 @@ eqos_pci_attach(device_t parent, device_
case PCI_PRODUCT_INTEL_EHL_PSE_ETH_0_SGMII_2_5G:
case PCI_PRODUCT_INTEL_EHL_PSE_ETH_1_SGMII_2_5G:
sc->sc_csr_clock = 200000000;
+ dma_pbl = 32;
break;
+#if 0
+ case PCI_PRODUCT_INTEL_QUARTK_ETH:
+ dma_pbl = 16;
+#endif
default:
sc->sc_csr_clock = 200000000; /* XXX */
}
+ /* Defaults */
+ if (dma_pbl != 0) {
+ prop = device_properties(sc->sc_dev);
+ prop_dictionary_set_uint32(prop, "snps,pbl", dma_pbl);
+ }
+
if (eqos_attach(sc) != 0) {
aprint_error_dev(sc->sc_dev, "failed in eqos_attach()\n");
return;