From: Brad Smith Subject: vmx 64-bit dma To: tech@openbsd.org Date: Fri, 13 Mar 2026 06:05:09 -0400 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;