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 *);