Module Name: src Committed By: thorpej Date: Sat Dec 2 15:50:57 UTC 2023
Modified Files: src/sys/arch/sun2/sun2: machdep.c Log Message: Use vmem(9) rather than extent(9) to manage DVMA mappings. To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/arch/sun2/sun2/machdep.c 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/sun2/sun2/machdep.c diff -u src/sys/arch/sun2/sun2/machdep.c:1.84 src/sys/arch/sun2/sun2/machdep.c:1.85 --- src/sys/arch/sun2/sun2/machdep.c:1.84 Tue Aug 17 22:00:31 2021 +++ src/sys/arch/sun2/sun2/machdep.c Sat Dec 2 15:50:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.84 2021/08/17 22:00:31 andvar Exp $ */ +/* $NetBSD: machdep.c,v 1.85 2023/12/02 15:50:57 thorpej Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -149,7 +149,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.84 2021/08/17 22:00:31 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.85 2023/12/02 15:50:57 thorpej Exp $"); #include "opt_ddb.h" #include "opt_fpu_emulate.h" @@ -164,7 +164,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v #include <sys/device.h> #include <sys/exec.h> #include <sys/exec_aout.h> /* for MID_* */ -#include <sys/extent.h> +#include <sys/vmem.h> #include <sys/file.h> #include <sys/ioctl.h> #include <sys/kcore.h> @@ -253,7 +253,7 @@ label_t *nofault; /* * dvmamap is used to manage DVMA memory. */ -static struct extent *dvmamap; +vmem_t *dvma_arena; /* Our private scratch page for dumping the MMU. */ static vaddr_t dumppage; @@ -351,10 +351,15 @@ cpu_startup(void) /* * Allocate DMA map for devices on the bus. */ - dvmamap = extent_create("dvmamap", - DVMA_MAP_BASE, DVMA_MAP_BASE + DVMA_MAP_AVAIL, - 0, 0, EX_NOWAIT); - if (dvmamap == NULL) + dvma_arena = vmem_create("dvmamap", DVMA_MAP_BASE, DVMA_MAP_AVAIL, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); + if (dvma_arena == NULL) panic("unable to allocate DVMA map"); /* @@ -801,7 +806,7 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu { struct vm_page *m; paddr_t pa; - bus_addr_t dva; + vmem_addr_t dva; bus_size_t sgsize; struct pglist *mlist; int pagesz = PAGE_SIZE; @@ -831,11 +836,17 @@ _bus_dmamap_load_raw(bus_dma_tag_t t, bu * Otherwise, we need virtual addresses in DVMA space. */ else { - error = extent_alloc(dvmamap, sgsize, pagesz, - map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 - ? EX_WAITOK : EX_NOWAIT, - (u_long *)&dva); + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(dvma_arena, sgsize, + 0, /* alignment */ + 0, /* phase */ + map->_dm_boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva); if (error) return (error); } @@ -878,7 +889,7 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm bus_size_t sgsize; vaddr_t va = (vaddr_t)buf; int pagesz = PAGE_SIZE; - bus_addr_t dva; + vmem_addr_t dva; pmap_t pmap; int rv __diagused; @@ -915,9 +926,17 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm */ sgsize = m68k_round_page(buflen + (va & (pagesz - 1))); - if (extent_alloc(dvmamap, sgsize, pagesz, map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 ? EX_WAITOK : EX_NOWAIT, - (u_long *)&dva) != 0) { + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + if (vmem_xalloc(dvma_arena, sgsize, + 0, /* alignment */ + 0, /* phase */ + map->_dm_boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva) != 0) { return (ENOMEM); } @@ -982,7 +1001,6 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ int flags = map->_dm_flags; bus_addr_t dva; bus_size_t len; - int s, error; if (nsegs != 1) panic("_bus_dmamem_unload: nsegs = %d", nsegs); @@ -1024,11 +1042,7 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ * This map was loaded using _bus_dmamap_load or * _bus_dmamap_load_raw for a non-24-bit device. */ - s = splhigh(); - error = extent_free(dvmamap, dva, len, EX_NOWAIT); - splx(s); - if (error != 0) - printf("warning: %ld of DVMA space lost\n", len); + vmem_xfree(dvma_arena, dva, len); } }