Index | Thread | Search

From:
Martin Pieuchot <mpi@grenadille.net>
Subject:
Convert envy(4) to bus_dmamem_alloc_range(9)
To:
tech@openbsd.org
Date:
Thu, 4 Sep 2025 17:18:57 +0200

Download raw body.

Thread
Straightforward conversion.  I don't own any envy(4) and I'd greatly
appreciate a test.

ok?

Index: dev/pci/envy.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/envy.c,v
diff -u -p -r1.88 envy.c
--- dev/pci/envy.c	24 May 2024 06:02:53 -0000	1.88
+++ dev/pci/envy.c	4 Sep 2025 15:06:18 -0000
@@ -1811,6 +1811,8 @@ envy_allocm(void *self, int dir, size_t 
 	int err, wait;
 	struct envy_buf *buf;
 	bus_addr_t dma_addr;
+	bus_dma_segment_t seg;
+	int rseg;
 
 	buf = (dir == AUMODE_RECORD) ? &sc->ibuf : &sc->obuf;
 	if (buf->addr != NULL) {
@@ -1823,13 +1825,18 @@ envy_allocm(void *self, int dir, size_t 
 #define ENVY_ALIGN	4
 #define ENVY_MAXADDR	((1 << 28) - 1)
 
-	buf->addr = (caddr_t)uvm_km_kmemalloc_pla(kernel_map,
-	    uvm.kernel_object, buf->size, 0, UVM_KMF_NOWAIT, 0,
-	    (paddr_t)ENVY_MAXADDR, 0, 0, 1);
-	if (buf->addr == NULL) {
-		DPRINTF("%s: unable to alloc dma segment\n", DEVNAME(sc));
+	err = bus_dmamem_alloc_range(sc->pci_dmat, buf->size, 0, 0, &seg, 1,
+	    &rseg, BUS_DMA_NOWAIT, (bus_addr_t)0, (bus_addr_t)ENVY_MAXADDR);
+	if (err) {
+		DPRINTF("%s: dmamem_alloc_range failed %d", DEVNAME(sc), err);
 		goto err_ret;
 	}
+	err = bus_dmamem_map(sc->pci_dmat, &seg, rseg, buf->size, &buf->addr,
+	    BUS_DMA_NOWAIT);
+	if (err) {
+		DPRINTF("%s: dmamem_map failed %d\n", DEVNAME(sc), err);
+		goto err_unmap;
+	}
 	err = bus_dmamap_create(sc->pci_dmat, buf->size, 1, buf->size, 0,
 	    wait, &buf->map);
 	if (err) {
@@ -1855,7 +1862,7 @@ envy_allocm(void *self, int dir, size_t 
  err_destroy:
 	bus_dmamap_destroy(sc->pci_dmat, buf->map);
  err_unmap:
-	uvm_km_free(kernel_map, (vaddr_t)buf->addr, buf->size);
+	bus_dmamem_free(sc->pci_dmat, &seg, rseg);
  err_ret:
 	return NULL;
 }