From: Alexander Bluhm Subject: Re: em 64 bit dma To: tech@openbsd.org Cc: Mark Kettenis Date: Tue, 3 Mar 2026 20:54:04 +0100 On Mon, Mar 02, 2026 at 08:22:31AM +0000, Vitaliy Makkoveev wrote: > > > > I only enable BUS_DMA_64BIT for PCIe. kettenis@ preferes the check this way. ok? Index: dev/pci/if_em.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_em.c,v diff -u -p -r1.379 if_em.c --- dev/pci/if_em.c 14 Jul 2025 11:52:43 -0000 1.379 +++ dev/pci/if_em.c 3 Mar 2026 19:46:42 -0000 @@ -534,6 +534,10 @@ em_attach(struct device *parent, struct sc->hw.min_frame_size = ETHER_MIN_LEN + ETHER_CRC_LEN; + em_get_bus_info(&sc->hw); + if (sc->hw.bus_type == em_bus_type_pci_express) + sc->sc_dmaflags |= BUS_DMA_64BIT; + if (em_allocate_desc_rings(sc) != 0) { printf("%s: Unable to allocate descriptor ring memory\n", DEVNAME(sc)); @@ -610,11 +614,10 @@ em_attach(struct device *parent, struct DEVNAME(sc)); /* Identify 82544 on PCI-X */ - em_get_bus_info(&sc->hw); if (sc->hw.bus_type == em_bus_type_pcix && sc->hw.mac_type == em_82544) sc->pcix_82544 = TRUE; - else + else sc->pcix_82544 = FALSE; sc->hw.icp_xxxx_is_link_up = FALSE; @@ -2158,12 +2161,13 @@ em_dma_malloc(struct em_softc *sc, bus_s int r; r = bus_dmamap_create(sc->sc_dmat, size, 1, - size, 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &dma->dma_map); + size, 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | sc->sc_dmaflags, + &dma->dma_map); if (r != 0) return (r); r = bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &dma->dma_seg, - 1, &dma->dma_nseg, BUS_DMA_WAITOK | BUS_DMA_ZERO); + 1, &dma->dma_nseg, BUS_DMA_WAITOK | BUS_DMA_ZERO | sc->sc_dmaflags); if (r != 0) goto destroy; @@ -2250,10 +2254,12 @@ em_setup_transmit_structures(struct em_s pkt = &que->tx.sc_tx_pkts_ring[i]; error = bus_dmamap_create(sc->sc_dmat, EM_TSO_SIZE, EM_MAX_SCATTER / (sc->pcix_82544 ? 2 : 1), - EM_TSO_SEG_SIZE, 0, BUS_DMA_NOWAIT, &pkt->pkt_map); + EM_TSO_SEG_SIZE, 0, + BUS_DMA_NOWAIT | sc->sc_dmaflags, + &pkt->pkt_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; } } @@ -2772,11 +2778,11 @@ em_allocate_receive_structures(struct em pkt = &que->rx.sc_rx_pkts_ring[i]; error = bus_dmamap_create(sc->sc_dmat, EM_MCLBYTES, 1, - EM_MCLBYTES, 0, BUS_DMA_NOWAIT, &pkt->pkt_map); + EM_MCLBYTES, 0, BUS_DMA_NOWAIT | sc->sc_dmaflags, + &pkt->pkt_map); if (error != 0) { - printf("%s: em_allocate_receive_structures: " - "bus_dmamap_create failed; error %u\n", - DEVNAME(sc), error); + printf("%s: Unable to create RX DMA map, " + "error %d\n", DEVNAME(sc), error); goto fail; } Index: dev/pci/if_em.h =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_em.h,v diff -u -p -r1.83 if_em.h --- dev/pci/if_em.h 16 Feb 2024 22:30:54 -0000 1.83 +++ dev/pci/if_em.h 3 Mar 2026 19:41:04 -0000 @@ -385,6 +385,7 @@ struct em_softc { struct arpcom sc_ac; bus_dma_tag_t sc_dmat; + int sc_dmaflags; struct em_hw hw;