From: Mark Kettenis Subject: Re: igc 64 bit dma To: Alexander Bluhm Cc: tech@openbsd.org Date: Tue, 24 Feb 2026 23:20:38 +0100 > Date: Tue, 24 Feb 2026 22:59:08 +0100 > From: Alexander Bluhm > > Hi, > > igc(4) also works for me with 64 bit DMA. Tested with > > igc1 at pci16 dev 0 function 0 "Intel I225-LM" rev 0x03, msix, 4 queues, address 24:5e:be:8f:0f:1d > > ok? ok kettenis@ > bluhm > > Index: dev/pci/if_igc.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_igc.c,v > diff -u -p -r1.30 if_igc.c > --- dev/pci/if_igc.c 17 Dec 2025 01:14:42 -0000 1.30 > +++ dev/pci/if_igc.c 24 Feb 2026 21:54:13 -0000 > @@ -737,11 +737,11 @@ igc_dma_malloc(struct igc_softc *sc, bus > > dma->dma_tag = os->os_pa.pa_dmat; > > - if (bus_dmamap_create(dma->dma_tag, size, 1, size, 0, BUS_DMA_NOWAIT, > - &dma->dma_map)) > + if (bus_dmamap_create(dma->dma_tag, size, 1, size, 0, > + BUS_DMA_NOWAIT | BUS_DMA_64BIT, &dma->dma_map)) > return 1; > if (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)) > goto destroy; > if (bus_dmamem_map(dma->dma_tag, &dma->dma_seg, dma->dma_nseg, size, > &dma->dma_vaddr, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) > @@ -1855,10 +1855,11 @@ igc_allocate_transmit_buffers(struct igc > for (i = 0; i < sc->num_tx_desc; i++) { > txbuf = &txr->tx_buffers[i]; > error = bus_dmamap_create(txr->txdma.dma_tag, IGC_TSO_SIZE, > - IGC_MAX_SCATTER, PAGE_SIZE, 0, BUS_DMA_NOWAIT, &txbuf->map); > + IGC_MAX_SCATTER, PAGE_SIZE, 0, > + BUS_DMA_NOWAIT | BUS_DMA_64BIT, &txbuf->map); > if (error != 0) { > - printf("%s: Unable to create TX DMA map\n", > - DEVNAME(sc)); > + printf("%s: Unable to create TX DMA map, error %d\n", > + DEVNAME(sc), error); > goto fail; > } > } > @@ -2161,10 +2162,10 @@ igc_allocate_receive_buffers(struct igc_ > for (i = 0; i < sc->num_rx_desc; i++, rxbuf++) { > error = bus_dmamap_create(rxr->rxdma.dma_tag, > sc->rx_mbuf_sz, 1, sc->rx_mbuf_sz, 0, > - BUS_DMA_NOWAIT, &rxbuf->map); > + BUS_DMA_NOWAIT | BUS_DMA_64BIT, &rxbuf->map); > if (error) { > - printf("%s: Unable to create RX DMA map\n", > - DEVNAME(sc)); > + printf("%s: Unable to create RX DMA map, error %d\n", > + DEVNAME(sc), error); > goto fail; > } > } > >