Index | Thread | Search

From:
Brad Smith <brad@comstyle.com>
Subject:
vmx 64-bit dma
To:
tech@openbsd.org
Date:
Fri, 13 Mar 2026 06:05:09 -0400

Download raw body.

Thread
  • Brad Smith:

    vmx 64-bit dma

vmx(4) works with 64-bit DMA. Tested with

vmx0 at pci11 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 8 queues, address 00:0c:29:96:8e:d5


Index: if_vmx.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_vmx.c,v
retrieving revision 1.94
diff -u -p -u -p -U7 -r1.94 if_vmx.c
--- if_vmx.c	11 Nov 2025 17:43:18 -0000	1.94
+++ if_vmx.c	26 Feb 2026 01:06:35 -0000
@@ -611,15 +611,16 @@ vmxnet3_alloc_txring(struct vmxnet3_soft
 	if (vmx_dmamem_alloc(sc, &comp_ring->dmamem,
 	    NTXCOMPDESC * sizeof(comp_ring->txcd[0]), 512) != 0)
 		return -1;
 	comp_ring->txcd = VMX_DMA_KVA(&comp_ring->dmamem);
 
 	for (idx = 0; idx < NTXDESC; idx++) {
 		if (bus_dmamap_create(sc->sc_dmat, MAXMCLBYTES, NTXSEGS,
-		    VMXNET3_TX_LEN_M, 0, BUS_DMA_NOWAIT, &ring->dmap[idx]))
+		    VMXNET3_TX_LEN_M, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT,
+		    &ring->dmap[idx]))
 			return -1;
 	}
 
 	ts = tq->ts;
 	bzero(ts, sizeof *ts);
 	ts->npending = 0;
 	ts->intr_threshold = 1;
@@ -661,15 +662,16 @@ vmxnet3_alloc_rxring(struct vmxnet3_soft
 		ring = &rq->cmd_ring[i];
 		ring->sc = sc;
 		ring->rid = i;
 		mtx_init(&ring->mtx, IPL_NET);
 		timeout_set(&ring->refill, vmxnet3_rxfill_tick, ring);
 		for (idx = 0; idx < NRXDESC; idx++) {
 			if (bus_dmamap_create(sc->sc_dmat, JUMBO_LEN, 1,
-			    JUMBO_LEN, 0, BUS_DMA_NOWAIT, &ring->dmap[idx]))
+			    JUMBO_LEN, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT,
+			    &ring->dmap[idx]))
 				return -1;
 		}
 
 		ring->rs = rq->rs;
 		ring->rxh = (i == 0) ?
 		    VMXNET3_BAR0_RXH1(queue) : VMXNET3_BAR0_RXH2(queue);
 	}
@@ -1805,19 +1807,21 @@ vmxnet3_dma_allocmem(struct vmxnet3_soft
 {
 	bus_dma_tag_t t = sc->sc_dmat;
 	bus_dma_segment_t segs[1];
 	bus_dmamap_t map;
 	caddr_t va;
 	int n;
 
-	if (bus_dmamem_alloc(t, size, align, 0, segs, 1, &n, BUS_DMA_NOWAIT))
+	if (bus_dmamem_alloc(t, size, align, 0, segs, 1, &n,
+	    BUS_DMA_NOWAIT | BUS_DMA_64BIT))
 		return NULL;
 	if (bus_dmamem_map(t, segs, 1, size, &va, BUS_DMA_NOWAIT))
 		return NULL;
-	if (bus_dmamap_create(t, size, 1, size, 0, BUS_DMA_NOWAIT, &map))
+	if (bus_dmamap_create(t, size, 1, size, 0,
+	    BUS_DMA_NOWAIT | BUS_DMA_64BIT, &map))
 		return NULL;
 	if (bus_dmamap_load(t, map, va, size, NULL, BUS_DMA_NOWAIT))
 		return NULL;
 	bzero(va, size);
 	*pa = DMAADDR(map);
 	bus_dmamap_unload(t, map);
 	bus_dmamap_destroy(t, map);
@@ -1833,15 +1837,15 @@ vmx_dmamem_alloc(struct vmxnet3_softc *s
 	if (bus_dmamap_create(sc->sc_dmat, vdm->vdm_size, 1,
 	    vdm->vdm_size, 0,
 	    BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT,
 	    &vdm->vdm_map) != 0)
 		return (1);
 	if (bus_dmamem_alloc(sc->sc_dmat, vdm->vdm_size,
 	    align, 0, &vdm->vdm_seg, 1, &vdm->vdm_nsegs,
-	    BUS_DMA_WAITOK | BUS_DMA_ZERO) != 0)
+	    BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_64BIT) != 0)
 		goto destroy;
 	if (bus_dmamem_map(sc->sc_dmat, &vdm->vdm_seg, vdm->vdm_nsegs,
 	    vdm->vdm_size, &vdm->vdm_kva, BUS_DMA_WAITOK) != 0)
 		goto free;
 	if (bus_dmamap_load(sc->sc_dmat, vdm->vdm_map, vdm->vdm_kva,
 	    vdm->vdm_size, NULL, BUS_DMA_WAITOK) != 0)
 		goto unmap;