Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
Re: em 64 bit dma
To:
tech@openbsd.org
Cc:
Mark Kettenis <kettenis@openbsd.org>
Date:
Tue, 3 Mar 2026 20:54:04 +0100

Download raw body.

Thread
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;