Module Name:    src
Committed By:   thorpej
Date:           Sat Dec  2 22:42:02 UTC 2023

Modified Files:
        src/sys/arch/dreamcast/dev/g2: gapspci_dma.c gapspcivar.h

Log Message:
Use vmem(9) rather than extent(9) to manage the GAPS PCI DMA buffer.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/dreamcast/dev/g2/gapspci_dma.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/dreamcast/dev/g2/gapspcivar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/dreamcast/dev/g2/gapspci_dma.c
diff -u src/sys/arch/dreamcast/dev/g2/gapspci_dma.c:1.20 src/sys/arch/dreamcast/dev/g2/gapspci_dma.c:1.21
--- src/sys/arch/dreamcast/dev/g2/gapspci_dma.c:1.20	Fri Jan 27 18:52:53 2012
+++ src/sys/arch/dreamcast/dev/g2/gapspci_dma.c	Sat Dec  2 22:42:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: gapspci_dma.c,v 1.20 2012/01/27 18:52:53 para Exp $	*/
+/*	$NetBSD: gapspci_dma.c,v 1.21 2023/12/02 22:42:02 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -32,20 +32,20 @@
 /*
  * Bus DMA implementation for the SEGA GAPS PCI bridge.
  *
- * NOTE: We only implement a small subset of what the bus_space(9)
+ * NOTE: We only implement a small subset of what the bus_dma(9)
  * API specifies.  Right now, the GAPS PCI bridge is only used for
  * the Dreamcast Broadband Adatper, so we only provide what the
  * pci(4) and rtk(4) drivers need.
  */
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: gapspci_dma.c,v 1.20 2012/01/27 18:52:53 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gapspci_dma.c,v 1.21 2023/12/02 22:42:02 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/mbuf.h>
-#include <sys/extent.h>
+#include <sys/vmem.h>
 #include <sys/malloc.h>
 #include <sys/bus.h>
 
@@ -105,11 +105,18 @@ gaps_dma_init(struct gaps_softc *sc)
 
 	/*
 	 * The GAPS PCI bridge has 32k of DMA memory.  We manage it
-	 * with an extent map.
+	 * with a vmem arena.
 	 */
-	sc->sc_dma_ex = extent_create("gaps dma",
-	    sc->sc_dmabase, sc->sc_dmabase + (sc->sc_dmasize - 1),
-	    NULL, 0, EX_WAITOK | EXF_NOCOALESCE);
+	sc->sc_dma_arena = vmem_create("gaps dma",
+				       sc->sc_dmabase,
+				       sc->sc_dmasize,
+				       1024 /* XXX */,	/* quantum */
+				       NULL,		/* allocfn */
+				       NULL,		/* freefn */
+				       NULL,		/* arg */
+				       0,		/* qcache_max */
+				       VM_SLEEP,
+				       IPL_VM);
 
 	if (bus_space_map(sc->sc_memt, sc->sc_dmabase, sc->sc_dmasize,
 	    0, &sc->sc_dma_memh) != 0)
