Module Name:    src
Committed By:   thorpej
Date:           Mon Dec  4 01:49:29 UTC 2023

Modified Files:
        src/sys/dev/vme: vme.c vmevar.h

Log Message:
Manage VME address space using vmem(9) rather than extent(9).

XXX PR kern/57748 applies here; we lose the last byte of A32 space.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/vme/vme.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/vme/vmevar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/vme/vme.c
diff -u src/sys/dev/vme/vme.c:1.29 src/sys/dev/vme/vme.c:1.30
--- src/sys/dev/vme/vme.c:1.29	Sat Aug  7 16:19:17 2021
+++ src/sys/dev/vme/vme.c	Mon Dec  4 01:49:29 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: vme.c,v 1.29 2021/08/07 16:19:17 thorpej Exp $ */
+/* $NetBSD: vme.c,v 1.30 2023/12/04 01:49:29 thorpej Exp $ */
 
 /*
  * Copyright (c) 1999
@@ -29,13 +29,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vme.c,v 1.29 2021/08/07 16:19:17 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vme.c,v 1.30 2023/12/04 01:49:29 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/malloc.h>
-#include <sys/extent.h>
+#include <sys/vmem.h>
 #include <sys/bus.h>
 
 #include <dev/vme/vmereg.h>
@@ -47,7 +47,7 @@ static int vmesubmatch1(device_t, cfdata
 static int vmesubmatch(device_t, cfdata_t, const int *, void *);
 int vmematch(device_t, cfdata_t, void *);
 void vmeattach(device_t, device_t, void *);
-static struct extent *vme_select_map(struct vmebus_softc*, vme_am_t);
+static vmem_t *vme_select_map(struct vmebus_softc*, vme_am_t);
 
 #define VME_SLAVE_DUMMYDRV "vme_slv"
 
@@ -180,21 +180,48 @@ vmeattach(device_t parent, device_t self
 	/*
 	 * set up address space accounting - assume incomplete decoding
 	 */
