From: Kevin Lo Subject: rge 64-bit dma To: tech@openbsd.org Date: Mon, 2 Mar 2026 11:01:32 +0800 Tested rge(4) with 64 bit dma: rge0 at pci4 dev 0 function 0 "Realtek RTL8125" rev 0x00: msix, address 00:13:3b:xx:xx:xx rge1 at pci6 dev 0 function 0 "Realtek RTL8125" rev 0x04: msix: RTL8125B, address 7c:b5:9b:xx:xx:xx rge2 at pci7 dev 0 function 0 "Realtek RTL8125" rev 0x0c: msix: RTL8125D, address 34:5a:60:xx:xx:xx rge0 at pci4 dev 0 function 0 "Realtek RTL8126" rev 0x01: msix, address 88:c9:b3:xx:xx:xx rge1 at pci5 dev 0 function 0 "Realtek RTL8127" rev 0x05: msix, address 1c:86:0b:xx:xx:xx ok? Index: sys/dev/pci/if_rge.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_rge.c,v diff -u -p -u -p -r1.42 if_rge.c --- sys/dev/pci/if_rge.c 26 Jan 2026 01:45:18 -0000 1.42 +++ sys/dev/pci/if_rge.c 2 Mar 2026 02:27:00 -0000 @@ -1102,7 +1102,8 @@ rge_allocmem(struct rge_softc *sc) /* Allocate DMA'able memory for the TX ring. */ error = bus_dmamap_create(sc->sc_dmat, RGE_TX_LIST_SZ, 1, - RGE_TX_LIST_SZ, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + RGE_TX_LIST_SZ, 0, + BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &q->q_tx.rge_tx_list_map); if (error) { printf("%s: can't create TX list map\n", sc->sc_dev.dv_xname); @@ -1110,7 +1111,7 @@ rge_allocmem(struct rge_softc *sc) } error = bus_dmamem_alloc(sc->sc_dmat, RGE_TX_LIST_SZ, RGE_ALIGN, 0, &q->q_tx.rge_tx_listseg, 1, &q->q_tx.rge_tx_listnseg, - BUS_DMA_NOWAIT| BUS_DMA_ZERO); + BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_64BIT); if (error) { printf("%s: can't alloc TX list\n", sc->sc_dev.dv_xname); return (error); @@ -1142,7 +1143,7 @@ rge_allocmem(struct rge_softc *sc) for (i = 0; i < RGE_TX_LIST_CNT; i++) { error = bus_dmamap_create(sc->sc_dmat, RGE_JUMBO_FRAMELEN, RGE_TX_NSEGS, RGE_JUMBO_FRAMELEN, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &q->q_tx.rge_txq[i].txq_dmamap); if (error) { printf("%s: can't create DMA map for TX\n", @@ -1153,7 +1154,8 @@ rge_allocmem(struct rge_softc *sc) /* Allocate DMA'able memory for the RX ring. */ error = bus_dmamap_create(sc->sc_dmat, RGE_RX_LIST_SZ, 1, - RGE_RX_LIST_SZ, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + RGE_RX_LIST_SZ, 0, + BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &q->q_rx.rge_rx_list_map); if (error) { printf("%s: can't create RX list map\n", sc->sc_dev.dv_xname); @@ -1161,7 +1163,7 @@ rge_allocmem(struct rge_softc *sc) } error = bus_dmamem_alloc(sc->sc_dmat, RGE_RX_LIST_SZ, RGE_ALIGN, 0, &q->q_rx.rge_rx_listseg, 1, &q->q_rx.rge_rx_listnseg, - BUS_DMA_NOWAIT| BUS_DMA_ZERO); + BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_64BIT); if (error) { printf("%s: can't alloc RX list\n", sc->sc_dev.dv_xname); return (error); @@ -1192,7 +1194,8 @@ rge_allocmem(struct rge_softc *sc) /* Create DMA maps for RX buffers. */ for (i = 0; i < RGE_RX_LIST_CNT; i++) { error = bus_dmamap_create(sc->sc_dmat, RGE_JUMBO_FRAMELEN, 1, - RGE_JUMBO_FRAMELEN, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, + RGE_JUMBO_FRAMELEN, 0, + BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &q->q_rx.rge_rxq[i].rxq_dmamap); if (error) { printf("%s: can't create DMA map for RX\n",