From 5e38d9e4832620a5b78ad5b5604311de0bed4316 Mon Sep 17 00:00:00 2001 From: Emmanuel Vadot Date: Sun, 22 Nov 2020 20:16:46 +0000 Subject: [PATCH] if_dwc: Correctly configure the DMA engine based on the fdt properties Do not hardcode what we setup for the DMA engine configuration but lookup the fdt properties and configuring accordingly. Use a default value of 8 for the burst dma length for both TX and RX, this is what we used for TX before. --- sys/dev/dwc/if_dwc.c | 25 +++++++++++++++++++------ sys/dev/dwc/if_dwc.h | 2 ++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/sys/dev/dwc/if_dwc.c b/sys/dev/dwc/if_dwc.c index cd0e48b3f689..7bbfac512996 100644 --- a/sys/dev/dwc/if_dwc.c +++ b/sys/dev/dwc/if_dwc.c @@ -1496,6 +1496,9 @@ dwc_attach(device_t dev) uint32_t reg; char *phy_mode; phandle_t node; + uint32_t txpbl, rxpbl; + bool nopblx8 = false; + bool fixed_burst = false; sc = device_get_softc(dev); sc->dev = dev; @@ -1513,6 +1516,15 @@ dwc_attach(device_t dev) OF_prop_free(phy_mode); } + if (OF_getencprop(node, "snps,txpbl", &txpbl, sizeof(uint32_t)) <= 0) + txpbl = 8; + if (OF_getencprop(node, "snps,rxpbl", &rxpbl, sizeof(uint32_t)) <= 0) + rxpbl = 8; + if (OF_hasprop(node, "snps,no-pbl-x8") == 1) + nopblx8 = true; + if (OF_hasprop(node, "snps,fixed-burst") == 1) + fixed_burst = true; + if (IF_DWC_INIT(dev) != 0) return (ENXIO); @@ -1550,12 +1562,13 @@ dwc_attach(device_t dev) return (ENXIO); } - if (sc->mactype != DWC_GMAC_EXT_DESC) { - reg = BUS_MODE_FIXEDBURST; - reg |= (BUS_MODE_PRIORXTX_41 << BUS_MODE_PRIORXTX_SHIFT); - } else - reg = (BUS_MODE_EIGHTXPBL); - reg |= (BUS_MODE_PBL_BEATS_8 << BUS_MODE_PBL_SHIFT); + reg = BUS_MODE_USP; + if (!nopblx8) + reg |= BUS_MODE_EIGHTXPBL; + reg |= (txpbl << BUS_MODE_PBL_SHIFT); + reg |= (rxpbl << BUS_MODE_RPBL_SHIFT); + if (fixed_burst) + reg |= BUS_MODE_FIXEDBURST; WRITE4(sc, BUS_MODE, reg); /* diff --git a/sys/dev/dwc/if_dwc.h b/sys/dev/dwc/if_dwc.h index 28290d139b55..d0ba813af8c0 100644 --- a/sys/dev/dwc/if_dwc.h +++ b/sys/dev/dwc/if_dwc.h @@ -220,6 +220,8 @@ /* DMA */ #define BUS_MODE 0x1000 #define BUS_MODE_EIGHTXPBL (1 << 24) /* Multiplies PBL by 8 */ +#define BUS_MODE_USP (1 << 23) +#define BUS_MODE_RPBL_SHIFT 17 /* Single block transfer size */ #define BUS_MODE_FIXEDBURST (1 << 16) #define BUS_MODE_PRIORXTX_SHIFT 14 #define BUS_MODE_PRIORXTX_41 3