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 <jmcne...@invisible.ca> @@ -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 <jmcne...@invisible.ca> @@ -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 <jmcne...@invisible.ca> @@ -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 <msai...@netbsd.org> @@ -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;