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