From: Mark Kettenis Subject: Re: ix 64 bit dma To: Alexander Bluhm Cc: tech@openbsd.org Date: Thu, 26 Feb 2026 21:22:00 +0100 > Date: Thu, 26 Feb 2026 20:38:56 +0100 > From: Alexander Bluhm > > Hi, > > I have tested ix(4) with 64 bit dma. I found these versions in my > lab. > > ix0 at pci3 dev 0 function 0 "Intel 82598AF" rev 0x01, msix, 4 queues, address 00:1b:21:0d:db:8f > ix1 at pci4 dev 0 function 0 "Intel 82599" rev 0x01, msix, 4 queues, address 00:1b:21:c5:19:50 > ix3 at pci10 dev 0 function 0 "Intel X540T" rev 0x01, msix, 4 queues, address a0:36:9f:1d:fe:9c > > Brad Smith pointed out that ixv(4) is also affected by this diff. > I don't have a setup for that, but I guess it makes no difference. > > ok? PCIe hardware and Linux agrees. ok kettenis@ > Index: dev/pci/if_ix.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_ix.c,v > diff -u -p -r1.222 if_ix.c > --- dev/pci/if_ix.c 11 Nov 2025 17:43:18 -0000 1.222 > +++ dev/pci/if_ix.c 26 Feb 2026 10:38:40 -0000 > @@ -2087,7 +2087,7 @@ ixgbe_dma_malloc(struct ix_softc *sc, bu > > dma->dma_tag = os->os_pa.pa_dmat; > r = bus_dmamap_create(dma->dma_tag, size, 1, > - size, 0, BUS_DMA_NOWAIT, &dma->dma_map); > + size, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT, &dma->dma_map); > if (r != 0) { > printf("%s: ixgbe_dma_malloc: bus_dmamap_create failed; " > "error %u\n", ifp->if_xname, r); > @@ -2095,7 +2095,7 @@ ixgbe_dma_malloc(struct ix_softc *sc, bu > } > > r = bus_dmamem_alloc(dma->dma_tag, size, PAGE_SIZE, 0, &dma->dma_seg, > - 1, &dma->dma_nseg, BUS_DMA_NOWAIT); > + 1, &dma->dma_nseg, BUS_DMA_NOWAIT | BUS_DMA_64BIT); > if (r != 0) { > printf("%s: ixgbe_dma_malloc: bus_dmamem_alloc failed; " > "error %u\n", ifp->if_xname, r); > @@ -2293,11 +2293,11 @@ ixgbe_allocate_transmit_buffers(struct i > txbuf = &txr->tx_buffers[i]; > error = bus_dmamap_create(txr->txdma.dma_tag, MAXMCLBYTES, > sc->num_segs, PAGE_SIZE, 0, > - BUS_DMA_NOWAIT, &txbuf->map); > + BUS_DMA_NOWAIT | BUS_DMA_64BIT, &txbuf->map); > > if (error != 0) { > - printf("%s: Unable to create TX DMA map\n", > - ifp->if_xname); > + printf("%s: Unable to create TX DMA map, error %d\n", > + ifp->if_xname, error); > goto fail; > } > } > @@ -2776,10 +2776,10 @@ ixgbe_allocate_receive_buffers(struct ix > rxbuf = rxr->rx_buffers; > for (i = 0; i < sc->num_rx_desc; i++, rxbuf++) { > error = bus_dmamap_create(rxr->rxdma.dma_tag, 16 * 1024, 1, > - 16 * 1024, 0, BUS_DMA_NOWAIT, &rxbuf->map); > + 16 * 1024, 0, BUS_DMA_NOWAIT | BUS_DMA_64BIT, &rxbuf->map); > if (error) { > - printf("%s: Unable to create Pack DMA map\n", > - ifp->if_xname); > + printf("%s: Unable to create RX DMA map, error %d\n", > + ifp->if_xname, error); > goto fail; > } > } > >