From da13a0afc74b5a15ab20ebbc59004353cf23c84e Mon Sep 17 00:00:00 2001 From: thorpej Date: Wed, 25 Sep 2002 19:30:22 +0000 Subject: [PATCH] Replace resource map usage with extent maps. --- sys/arch/hp300/hp300/autoconf.c | 66 +++++++++++++++++++++---------- sys/arch/hp300/hp300/bus_space.c | 39 +++++++++--------- sys/arch/hp300/hp300/genassym.cf | 3 +- sys/arch/hp300/hp300/machdep.c | 10 ++--- sys/arch/hp300/include/autoconf.h | 14 ++++--- 5 files changed, 80 insertions(+), 52 deletions(-) diff --git a/sys/arch/hp300/hp300/autoconf.c b/sys/arch/hp300/hp300/autoconf.c index d88d4476bb86..0188f35f4f1f 100644 --- a/sys/arch/hp300/hp300/autoconf.c +++ b/sys/arch/hp300/hp300/autoconf.c @@ -1,7 +1,7 @@ -/* $NetBSD: autoconf.c,v 1.57 2002/04/17 20:40:30 gmcgarry Exp $ */ +/* $NetBSD: autoconf.c,v 1.58 2002/09/25 19:30:22 thorpej Exp $ */ /*- - * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * Copyright (c) 1996, 1997, 2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -99,7 +99,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.57 2002/04/17 20:40:30 gmcgarry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.58 2002/09/25 19:30:22 thorpej Exp $"); #include "hil.h" #include "dvbox.h" @@ -121,12 +121,14 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.57 2002/04/17 20:40:30 gmcgarry Exp $ #include #include #include -#include +#include #include #include #include #include +#include + #include #include @@ -165,9 +167,6 @@ extern int dnkbdcnattach(bus_space_tag_t, bus_addr_t); int dio_scan(int (*func)(bus_space_tag_t, bus_addr_t, int)); int dio_scode_probe(int, int (*func)(bus_space_tag_t, bus_addr_t, int)); -/* XXX must be allocated statically because of early console init */ -struct map extiomap[EIOMAPSIZE/16]; - extern caddr_t internalhpib; extern char *extiobase; @@ -178,6 +177,16 @@ int booted_partition; /* How we were booted. */ u_int bootdev; +/* + * Extent map to manage the external I/O (DIO/DIO-II) space. We + * allocate storate for 8 regions in the map. extio_ex_malloc_safe + * will indicate that it's safe to use malloc() to dynamically allocate + * region descriptors in case we run out. + */ +static long extio_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)]; +struct extent *extio_ex; +int extio_ex_malloc_safe; + /* * This information is built during the autoconfig process. * A little explanation about the way this works is in order. @@ -915,6 +924,20 @@ dio_scode_probe(scode, func) * Mapping functions **********************************************************************/ +/* + * Initialize the external I/O extent map. + */ +void +iomap_init(void) +{ + + /* extiobase is initialized by pmap_bootstrap(). */ + extio_ex = extent_create("extio", (u_long) extiobase, + (u_long) extiobase + (ptoa(EIOMAPSIZE) - 1), M_DEVBUF, + (caddr_t) extio_ex_storage, sizeof(extio_ex_storage), + EX_NOCOALESCE|EX_NOWAIT); +} + /* * Allocate/deallocate a cache-inhibited range of kernel virtual address * space mapping the indicated physical address range [pa - pa+size) @@ -924,20 +947,22 @@ iomap(pa, size) caddr_t pa; int size; { - int ix, npf; - caddr_t kva; + u_long kva; + int error; #ifdef DEBUG if (((int)pa & PGOFSET) || (size & PGOFSET)) panic("iomap: unaligned"); #endif - npf = btoc(size); - ix = rmalloc(extiomap, npf); - if (ix == 0) - return(0); - kva = extiobase + ctob(ix-1); - physaccess(kva, pa, size, PG_RW|PG_CI); - return(kva); + + error = extent_alloc(extio_ex, size, PAGE_SIZE, 0, + EX_FAST | EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0), + &kva); + if (error) + return (0); + + physaccess((caddr_t) kva, pa, size, PG_RW|PG_CI); + return ((caddr_t) kva); } /* @@ -948,15 +973,16 @@ iounmap(kva, size) caddr_t kva; int size; { - int ix; #ifdef DEBUG if (((int)kva & PGOFSET) || (size & PGOFSET)) panic("iounmap: unaligned"); - if (kva < extiobase || kva >= extiobase + ctob(EIOMAPSIZE)) + if (kva < extiobase || kva >= extiobase + ptoa(EIOMAPSIZE)) panic("iounmap: bad address"); #endif physunaccess(kva, size); - ix = btoc(kva - extiobase) + 1; - rmfree(extiomap, btoc(size), ix); + if (extent_free(extio_ex, (u_long) kva, size, + EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0))) + printf("iounmap: kva %p size 0x%x: can't free region\n", + kva, size); } diff --git a/sys/arch/hp300/hp300/bus_space.c b/sys/arch/hp300/hp300/bus_space.c index 6746233f1b7f..d1c2bb98271b 100644 --- a/sys/arch/hp300/hp300/bus_space.c +++ b/sys/arch/hp300/hp300/bus_space.c @@ -1,4 +1,4 @@ -/* $NetBSD: bus_space.c,v 1.4 2002/03/15 05:55:37 gmcgarry Exp $ */ +/* $NetBSD: bus_space.c,v 1.5 2002/09/25 19:30:22 thorpej Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -41,18 +41,18 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.4 2002/03/15 05:55:37 gmcgarry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_space.c,v 1.5 2002/09/25 19:30:22 thorpej Exp $"); #include #include -#include +#include +#include #include #include -extern struct map extiomap[]; -extern caddr_t extiobase; +extern char *extiobase; extern int *nofault; /* ARGSUSED */ @@ -64,8 +64,8 @@ bus_space_map(t, bpa, size, flags, bshp) int flags; bus_space_handle_t *bshp; { - int idx, npgs; - caddr_t kva; + u_long kva; + int error; if (t == HP300_BUS_SPACE_INTIO) { /* @@ -80,19 +80,19 @@ bus_space_map(t, bpa, size, flags, bshp) panic("bus_space_map: bad space tag"); /* - * Allocate virtual address space from the extio resource map. + * Allocate virtual address space from the extio extent map. */ size = m68k_round_page(size); - npgs = btoc(size); - idx = rmalloc(extiomap, npgs); - if (idx == 0) - return (ENOMEM); - kva = extiobase + ctob(idx - 1); + error = extent_alloc(extio_ex, size, PAGE_SIZE, 0, + EX_FAST | EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0), + &kva); + if (error) + return (error); /* * Map the range. The range is always cache-inhibited on the hp300. */ - physaccess(kva, (caddr_t)bpa, size, PG_RW|PG_CI); + physaccess((caddr_t)kva, (caddr_t)bpa, size, PG_RW|PG_CI); /* * All done. @@ -139,7 +139,6 @@ bus_space_unmap(t, bsh, size) bus_space_handle_t bsh; bus_size_t size; { - int idx; if (t == HP300_BUS_SPACE_INTIO) { /* @@ -158,7 +157,7 @@ bus_space_unmap(t, bsh, size) if (bsh & PGOFSET) panic("bus_space_unmap: unaligned"); if ((caddr_t)bsh < extiobase || - (caddr_t)bsh >= (extiobase + ctob(EIOMAPSIZE))) + (caddr_t)bsh >= (extiobase + ptoa(EIOMAPSIZE))) panic("bus_space_unmap: bad bus space handle"); #endif @@ -168,10 +167,12 @@ bus_space_unmap(t, bsh, size) physunaccess((caddr_t)bsh, size); /* - * Free it from the extio resource map. + * Free it from the extio extent map. */ - idx = btoc((caddr_t)bsh - extiobase) + 1; - rmfree(extiomap, btoc(size), idx); + if (extent_free(extio_ex, (u_long) bsh, size, + EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0))) + printf("bus_space_unmap: kva 0x%lx size 0x%lx: " + "can't free region\n", (u_long) bsh, size); } /* ARGSUSED */ diff --git a/sys/arch/hp300/hp300/genassym.cf b/sys/arch/hp300/hp300/genassym.cf index 9e218e1b5324..cb81e7b880bf 100644 --- a/sys/arch/hp300/hp300/genassym.cf +++ b/sys/arch/hp300/hp300/genassym.cf @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.26 2002/09/22 05:48:46 gmcgarry Exp $ +# $NetBSD: genassym.cf,v 1.27 2002/09/25 19:30:22 thorpej Exp $ # # Copyright (c) 1982, 1990, 1993 @@ -41,7 +41,6 @@ endif include include -include include include include diff --git a/sys/arch/hp300/hp300/machdep.c b/sys/arch/hp300/hp300/machdep.c index cf7c8169f30c..d45e90ec9dc0 100644 --- a/sys/arch/hp300/hp300/machdep.c +++ b/sys/arch/hp300/hp300/machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.161 2002/09/19 10:38:01 ragge Exp $ */ +/* $NetBSD: machdep.c,v 1.162 2002/09/25 19:30:22 thorpej Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -43,7 +43,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.161 2002/09/19 10:38:01 ragge Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.162 2002/09/25 19:30:22 thorpej Exp $"); #include "opt_ddb.h" #include "opt_compat_hpux.h" @@ -61,7 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.161 2002/09/19 10:38:01 ragge Exp $"); #include #include #include -#include #include #include #include @@ -241,12 +240,11 @@ hp300_init() void consinit() { - extern struct map extiomap[]; /* - * Initialize the DIO resource map. + * Initialize the external I/O extent map. */ - rminit(extiomap, (long)EIOMAPSIZE, (long)1, "extio", EIOMAPSIZE/16); + iomap_init(); /* * Initialize the console before we print anything out. diff --git a/sys/arch/hp300/include/autoconf.h b/sys/arch/hp300/include/autoconf.h index 45ea7aca7ad0..666a60b49eca 100644 --- a/sys/arch/hp300/include/autoconf.h +++ b/sys/arch/hp300/include/autoconf.h @@ -1,7 +1,7 @@ -/* $NetBSD: autoconf.h,v 1.7 2001/12/14 08:29:25 gmcgarry Exp $ */ +/* $NetBSD: autoconf.h,v 1.8 2002/09/25 19:30:23 thorpej Exp $ */ /*- - * Copyright (c) 1996 The NetBSD Foundation, Inc. + * Copyright (c) 1996, 2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -37,7 +37,11 @@ */ #ifdef _KERNEL -void hp300_cninit __P((void)); -caddr_t iomap __P((caddr_t, int)); -void iounmap __P((caddr_t, int)); +void hp300_cninit(void); +void iomap_init(void); +caddr_t iomap(caddr_t, int); +void iounmap(caddr_t, int); + +extern struct extent *extio_ex; +extern int extio_ex_malloc_safe; #endif /* _KERNEL */