From d80952da09e939a8d77e0c52c8ad1a08fafb6462 Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Thu, 30 Dec 2004 21:26:18 +0000 Subject: Kill the EIOMAPSIZE and instead, dynamically size the external I/O map, based on the DIO-II space probing results. This does not win much for now, but this will be very useful for SGC bus support (coming soon). --- sys/arch/hp300/hp300/autoconf.c | 6 ++- sys/arch/hp300/hp300/locore.s | 87 ++++++++++++++++++++++++++++++++++- sys/arch/hp300/hp300/machdep.c | 5 +- sys/arch/hp300/hp300/mem.c | 5 +- sys/arch/hp300/hp300/pmap_bootstrap.c | 5 +- sys/arch/hp300/include/vmparam.h | 12 +---- 6 files changed, 100 insertions(+), 20 deletions(-) diff --git a/sys/arch/hp300/hp300/autoconf.c b/sys/arch/hp300/hp300/autoconf.c index 7c57c118bde..832e266fe94 100644 --- a/sys/arch/hp300/hp300/autoconf.c +++ b/sys/arch/hp300/hp300/autoconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.c,v 1.27 2004/12/25 23:02:24 miod Exp $ */ +/* $OpenBSD: autoconf.c,v 1.28 2004/12/30 21:26:14 miod Exp $ */ /* $NetBSD: autoconf.c,v 1.45 1999/04/10 17:31:02 kleink Exp $ */ /* @@ -1243,9 +1243,11 @@ iounmap(kva, size) int error; #ifdef DEBUG + extern int eiomapsize; + if (((int)kva & PGOFSET) || (size & PGOFSET)) panic("iounmap: unaligned"); - if (kva < extiobase || kva >= extiobase + ctob(EIOMAPSIZE)) + if (kva < extiobase || kva >= extiobase + ctob(eiomapsize)) panic("iounmap: bad address"); #endif diff --git a/sys/arch/hp300/hp300/locore.s b/sys/arch/hp300/hp300/locore.s index db8bc017829..c8820504608 100644 --- a/sys/arch/hp300/hp300/locore.s +++ b/sys/arch/hp300/hp300/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.43 2004/12/24 22:50:29 miod Exp $ */ +/* $OpenBSD: locore.s,v 1.44 2004/12/30 21:26:14 miod Exp $ */ /* $NetBSD: locore.s,v 1.91 1998/11/11 06:41:25 thorpej Exp $ */ /* @@ -71,6 +71,7 @@ #ifdef USELEDS #include #endif +#include #define MMUADDR(ar) movl _C_LABEL(MMUbase),ar #define CLKADDR(ar) movl _C_LABEL(CLKbase),ar @@ -317,6 +318,51 @@ Lis320: */ Lstart1: + /* + * Now we need to know how much space the external I/O map has to be. + * This has to be done before pmap_bootstrap() is invoked, but since + * we are not running in virtual mode and will cause several bus + * errors while probing, it is easier to do this before setting up + * our own vectors table. + * Be careful, a1 is reserved at this point. + */ + clrl d3 + + /* + * Don't probe the DIO-I space. Since cards may claim memory outside + * their range (frame buffers, for example), assume the whole 0-31 + * select code range is taken, i.e. 32 boards. + */ + addl #(DIO_DEVSIZE * 32), d3 + + /* + * Probe for DIO-II devices, select codes 132 to 255. + */ + RELOC(machineid,a0) + cmpl #HP_320,a0@ + jeq eiodone | HP 320 has nothing more + + movl #132, d2 | our select code... + movl #DIOII_BASE, a0 | and first address +dioloop: + ASRELOC(phys_badaddr, a3) + jbsr a3@ | probe address (read ID) + movl #DIOII_DEVSIZE, d1 + tstl d0 | success? + jne 1f | no, skip + addl d1, d3 | yes, count it +1: + addl d1, a0 | next slot address... + addql #1, d2 | and slot number + cmpl #256, d2 + jne dioloop + +eiodone: + moveq #PGSHIFT, d2 + lsrl d2, d3 | convert from bytes to pages + RELOC(eiomapsize,a2) + movl d3,a2@ + /* * Now that we know what CPU we have, initialize the address error * and bus error handlers in the vector table: @@ -1866,6 +1912,42 @@ Lm68881rdone: frestore a0@ | restore state rts +/* + * Probe a memory address, and see if it causes a bus error. + * This function is only to be used in physical mode, and before our + * trap vectors are initialized. + * Invoke with address to probe in a0. + * Alters: a3 d0 d1 + */ +#define BUSERR 0xfffffffc +ASLOCAL(phys_badaddr) + ASRELOC(_bsave,a3) + movl BUSERR,a3@ | save ROM bus errror handler + ASRELOC(_ssave,a3) + movl sp,a3@ | and current stack pointer + ASRELOC(catchbad,a3) + movl a3,BUSERR | plug in our handler + movw a0@,d1 | access address + ASRELOC(_bsave,a3) | no fault! + movl a3@,BUSERR + clrl d0 | return success + rts +ASLOCAL(catchbad) + ASRELOC(_bsave,a3) | got a bus error, so restore handler + movl a1@,BUSERR + ASRELOC(_ssave,a3) + movl a3@,sp | and stack + moveq #1,d0 | return fault + rts +#undef BUSERR + + .data +ASLOCAL(_bsave) + .long 0 +ASLOCAL(_ssave) + .long 0 + .text + /* * Handle the nitty-gritty of rebooting the machine. * Basically we just turn off the MMU and jump to the appropriate ROM routine. @@ -1980,6 +2062,9 @@ GLOBAL(intiolimit) GLOBAL(extiobase) .long 0 | KVA of base of external IO space +GLOBAL(eiomapsize) + .long 0 | size of external IO space in pages + GLOBAL(CLKbase) .long 0 | KVA of base of clock registers diff --git a/sys/arch/hp300/hp300/machdep.c b/sys/arch/hp300/hp300/machdep.c index b85bdb24f76..4131b3a7717 100644 --- a/sys/arch/hp300/hp300/machdep.c +++ b/sys/arch/hp300/hp300/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.93 2004/12/23 15:32:09 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.94 2004/12/30 21:26:14 miod Exp $ */ /* $NetBSD: machdep.c,v 1.121 1999/03/26 23:41:29 mycroft Exp $ */ /* @@ -149,6 +149,7 @@ extern struct emul emul_sunos; * DIOCSIZE bytes. Play safe and allow for twice this size. */ char extiospace[EXTENT_FIXED_STORAGE_SIZE(2 * DIOCSIZE / PAGE_SIZE)]; +extern int eiomapsize; /* prototypes for local functions */ caddr_t allocsys(caddr_t); @@ -228,7 +229,7 @@ consinit() * Initialize the DIO resource map. */ extio = extent_create("extio", - (u_long)extiobase, (u_long)extiobase + ctob(EIOMAPSIZE), + (u_long)extiobase, (u_long)extiobase + ctob(eiomapsize), M_DEVBUF, extiospace, sizeof(extiospace), EX_NOWAIT); /* diff --git a/sys/arch/hp300/hp300/mem.c b/sys/arch/hp300/hp300/mem.c index a8241915fbe..a2a51ed3740 100644 --- a/sys/arch/hp300/hp300/mem.c +++ b/sys/arch/hp300/hp300/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.21 2003/06/02 23:27:45 millert Exp $ */ +/* $OpenBSD: mem.c,v 1.22 2004/12/30 21:26:15 miod Exp $ */ /* $NetBSD: mem.c,v 1.25 1999/03/27 00:30:06 mycroft Exp $ */ /* @@ -55,6 +55,7 @@ extern u_int lowram; extern char *extiobase; +extern int eiomapsize; static caddr_t devzeropage; #define mmread mmrw @@ -167,7 +168,7 @@ mmrw(dev, uio, flags) */ if (ISIIOVA(v) || ((caddr_t)v >= extiobase && - (caddr_t)v < (extiobase + (EIOMAPSIZE * NBPG)))) + (caddr_t)v < (extiobase + (eiomapsize * NBPG)))) return (EFAULT); error = uiomove((caddr_t)v, c, uio); diff --git a/sys/arch/hp300/hp300/pmap_bootstrap.c b/sys/arch/hp300/hp300/pmap_bootstrap.c index 87d35864eb4..d825f1a7e51 100644 --- a/sys/arch/hp300/hp300/pmap_bootstrap.c +++ b/sys/arch/hp300/hp300/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap_bootstrap.c,v 1.19 2004/12/30 21:22:19 miod Exp $ */ +/* $OpenBSD: pmap_bootstrap.c,v 1.20 2004/12/30 21:26:15 miod Exp $ */ /* $NetBSD: pmap_bootstrap.c,v 1.13 1997/06/10 18:56:50 veego Exp $ */ /* @@ -54,13 +54,14 @@ caddr_t ledbase; /* SPU LEDs mapping */ extern vaddr_t CLKbase, MMUbase; extern char *extiobase; extern int maxmem; +extern int eiomapsize; #define RELOC(v, t) *((t*)((u_int)&(v) + firstpa)) #define PA2VA(v, t) *((t*)((u_int)&(v))) #define MACHINE_IIOMAPSIZE IIOMAPSIZE #define MACHINE_INTIOBASE INTIOBASE -#define MACHINE_EIOMAPSIZE EIOMAPSIZE +#define MACHINE_EIOMAPSIZE RELOC(eiomapsize, int) #define PMAP_MD_LOCALS /* nothing */ diff --git a/sys/arch/hp300/include/vmparam.h b/sys/arch/hp300/include/vmparam.h index 247bc35867a..e1ac81f5c22 100644 --- a/sys/arch/hp300/include/vmparam.h +++ b/sys/arch/hp300/include/vmparam.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmparam.h,v 1.14 2003/06/02 23:27:45 millert Exp $ */ +/* $OpenBSD: vmparam.h,v 1.15 2004/12/30 21:26:17 miod Exp $ */ /* $NetBSD: vmparam.h,v 1.16 1998/08/20 08:33:48 kleink Exp $ */ /* @@ -48,16 +48,6 @@ #include -/* - * External IO space map size. - * By default we make it large enough to map up to 3 DIO-II devices and - * the complete DIO space. For a 320-only configuration (which has no - * DIO-II) you could define a considerably smaller region. - */ -#ifndef EIOMAPSIZE -#define EIOMAPSIZE 3584 /* 14mb */ -#endif - /* * Constants which control the way the VM system deals with memory segments. * The hp300 only has one physical memory segment. -- cgit v1.2.3