Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: iwx 64-bit dma
To:
Chris Cappuccio <chris@nmedia.net>
Cc:
deraadt@openbsd.org, mvs@openbsd.org, brad@comstyle.com, tech@openbsd.org, stsp@openbsd.org
Date:
Fri, 31 Jul 2026 11:50:26 +0200

Download raw body.

Thread
  • Chris Cappuccio:

    iwx 64-bit dma

    • Mark Kettenis:

      iwx 64-bit dma

  • > Date: Thu, 30 Jul 2026 18:33:49 -0700
    > From: Chris Cappuccio <chris@nmedia.net>
    > 
    > Theo de Raadt [deraadt@openbsd.org] wrote:
    > > 
    > > The diff in question which adds BUS_DMA_64BIT is a declaration to
    > > the higher-level code that _all_ chipsets supported by this driver can
    > > work with 64 bit-addressable memory if the higher levels provide it.
    > > 
    > 
    > Linux iwlwifi has a 36-bit dma limit for older hardware. For the
    > AX200/201 and the AX210/211 it's 64-bit all the way. So iwx is
    > doing the right thing.
    > 
    > However, there is a bug with the AX200/201 dma engine crossing 32-bit
    > boundaries:
    > 
    > https://code.opensuse.org/kernel/kernel-source/blob/5377a688dcc5c526f0a5df6d91df22d8b4f2dce6/f/patches.suse/iwlwifi-pcie-extend-hardware-workaround-to-context-i.patch
    > 
    > To avoid triggering it, we'd need to do something like this with
    > any post-IOMMU addresses:
    > 
    > iwx_crosses_4g_boundary(struct iwx_softc *sc, bus_addr_t addr, bus_size_t len) {
    > 	if (sc->sc_device_family != IWX_DEVICE_FAMILY_22000)
    > 		return 0;
    > 
    > 	return (addr >> 32) != ((addr + len) >> 32);
    > }
    > ...
    > 	for (i = 0; i < map->dm_nsegs; i++) {
    > 		if (iwx_crosses_4g_boundary(sc, map->dm_segs[i].ds_addr,
    > 		    map->dm_segs[i].ds_len)) {
    > 			/* remap */
    > 		}
    > 	}
    
    The right way to solve that issue is to specify a non-zero boundary
    when calling bus_dmamap_create() to create the DMA map.
    
    
  • Chris Cappuccio:

    iwx 64-bit dma