Module Name: src Committed By: thorpej Date: Fri Dec 1 23:56:30 UTC 2023
Modified Files: src/sys/arch/sun3/sun3: dvma.c src/sys/arch/sun3/sun3x: dvma.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.41 -r1.42 src/sys/arch/sun3/sun3/dvma.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/sun3/sun3x/dvma.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/sun3/sun3/dvma.c diff -u src/sys/arch/sun3/sun3/dvma.c:1.41 src/sys/arch/sun3/sun3/dvma.c:1.42 --- src/sys/arch/sun3/sun3/dvma.c:1.41 Thu Jun 1 02:45:07 2017 +++ src/sys/arch/sun3/sun3/dvma.c Fri Dec 1 23:56:30 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: dvma.c,v 1.41 2017/06/01 02:45:07 chs Exp $ */ +/* $NetBSD: dvma.c,v 1.42 2023/12/01 23:56:30 thorpej Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -30,14 +30,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.41 2017/06/01 02:45:07 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.42 2023/12/01 23:56:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/device.h> #include <sys/proc.h> #include <sys/malloc.h> -#include <sys/extent.h> +#include <sys/vmem.h> #include <sys/buf.h> #include <sys/vnode.h> #include <sys/core.h> @@ -60,7 +60,7 @@ __KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.4 #define DVMA_MAP_END (DVMA_MAP_BASE + DVMA_MAP_AVAIL) /* Extent map used by dvma_mapin/dvma_mapout */ -struct extent *dvma_extent; +vmem_t *dvma_arena; /* XXX: Might need to tune this... */ vsize_t dvma_segmap_size = 6 * NBSG; @@ -97,12 +97,17 @@ dvma_init(void) panic("dvma_init: unable to allocate DVMA segments"); /* - * Create the VM pool used for mapping whole segments + * Create the vmem arena used for mapping whole segments * into DVMA space for the purpose of data transfer. */ - dvma_extent = extent_create("dvma", segmap_addr, - segmap_addr + (dvma_segmap_size - 1), - NULL, 0, EX_NOCOALESCE|EX_NOWAIT); + dvma_arena = vmem_create("dvma", segmap_addr, dvma_segmap_size, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); } /* @@ -172,10 +177,11 @@ dvma_kvtopa(void *kva, int bustype) void * dvma_mapin(void *kva, int len, int canwait /* ignored */) { - vaddr_t seg_kva, seg_dma; + vaddr_t seg_kva; vsize_t seg_len, seg_off; vaddr_t v, x; int s, sme, error; + vmem_addr_t seg_dma; /* Get seg-aligned address and length. */ seg_kva = (vaddr_t)kva; @@ -184,31 +190,32 @@ dvma_mapin(void *kva, int len, int canwa seg_kva -= seg_off; seg_len = sun3_round_seg(seg_len + seg_off); - s = splvm(); - /* Allocate the DVMA segment(s) */ - error = extent_alloc(dvma_extent, seg_len, NBSG, 0, - EX_FAST | EX_NOWAIT | EX_MALLOCOK, &seg_dma); - if (error) { - splx(s); + const vm_flag_t vmflags = VM_INSTANTFIT | + (/* canwait ? VM_SLEEP : */ VM_NOSLEEP); + + error = vmem_xalloc(dvma_arena, seg_len, + NBSG, /* alignment */ + 0, /* phase */ + 0, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &seg_dma); + if (error) return NULL; - } -#ifdef DIAGNOSTIC - if (seg_dma & SEGOFSET) - panic("dvma_mapin: seg not aligned"); -#endif + KASSERT((seg_dma & SEGOFSET) == 0); + + s = splvm(); /* Duplicate the mappings into DMA space. */ v = seg_kva; x = seg_dma; while (seg_len > 0) { sme = get_segmap(v); -#ifdef DIAGNOSTIC - if (sme == SEGINV) - panic("dvma_mapin: seg not mapped"); -#endif + KASSERT(sme != SEGINV); #ifdef HAVECACHE /* flush write-back on old mappings */ if (cache_size) @@ -253,10 +260,7 @@ dvma_mapout(void *dma, int len) x = v + seg_len; while (v < x) { sme = get_segmap(v); -#ifdef DIAGNOSTIC - if (sme == SEGINV) - panic("dvma_mapout: seg not mapped"); -#endif + KASSERT(sme != SEGINV); #ifdef HAVECACHE /* flush write-back on the DVMA mappings */ if (cache_size) @@ -266,11 +270,9 @@ dvma_mapout(void *dma, int len) v += NBSG; } - if (extent_free(dvma_extent, seg_dma, seg_len, - EX_NOWAIT | EX_MALLOCOK)) - panic("dvma_mapout: unable to free 0x%lx,0x%lx", - seg_dma, seg_len); splx(s); + + vmem_xfree(dvma_arena, seg_dma, seg_len); } int @@ -285,11 +287,12 @@ int _bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf, bus_size_t buflen, struct proc *p, int flags) { - vaddr_t kva, dva; + vaddr_t kva; + vmem_addr_t dva; vsize_t off, sgsize; paddr_t pa; pmap_t pmap; - int error, rv __diagused, s; + int error, rv __diagused; /* * Make sure that on error condition we return "no valid mappings". @@ -305,11 +308,18 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm sgsize = round_page(off + buflen); /* Try to allocate DVMA space. */ - s = splvm(); - error = extent_alloc(dvma_extent, sgsize, PAGE_SIZE, 0, - EX_FAST | ((flags & BUS_DMA_NOWAIT) == 0 ? EX_WAITOK : EX_NOWAIT), - &dva); - splx(s); + + const vm_flag_t vmflags = VM_INSTANTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(dvma_arena, sgsize, + 0, /* alignment */ + 0, /* phase */ + 0, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva); if (error) return ENOMEM; @@ -353,7 +363,6 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ bus_dma_segment_t *segs; vaddr_t dva; vsize_t sgsize; - int error __diagused, s; #ifdef DIAGNOSTIC if (map->dm_nsegs != 1) @@ -369,13 +378,7 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ pmap_update(pmap_kernel()); /* Free the DVMA addresses. */ - s = splvm(); - error = extent_free(dvma_extent, dva, sgsize, EX_NOWAIT); - splx(s); -#ifdef DIAGNOSTIC - if (error) - panic("%s: unable to free DVMA region", __func__); -#endif + vmem_xfree(dvma_arena, dva, sgsize); /* Mark the mappings as invalid. */ map->dm_mapsize = 0; Index: src/sys/arch/sun3/sun3x/dvma.c diff -u src/sys/arch/sun3/sun3x/dvma.c:1.43 src/sys/arch/sun3/sun3x/dvma.c:1.44 --- src/sys/arch/sun3/sun3x/dvma.c:1.43 Thu Nov 7 02:37:56 2013 +++ src/sys/arch/sun3/sun3x/dvma.c Fri Dec 1 23:56:30 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: dvma.c,v 1.43 2013/11/07 02:37:56 christos Exp $ */ +/* $NetBSD: dvma.c,v 1.44 2023/12/01 23:56:30 thorpej Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -69,14 +69,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.43 2013/11/07 02:37:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.44 2023/12/01 23:56:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/device.h> #include <sys/proc.h> #include <sys/malloc.h> -#include <sys/extent.h> +#include <sys/vmem.h> #include <sys/buf.h> #include <sys/vnode.h> #include <sys/core.h> @@ -97,25 +97,28 @@ __KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.4 #include <sun3/sun3x/iommu.h> /* - * Use an extent map to manage DVMA scratch-memory pages. + * Use an vmem arena to manage DVMA scratch-memory pages. * Note: SunOS says last three pages are reserved (PROM?) * Note: need a separate map (sub-map?) for last 1MB for * use by VME slave interface. */ - -/* Number of slots in dvmamap. */ -struct extent *dvma_extent; +vmem_t *dvma_arena; void dvma_init(void) { /* - * Create the extent map for DVMA pages. + * Create the vmem arena for DVMA pages. */ - dvma_extent = extent_create("dvma", DVMA_MAP_BASE, - DVMA_MAP_BASE + (DVMA_MAP_AVAIL - 1), - NULL, 0, EX_NOCOALESCE|EX_NOWAIT); + dvma_arena = vmem_create("dvma", DVMA_MAP_BASE, DVMA_MAP_AVAIL, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); /* * Enable DVMA in the System Enable register. @@ -162,21 +165,15 @@ void * dvma_mapin(void *kmem_va, int len, int canwait) { void *dvma_addr; - vaddr_t kva, tva; - int npf, s, error; + vaddr_t kva; + vmem_addr_t tva; + int npf, error; paddr_t pa; long off; bool rv __debugused; kva = (vaddr_t)kmem_va; -#ifdef DIAGNOSTIC - /* - * Addresses below VM_MIN_KERNEL_ADDRESS are not part of the kernel - * map and should not participate in DVMA. - */ - if (kva < VM_MIN_KERNEL_ADDRESS) - panic("dvma_mapin: bad kva"); -#endif + KASSERT(kva >= VM_MIN_KERNEL_ADDRESS); /* * Calculate the offset of the data buffer from a page boundary. @@ -190,10 +187,17 @@ dvma_mapin(void *kmem_va, int len, int c * Try to allocate DVMA space of the appropriate size * in which to do a transfer. */ - s = splvm(); - error = extent_alloc(dvma_extent, len, PAGE_SIZE, 0, - EX_FAST | EX_NOWAIT | (canwait ? EX_WAITSPACE : 0), &tva); - splx(s); + const vm_flag_t vmflags = VM_INSTANTFIT | + (canwait ? VM_SLEEP : VM_NOSLEEP); + + error = vmem_xalloc(dvma_arena, len, + 0, /* alignment */ + 0, /* phase */ + 0, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &tva); if (error) return NULL; @@ -237,7 +241,7 @@ void dvma_mapout(void *dvma_addr, int len) { u_long kva; - int s, off; + int off; kva = (u_long)dvma_addr; off = (int)kva & PGOFSET; @@ -248,11 +252,7 @@ dvma_mapout(void *dvma_addr, int len) pmap_kremove(kva, len); pmap_update(pmap_kernel()); - s = splvm(); - if (extent_free(dvma_extent, kva, len, EX_NOWAIT | EX_MALLOCOK)) - panic("dvma_mapout: unable to free region: 0x%lx,0x%x", - kva, len); - splx(s); + vmem_xfree(dvma_arena, kva, len); } /* @@ -300,11 +300,12 @@ int _bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf, bus_size_t buflen, struct proc *p, int flags) { - vaddr_t kva, dva; + vaddr_t kva; + vmem_addr_t dva; vsize_t off, sgsize; paddr_t pa; pmap_t pmap; - int error, rv __diagused, s; + int error, rv __diagused; /* * Make sure that on error condition we return "no valid mappings". @@ -320,11 +321,17 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm sgsize = round_page(off + buflen); /* Try to allocate DVMA space. */ - s = splvm(); - error = extent_alloc(dvma_extent, sgsize, PAGE_SIZE, 0, - EX_FAST | ((flags & BUS_DMA_NOWAIT) == 0 ? EX_WAITOK : EX_NOWAIT), - &dva); - splx(s); + const vm_flag_t vmflags = VM_INSTANTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(dvma_arena, sgsize, + 0, /* alignment */ + 0, /* phase */ + 0, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva); if (error) return ENOMEM; @@ -369,7 +376,6 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ bus_dma_segment_t *segs; vaddr_t dva; vsize_t sgsize; - int error __diagused, s; #ifdef DIAGNOSTIC if (map->dm_nsegs != 1) @@ -386,13 +392,7 @@ _bus_dmamap_unload(bus_dma_tag_t t, bus_ pmap_update(pmap_kernel()); /* Free the DVMA addresses. */ - s = splvm(); - error = extent_free(dvma_extent, dva, sgsize, EX_NOWAIT); - splx(s); -#ifdef DIAGNOSTIC - if (error) - panic("%s: unable to free DVMA region", __func__); -#endif + vmem_xfree(dvma_arena, dva, sgsize); /* Mark the mappings as invalid. */ map->dm_mapsize = 0;