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

Reply via email to