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