@@ -169,12 +176,20 @@ gaps_dmamap_create(bus_dma_tag_t t, bus_
 	map->dm_maxsegsz = maxsegsz;
 
 	if (flags & BUS_DMA_ALLOCNOW) {
-		u_long res;
+		vmem_addr_t res;
 		int error;
 
-		error = extent_alloc(sc->sc_dma_ex, size, 1024 /* XXX */,
-		    map->_dm_boundary,
-		    (flags & BUS_DMA_NOWAIT) ? EX_NOWAIT : EX_WAITOK, &res);
+		const vm_flag_t vmflags = VM_BESTFIT |
+		    ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP);
+
+		error = vmem_xalloc(sc->sc_dma_arena, size,
+				    0,			/* alignment */
+				    0,			/* phase */
+				    0,			/* nocross */
+				    VMEM_ADDR_MIN,	/* minaddr */
+				    VMEM_ADDR_MAX,	/* maxaddr */
+				    vmflags,
+				    &res);
 		if (error) {
 			free(gmap, M_DEVBUF);
 			return error;
@@ -201,9 +216,8 @@ gaps_dmamap_destroy(bus_dma_tag_t t, bus
 	struct gaps_softc *sc = t->_cookie;
 
 	if (map->_dm_flags & BUS_DMA_ALLOCNOW) {
-		(void) extent_free(sc->sc_dma_ex,
-		    map->dm_segs[0].ds_addr,
-		    map->dm_mapsize, EX_NOWAIT);
+		vmem_xfree(sc->sc_dma_arena, map->dm_segs[0].ds_addr,
+		    map->dm_mapsize);
 	}
 	free(map, M_DMAMAP);
 }
@@ -214,7 +228,7 @@ gaps_dmamap_load(bus_dma_tag_t t, bus_dm
 {
 	struct gaps_softc *sc = t->_cookie;
 	struct gaps_dmamap *gmap = (void *) map;
-	u_long res;
+	vmem_addr_t res;
 	int error;
 
 	if ((map->_dm_flags & BUS_DMA_ALLOCNOW) == 0) {
@@ -234,9 +248,17 @@ gaps_dmamap_load(bus_dma_tag_t t, bus_dm
 	if (size > map->_dm_size)
 		return EINVAL;
 
-	error = extent_alloc(sc->sc_dma_ex, size, 1024 /* XXX */,
-	    map->_dm_boundary,
-	    (flags & BUS_DMA_NOWAIT) ? EX_NOWAIT : EX_WAITOK, &res);
+	const vm_flag_t vmflags = VM_BESTFIT |
+	    ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP);
+
+	error = vmem_xalloc(sc->sc_dma_arena, size,
+			    0,			/* alignment */
+			    0,			/* phase */
+			    map->_dm_boundary,	/* nocross */
+			    VMEM_ADDR_MIN,	/* minaddr */
+			    VMEM_ADDR_MAX,	/* maxaddr */
+			    vmflags,
+			    &res);
 	if (error)
 		return error;
 
@@ -258,7 +280,7 @@ gaps_dmamap_load_mbuf(bus_dma_tag_t t, b
 {
 	struct gaps_softc *sc = t->_cookie;
 	struct gaps_dmamap *gmap = (void *) map;
-	u_long res;
+	vmem_addr_t res;
 	int error;
 
 	if ((map->_dm_flags & BUS_DMA_ALLOCNOW) == 0) {
@@ -279,9 +301,17 @@ gaps_dmamap_load_mbuf(bus_dma_tag_t t, b
 	if (m0->m_pkthdr.len > map->_dm_size)
 		return EINVAL;
 
-	error = extent_alloc(sc->sc_dma_ex, m0->m_pkthdr.len, 1024 /* XXX */,
-	    map->_dm_boundary,
-	    (flags & BUS_DMA_NOWAIT) ? EX_NOWAIT : EX_WAITOK, &res);
+	const vm_flag_t vmflags = VM_BESTFIT |
+	    ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP);
+
+	error = vmem_xalloc(sc->sc_dma_arena, m0->m_pkthdr.len,
+			    0,			/* alignment */
+			    0,			/* phase */
+			    map->_dm_boundary,	/* nocross */
+			    VMEM_ADDR_MIN,	/* minaddr */
+			    VMEM_ADDR_MAX,	/* maxaddr */
+			    vmflags,
+			    &res);
 	if (error)
 		return error;
 
@@ -327,9 +357,8 @@ gaps_dmamap_unload(bus_dma_tag_t t, bus_
 	}
 
 	if ((map->_dm_flags & BUS_DMA_ALLOCNOW) == 0) {
-		(void) extent_free(sc->sc_dma_ex,
-		    map->dm_segs[0].ds_addr,
-		    map->dm_mapsize, EX_NOWAIT);
+		vmem_xfree(sc->sc_dma_arena, map->dm_segs[0].ds_addr,
+		    map->dm_mapsize);
 
 		map->dm_maxsegsz = map->_dm_maxmaxsegsz;
 		map->dm_mapsize = 0;

Index: src/sys/arch/dreamcast/dev/g2/gapspcivar.h
diff -u src/sys/arch/dreamcast/dev/g2/gapspcivar.h:1.3 src/sys/arch/dreamcast/dev/g2/gapspcivar.h:1.4
--- src/sys/arch/dreamcast/dev/g2/gapspcivar.h:1.3	Sun Nov 21 16:11:32 2010
+++ src/sys/arch/dreamcast/dev/g2/gapspcivar.h	Sat Dec  2 22:42:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: gapspcivar.h,v 1.3 2010/11/21 16:11:32 tsutsui Exp $	*/
+/*	$NetBSD: gapspcivar.h,v 1.4 2023/12/02 22:42:02 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2001 Marcus Comstedt
@@ -35,6 +35,8 @@
 #ifndef _DREAMCAST_GAPSPCIVAR_H_
 #define	_DREAMCAST_GAPSPCIVAR_H_
 
+#include <sys/vmem.h>
+
 struct gaps_softc {
 	device_t sc_dev;
 	bus_space_tag_t sc_memt;
@@ -45,7 +47,7 @@ struct gaps_softc {
 	struct dreamcast_bus_dma_tag sc_dmat;
 	paddr_t sc_dmabase;
 	size_t sc_dmasize;
-	struct extent *sc_dma_ex;
+	vmem_t *sc_dma_arena;
 };
 
 void	gaps_pci_init(struct gaps_softc *);

Reply via email to