Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: ix 64 bit dma
To:
Alexander Bluhm <bluhm@openbsd.org>
Cc:
tech@openbsd.org
Date:
Thu, 26 Feb 2026 21:22:00 +0100

Download raw body.

Thread
  • Alexander Bluhm:

    ix 64 bit dma

    • Mark Kettenis:

      ix 64 bit dma

> Date: Thu, 26 Feb 2026 20:38:56 +0100
> From: Alexander Bluhm <bluhm@openbsd.org>
> 
> 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;
>  		}
>  	}
> 
>