-	sc->vme32ext = extent_create("vme32", 0, 0xffffffff, 0, 0, 0);
-	if (!sc->vme32ext) {
-		printf("error creating A32 map\n");
+	sc->vme32_arena = vmem_create("vme32",
+				      0,		/* base */
+	/* XXX loses last byte */     0xffffffff,	/* size */
+				      1,		/* quantum */
+				      NULL,		/* allocfn */
+				      NULL,		/* releasefn */
+				      NULL,		/* source */
+				      0,		/* qcache_max */
+				      VM_SLEEP,
+				      IPL_NONE);
+	if (!sc->vme32_arena) {
+		device_printf(self, "error creating A32 map\n");
 		return;
 	}
 
-	sc->vme24ext = extent_create("vme24", 0, 0x00ffffff, 0, 0, 0);
-	if (!sc->vme24ext) {
-		printf("error creating A24 map\n");
+	sc->vme24_arena = vmem_create("vme24",
+				      0,		/* base */
+				      0x01000000,	/* size */
+				      1,		/* quantum */
+				      NULL,		/* allocfn */
+				      NULL,		/* releasefn */
+				      NULL,		/* source */
+				      0,		/* qcache_max */
+				      VM_SLEEP,
+				      IPL_NONE);
+	if (!sc->vme24_arena) {
+		device_printf(self, "error creating A24 map\n");
 		return;
 	}
 
-	sc->vme16ext = extent_create("vme16", 0, 0x0000ffff, 0, 0, 0);
-	if (!sc->vme16ext) {
-		printf("error creating A16 map\n");
+	sc->vme16_arena = vmem_create("vme16",
+				      0,		/* base */
+				      0x00010000,	/* size */
+				      1,		/* quantum */
+				      NULL,		/* allocfn */
+				      NULL,		/* releasefn */
+				      NULL,		/* source */
+				      0,		/* qcache_max */
+				      VM_SLEEP,
+				      IPL_NONE);
+	if (!sc->vme16_arena) {
+		device_printf(self, "error creating A16 map\n");
 		return;
 	}
 
@@ -207,13 +234,13 @@ vmeattach(device_t parent, device_t self
 	config_search(self, NULL,
 	    CFARGS(.search = vmesubmatch));
 
-#ifdef VMEDEBUG
-	if (sc->vme32ext)
-		extent_print(sc->vme32ext);
-	if (sc->vme24ext)
-		extent_print(sc->vme24ext);
-	if (sc->vme16ext)
-		extent_print(sc->vme16ext);
+#if 0	/* XXX VMEDEBUG */
+	if (sc->vme32_arena)
+		vmem_print(sc->vme32_arena);
+	if (sc->vme24_arena)
+		vmem_print(sc->vme24_arena);
+	if (sc->vme16_arena)
+		vmem_print(sc->vme16_arena);
 #endif
 }
 
@@ -230,38 +257,38 @@ vmedetach(device_t dev)
 
 	/* extent maps should be empty now */
 
-	if (sc->vme32ext) {
+	if (sc->vme32_arena) {
 #ifdef VMEDEBUG
-		extent_print(sc->vme32ext);
+		vmem_print(sc->vme32_arena);
 #endif
-		extent_destroy(sc->vme32ext);
+		vmem_destroy(sc->vme32_arena);
 	}
-	if (sc->vme24ext) {
+	if (sc->vme24_arena) {
 #ifdef VMEDEBUG
-		extent_print(sc->vme24ext);
+		vmem_print(sc->vme24_arena);
 #endif
-		extent_destroy(sc->vme24ext);
+		vmem_destroy(sc->vme24_arena);
 	}
-	if (sc->vme16ext) {
+	if (sc->vme16_arena) {
 #ifdef VMEDEBUG
-		extent_print(sc->vme16ext);
+		vmem_print(sc->vme16_arena);
 #endif
-		extent_destroy(sc->vme16ext);
+		vmem_destroy(sc->vme16_arena);
 	}
 
 	return (0);
 }
 #endif
 
-static struct extent *
+static vmem_t *
 vme_select_map(struct vmebus_softc *sc, vme_am_t ams)
 {
 	if ((ams & VME_AM_ADRSIZEMASK) == VME_AM_A32)
-		return (sc->vme32ext);
+		return (sc->vme32_arena);
 	else if ((ams & VME_AM_ADRSIZEMASK) == VME_AM_A24)
-		return (sc->vme24ext);
+		return (sc->vme24_arena);
 	else if ((ams & VME_AM_ADRSIZEMASK) == VME_AM_A16)
-		return (sc->vme16ext);
+		return (sc->vme16_arena);
 	else
 		return (0);
 }
@@ -269,41 +296,48 @@ vme_select_map(struct vmebus_softc *sc, 
 int
 _vme_space_alloc(struct vmebus_softc *sc, vme_addr_t addr, vme_size_t len, vme_am_t ams)
 {
-	struct extent *ex;
+	vmem_t *vm;
 
-	ex = vme_select_map(sc, ams);
-	if (!ex)
+	vm = vme_select_map(sc, ams);
+	if (!vm)
 		return (EINVAL);
 
-	return (extent_alloc_region(ex, addr, len, EX_NOWAIT));
+	return vmem_xalloc_addr(vm, addr, len, VM_NOSLEEP);
 }
 
 void
 _vme_space_free(struct vmebus_softc *sc, vme_addr_t addr, vme_size_t len, vme_am_t ams)
 {
-	struct extent *ex;
+	vmem_t *vm;
 
-	ex = vme_select_map(sc, ams);
-	if (!ex) {
+	vm = vme_select_map(sc, ams);
+	if (!vm) {
 		panic("vme_space_free: invalid am %x", ams);
 		return;
 	}
 
-	extent_free(ex, addr, len, EX_NOWAIT);
+	vmem_xfree(vm, addr, len);
 }
 
 int
 _vme_space_get(struct vmebus_softc *sc, vme_size_t len, vme_am_t ams, u_long align, vme_addr_t *addr)
 {
-	struct extent *ex;
-	u_long help;
+	vmem_t *vm;
+	vmem_addr_t help;
 	int res;
 
-	ex = vme_select_map(sc, ams);
-	if (!ex)
+	vm = vme_select_map(sc, ams);
+	if (!vm)
 		return (EINVAL);
 
-	res = extent_alloc(ex, len, align, EX_NOBOUNDARY, EX_NOWAIT, &help);
+	res = vmem_xalloc(vm, len,
+			  align,		/* align */
+			  0,			/* phase */
+			  0,			/* nocross */
+			  VMEM_ADDR_MIN,	/* minaddr */
+			  VMEM_ADDR_MAX,	/* maxaddr */
+			  VM_NOSLEEP,
+			  &help);
 	if (!res)
 		*addr = help;
 	return (res);

Index: src/sys/dev/vme/vmevar.h
diff -u src/sys/dev/vme/vmevar.h:1.14 src/sys/dev/vme/vmevar.h:1.15
--- src/sys/dev/vme/vmevar.h:1.14	Sat Oct 27 17:18:38 2012
+++ src/sys/dev/vme/vmevar.h	Mon Dec  4 01:49:29 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: vmevar.h,v 1.14 2012/10/27 17:18:38 chs Exp $ */
+/* $NetBSD: vmevar.h,v 1.15 2023/12/04 01:49:29 thorpej Exp $ */
 
 /*
  * Copyright (c) 1999
@@ -45,6 +45,8 @@ typedef int vme_swap_t; /* hardware swap
 
 #ifdef _KERNEL
 
+#include <sys/vmem.h>
+
 /*
  * Generic placeholder for any resources needed for a mapping,
  * overloaded by bus interface driver
@@ -172,7 +174,7 @@ struct vmebus_softc {
 
 	vme_slaveconf_callback slaveconfig;
 
-	struct extent *vme32ext, *vme24ext, *vme16ext;
+	vmem_t *vme32_arena, *vme24_arena, *vme16_arena;
 };
 
 #define VME_MAXCFRANGES 3

Reply via email to