Module Name: src Committed By: thorpej Date: Fri Dec 1 05:22:02 UTC 2023
Modified Files: src/sys/arch/sparc/dev: vme_machdep.c src/sys/arch/sparc/sparc: iommu.c 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.76 -r1.77 src/sys/arch/sparc/dev/vme_machdep.c cvs rdiff -u -r1.101 -r1.102 src/sys/arch/sparc/sparc/iommu.c cvs rdiff -u -r1.339 -r1.340 src/sys/arch/sparc/sparc/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/sparc/dev/vme_machdep.c diff -u src/sys/arch/sparc/dev/vme_machdep.c:1.76 src/sys/arch/sparc/dev/vme_machdep.c:1.77 --- src/sys/arch/sparc/dev/vme_machdep.c:1.76 Fri Jan 21 19:22:56 2022 +++ src/sys/arch/sparc/dev/vme_machdep.c Fri Dec 1 05:22:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: vme_machdep.c,v 1.76 2022/01/21 19:22:56 thorpej Exp $ */ +/* $NetBSD: vme_machdep.c,v 1.77 2023/12/01 05:22:01 thorpej Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -30,14 +30,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vme_machdep.c,v 1.76 2022/01/21 19:22:56 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vme_machdep.c,v 1.77 2023/12/01 05:22:01 thorpej Exp $"); #include <sys/param.h> -#include <sys/extent.h> #include <sys/systm.h> #include <sys/device.h> #include <sys/kmem.h> #include <sys/errno.h> +#include <sys/vmem.h> #include <sys/proc.h> #include <sys/syslog.h> @@ -190,7 +190,7 @@ struct rom_range vmebus_translations[] = * for DVMA space allocations. The DMA addresses returned by * bus_dmamap_load*() must be relocated by -VME4_DVMA_BASE. */ -struct extent *vme_dvmamap; +vmem_t *vme_dvmamap; /* * The VME hardware on the sun4m IOMMU maps the first 8MB of 32-bit @@ -314,8 +314,16 @@ vmeattach_mainbus(device_t parent, devic sc->sc_nrange = sizeof(vmebus_translations)/sizeof(vmebus_translations[0]); - vme_dvmamap = extent_create("vmedvma", VME4_DVMA_BASE, VME4_DVMA_END, - 0, 0, EX_WAITOK); + vme_dvmamap = vmem_create("vmedvma", + VME4_DVMA_BASE, + VME4_DVMA_END - VME4_DVMA_BASE, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); printf("\n"); (void)config_found(self, &vba, 0, CFARGS_NONE); @@ -828,7 +836,7 @@ sparc_vme4_dmamap_load(bus_dma_tag_t t, { bus_addr_t dva; bus_size_t sgsize; - u_long ldva; + vmem_addr_t ldva; vaddr_t va, voff; pmap_t pmap; int pagesz = PAGE_SIZE; @@ -845,12 +853,18 @@ sparc_vme4_dmamap_load(bus_dma_tag_t t, * covering the passed buffer. */ sgsize = (buflen + voff + pagesz - 1) & -pagesz; - error = extent_alloc(vme_dvmamap, sgsize, pagesz, - map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 - ? EX_WAITOK - : EX_NOWAIT, - &ldva); + + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(vme_dvmamap, sgsize, + 0, /* alignment */ + 0, /* phase */ + map->_dm_boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &ldva); if (error != 0) return (error); dva = (bus_addr_t)ldva; @@ -895,7 +909,7 @@ sparc_vme4_dmamap_unload(bus_dma_tag_t t int nsegs = map->dm_nsegs; bus_addr_t dva; bus_size_t len; - int i, s, error; + int i; for (i = 0; i < nsegs; i++) { /* Go from VME to CPU view */ @@ -907,11 +921,7 @@ sparc_vme4_dmamap_unload(bus_dma_tag_t t pmap_remove(pmap_kernel(), dva, dva + len); /* Release DVMA space */ - s = splhigh(); - error = extent_free(vme_dvmamap, dva, len, EX_NOWAIT); - splx(s); - if (error != 0) - printf("warning: %ld of DVMA space lost\n", len); + vmem_xfree(vme_dvmamap, dva, len); } pmap_update(pmap_kernel()); Index: src/sys/arch/sparc/sparc/iommu.c diff -u src/sys/arch/sparc/sparc/iommu.c:1.101 src/sys/arch/sparc/sparc/iommu.c:1.102 --- src/sys/arch/sparc/sparc/iommu.c:1.101 Sat Jan 22 11:49:16 2022 +++ src/sys/arch/sparc/sparc/iommu.c Fri Dec 1 05:22:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: iommu.c,v 1.101 2022/01/22 11:49:16 thorpej Exp $ */ +/* $NetBSD: iommu.c,v 1.102 2023/12/01 05:22:01 thorpej Exp $ */ /* * Copyright (c) 1996 @@ -37,17 +37,17 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: iommu.c,v 1.101 2022/01/22 11:49:16 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: iommu.c,v 1.102 2023/12/01 05:22:01 thorpej Exp $"); #include "opt_sparc_arch.h" #include <sys/param.h> -#include <sys/extent.h> #include <sys/malloc.h> #include <sys/queue.h> #include <sys/systm.h> #include <sys/device.h> #include <sys/proc.h> +#include <sys/vmem.h> #include <uvm/uvm.h> @@ -74,7 +74,7 @@ struct iommu_softc { * our clients will run. */ struct sparc_bus_dma_tag sc_dmatag; - struct extent *sc_dvmamap; + vmem_t *sc_dvmamap; }; /* autoconfiguration driver */ @@ -274,9 +274,16 @@ iommu_attach(device_t parent, device_t s sc->sc_pagesize, sc->sc_range >> 20); - sc->sc_dvmamap = extent_create("iommudvma", - IOMMU_DVMA_BASE, IOMMU_DVMA_END, - 0, 0, EX_WAITOK); + sc->sc_dvmamap = vmem_create("iommudvma", + IOMMU_DVMA_BASE, + IOMMU_DVMA_END - IOMMU_DVMA_BASE, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); devhandle_t selfh = device_handle(self); @@ -493,7 +500,6 @@ iommu_dmamap_create(bus_dma_tag_t t, bus bus_size_t maxsegsz, bus_size_t boundary, int flags, bus_dmamap_t *dmamp) { - struct iommu_softc *sc = t->_cookie; bus_dmamap_t map; int error; @@ -504,11 +510,11 @@ iommu_dmamap_create(bus_dma_tag_t t, bus if ((flags & BUS_DMA_24BIT) != 0) { /* Limit this map to the range usable by `24-bit' devices */ map->_dm_ex_start = D24_DVMA_BASE; - map->_dm_ex_end = D24_DVMA_END; + map->_dm_ex_end = D24_DVMA_END - 1; } else { /* Enable allocations from the entire map */ - map->_dm_ex_start = sc->sc_dvmamap->ex_start; - map->_dm_ex_end = sc->sc_dvmamap->ex_end; + map->_dm_ex_start = VMEM_ADDR_MIN; + map->_dm_ex_end = VMEM_ADDR_MAX; } *dmamp = map; @@ -524,8 +530,9 @@ iommu_dvma_alloc(struct iommu_softc *sc, bus_addr_t *dvap, bus_size_t *sgsizep) { bus_size_t sgsize; - u_long align, voff, dvaddr; - int s, error; + u_long align, voff; + vmem_addr_t dvaddr; + int error; int pagesz = PAGE_SIZE; /* @@ -541,15 +548,18 @@ iommu_dvma_alloc(struct iommu_softc *sc, sgsize = (len + voff + pagesz - 1) & -pagesz; align = dvma_cachealign ? dvma_cachealign : map->_dm_align; - s = splhigh(); - error = extent_alloc_subregion1(sc->sc_dvmamap, - map->_dm_ex_start, map->_dm_ex_end, - sgsize, align, va & (align-1), - map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 - ? EX_WAITOK : EX_NOWAIT, - &dvaddr); - splx(s); + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(sc->sc_dvmamap, sgsize, + align, /* alignment */ + va & (align-1), /* phase */ + map->_dm_boundary, /* nocross */ + map->_dm_ex_start, /* minaddr */ + map->_dm_ex_end, /* maxaddr */ + vmflags, + &dvaddr); + *dvap = (bus_addr_t)dvaddr; *sgsizep = sgsize; return (error); @@ -706,18 +716,14 @@ iommu_dmamap_unload(bus_dma_tag_t t, bus int nsegs = map->dm_nsegs; bus_addr_t dva; bus_size_t len; - int i, s, error; + int i; for (i = 0; i < nsegs; i++) { dva = segs[i].ds_addr & -PAGE_SIZE; len = segs[i]._ds_sgsize; iommu_remove(sc, dva, len); - s = splhigh(); - error = extent_free(sc->sc_dvmamap, dva, len, EX_NOWAIT); - splx(s); - if (error != 0) - printf("warning: %ld of DVMA space lost\n", (long)len); + vmem_xfree(sc->sc_dvmamap, dva, len); } /* Mark the mappings as invalid. */ Index: src/sys/arch/sparc/sparc/machdep.c diff -u src/sys/arch/sparc/sparc/machdep.c:1.339 src/sys/arch/sparc/sparc/machdep.c:1.340 --- src/sys/arch/sparc/sparc/machdep.c:1.339 Tue Jul 26 20:08:56 2022 +++ src/sys/arch/sparc/sparc/machdep.c Fri Dec 1 05:22:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.339 2022/07/26 20:08:56 andvar Exp $ */ +/* $NetBSD: machdep.c,v 1.340 2023/12/01 05:22:01 thorpej Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.339 2022/07/26 20:08:56 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.340 2023/12/01 05:22:01 thorpej Exp $"); #include "opt_compat_netbsd.h" #include "opt_compat_sunos.h" @@ -83,7 +83,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v #include <sys/signal.h> #include <sys/signalvar.h> #include <sys/proc.h> -#include <sys/extent.h> +#include <sys/vmem.h> #include <sys/cpu.h> #include <sys/buf.h> #include <sys/device.h> @@ -145,7 +145,7 @@ kmutex_t fpu_mtx; * dvmamap24 is used to manage DVMA memory for devices that have the upper * eight address bits wired to all-ones (e.g. `le' and `ie') */ -struct extent *dvmamap24; +vmem_t *dvmamap24; void dumpsys(void); void stackdump(void); @@ -310,9 +310,16 @@ cpu_startup(void) * Allocate DMA map for 24-bit devices (le, ie) * [dvma_base - dvma_end] is for VME devices.. */ - dvmamap24 = extent_create("dvmamap24", - D24_DVMA_BASE, D24_DVMA_END, - 0, 0, EX_NOWAIT); + dvmamap24 = vmem_create("dvmamap24", + D24_DVMA_BASE, + D24_DVMA_END - D24_DVMA_BASE, + PAGE_SIZE, /* quantum */ + NULL, /* importfn */ + NULL, /* releasefn */ + NULL, /* source */ + 0, /* qcache_max */ + VM_SLEEP, + IPL_VM); if (dvmamap24 == NULL) panic("unable to allocate DVMA map"); } @@ -1589,9 +1596,17 @@ sun4_dmamap_load(bus_dma_tag_t t, bus_dm no_fit: sgsize = round_page(buflen + (va & (pagesz - 1))); - if (extent_alloc(dvmamap24, sgsize, pagesz, map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 ? EX_WAITOK : EX_NOWAIT, - &dva) != 0) { + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + if (vmem_xalloc(dvmamap24, sgsize, + 0, /* alignment */ + 0, /* phase */ + map->_dm_boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva) != 0) { return (ENOMEM); } @@ -1664,11 +1679,17 @@ sun4_dmamap_load_raw(bus_dma_tag_t t, bu /* Allocate DVMA addresses */ if ((map->_dm_flags & BUS_DMA_24BIT) != 0) { - error = extent_alloc(dvmamap24, sgsize, pagesz, - map->_dm_boundary, - (flags & BUS_DMA_NOWAIT) == 0 - ? EX_WAITOK : EX_NOWAIT, - &dva); + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + + error = vmem_xalloc(dvmamap24, sgsize, + 0, /* alignment */ + 0, /* phase */ + map->_dm_boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dva); if (error) return (error); } else { @@ -1720,7 +1741,7 @@ sun4_dmamap_unload(bus_dma_tag_t t, bus_ int flags = map->_dm_flags; vaddr_t dva; bus_size_t len; - int i, s, error; + int i; map->dm_maxsegsz = map->_dm_maxmaxsegsz; @@ -1739,11 +1760,7 @@ sun4_dmamap_unload(bus_dma_tag_t t, bus_ pmap_kremove(dva, len); if ((flags & BUS_DMA_24BIT) != 0) { - s = splhigh(); - error = extent_free(dvmamap24, dva, len, EX_NOWAIT); - splx(s); - if (error != 0) - printf("warning: %ld of DVMA space lost\n", len); + vmem_xfree(dvmamap24, dva, len); } else { uvm_unmap(kernel_map, dva, dva + len); }