diff options
Diffstat (limited to 'sys/arch')
29 files changed, 1831 insertions, 1385 deletions
diff --git a/sys/arch/mvme88k/dev/bugio.c b/sys/arch/mvme88k/dev/bugio.c index 941c7f143b5..be68ef99c17 100644 --- a/sys/arch/mvme88k/dev/bugio.c +++ b/sys/arch/mvme88k/dev/bugio.c @@ -1,3 +1,5 @@ +/* $OpenBSD: bugio.c,v 1.2 1998/12/15 05:52:29 smurph Exp $ */ +/* Copyright (c) 1998 Steve Murphree, Jr. */ #include <machine/bugio.h> #define INCHR "0x0000" @@ -62,29 +64,14 @@ char buginchr(void) { register int cc asm("r2"); - BUGCTXT(); asm volatile ("or r9,r0," INCHR); asm volatile ("tb0 0,r0,0x1F0"); - /*asm("or %0,r0,r2" : "=r" (cc) : );*/ + asm volatile ("or %0,r0,r2" : "=r" (cc) : ); OSCTXT(); return ((char)cc & 0xFF); } -/* return 1 if not empty else 0 */ - -buginstat(void) -{ - int ret; - - BUGCTXT(); - asm volatile ("or r9,r0," INSTAT); - asm volatile ("tb0 0,r0,0x1F0"); - asm volatile ("or %0,r0,r2" : "=r" (ret) : ); - OSCTXT(); - return (ret & 0x40 ? 1 : 0); -} - bugoutchr(unsigned char c) { unsigned char cc; @@ -103,6 +90,20 @@ bugoutchr(unsigned char c) OSCTXT(); } +/* return 1 if not empty else 0 */ + +buginstat(void) +{ + int ret; + + BUGCTXT(); + asm volatile ("or r9,r0," INSTAT); + asm volatile ("tb0 0,r0,0x1F0"); + asm volatile ("or %0,r0,r2" : "=r" (ret) : ); + OSCTXT(); + return (ret & 0x4 ? 1 : 0); +} + bugoutstr(char *s, char *se) { BUGCTXT(); @@ -176,9 +177,9 @@ bugbrdid(struct bugbrdid *id) bugnetctrl(struct bugniocall *niocall) { - BUGCTXT(); +/* BUGCTXT();*/ asm("or r2,r0,%0" : : "r" (niocall)); asm("or r9,r0, " NETCTRL); asm("tb0 0,r0,0x1F0"); - OSCTXT(); +/* OSCTXT();*/ } diff --git a/sys/arch/mvme88k/dev/bugtty.c b/sys/arch/mvme88k/dev/bugtty.c index 0eeafd308c7..87e20c7189c 100644 --- a/sys/arch/mvme88k/dev/bugtty.c +++ b/sys/arch/mvme88k/dev/bugtty.c @@ -1,6 +1,5 @@ -/* $NetBSD$ */ - -/* +/* $OpenBSD: bugtty.c,v 1.4 1998/12/15 05:52:29 smurph Exp $ */ +/* Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Dale Rahn. * All rights reserved. * @@ -81,6 +80,17 @@ char bug_obuffer[BUGBUF+1]; #define bugtty_tty bugttytty struct tty *bugtty_tty[NBUGTTY]; int needprom = 1; +/* + int ca_bustype; + void *ca_vaddr; + void *ca_paddr; + int ca_offset; + int ca_len; + int ca_ipl; + int ca_vec; + char *ca_name; + void *ca_master; points to bus-dependent data +*/ int bugttymatch(parent, self, aux) @@ -88,17 +98,15 @@ bugttymatch(parent, self, aux) void *self; void *aux; { - extern int needprom; struct confargs *ca = aux; if (needprom == 0) return (0); - /* - * tell our parent our requirements - */ - ca->ca_paddr = (caddr_t)0xfff45000; - ca->ca_size = 0x200; + ca->ca_paddr = (void *)0xfff45000; + ca->ca_vaddr = (void *)0xfff45000; + ca->ca_len = 0x200; ca->ca_ipl = IPL_TTY; + ca->ca_name = "bugtty\0"; return (1); } @@ -108,7 +116,7 @@ bugttyattach(parent, self, aux) struct device *self; void *aux; { - printf("\n"); + printf(": bugtty\n"); } #define BUGTTYUNIT(x) ((x) & (0x7f)) @@ -444,8 +452,8 @@ bugttycnprobe(cp) struct consdev *cp; { int maj; - extern int needprom; - + int needprom = 1; + if (needprom == 0) { cp->cn_pri = CN_DEAD; return (0); @@ -460,7 +468,8 @@ bugttycnprobe(cp) default: break; } -#else +#endif +#if 0 cp->cn_pri = CN_NORMAL; return (0); #endif /* 0 */ @@ -472,7 +481,6 @@ bugttycnprobe(cp) cp->cn_dev = makedev(maj, 0); cp->cn_pri = CN_NORMAL; - return (1); } @@ -480,6 +488,7 @@ int bugttycninit(cp) struct consdev *cp; { + /* Nothing to do */ } int diff --git a/sys/arch/mvme88k/dev/cl.c b/sys/arch/mvme88k/dev/cl.c index 1c1ff9748ad..373c6816961 100644 --- a/sys/arch/mvme88k/dev/cl.c +++ b/sys/arch/mvme88k/dev/cl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cl.c,v 1.1 1997/03/03 19:32:04 rahnds Exp $ */ +/* $OpenBSD: cl.c,v 1.2 1998/12/15 05:52:29 smurph Exp $ */ /* * Copyright (c) 1995 Dale Rahn. All rights reserved. @@ -84,10 +84,14 @@ #define CL_TXINTR 0x02 #define CL_RXINTR 0x02 +#ifdef DEBUG +#undef DEBUG +#endif +#define DEBUG_KERN 1 struct cl_cons { void *cl_paddr; volatile struct clreg *cl_vaddr; - volatile struct pcc2reg *pcctwoaddr; + volatile struct pcctworeg *pcctwoaddr; u_char channel; } cl_cons; @@ -133,7 +137,7 @@ struct clsoftc { struct intrhand sc_ih_m; struct intrhand sc_ih_t; struct intrhand sc_ih_r; - struct pcc2reg *sc_pcctwo; + struct pcctworeg *sc_pcctwo; int sc_flags; }; struct { @@ -241,46 +245,20 @@ int clprobe(parent, self, aux) */ struct clreg *cl_reg; struct confargs *ca = aux; - register struct cfdata *cf = self; - caddr_t base; - int ret; -#if 0 - if (cputyp != CPU_167 && cputyp != CPU_166 -#ifdef CPU_187 - && cputyp != CPU_187 -#endif - ) - { - return 0; - } -#endif /* 0 */ - if (cputyp != CPU_187) { + if (cputyp != CPU_187) return 0; - } - /* - * If bus or name do not match, fail. - */ - if (ca->ca_bustype != BUS_PCCTWO || - strcmp(cf->cf_driver->cd_name, "cl")) { - return 0; - } - - base = (caddr_t)cf->cf_loc[0]; - - if (badpaddr(base, 1) == -1) { - return 0; - } - - /* - * tell our parent our requirements - */ - ca->ca_paddr = (caddr_t)CD2400_BASE_ADDR; - ca->ca_size = CD2400_SIZE; ca->ca_ipl = IPL_TTY; - - return 1; + ca->ca_paddr = (void *)CD2400_BASE_ADDR; + cl_reg = (struct clreg *)ca->ca_vaddr; + +#if 0 + ret = !badvaddr(&cl_reg->cl_gfrcr,1); +#else + ret = 1; +#endif + return ret; } void @@ -294,7 +272,7 @@ clattach(parent, self, aux) int i; sc->cl_reg = (struct clreg *)ca->ca_vaddr; - sc->sc_pcctwo = (struct pcc2reg *)ca->ca_parent; + sc->sc_pcctwo = ca->ca_master; if ((u_char *)ca->ca_paddr == (u_char *)cl_cons.cl_paddr) { /* if this device is configured as console, @@ -305,6 +283,9 @@ clattach(parent, self, aux) /* reset chip only if we are not console device */ /* wait for GFRCR */ } + /* allow chip to settle before continuing */ + delay(100); + /* set up global registers */ sc->cl_reg->cl_tpr = CL_TIMEOUT; sc->cl_reg->cl_rpilr = 0x03; @@ -383,13 +364,13 @@ clattach(parent, self, aux) intr_establish(PCC2_VECT + SMOIRQ, &sc->sc_ih_m); intr_establish(PCC2_VECT + STxIRQ, &sc->sc_ih_t); intr_establish(PCC2_VECT + SRxIRQ, &sc->sc_ih_r); - sc->sc_pcctwo = (struct pcc2reg *)ca->ca_parent; - sc->sc_pcctwo->pcc2_sccerrstat = 0x01; /* clear errors */ + sc->sc_pcctwo = ca->ca_master; + sc->sc_pcctwo->pcc2_sccerr = 0x01; /* clear errors */ /* enable all interrupts at ca_ipl */ - sc->sc_pcctwo->pcc2_sccmoirq = 0x10 | (ca->ca_ipl & 0x7); - sc->sc_pcctwo->pcc2_scctxirq = 0x10 | (ca->ca_ipl & 0x7); - sc->sc_pcctwo->pcc2_sccrxirq = 0x10 | (ca->ca_ipl & 0x7); + sc->sc_pcctwo->pcc2_sccirq = 0x10 | (ca->ca_ipl & 0x7); + sc->sc_pcctwo->pcc2_scctx = 0x10 | (ca->ca_ipl & 0x7); + sc->sc_pcctwo->pcc2_sccrx = 0x10 | (ca->ca_ipl & 0x7); break; default: /* oops */ @@ -959,29 +940,11 @@ int clcninit(cp) struct consdev *cp; { -#if defined(MVME187) - volatile struct clreg *cl_reg; - extern vm_offset_t clconsvaddr, pcc2consvaddr; - - cl_cons.cl_paddr = (void *)CD2400_BASE_ADDR; - cl_cons.cl_vaddr = (struct clreg *)CD2400_BASE_ADDR; - cl_cons.pcctwoaddr = (struct pcc2reg *)PCC2_BASE_ADDR; -#else -#ifdef MAP_DOES_WORK - int size = (0x1ff + PGOFSET) & ~PGOFSET; - int pcc2_size = (0x3C + PGOFSET) & ~PGOFSET; -#endif - struct clreg *cl_reg; + volatile struct clreg *cl_reg; cl_cons.cl_paddr = (void *)0xfff45000; -#ifdef MAP_DOES_WORK - cl_cons.cl_vaddr = mapiodev(cl_cons.cl_paddr,size); - cd_pcc2_base = mapiodev(0xfff42000,pcc2_size); -#else cl_cons.cl_vaddr = (struct clreg *)IIOV(cl_cons.cl_paddr); cl_cons.pcctwoaddr = (void *)IIOV(0xfff42000); -#endif -#endif /* defined(MVME187) cl_reg = cl_cons.cl_vaddr; /* reset the chip? */ #ifdef CLCD_DO_RESET @@ -1035,12 +998,13 @@ clcngetc(dev) int got_char = 0; u_char ier_old = 0xff; volatile struct clreg *cl_reg = cl_cons.cl_vaddr; - volatile struct pcc2reg *pcc2_base = cl_cons.pcctwoaddr; + volatile struct pcctworeg *pcc2_base = cl_cons.pcctwoaddr; cl_reg->cl_car = 0; if (!(cl_reg->cl_ier & 0x08)) { ier_old = cl_reg->cl_ier; cl_reg->cl_ier = 0x08; } + while (got_char == 0) { val = cl_reg->cl_rir; /* if no receive interrupt pending wait */ @@ -1048,7 +1012,7 @@ clcngetc(dev) continue; } /* XXX do we need to suck the entire FIFO contents? */ - reoir = pcc2_base->pcc2_sccrxpiack; /* receive PIACK */ + reoir = pcc2_base->pcc2_sccrxiack; /* receive PIACK */ licr = cl_reg->cl_licr; if (((licr >> 2) & 0x3) == 0) { /* is the interrupt for us (port 0) */ @@ -1216,7 +1180,7 @@ clgetc(sc, channel) int *channel; { volatile struct clreg *cl_reg; - volatile struct pcc2reg *pcc2_base; + volatile struct pcctworeg *pcc2_base; u_char val, reoir, licr, isrl, fifo_cnt, data; if (0 == sc) { cl_reg = cl_cons.cl_vaddr; @@ -1231,7 +1195,7 @@ clgetc(sc, channel) return 0; } /* XXX do we need to suck the entire FIFO contents? */ - reoir = pcc2_base->pcc2_sccrxpiack; /* receive PIACK */ + reoir = pcc2_base->pcc2_sccrxiack; /* receive PIACK */ licr = cl_reg->cl_licr; *channel = (licr >> 2) & 0x3; /* is the interrupt for us (port 0) */ @@ -1685,7 +1649,7 @@ cl_rxintr(sc) } else /* We don't need no sinkin special characters */ if (risrl & 0x08) { - cl_overflow (sc, channel, &sc->sc_fotime, "fifo"); + cl_overflow (sc, channel, (long*)&sc->sc_fotime, "fifo"); reoir = 0x08; } else if (risrl & 0x04) { @@ -1871,7 +1835,11 @@ cl_break (sc, channel) struct clsoftc *sc; int channel; { +#ifdef DEBUG_KERN + Debugger(); +#else log(LOG_WARNING, "%s%d[%d]: break detected\n", cl_cd.cd_name, 0, channel); +#endif return; } diff --git a/sys/arch/mvme88k/dev/clock.c b/sys/arch/mvme88k/dev/clock.c index 352bc426dfc..3535f83d231 100644 --- a/sys/arch/mvme88k/dev/clock.c +++ b/sys/arch/mvme88k/dev/clock.c @@ -1,6 +1,35 @@ -/* $NetBSD: clock.c,v 1.22 1995/05/29 23:57:15 pk Exp $ */ +/* $OpenBSD: clock.c,v 1.4 1998/12/15 05:52:29 smurph Exp $ */ /* + * Copyright (c) 1995 Theo de Raadt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * Copyright (c) 1995 Nivas Madhur @@ -58,10 +87,12 @@ #include <sys/gmon.h> #endif +#include <machine/psl.h> #include <machine/autoconf.h> #include <machine/cpu.h> #include <mvme88k/dev/pcctworeg.h> +#include "pcctwo.h" /* * Statistics clock interval and variance, in usec. Variance must be a @@ -79,12 +110,13 @@ u_long delay_factor = 1; static int clockmatch __P((struct device *, void *, void *)); static void clockattach __P((struct device *, struct device *, void *)); -int clockintr __P((void *, void *)); -int statintr __P((void *, void *)); +/*int clockintr __P((void *, void *));*/ +/*#int statintr __P((void *, void *));*/ struct clocksoftc { struct device sc_dev; - volatile struct pcc2reg *sc_pcc2reg; + struct intrhand sc_profih; + struct intrhand sc_statih; }; struct cfattach clock_ca = { @@ -95,13 +127,23 @@ struct cfdriver clock_cd = { NULL, "clock", DV_DULL, 0 }; -struct intrhand clockintrhand, statintrhand; +int clockintr __P((void *)); +int statintr __P((void *)); + +int clockbus; +u_char stat_reset, prof_reset; -static int -clockmatch(struct device *parent, void *self, void *aux) + /* + * Every machine must have a clock tick device of some sort; for this + * platform this file manages it, no matter what form it takes. + */ +int +clockmatch(parent, vcf, args) + struct device *parent; + void *vcf, *args; { - register struct confargs *ca = aux; - register struct cfdata *cf = self; + register struct confargs *ca = args; + register struct cfdata *cf = vcf; if (ca->ca_bustype != BUS_PCCTWO || strcmp(cf->cf_driver->cd_name, "clock")) { @@ -115,100 +157,62 @@ clockmatch(struct device *parent, void *self, void *aux) */ ca->ca_ipl = IPL_CLOCK; /* set size to 0 - see pcctwo.c:match for details */ - ca->ca_size = 0; + ca->ca_len = 0; - return 1; + + return (1); } -/* ARGSUSED */ -static void -clockattach(struct device *parent, struct device *self, void *aux) +void +clockattach(parent, self, args) + struct device *parent, *self; + void *args; { - struct confargs *ca = aux; + struct confargs *ca = args; struct clocksoftc *sc = (struct clocksoftc *)self; - u_long elapsedtime; - extern void delay(u_long); - extern int cpuspeed; + sc->sc_profih.ih_fn = clockintr; + sc->sc_profih.ih_arg = 0; + sc->sc_profih.ih_wantframe = 1; + sc->sc_profih.ih_ipl = ca->ca_ipl; - /* - * save virtual address of the pcc2 block since our - * registers are in that block. - */ - sc->sc_pcc2reg = (struct pcc2reg *)ca->ca_vaddr; + sc->sc_statih.ih_fn = statintr; + sc->sc_statih.ih_arg = 0; + sc->sc_statih.ih_wantframe = 1; + sc->sc_statih.ih_ipl = ca->ca_ipl; - /* - * calibrate for delay() calls. - * We do this by using tick timer1 in free running mode before - * cpu_initclocks() is called so turn on clock interrupts etc. - * - * the approach is: - * set count in timer to 0 - * call delay(1000) for a 1000 us delay - * after return, stop count and figure out - * how many us went by (call it x) - * now the factor to multiply the arg. passed to - * delay would be (x/1000) rounded up to an int. - */ - printf("\n"); - sc->sc_pcc2reg->pcc2_t1ctl &= ~PCC2_TICTL_CEN; - sc->sc_pcc2reg->pcc2_psclkadj = 256 - cpuspeed; - sc->sc_pcc2reg->pcc2_t1irq &= ~PCC2_TTIRQ_IEN; - sc->sc_pcc2reg->pcc2_t1cntr = 0; - sc->sc_pcc2reg->pcc2_t1ctl |= PCC2_TICTL_CEN; - delay(1000); /* delay for 1 ms */ - sc->sc_pcc2reg->pcc2_t1ctl &= ~PCC2_TICTL_CEN; - elapsedtime = sc->sc_pcc2reg->pcc2_t1cntr; - - delay_factor = (u_long)(elapsedtime / 1000 + 1); + clockbus = ca->ca_bustype; + prof_reset = ca->ca_ipl | PCC2_IRQ_IEN | PCC2_IRQ_ICLR; + stat_reset = ca->ca_ipl | PCC2_IRQ_IEN | PCC2_IRQ_ICLR; + pcctwointr_establish(PCC2V_TIMER1, &sc->sc_profih); + pcctwointr_establish(PCC2V_TIMER2, &sc->sc_statih); - /* - * program clock to interrupt at IPL_CLOCK. Set everything - * except compare registers, interrupt enable and counter - * enable registers. - */ - sc->sc_pcc2reg->pcc2_t1ctl &= ~(PCC2_TICTL_CEN); - sc->sc_pcc2reg->pcc2_t1cntr= 0; - sc->sc_pcc2reg->pcc2_t1ctl |= (PCC2_TICTL_COC|PCC2_TICTL_COVF); - sc->sc_pcc2reg->pcc2_t1irq = (PCC2_TTIRQ_ICLR|IPL_CLOCK); - - sc->sc_pcc2reg->pcc2_t2ctl &= ~(PCC2_TICTL_CEN); - sc->sc_pcc2reg->pcc2_t2cntr= 0; - sc->sc_pcc2reg->pcc2_t2ctl |= (PCC2_TICTL_COC|PCC2_TICTL_COVF); - sc->sc_pcc2reg->pcc2_t2irq = (PCC2_TTIRQ_ICLR|IPL_CLOCK); + printf("\n"); +} /* - * Establish inerrupt handlers. + * clockintr: ack intr and call hardclock */ - clockintrhand.ih_fn = clockintr; - clockintrhand.ih_arg = 0; /* don't want anything */ - clockintrhand.ih_ipl = IPL_CLOCK; - clockintrhand.ih_wantframe = 1; - intr_establish(PCC2_VECT+9, &clockintrhand); - - statintrhand.ih_fn = statintr; - statintrhand.ih_arg = 0; /* don't want anything */ - statintrhand.ih_ipl = IPL_CLOCK; - statintrhand.ih_wantframe = 1; - intr_establish(PCC2_VECT+8, &statintrhand); - - timerok = 1; +int +clockintr(arg) + void *arg; +{ + sys_pcc2->pcc2_t1irq = prof_reset; + hardclock(arg); +#include "bugtty.h" +#if NBUGTTY > 0 + bugtty_chkinput(); +#endif /* NBUGTTY */ + return (1); } /* - * Set up the real-time and statistics clocks. Leave stathz 0 only if - * no alternative timer is available. mvme167/mvme187 has 2 tick timers - * in pcc2 - we are using timer 1 for clock interrupt and timer 2 for - * statistics. - * - * The frequencies of these clocks must be an even number of microseconds. + * Set up real-time clock; we don't have a statistics clock at + * present. */ cpu_initclocks() { register int statint, minint; - volatile struct pcc2reg *pcc2reg; - - pcc2reg = ((struct clocksoftc *)clock_cd.cd_devs[0])->sc_pcc2reg; if (1000000 % hz) { printf("cannot get %d Hz clock; using 100 Hz\n", hz); @@ -227,91 +231,41 @@ cpu_initclocks() minint = statint / 2 + 100; while (statvar > minint) statvar >>= 1; - /* - * hz value 100 means we want the clock to interrupt 100 - * times a sec or 100 times in 1000000 us ie, 1 interrupt - * every 10000 us. Program the tick timer compare register - * to this value. - */ - pcc2reg->pcc2_t1cmp = tick; - pcc2reg->pcc2_t2cmp = statint; - statmin = statint - (statvar >> 1); - /* start the clocks ticking */ - pcc2reg->pcc2_t1ctl = (PCC2_TICTL_CEN|PCC2_TICTL_COC|PCC2_TICTL_COVF); - pcc2reg->pcc2_t2ctl = (PCC2_TICTL_CEN|PCC2_TICTL_COC|PCC2_TICTL_COVF); - /* and enable those interrupts */ - pcc2reg->pcc2_t1irq |= (PCC2_TTIRQ_IEN|PCC2_TTIRQ_ICLR); - pcc2reg->pcc2_t2irq |= (PCC2_TTIRQ_IEN|PCC2_TTIRQ_ICLR); -} + /* profclock */ + sys_pcc2->pcc2_t1ctl = 0; + sys_pcc2->pcc2_t1cmp = pcc2_timer_us2lim(tick); + sys_pcc2->pcc2_t1count = 0; + sys_pcc2->pcc2_t1ctl = PCC2_TCTL_CEN | PCC2_TCTL_COC | + PCC2_TCTL_COVF; + sys_pcc2->pcc2_t1irq = prof_reset; + + /* statclock */ + sys_pcc2->pcc2_t2ctl = 0; + sys_pcc2->pcc2_t2cmp = pcc2_timer_us2lim(statint); + sys_pcc2->pcc2_t2count = 0; + sys_pcc2->pcc2_t2ctl = PCC2_TCTL_CEN | PCC2_TCTL_COC | + PCC2_TCTL_COVF; + sys_pcc2->pcc2_t2irq = stat_reset; -/* - * Dummy setstatclockrate(), since we know profhz==hz. - */ -/* ARGSUSED */ -void -setstatclockrate(int newhz) -{ - /* nothing */ + statmin = statint - (statvar >> 1); } -/* - * Delay: wait for `about' n microseconds to pass. - */ void -delay(volatile u_long n) -{ - volatile u_long cnt = n * delay_factor; - - while (cnt-- > 0) { - asm volatile(""); - } -} - -/* - * Clock interrupt handler. Calls hardclock() after setting up a - * clockframe. - */ -int -clockintr(void *cap, void *frame) +setstatclockrate(newhz) + int newhz; { - volatile struct pcc2reg *reg; - - reg = ((struct clocksoftc *)clock_cd.cd_devs[0])->sc_pcc2reg; - - /* Clear the interrupt */ - reg->pcc2_t1irq = (PCC2_TTIRQ_IEN|PCC2_TTIRQ_ICLR|IPL_CLOCK); -#if 0 - reg->pcc2_t1irq |= PCC2_TTIRQ_ICLR; -#endif /* 0 */ - - hardclock((struct clockframe *)frame); -#include "bugtty.h" -#if NBUGTTY > 0 - bugtty_chkinput(); -#endif /* NBUGTTY */ - - return (1); } -/* - * Stat clock interrupt handler. - */ int -statintr(void *cap, void *frame) +statintr(cap) + void *cap; { - volatile struct pcc2reg *reg; register u_long newint, r, var; - reg = ((struct clocksoftc *)clock_cd.cd_devs[0])->sc_pcc2reg; - - /* Clear the interrupt */ -#if 0 - reg->pcc2_t2irq |= PCC2_TTIRQ_ICLR; -#endif /* 0 */ - reg->pcc2_t2irq = (PCC2_TTIRQ_IEN|PCC2_TTIRQ_ICLR|IPL_CLOCK); + sys_pcc2->pcc2_t2irq = stat_reset; - statclock((struct clockframe *)frame); + statclock((struct clockframe *)cap); /* * Compute new randomized interval. The intervals are uniformly @@ -324,48 +278,27 @@ statintr(void *cap, void *frame) } while (r == 0); newint = statmin + r; - /* - * reprogram statistics timer to interrupt at - * newint us intervals. - */ - reg->pcc2_t2ctl = ~(PCC2_TICTL_CEN); - reg->pcc2_t2cntr = 0; - reg->pcc2_t2cmp = newint; - reg->pcc2_t2ctl = (PCC2_TICTL_CEN|PCC2_TICTL_COC|PCC2_TICTL_COVF); - reg->pcc2_t2irq |= (PCC2_TTIRQ_ICLR|PCC2_TTIRQ_IEN); + sys_pcc2->pcc2_t2ctl = 0; + sys_pcc2->pcc2_t2cmp = pcc2_timer_us2lim(newint); + sys_pcc2->pcc2_t2count = 0; /* should I? */ + sys_pcc2->pcc2_t2irq = stat_reset; + sys_pcc2->pcc2_t2ctl = PCC2_TCTL_CEN | PCC2_TCTL_COC; return (1); } -/* - * Return the best possible estimate of the time in the timeval - * to which tvp points. We do this by returning the current time - * plus the amount of time since the last clock interrupt. - * - * Check that this time is no less than any previously-reported time, - * which could happen around the time of a clock adjustment. Just for - * fun, we guarantee that the time will be greater than the value - * obtained by a previous call. - */ -void -microtime(tvp) - register struct timeval *tvp; +delay(us) + register int us; { - int s; - static struct timeval lasttime; - - s = splhigh(); - *tvp = time; - while (tvp->tv_usec > 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - if (tvp->tv_sec == lasttime.tv_sec && - tvp->tv_usec <= lasttime.tv_usec && - (tvp->tv_usec = lasttime.tv_usec + 1) > 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - lasttime = *tvp; - splx(s); + volatile register int c; + + /* + * XXX MVME167 doesn't have a 3rd free-running timer, + * so we use a stupid loop. Fix the code to watch t1: + * the profiling timer. + */ + c = 4 * us; + while (--c > 0) + ; + return (0); } diff --git a/sys/arch/mvme88k/dev/clockreg.h b/sys/arch/mvme88k/dev/clockreg.h index e2222446f1c..cb66b35e243 100644 --- a/sys/arch/mvme88k/dev/clockreg.h +++ b/sys/arch/mvme88k/dev/clockreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: clockreg.h,v 1.5 1994/11/20 20:54:07 deraadt Exp $ */ +/* $OpenBSD: clockreg.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /* * Copyright (c) 1992, 1993 diff --git a/sys/arch/mvme88k/dev/clreg.h b/sys/arch/mvme88k/dev/clreg.h index e2aead59379..8377578d063 100644 --- a/sys/arch/mvme88k/dev/clreg.h +++ b/sys/arch/mvme88k/dev/clreg.h @@ -1,5 +1,5 @@ -/* $NetBSD$ */ -/* +/* $OpenBSD: clreg.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ +/* Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Dale Rahn. All rights reserved. * * @@ -30,136 +30,136 @@ */ struct clreg { - volatile u_char anon1[0x7]; - volatile u_char cl_cor7; /* 0x07 */ - volatile u_char anon2[0x1]; - volatile u_char cl_livr; /* 0x09 */ + volatile u_char anon1[0x7]; + volatile u_char cl_cor7; /* 0x07 */ + volatile u_char anon2[0x1]; + volatile u_char cl_livr; /* 0x09 */ volatile u_char anon3[0x6]; - volatile u_char cl_cor1; /* 0x10 */ - volatile u_char cl_ier; /* 0x11 */ - volatile u_char cl_stcr; /* 0x12 */ - volatile u_char cl_ccr; /* 0x13 */ - volatile u_char cl_cor5; /* 0x14 */ - volatile u_char cl_cor4; /* 0x15 */ - volatile u_char cl_cor3; /* 0x16 */ - volatile u_char cl_cor2; /* 0x17 */ - volatile u_char cl_cor6; /* 0x18 */ - volatile u_char cl_dmabsts; /* 0x19 */ - volatile u_char cl_csr; /* 0x1a */ - volatile u_char cl_cmr; /* 0x1b */ - volatile u_char cl_schr4; /* 0x1c */ - volatile u_char cl_schr3; /* 0x1d */ - volatile u_char cl_schr2; /* 0x1e */ - volatile u_char cl_schr1; /* 0x1f */ - volatile u_char anon5[0x2]; - volatile u_char cl_scrh; /* 0x22 */ - volatile u_char cl_scrl; /* 0x23 */ + volatile u_char cl_cor1; /* 0x10 */ + volatile u_char cl_ier; /* 0x11 */ + volatile u_char cl_stcr; /* 0x12 */ + volatile u_char cl_ccr; /* 0x13 */ + volatile u_char cl_cor5; /* 0x14 */ + volatile u_char cl_cor4; /* 0x15 */ + volatile u_char cl_cor3; /* 0x16 */ + volatile u_char cl_cor2; /* 0x17 */ + volatile u_char cl_cor6; /* 0x18 */ + volatile u_char cl_dmabsts; /* 0x19 */ + volatile u_char cl_csr; /* 0x1a */ + volatile u_char cl_cmr; /* 0x1b */ + volatile u_char cl_schr4; /* 0x1c */ + volatile u_char cl_schr3; /* 0x1d */ + volatile u_char cl_schr2; /* 0x1e */ + volatile u_char cl_schr1; /* 0x1f */ + volatile u_char anon5[0x2]; + volatile u_char cl_scrh; /* 0x22 */ + volatile u_char cl_scrl; /* 0x23 */ #define cl_rtpr rtpr.rtpr_rtpr #define cl_rtprh rtpr.hl.rtpr_rtprh #define cl_rtprl rtpr.hl.rtpr_rtprl union { - volatile u_short rtpr_rtpr; /* 0x24 */ + volatile u_short rtpr_rtpr; /* 0x24 */ struct { - volatile u_char rtpr_rtprh; /* 0x24 */ - volatile u_char rtpr_rtprl; /* 0x25 */ + volatile u_char rtpr_rtprh; /* 0x24 */ + volatile u_char rtpr_rtprl; /* 0x25 */ }hl; }rtpr; - volatile u_char cl_licr; /* 0x26 */ - volatile u_char anon6[0x7]; - volatile u_char cl_lnxt; /* 0x2e */ - volatile u_char anon7[0x1]; - volatile u_char cl_rfoc; /* 0x30 */ - volatile u_char anon8[0x7]; - volatile u_short cl_tcbadru; /* 0x38 */ - volatile u_short cl_tcbadrl; /* 0x3a */ - volatile u_short cl_rcbadru; /* 0x3c */ - volatile u_short cl_rcbadrl; /* 0x3e */ - volatile u_short cl_arbadru; /* 0x40 */ - volatile u_short cl_arbadrl; /* 0x42 */ - volatile u_short cl_brbadru; /* 0x44 */ - volatile u_short cl_brbadrl; /* 0x46 */ - volatile u_short cl_brbcnt; /* 0x48 */ - volatile u_short cl_arbcnt; /* 0x4a */ - volatile u_char anoni[0x2]; - volatile u_char cl_brbsts; /* 0x4e */ - volatile u_char cl_arbsts; /* 0x4f */ + volatile u_char cl_licr; /* 0x26 */ + volatile u_char anon6[0x7]; + volatile u_char cl_lnxt; /* 0x2e */ + volatile u_char anon7[0x1]; + volatile u_char cl_rfoc; /* 0x30 */ + volatile u_char anon8[0x7]; + volatile u_short cl_tcbadru; /* 0x38 */ + volatile u_short cl_tcbadrl; /* 0x3a */ + volatile u_short cl_rcbadru; /* 0x3c */ + volatile u_short cl_rcbadrl; /* 0x3e */ + volatile u_short cl_arbadru; /* 0x40 */ + volatile u_short cl_arbadrl; /* 0x42 */ + volatile u_short cl_brbadru; /* 0x44 */ + volatile u_short cl_brbadrl; /* 0x46 */ + volatile u_short cl_brbcnt; /* 0x48 */ + volatile u_short cl_arbcnt; /* 0x4a */ + volatile u_char anoni[0x2]; + volatile u_char cl_brbsts; /* 0x4e */ + volatile u_char cl_arbsts; /* 0x4f */ #define cl_atbadr atbadr.atbadr #define cl_atbadru atbadr.hl.atbadru #define cl_atbadrl atbadr.hl.atbadrl union { struct { - volatile u_short atbadru; /* 0x50 */ - volatile u_short atbadrl; /* 0x52 */ + volatile u_short atbadru; /* 0x50 */ + volatile u_short atbadrl; /* 0x52 */ }hl; - volatile u_long atbadr; /* 0x50 */ + volatile u_long atbadr; /* 0x50 */ }atbadr; #define cl_btbadr btbadr.btbadr #define cl_btbadru btbadr.hl.btbadru #define cl_btbadrl btbadr.hl.btbadrl union { struct { - volatile u_short btbadru; /* 0x54 */ - volatile u_short btbadrl; /* 0x56 */ + volatile u_short btbadru; /* 0x54 */ + volatile u_short btbadrl; /* 0x56 */ }hl; - volatile u_long btbadr; /* 0x54 */ + volatile u_long btbadr; /* 0x54 */ }btbadr; - volatile u_short cl_btbcnt; /* 0x58 */ - volatile u_short cl_atbcnt; /* 0x5a */ - volatile u_char anono[0x2]; - volatile u_char cl_btbsts; /* 0x5e */ - volatile u_char cl_atbsts; /* 0x5f */ - volatile u_char anonp[0x20]; - volatile u_char cl_tftc; /* 0x80 */ - volatile u_char cl_gfrcr; /* 0x81 */ - volatile u_char anonq[0x2]; - volatile u_char cl_reoir; /* 0x84 */ - volatile u_char cl_teoir; /* 0x85 */ - volatile u_char cl_meoir; /* 0x86 */ - volatile u_char anonr[0x1]; + volatile u_short cl_btbcnt; /* 0x58 */ + volatile u_short cl_atbcnt; /* 0x5a */ + volatile u_char anono[0x2]; + volatile u_char cl_btbsts; /* 0x5e */ + volatile u_char cl_atbsts; /* 0x5f */ + volatile u_char anonp[0x20]; + volatile u_char cl_tftc; /* 0x80 */ + volatile u_char cl_gfrcr; /* 0x81 */ + volatile u_char anonq[0x2]; + volatile u_char cl_reoir; /* 0x84 */ + volatile u_char cl_teoir; /* 0x85 */ + volatile u_char cl_meoir; /* 0x86 */ + volatile u_char anonr[0x1]; #define cl_risr risr.risr_risr #define cl_risrl risr.hl.risr_risrl #define cl_risrh risr.hl.risr_risrh union { - volatile u_short risr_risr; /* 0x88 */ + volatile u_short risr_risr; /* 0x88 */ struct { - volatile u_char risr_risrh; /* 0x88 */ - volatile u_char risr_risrl; /* 0x89 */ + volatile u_char risr_risrh; /* 0x88 */ + volatile u_char risr_risrl; /* 0x89 */ }hl; }risr; - volatile u_char cl_tisr; /* 0x8a */ - volatile u_char cl_misr; /* 0x8b */ - volatile u_char anons[0x2]; - volatile u_char cl_bercnt; /* 0x8e */ - volatile u_char anont[0x31]; - volatile u_char cl_tcor; /* 0xc0 */ - volatile u_char anonu[0x2]; - volatile u_char cl_tbpr; /* 0xc3 */ - volatile u_char anonv[0x4]; - volatile u_char cl_rcor; /* 0xc8 */ - volatile u_char anonw[0x2]; - volatile u_char cl_rbpr; /* 0xcb */ - volatile u_char anonx[0xa]; - volatile u_char cl_cpsr; /* 0xd6 */ - volatile u_char anony[0x3]; - volatile u_char cl_tpr; /* 0xda */ - volatile u_char anonz[0x3]; - volatile u_char cl_msvr_rts; /* 0xde */ - volatile u_char cl_msvr_dtr; /* 0xdf */ - volatile u_char cl_tpilr; /* 0xe0 */ - volatile u_char cl_rpilr; /* 0xe1 */ - volatile u_char cl_stk; /* 0xe2 */ - volatile u_char cl_mpilr; /* 0xe3 */ - volatile u_char anonA[0x8]; - volatile u_char cl_tir; /* 0xec */ - volatile u_char cl_rir; /* 0xed */ - volatile u_char cl_car; /* 0xee */ - volatile u_char cl_mir; /* 0xef */ - volatile u_char anonB[0x6]; - volatile u_char cl_dmr; /* 0xf6 */ - volatile u_char anonC[0x1]; + volatile u_char cl_tisr; /* 0x8a */ + volatile u_char cl_misr; /* 0x8b */ + volatile u_char anons[0x2]; + volatile u_char cl_bercnt; /* 0x8e */ + volatile u_char anont[0x31]; + volatile u_char cl_tcor; /* 0xc0 */ + volatile u_char anonu[0x2]; + volatile u_char cl_tbpr; /* 0xc3 */ + volatile u_char anonv[0x4]; + volatile u_char cl_rcor; /* 0xc8 */ + volatile u_char anonw[0x2]; + volatile u_char cl_rbpr; /* 0xcb */ + volatile u_char anonx[0xa]; + volatile u_char cl_cpsr; /* 0xd6 */ + volatile u_char anony[0x3]; + volatile u_char cl_tpr; /* 0xda */ + volatile u_char anonz[0x3]; + volatile u_char cl_msvr_rts; /* 0xde */ + volatile u_char cl_msvr_dtr; /* 0xdf */ + volatile u_char cl_tpilr; /* 0xe0 */ + volatile u_char cl_rpilr; /* 0xe1 */ + volatile u_char cl_stk; /* 0xe2 */ + volatile u_char cl_mpilr; /* 0xe3 */ + volatile u_char anonA[0x8]; + volatile u_char cl_tir; /* 0xec */ + volatile u_char cl_rir; /* 0xed */ + volatile u_char cl_car; /* 0xee */ + volatile u_char cl_mir; /* 0xef */ + volatile u_char anonB[0x6]; + volatile u_char cl_dmr; /* 0xf6 */ + volatile u_char anonC[0x1]; #define cl_rdr cl_tdr - volatile u_char cl_tdr; /* 0xf8 */ - volatile u_char anonD[7]; + volatile u_char cl_tdr; /* 0xf8 */ + volatile u_char anonD[7]; }; diff --git a/sys/arch/mvme88k/dev/i82586.h b/sys/arch/mvme88k/dev/i82586.h index fb6e2b1090f..f0bf80ade44 100644 --- a/sys/arch/mvme88k/dev/i82586.h +++ b/sys/arch/mvme88k/dev/i82586.h @@ -1,6 +1,7 @@ -/* $Id: i82586.h,v 1.1 1997/03/03 19:32:07 rahnds Exp $ */ +/* $OpenBSD: i82586.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /*- + * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Theo de Raadt * Copyright (c) 1992, University of Vermont and State Agricultural College. * Copyright (c) 1992, Garrett A. Wollman. diff --git a/sys/arch/mvme88k/dev/if_ie.c b/sys/arch/mvme88k/dev/if_ie.c index 859e26b41b0..b832953497a 100644 --- a/sys/arch/mvme88k/dev/if_ie.c +++ b/sys/arch/mvme88k/dev/if_ie.c @@ -1,6 +1,7 @@ -/* $Id: if_ie.c,v 1.1 1997/03/03 19:32:06 rahnds Exp $ */ +/* $Id: if_ie.c,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /*- + * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Theo de Raadt * Copyright (c) 1993, 1994, 1995 Charles Hannum. * Copyright (c) 1992, 1993, University of Vermont and State @@ -288,7 +289,7 @@ struct ie_softc { struct mcreg *sc_mc; #endif #if NPCCTWO > 0 - struct pcc2reg *sc_pcc2; + struct pcctworeg *sc_pcc2; #endif }; @@ -339,13 +340,12 @@ struct cfdriver ie_cd = { * MK_16 = KVA -> 16 bit address in INTEL byte order * ST_24 = store a 24 bit address in SUN byte order to INTEL byte order */ - -#define MK_24(base, ptr) ((caddr_t)(((u_long)(ptr)) & 0x00ffffff)) +#define MK_24(base, ptr) ((caddr_t)((u_long)ptr)) #define MK_16(base, ptr) SWAP((u_short)( ((u_long)(ptr)) - ((u_long)(base)) )) #define ST_24(to, from) { \ u_long fval = (u_long)(from); \ u_char *t = (u_char *)&(to), *f = (u_char *)&fval; \ - t[0] = f[2]; t[1] = f[3]; t[2] = 0; t[3] = f[1]; \ + t[0] = f[2]; t[1] = f[3]; /*t[2] = f[0]*/; t[3] = f[1]; \ } /* * Here are a few useful functions. We could have done these as macros, but @@ -388,39 +388,13 @@ iematch(parent, vcf, args) { struct cfdata *cf = vcf; struct confargs *ca = args; - -#if defined(MVME187) - caddr_t base; - if (cputyp != CPU_187) - { - return 0; - } - - /* - * If bus or name do not match, fail. - */ - if (ca->ca_bustype != BUS_PCCTWO || - strcmp(cf->cf_driver->cd_name, "ie")) { - return 0; - } - - base = (caddr_t)cf->cf_loc[0]; - - if (badpaddr(base, 1) == -1) { - return 0; + int ret; + + if ((ret = badvaddr(IIOV(ca->ca_vaddr), 1)) <=0){ + printf("==> ie: failed address check returning %ld.\n", ret); + return(0); } - - /* - * tell our parent our requirements - */ - ca->ca_paddr = (caddr_t)LANCE_ADDR; - ca->ca_size = 0x1000; - ca->ca_ipl = IPL_NET; - - return 1; -#else - return (!badvaddr(ca->ca_vaddr, 4)); -#endif + return (1); } /* @@ -433,25 +407,18 @@ ie_obreset(sc) volatile struct ieob *ieo = (struct ieob *) sc->sc_reg; volatile int t; u_long a; - u_long b; - /* - * Convert a to the format the chip expects before writing - * the high and low (16 bit) words of the CPU port. - */ a = IE_PORT_RESET; - ST_24(b, a); - ieo->porthigh = b >> 16; + ieo->porthigh = a & 0xffff; t = 0; t = 1; - ieo->portlow = b & 0xffff; + ieo->portlow = a >> 16; delay(1000); - a = (u_long)pmap_extract(pmap_kernel(), (vm_offset_t)sc->scp) - | IE_PORT_NEWSCPADDR; - ST_24(b, a); - ieo->porthigh = b >> 16; + a = (u_long)pmap_extract(pmap_kernel(), (vm_offset_t)sc->scp) | + IE_PORT_NEWSCPADDR; + ieo->porthigh = a & 0xffff; t = 0; t = 1; - ieo->portlow = b & 0xffff; + ieo->portlow = a >> 16; delay(1000); } @@ -496,14 +463,10 @@ ieattach(parent, self, aux) sc->sc_reg = ca->ca_vaddr; ieo = (volatile struct ieob *) sc->sc_reg; -#if XXXX - /* Don't know what this yet XXX nivas */ /* Are we the boot device? */ if (ca->ca_paddr == bootaddr) bootdv = self; -#endif -#if 0 sc->sc_maddr = etherbuf; /* maddr = vaddr */ pa = pmap_extract(pmap_kernel(), (vm_offset_t)sc->sc_maddr); if (pa == 0) panic("ie pmap_extract"); @@ -521,28 +484,6 @@ ieattach(parent, self, aux) /*printf("scpV %x iscpV %x scbV %x\n", sc->scp, sc->iscp, sc->scb);*/ sc->scp->ie_bus_use = 0; /* 16-bit */ -#endif /* 0 */ - sc->sc_maddr = etherbuf; /* maddr = vaddr */ - pa = pmap_extract(pmap_kernel(), (vm_offset_t)sc->sc_maddr); - if (pa == 0) panic("ie pmap_extract"); - sc->sc_iobase = (caddr_t)pa; /* iobase = paddr (24 bit) */ - - (sc->memzero)(sc->sc_maddr, sc->sc_msize); - - sc->scb = (volatile struct ie_sys_ctl_block *) - sc->sc_maddr; /* @ location zero */ - sc->scp = (struct ie_sys_conf_ptr *) - roundup((int)sc->scb + sizeof(struct ie_sys_ctl_block), 16); - sc->iscp = (volatile struct ie_int_sys_conf_ptr *) - roundup((int)sc->scp + sizeof(struct ie_sys_conf_ptr), 16); - - /*printf("maddrV %x iobaseP %x\n", sc->sc_maddr, sc->sc_iobase);*/ - /*printf("scpV %x iscpV %x scbV %x\n", sc->scp, sc->iscp, sc->scb);*/ - - /* - * init scp; iscp will be inited later in ie_setupram(). - */ - sc->scp->ie_bus_use = 0; /* 8-bit */ ST_24(sc->scp->ie_iscp_ptr, pmap_extract(pmap_kernel(), (vm_offset_t)sc->iscp)); @@ -603,13 +544,12 @@ ieattach(parent, self, aux) #endif #if NPCCTWO > 0 case BUS_PCCTWO: - - intr_establish(PCC2_VECT + LANCIRQ, &sc->sc_ih); - sc->sc_pcc2 = (struct pcc2reg *)ca->ca_parent; - sc->sc_pcc2->pcc2_lancirq = pri | + pcctwointr_establish(PCC2V_IE, &sc->sc_ih); + sc->sc_pcc2 = (struct pcctworeg *)ca->ca_master; + sc->sc_pcc2->pcc2_ieirq = pri | PCC2_SC_SNOOP | PCC2_IRQ_IEN | PCC2_IRQ_ICLR; - intr_establish(PCC2_VECT + LANCERR, &sc->sc_failih); - sc->sc_pcc2->pcc2_lancerrirq = pri | PCC2_IRQ_IEN | + pcctwointr_establish(PCC2V_IEFAIL, &sc->sc_failih); + sc->sc_pcc2->pcc2_iefailirq = pri | PCC2_IRQ_IEN | PCC2_IRQ_ICLR; break; #endif @@ -650,9 +590,9 @@ void *v; #endif #if NPCCTWO > 0 case BUS_PCCTWO: - sc->sc_pcc2->pcc2_lancirq |= PCC2_IRQ_ICLR; /* safe: clear irq */ - sc->sc_pcc2->pcc2_lancerrirq |= PCC2_IRQ_ICLR; /* clear failure */ - sc->sc_pcc2->pcc2_lancerrstat = PCC2_IEERR_SCLR; /* reset error */ + sc->sc_pcc2->pcc2_ieirq |= PCC2_IRQ_ICLR; /* safe: clear irq */ + sc->sc_pcc2->pcc2_iefailirq |= PCC2_IRQ_ICLR; /* clear failure */ + sc->sc_pcc2->pcc2_ieerr = PCC2_IEERR_SCLR; /* reset error */ break; #endif } @@ -685,7 +625,7 @@ loop: #endif #if NPCCTWO > 0 case BUS_PCCTWO: - sc->sc_pcc2->pcc2_lancirq |= PCC2_IRQ_ICLR; /* clear irq */ + sc->sc_pcc2->pcc2_ieirq |= PCC2_IRQ_ICLR; /* clear irq */ break; #endif } diff --git a/sys/arch/mvme88k/dev/if_ie.h b/sys/arch/mvme88k/dev/if_ie.h index 78d1301fcb3..42b1a0edae0 100644 --- a/sys/arch/mvme88k/dev/if_ie.h +++ b/sys/arch/mvme88k/dev/if_ie.h @@ -1,6 +1,6 @@ -/* $Id: if_ie.h,v 1.1 1997/03/03 19:32:05 rahnds Exp $ */ +/* $OpenBSD: if_ie.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ -/* +/* Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1995 Theo de Raadt * All rights reserved. * diff --git a/sys/arch/mvme88k/dev/mainbus.c b/sys/arch/mvme88k/dev/mainbus.c index e51e630493b..49e002f1075 100644 --- a/sys/arch/mvme88k/dev/mainbus.c +++ b/sys/arch/mvme88k/dev/mainbus.c @@ -1,3 +1,5 @@ +/* $OpenBSD: mainbus.c,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ +/* Copyright (c) 1998 Steve Murphree, Jr. */ #include <sys/param.h> #include <sys/systm.h> #include <sys/reboot.h> @@ -8,17 +10,11 @@ #include <machine/cpu.h> #include <machine/autoconf.h> -void mbattach __P((struct device *, struct device *, void *)); -int mbprint __P((void *, const char *)); -int mbmatch __P((struct device *, void *, void *)); -int submatch __P((struct device *, void *, void *)); - -/* - * mainbus driver - */ +void mainbus_attach __P((struct device *, struct device *, void *)); +int mainbus_match __P((struct device *, void *, void *)); struct cfattach mainbus_ca = { - sizeof(struct device), mbmatch, mbattach + sizeof(struct device), mainbus_match, mainbus_attach }; struct cfdriver mainbus_cd = { @@ -26,70 +22,59 @@ struct cfdriver mainbus_cd = { }; int -mbmatch(struct device *pdp, void *self, void *auxp) +mainbus_match(parent, cf, args) + struct device *parent; + void *cf; + void *args; { - struct cfdata *cfp = self; - - if (cfp->cf_unit > 0) - return(0); - /* - * We are always here - */ - return(1); + return (1); } -/* - * "find" all the things that should be there. - */ -void -mbattach(struct device *pdp, struct device *dp, void *auxp) +int +mainbus_print(args, bus) + void *args; + const char *bus; { - struct cfdata *cf; - extern int cputyp; - - /* nothing to do for this bus */ - printf (" machine type %x\n", cputyp); - - if ((cf = config_search(submatch, dp, auxp)) != NULL) { - return; - } + struct confargs *ca = args; + if (ca->ca_paddr != (void *)-1) + printf(" addr 0x%x", (u_int32_t)ca->ca_paddr); + return (UNCONF); } int -mbprint(void *auxp, const char *pnp) +mainbus_scan(parent, child, args) + struct device *parent; + void *child, *args; { - if (pnp) - printf("%s at %s", (char *)auxp, pnp); - return(UNCONF); + struct cfdata *cf = child; + struct confargs oca; + + bzero(&oca, sizeof oca); + oca.ca_paddr = (void *)cf->cf_loc[0]; + oca.ca_vaddr = (void *)-1; + oca.ca_ipl = -1; + oca.ca_bustype = BUS_MAIN; + oca.ca_name = cf->cf_driver->cd_name; + if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0) + return (0); + config_attach(parent, cf, &oca, mainbus_print); + return (1); } -int -submatch(struct device *parent, void *self, void *aux) +void +mainbus_attach(parent, self, args) + struct device *parent, *self; + void *args; { - struct confargs *ca = aux; - struct cfdata *cf = self; - - ca->ca_bustype = BUS_MAIN; - ca->ca_paddr = (caddr_t)cf->cf_loc[0]; - ca->ca_size = cf->cf_loc[1]; - - if (!(*cf->cf_attach->ca_match)(parent, cf, ca)) { - if (!parent) - cf->cf_fstate = FSTATE_FOUND; - - return 0; - } + printf (" machine type %x\n", cputyp); - /* - * mapin the device memory of the child and call attach. + /* XXX + * should have a please-attach-first list for mainbus, + * to ensure that the pcc/vme2/mcc chips are attached + * first. */ -#if 0 - ca->ca_vaddr = (caddr_t)iomap_mapin(ca->ca_paddr, ca->ca_size, 1); -#endif /* 0 */ - ca->ca_vaddr = ca->ca_paddr; - config_attach(parent, cf, ca, mbprint); - - return 1; + (void)config_search(mainbus_scan, self, args); } + diff --git a/sys/arch/mvme88k/dev/memc.c b/sys/arch/mvme88k/dev/memc.c index 0cffad3f64b..f07337d3aec 100644 --- a/sys/arch/mvme88k/dev/memc.c +++ b/sys/arch/mvme88k/dev/memc.c @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: memc.c,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -14,7 +14,8 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by Theo de Raadt + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * @@ -31,11 +32,9 @@ */ /* - * MEMC chip - * XXX: - * the databooks say that you should only ever access the higher-numbered - * MEMC chip's control & status registers. this is strange. I disobey the - * rules, hopefully there won't be any spanking. + * MEMC/MCECC chips + * these chips are rather similar in appearance except that the MEMC + * does parity while the MCECC does ECC. */ #include <sys/param.h> #include <sys/conf.h> @@ -58,7 +57,7 @@ struct memcsoftc { struct device sc_dev; - caddr_t sc_vaddr; + void * sc_vaddr; struct memcreg *sc_memc; struct intrhand sc_ih; }; @@ -66,11 +65,16 @@ struct memcsoftc { void memcattach __P((struct device *, struct device *, void *)); int memcmatch __P((struct device *, void *, void *)); -struct cfdriver memccd = { - NULL, "memc", memcmatch, memcattach, - DV_DULL, sizeof(struct memcsoftc), 0 +struct cfattach memc_ca = { + sizeof(struct memcsoftc), memcmatch, memcattach }; +struct cfdriver memc_cd = { + NULL, "memc", DV_DULL, 0 +}; + +/*int memcintr __P((struct frame *frame));*/ + int memcmatch(parent, vcf, args) struct device *parent; @@ -80,9 +84,11 @@ memcmatch(parent, vcf, args) struct confargs *ca = args; struct memcreg *memc = (struct memcreg *)ca->ca_vaddr; - if (badvaddr(memc, 4) || memc->memc_chipid != MEMC_CHIPID) + if (badvaddr(memc, 1)) return (0); - return (1); + if (memc->memc_chipid==MEMC_CHIPID || memc->memc_chipid==MCECC_CHIPID) + return (1); + return (0); } void @@ -97,15 +103,33 @@ memcattach(parent, self, args) * since we know ourself to land in intiobase land, * we must adjust our address */ - sc->sc_memc = (struct memcreg *)sc->sc_vaddr; + sc->sc_memc = (struct memcreg *)ca->ca_vaddr; - printf(": rev %d, unsupported\n", sc->sc_memc->memc_chiprev); + printf(": %s rev %d", + (sc->sc_memc->memc_chipid == MEMC_CHIPID) ? "MEMC040" : "MCECC", + sc->sc_memc->memc_chiprev); #if 0 - sc->sc_nmiih.ih_fn = memcabort; - sc->sc_nmiih.ih_arg = 0; - sc->sc_nmiih.ih_ipl = 7; - sc->sc_nmiih.ih_wantframe = 1; - mcintr_establish(xxx, &sc->sc_nmiih); + sc->sc_ih.ih_fn = memcintr; + sc->sc_ih.ih_arg = 0; + sc->sc_ih.ih_ipl = 7; + sc->sc_ih.ih_wantframe = 1; + mcintr_establish(xxx, &sc->sc_ih); #endif + + switch (sc->sc_memc->memc_chipid) { + case MEMC_CHIPID: + break; + case MCECC_CHIPID: + break; + } + + printf("\n"); } + +/*int +memcintr(frame) + struct frame *frame; +{ + return (0); +}*/ diff --git a/sys/arch/mvme88k/dev/memcreg.h b/sys/arch/mvme88k/dev/memcreg.h index 304d35b6666..6295850a832 100644 --- a/sys/arch/mvme88k/dev/memcreg.h +++ b/sys/arch/mvme88k/dev/memcreg.h @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: memcreg.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -14,7 +14,8 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by Theo de Raadt + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. * 4. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * @@ -31,7 +32,7 @@ */ /* - * the MEMC's registers are very similar to the MCECC chip + * the MEMC's registers are a subset of the MCECC chip */ struct memcreg { volatile u_char memc_chipid; @@ -40,10 +41,7 @@ struct memcreg { volatile u_char xx1[3]; volatile u_char memc_memconf; #define MEMC_MEMCONF_MSIZ 0x07 -/* -#define MEMC_MEMCONF_RTOB(x) (((x) & MEMC_MEMCONF_MSIZ) * 4*1024*1024) -*/ -#define MEMC_MEMCONF_RTOB(x) (1 << (((x) & MEMC_MEMCONF_MSIZ) + 22)) +#define MEMC_MEMCONF_RTOB(x) ((4*1024*1024) << ((x) & MEMC_MEMCONF_MSIZ)) volatile u_char xx2[3]; volatile u_char memc_x0; volatile u_char xx3[3]; @@ -55,6 +53,55 @@ struct memcreg { volatile u_char xx6[3]; volatile u_char memc_bclk; volatile u_char xx7[3]; + + /* the following registers only exist on the MCECC */ + volatile u_char memc_datactl; + volatile u_char xx8[3]; + volatile u_char memc_scrubctl; + volatile u_char xx9[3]; + volatile u_char memc_scrubperh; + volatile u_char xx10[3]; + volatile u_char memc_scrubperl; + volatile u_char xx11[3]; + volatile u_char memc_chipprescale; + volatile u_char xx12[3]; + volatile u_char memc_scrubtime; + volatile u_char xx13[3]; + volatile u_char memc_scrubprescaleh; + volatile u_char xx14[3]; + volatile u_char memc_scrubprescalem; + volatile u_char xx15[3]; + volatile u_char memc_scrubprescalel; + volatile u_char xx16[3]; + volatile u_char memc_scrubtimeh; + volatile u_char xx17[3]; + volatile u_char memc_scrubtimel; + volatile u_char xx18[3]; + volatile u_char memc_scrubaddrhh; + volatile u_char xx19[3]; + volatile u_char memc_scrubaddrhm; + volatile u_char xx20[3]; + volatile u_char memc_scrubaddrlm; + volatile u_char xx21[3]; + volatile u_char memc_scrubaddrll; + volatile u_char xx22[3]; + volatile u_char memc_errlog; + volatile u_char xx23[3]; + volatile u_char memc_errloghh; + volatile u_char xx24[3]; + volatile u_char memc_errloghm; + volatile u_char xx25[3]; + volatile u_char memc_errloglm; + volatile u_char xx26[3]; + volatile u_char memc_errlogll; + volatile u_char xx27[3]; + volatile u_char memc_errsyndrome; + volatile u_char xx28[3]; + volatile u_char memc_defaults1; + volatile u_char xx29[3]; + volatile u_char memc_defaults2; + volatile u_char xx30[3]; }; -#define MEMC_CHIPID 0x81 +#define MEMC_CHIPID 0x80 +#define MCECC_CHIPID 0x81 diff --git a/sys/arch/mvme88k/dev/memdevs.c b/sys/arch/mvme88k/dev/memdevs.c index a966b8778cc..bb3163cc130 100644 --- a/sys/arch/mvme88k/dev/memdevs.c +++ b/sys/arch/mvme88k/dev/memdevs.c @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: memdevs.c,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt diff --git a/sys/arch/mvme88k/dev/nvram.c b/sys/arch/mvme88k/dev/nvram.c index 6a5a10c32c4..f34640f73f8 100644 --- a/sys/arch/mvme88k/dev/nvram.c +++ b/sys/arch/mvme88k/dev/nvram.c @@ -1,28 +1,62 @@ +/* $OpenBSD: nvram.c,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ + +/* + * Copyright (c) 1995 Theo de Raadt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + #include <sys/param.h> -#include <sys/conf.h> -#include <sys/ioctl.h> -#include <sys/proc.h> -#include <sys/tty.h> -#include <sys/uio.h> -#include <sys/systm.h> #include <sys/kernel.h> +#include <sys/ioctl.h> #include <sys/device.h> -#include <machine/cpu.h> +#include <sys/systm.h> +#include <sys/uio.h> +#include <sys/malloc.h> +#include <machine/psl.h> #include <machine/autoconf.h> - +#include <machine/cpu.h> +#include <machine/mioctl.h> +#include <machine/vmparam.h> #include <mvme88k/dev/nvramreg.h> #include <mvme88k/dev/pcctworeg.h> + struct nvramsoftc { struct device sc_dev; - caddr_t sc_paddr; - caddr_t sc_vaddr; - int sc_size; - volatile struct clockreg *sc_clockreg; + void * sc_paddr; + void * sc_vaddr; + int sc_len; + struct clockreg *sc_regs; }; -int nvrammatch __P((struct device *, void *, void *)); void nvramattach __P((struct device *, struct device *, void *)); +int nvrammatch __P((struct device *, void *, void *)); struct cfattach nvram_ca = { sizeof(struct nvramsoftc), nvrammatch, nvramattach @@ -32,101 +66,86 @@ struct cfdriver nvram_cd = { NULL, "nvram", DV_DULL, 0 }; -/* ARGSUSED */ int -nvrammatch(struct device *parent, void *self, void *aux) -{ - struct confargs *ca = aux; - struct cfdata *cf = self; - caddr_t base; - int ret; - -#if 0 - if (cputyp != CPU_167 && cputyp != CPU_166 -#ifdef CPU_187 - && cputyp != CPU_187 -#endif - ) +nvrammatch(parent, vcf, args) + struct device *parent; + void *vcf, *args; { - return 0; - } -#endif /* 0 */ - - if (cputyp != CPU_187) { - return 0; - } - - /* - * If bus or name do not match, fail. - */ - if (ca->ca_bustype != BUS_PCCTWO || - strcmp(cf->cf_driver->cd_name, "nvram")) { - return 0; - } - - - /* 3 locators base, size, ipl */ - base = (caddr_t)cf->cf_loc[0]; + struct cfdata *cf = vcf; + struct confargs *ca = args; - if (badpaddr(base, 1) == -1) { - return 0; - } - - /* - * Tell our parent our requirements. - */ - ca->ca_paddr = (caddr_t)cf->cf_loc[0]; - ca->ca_size = NVRAMSIZE; - ca->ca_ipl = 0; - - return 1; +/*X*/ if (ca->ca_vaddr == (void *)-1) +/*X*/ return (1); + return (!badvaddr(ca->ca_vaddr, 1)); } -/* ARGSUSED */ void -nvramattach(struct device *parent, struct device *self, void *aux) +nvramattach(parent, self, args) + struct device *parent, *self; + void *args; { + struct confargs *ca = args; struct nvramsoftc *sc = (struct nvramsoftc *)self; - struct confargs *ca = aux; - sc->sc_clockreg = (struct clockreg *)(ca->ca_vaddr + NVRAM_TOD_OFF); + sc->sc_paddr = ca->ca_paddr; + sc->sc_vaddr = ca->ca_vaddr; + + sc->sc_len = MK48T08_SIZE; - printf(": MK48T08\n"); +/*X*/ if (sc->sc_vaddr == (void *)-1) +/*X*/ sc->sc_vaddr = mapiodev((void *)sc->sc_paddr, +/*X*/ max(sc->sc_len, NBPG)); +/*X*/ if (sc->sc_vaddr == NULL) +/*X*/ panic("failed to map!\n"); + + sc->sc_regs = (struct clockreg *)(sc->sc_vaddr + sc->sc_len - + sizeof(struct clockreg)); + + printf(": MK48T0%d len %d\n", sc->sc_len / 1024, sc->sc_len); } -#if 0 /* - * Write en/dis-able clock registers. We coordinate so that several - * writers can run simultaneously. + * Return the best possible estimate of the time in the timeval + * to which tvp points. We do this by returning the current time + * plus the amount of time since the last clock interrupt (clock.c:clkread). + * + * Check that this time is no less than any previously-reported time, + * which could happen around the time of a clock adjustment. Just for fun, + * we guarantee that the time will be greater than the value obtained by a + * previous call. */ void -clk_wenable(onoff) - int onoff; +microtime(tvp) + register struct timeval *tvp; { - register int s; - register vm_prot_t prot;/* nonzero => change prot */ - static int writers; - - s = splhigh(); - if (onoff) - prot = writers++ == 0 ? VM_PROT_READ|VM_PROT_WRITE : 0; - else - prot = --writers == 0 ? VM_PROT_READ : 0; + int s = splhigh(); + static struct timeval lasttime; + + *tvp = time; + tvp->tv_usec; + while (tvp->tv_usec > 1000000) { + tvp->tv_sec++; + tvp->tv_usec -= 1000000; + } + if (tvp->tv_sec == lasttime.tv_sec && + tvp->tv_usec <= lasttime.tv_usec && + (tvp->tv_usec = lasttime.tv_usec + 1) > 1000000) { + tvp->tv_sec++; + tvp->tv_usec -= 1000000; + } + lasttime = *tvp; splx(s); - if (prot) - pmap_changeprot(pmap_kernel(), (vm_offset_t)clockreg, prot, 1); } -#endif /* 0 */ /* - * BCD to hex and hex to BCD. + * BCD to decimal and decimal to BCD. */ #define FROMBCD(x) (((x) >> 4) * 10 + ((x) & 0xf)) #define TOBCD(x) (((x) / 10 * 16) + ((x) % 10)) #define SECDAY (24 * 60 * 60) #define SECYR (SECDAY * 365) -#define LEAPYEAR(y) (((y) % 4 == 0) && ((y) % 100) != 0 || ((y) % 400) == 0) +#define LEAPYEAR(y) (((y) & 3) == 0) /* * This code is defunct after 2068. @@ -135,7 +154,9 @@ clk_wenable(onoff) const short dayyr[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; -chiptotime(int sec, int min, int hour, int day, int mon, int year) +static u_long +chiptotime(sec, min, hour, day, mon, year) + register int sec, min, hour, day, mon, year; { register int days, yr; @@ -147,7 +168,7 @@ chiptotime(int sec, int min, int hour, int day, int mon, int year) year = FROMBCD(year) + YEAR0; /* simple sanity checks */ - if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31) + if (year < 70 || year > 164 || mon < 1 || mon > 12 || day < 1 || day > 31) return (0); days = 0; for (yr = 70; yr < year; yr++) @@ -169,7 +190,8 @@ struct chiptime { int year; }; -timetochip(struct chiptime *c) +timetochip(c) + register struct chiptime *c; { register int t, t2, t3, now = time.tv_sec; @@ -216,16 +238,14 @@ timetochip(struct chiptime *c) /* * Set up the system's time, given a `reasonable' time value. */ -void -inittodr(time_t base) +void +inittodr(base) + time_t base; { - register struct nvramsoftc *sc; - register volatile struct clockreg *cl; + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[0]; + register struct clockreg *cl = sc->sc_regs; int sec, min, hour, day, mon, year; int badbase = 0, waszero = base == 0; - - sc = (struct nvramsoftc *)nvram_cd.cd_devs[0]; - cl = sc->sc_clockreg; if (base < 5 * SECYR) { /* @@ -238,7 +258,6 @@ inittodr(time_t base) base = 21*SECYR + 186*SECDAY + SECDAY/2; badbase = 1; } - cl->cl_csr |= CLK_READ; /* enable read (stop time) */ sec = cl->cl_sec; min = cl->cl_min; @@ -247,11 +266,8 @@ inittodr(time_t base) mon = cl->cl_month; year = cl->cl_year; cl->cl_csr &= ~CLK_READ; /* time wears on */ - - time.tv_sec = chiptotime(sec, min, hour, day, mon, year); - - if (time.tv_sec == 0) { - printf("WARNING: bad date in battery clock"); + if ((time.tv_sec = chiptotime(sec, min, hour, day, mon, year)) == 0) { + printf("WARNING: bad date in nvram"); /* * Believe the time in the file system for lack of * anything better, resetting the clock. @@ -278,19 +294,15 @@ inittodr(time_t base) * and when rebooting. Do nothing if the time is not yet known, e.g., * when crashing during autoconfig. */ -void -resettodr() +void resettodr() { - register struct nvramsoftc *sc; - register volatile struct clockreg *cl; + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[0]; + register struct clockreg *cl = sc->sc_regs; struct chiptime c; - sc = (struct nvramsoftc *)nvram_cd.cd_devs[0]; - - if (!time.tv_sec || (cl = sc->sc_clockreg) == NULL) + if (!time.tv_sec || cl == NULL) return; timetochip(&c); - cl->cl_csr |= CLK_WRITE; /* enable write */ cl->cl_sec = c.sec; cl->cl_min = c.min; @@ -301,3 +313,96 @@ resettodr() cl->cl_year = c.year; cl->cl_csr &= ~CLK_WRITE; /* load them up */ } + +/*ARGSUSED*/ +int +nvramopen(dev, flag, mode) + dev_t dev; + int flag, mode; +{ + if (minor(dev) >= nvram_cd.cd_ndevs || + nvram_cd.cd_devs[minor(dev)] == NULL) + return (ENODEV); + return (0); +} + +/*ARGSUSED*/ +int +nvramclose(dev, flag, mode) + dev_t dev; + int flag, mode; +{ + + return (0); +} + +/*ARGSUSED*/ +int +nvramioctl(dev, cmd, data, flag, p) + dev_t dev; + caddr_t data; + int cmd, flag; + struct proc *p; +{ + int unit = minor(dev); + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[unit]; + int error = 0; + + switch (cmd) { + case MIOCGSIZ: + *(int *)data = sc->sc_len; + break; + default: + error = ENOTTY; + break; + } + return (error); +} + +/*ARGSUSED*/ +int +nvramread(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + int unit = minor(dev); + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[unit]; + + return (memdevrw(sc->sc_vaddr, sc->sc_len, uio, flags)); +} + +/*ARGSUSED*/ +int +nvramwrite(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + int unit = minor(dev); + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[unit]; + + return (memdevrw(sc->sc_vaddr, sc->sc_len, uio, flags)); +} + +/* + * If the NVRAM is of the 2K variety, an extra 2K of who-knows-what + * will also be mmap'd, due to NBPG being 4K. On the MVME147 the NVRAM + * repeats, so userland gets two copies back-to-back. + */ +int +nvrammmap(dev, off, prot) + dev_t dev; + int off, prot; +{ + int unit = minor(dev); + struct nvramsoftc *sc = (struct nvramsoftc *) nvram_cd.cd_devs[unit]; + + if (minor(dev) != 0) + return (-1); + + /* allow access only in RAM */ + if (off > sc->sc_len) + return (-1); + return (m88k_btop(sc->sc_paddr + off)); +} diff --git a/sys/arch/mvme88k/dev/nvramreg.h b/sys/arch/mvme88k/dev/nvramreg.h index 4b92c0a5fd5..67de360c02e 100644 --- a/sys/arch/mvme88k/dev/nvramreg.h +++ b/sys/arch/mvme88k/dev/nvramreg.h @@ -1,3 +1,5 @@ +/* $OpenBSD: nvramreg.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ + /* * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. @@ -79,10 +81,13 @@ struct clockreg { struct clockreg *clockreg; /* - * Motorola chose the year `00' as their base count, so that - * cl_year == 0 means 1900. + * Motorola chose the year `1900' as their base count. + * XXX what happens when it wraps? */ #define YEAR0 00 #define NVRAMSIZE 0x8000 #define NVRAM_TOD_OFF 0x1ff8 /* offset of tod in NVRAM space */ +#define MK48T02_SIZE 2*1024 +#define MK48T08_SIZE 8*1024 + diff --git a/sys/arch/mvme88k/dev/pcctwo.c b/sys/arch/mvme88k/dev/pcctwo.c index 7ad4c3abee1..4156a8f440e 100644 --- a/sys/arch/mvme88k/dev/pcctwo.c +++ b/sys/arch/mvme88k/dev/pcctwo.c @@ -1,210 +1,208 @@ + +/* $OpenBSD: pcctwo.c,v 1.5 1998/12/15 05:52:30 smurph Exp $ */ + +/* + * Copyright (c) 1995 Theo de Raadt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * VME18x PCC2 chip + */ #include <sys/param.h> +#include <sys/conf.h> +#include <sys/ioctl.h> +#include <sys/proc.h> +#include <sys/user.h> +#include <sys/tty.h> #include <sys/uio.h> +#include <sys/callout.h> #include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/syslog.h> +#include <sys/fcntl.h> #include <sys/device.h> #include <machine/cpu.h> #include <machine/autoconf.h> +#include <dev/cons.h> #include <mvme88k/dev/pcctworeg.h> struct pcctwosoftc { - struct device sc_dev; - volatile struct pcc2reg *sc_pcc2reg; + struct device sc_dev; + void *sc_vaddr; /* PCC2 space */ + void *sc_paddr; + struct pcctworeg *sc_pcc2; /* the actual registers */ }; -int pcctwomatch __P((struct device *, void *, void *)); -int pcctwoscan __P((struct device *, void *, void *)); -void pcctwoattach __P((struct device *, struct device *, void *)); - +void pcctwoattach __P((struct device *, struct device *, void *)); +int pcctwomatch __P((struct device *, void *, void *)); #ifdef MVME187 void setupiackvectors __P((void)); #endif /* MVME187 */ -struct cfattach pcctwo_ca = { - sizeof(struct pcctwosoftc), pcctwomatch, pcctwoattach +struct cfattach pcctwo_ca = { + sizeof(struct pcctwosoftc), pcctwomatch, pcctwoattach }; struct cfdriver pcctwo_cd = { - NULL, "pcctwo", DV_DULL, 0 -}; + NULL, "pcctwo", DV_DULL, 0 +}; + +struct pcctworeg *sys_pcc2 = NULL; -/*ARGSUSED*/ int -pcctwomatch(struct device *parent, void *self, void *aux) +pcctwomatch(parent, vcf, args) + struct device *parent; + void *vcf, *args; { - int ret; - u_char id, rev; - caddr_t base; - struct confargs *ca = aux; - struct cfdata *cf = self; - -#if 0 - if (cputyp != CPU_167 && cputyp != CPU_166 -#ifdef MVME187 - && cputyp != CPU_187 -#endif - ) - { - return 0; - } -#endif /* 0 */ - if (cputyp != CPU_187) { - return 0; - } - - /* - * If bus or name do not match, fail. - */ - if (ca->ca_bustype != BUS_MAIN || - strcmp(cf->cf_driver->cd_name, "pcctwo")) { - return 0; + struct cfdata *cf = vcf; + struct confargs *ca = args; + struct pcctworeg *pcc2; + + /* Bomb if wrong cpu */ + if (cputyp != CPU_187){ + printf("==> pcctwo: wrong CPU type %x.\n", cputyp); + return (0); } - if ((base = (caddr_t)cf->cf_loc[0]) == (caddr_t)-1) { - return 0; + pcc2 = (struct pcctworeg *)(IIOV(ca->ca_paddr) + PCC2_PCC2CHIP_OFF); + if (badvaddr(pcc2, 4) <= 0){ + printf("==> pcctwo: failed address check.\n"); + return (0); } - - id = badpaddr(base, 1); - rev = badpaddr(base + 1, 1); - - if (id != PCC2_CHIP_ID || rev != PCC2_CHIP_REV) { - return 0; + if (pcc2->pcc2_chipid != PCC2_CHIPID){ + printf("==> pcctwo: wrong chip id %x.\n", pcc2->pcc2_chipid); + return (0); } - - ca->ca_size = PCC2_SIZE; - ca->ca_paddr = base; - - return 1; + return (1); } int -pcctwoprint(void *aux, char *parent) +pcctwo_print(args, bus) + void *args; + const char *bus; { - struct confargs *ca = aux; - - /* - * We call pcctwoprint() via config_attach(). Parent - * will always be null and config_attach() would have already - * printed "nvram0 at pcctwo0". - */ - printf(" addr %x size %x", ca->ca_paddr, ca->ca_size); - if (ca->ca_ipl != -1) { - printf(" ipl %x", ca->ca_ipl); - } + struct confargs *ca = args; + if (ca->ca_offset != -1) + printf(" offset 0x%x", ca->ca_offset); + if (ca->ca_ipl > 0) + printf(" ipl %d", ca->ca_ipl); return (UNCONF); } -/*ARGSUSED*/ int -pcctwoscan(struct device *parent, void *self, void *aux) +pcctwo_scan(parent, child, args) + struct device *parent; + void *child, *args; { - struct confargs ca; - struct cfdata *cf = self; + struct cfdata *cf = child; struct pcctwosoftc *sc = (struct pcctwosoftc *)parent; - - /* - * Pcctwoscan gets called by config_search() for each - * child of parent (pcctwo) specified in ioconf.c. - * Fill in the bus type to be PCCTWO and call the child's - * match routine. If the child's match returns 1, then - * we need to allocate device memory, set it in confargs - * and call config_attach(). This, in turn, will call the - * child's attach. - */ - - ca.ca_bustype = BUS_PCCTWO; - - if ((*cf->cf_attach->ca_match)(parent, cf, &ca) == 0) - return 0; - - /* - * The child would have fixed up ca to reflect what its - * requirements are. - */ - - if (cf->cf_loc[2] != ca.ca_ipl) { - printf("Changing ipl %x specified in ioconf.c to %x for %s\n", - cf->cf_loc[2], ca.ca_ipl, cf->cf_driver->cd_name); + struct confargs *ca = args; + struct confargs oca; + + if (parent->dv_cfdata->cf_driver->cd_indirect) { + printf(" indirect devices not supported\n"); + return 0; + } + + bzero(&oca, sizeof oca); + oca.ca_offset = cf->cf_loc[0]; + oca.ca_ipl = cf->cf_loc[1]; + if ((oca.ca_offset != (void*)-1) && ISIIOVA(sc->sc_vaddr + oca.ca_offset)) { + oca.ca_vaddr = sc->sc_vaddr + oca.ca_offset; + oca.ca_paddr = sc->sc_paddr + oca.ca_offset; + } else { + oca.ca_vaddr = (void *)-1; + oca.ca_paddr = (void *)-1; } - - /* - * If the size specified by the child is 0, don't map - * any IO space, but pass in the address of pcc2reg as vaddr. - * This is for clock and parallel port which don't have a - * separate address space by themselves but use pcc2's register - * block. - */ - if (ca.ca_size == 0) { - /* - * pcc2regs addr - */ -#if 0 - ca.ca_vaddr = ((struct confargs *)aux)->ca_vaddr; -#endif /* 0 */ - ca.ca_vaddr = (caddr_t)sc->sc_pcc2reg; - - } else { - ca.ca_vaddr = ca.ca_paddr; - } - -#if 0 - ca.ca_parent = ((struct confargs *)aux)->ca_vaddr; -#endif /* 0 */ - ca.ca_parent = (caddr_t)sc->sc_pcc2reg; - - /* - * Call child's attach using config_attach(). - */ - config_attach(parent, cf, &ca, pcctwoprint); - return 1; + oca.ca_bustype = BUS_PCCTWO; + oca.ca_master = (void *)sc->sc_pcc2; + oca.ca_name = cf->cf_driver->cd_name; + if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0) + return (0); + config_attach(parent, cf, &oca, pcctwo_print); + return (1); } -/* - * This function calls the match routine of the configured children - * in turn. For each configured child, map the device address into - * iomap space and then call config_attach() to attach the child. - */ - -/* ARGSUSED */ void -pcctwoattach(struct device *parent, struct device *self, void *aux) +pcctwoattach(parent, self, args) + struct device *parent, *self; + void *args; { - struct pcctwosoftc *sc = (struct pcctwosoftc *)self; - struct confargs *ca = aux; - caddr_t base; - - if (self->dv_unit > 0) { - printf(" unsupported\n"); - return; - } - - base = ca->ca_vaddr; + struct confargs *ca = args; + struct pcctwosoftc *sc = (struct pcctwosoftc *)self; + int i; - printf(": PCCTWO id 0x%2x rev 0x%2x\n", - *(u_char *)base, *((u_char *)base + 1)); + if (sys_pcc2) + panic("pcc2 already attached!"); /* - * mainbus driver would have mapped Pcc2 at base. Save - * the address in pcctwosoftc. + * since we know ourself to land in intiobase land, + * we must adjust our address */ - sc->sc_pcc2reg = (struct pcc2reg *)base; + sc->sc_paddr = ca->ca_paddr; + sc->sc_vaddr = (void *)IIOV(sc->sc_paddr); + sc->sc_pcc2 = (struct pcctworeg *)(sc->sc_vaddr + PCC2_PCC2CHIP_OFF); + sys_pcc2 = sc->sc_pcc2; + + printf(": rev %d\n", sc->sc_pcc2->pcc2_chiprev); + + sc->sc_pcc2->pcc2_vecbase = PCC2_VECBASE; + sc->sc_pcc2->pcc2_genctl |= PCC2_GENCTL_IEN; /* global irq enable */ /* * Set pcc2intr_mask and pcc2intr_ipl. */ - pcc2intr_ipl = (u_char *)&(sc->sc_pcc2reg->pcc2_ipl); - pcc2intr_mask = (u_char *)&(sc->sc_pcc2reg->pcc2_imask); + pcc2intr_ipl = (u_char *)&(sc->sc_pcc2->pcc2_ipl); + pcc2intr_mask = (u_char *)&(sc->sc_pcc2->pcc2_mask); #ifdef MVME187 - /* - * Get mappings for iack vectors. This doesn't belong here - * but is more closely related to pcc than anything I can - * think of. (could probably do it in locore.s). - */ - + printf("setting interrupt ack vectors.\n"); setupiackvectors(); #endif /* MVME187 */ - (void)config_search(pcctwoscan, self, aux); + config_search(pcctwo_scan, self, args); +} + +/* + * PCC2 interrupts land in a PCC2_NVEC sized hole starting at PCC2_VECBASE + */ +int +pcctwointr_establish(vec, ih) + int vec; + struct intrhand *ih; +{ + if (vec >= PCC2_NVEC) { + printf("pcctwo: illegal vector: 0x%x\n", vec); + panic("pcctwointr_establish"); + } + return (intr_establish(PCC2_VECBASE+vec, ih)); } diff --git a/sys/arch/mvme88k/dev/pcctworeg.h b/sys/arch/mvme88k/dev/pcctworeg.h index b029797bd54..3a4cbbb1f2f 100644 --- a/sys/arch/mvme88k/dev/pcctworeg.h +++ b/sys/arch/mvme88k/dev/pcctworeg.h @@ -1,3 +1,5 @@ +/* $OpenBSD: pcctworeg.h,v 1.2 1998/12/15 05:52:30 smurph Exp $ */ + /* * Memory map for PCC2 chip found in mvme1x7 boards. * @@ -5,68 +7,61 @@ * two-bytes (16 bits), or four-bytes (32 bits). */ -struct pcc2reg { - volatile u_char pcc2_chipid; - volatile u_char pcc2_chiprev; - volatile u_char pcc2_gcr; - volatile u_char pcc2_vbr; /* vector base reg. */ - volatile u_long pcc2_t1cmp; /* timer1 compare reg */ - volatile u_long pcc2_t1cntr; /* timer1 counter reg */ - volatile u_long pcc2_t2cmp; /* timer2 compare reg */ - volatile u_long pcc2_t2cntr; /* timer2 counter reg */ - volatile u_char pcc2_pscntreg; /* prescalar count reg */ - volatile u_char pcc2_psclkadj; /* clock adjust reg */ - volatile u_char pcc2_t2ctl; /* timer2 control */ - volatile u_char pcc2_t1ctl; /* timer1 control */ - volatile u_char pcc2_gpiirq; /* GPIO intr ctl */ - volatile u_char pcc2_gpiopctl; /* GPIO pin control */ - volatile u_char pcc2_t2irq; /* Timer2 intr ctl */ - volatile u_char pcc2_t1irq; /* Timer1 intr ctl */ - volatile u_char pcc2_sccerrstat; /* SCC error status */ - volatile u_char pcc2_sccmoirq; /* Modem intr control */ - volatile u_char pcc2_scctxirq; /* Tx intr control */ - volatile u_char pcc2_sccrxirq; /* Rx intr control */ - volatile u_int :24; - volatile u_char pcc2_sccmopiack; /* modem PIACK */ - volatile u_char :8; - volatile u_char pcc2_scctxpiack; /* Tx PIACK */ - volatile u_char :8; - volatile u_char pcc2_sccrxpiack; /* Rx PIACK */ - volatile u_char pcc2_lancerrstat; /* LANC error status */ - volatile u_char :8; - volatile u_char pcc2_lancirq; /* LANC intr control */ - volatile u_char pcc2_lancerrirq; /* LANC err intr ctl */ - volatile u_char pcc2_scsierrstat; /* SCSI err status */ - volatile u_char :8; - volatile u_char :8; - volatile u_char pcc2_scsiirq; /* SCSI intr control */ - volatile u_char pcc2_packirq; /* printer ACK intr */ - volatile u_char pcc2_pfltirq; /* printer FAULT intr */ - volatile u_char pcc2_pselirq; /* printer SEL intr */ - volatile u_char pcc2_ppeirq; /* printer PE intr */ - volatile u_char pcc2_pbusyirq; /* printer BUSY intr */ - volatile u_char :8; - volatile u_char pcc2_pstat; /* printer status reg */ - volatile u_char pcc2_pctl; /* printer port ctl */ - volatile u_short pcc2_chipspeed; /* chip speed (factory testing only) */ - volatile u_short pcc2_pdata; /* printer data */ - volatile u_int :16; - volatile u_char pcc2_ipl; /* interrupt IPL */ - volatile u_char pcc2_imask; /* intr mask level */ +struct pcctworeg { + volatile u_char pcc2_chipid; + volatile u_char pcc2_chiprev; + volatile u_char pcc2_genctl; + volatile u_char pcc2_vecbase; /* irq vector base */ + volatile u_long pcc2_t1cmp; /* timer1 compare */ + volatile u_long pcc2_t1count; /* timer1 count */ + volatile u_long pcc2_t2cmp; /* timer2 compare */ + volatile u_long pcc2_t2count; /* timer2 count */ + volatile u_char pcc2_pscalecnt; /* timer prescaler counter */ + volatile u_char pcc2_pscaleadj; /* timer prescaler adjust */ + volatile u_char pcc2_t2ctl; /* timer2 ctrl reg */ + volatile u_char pcc2_t1ctl; /* timer1 ctrl reg */ + volatile u_char pcc2_gpioirq; /* gpio irq */ + volatile u_char pcc2_gpio; /* gpio i/o */ + volatile u_char pcc2_t2irq; + volatile u_char pcc2_t1irq; + volatile u_char pcc2_sccerr; + volatile u_char pcc2_sccirq; + volatile u_char pcc2_scctx; + volatile u_char pcc2_sccrx; + volatile u_char :8; + volatile u_char :8; + volatile u_char :8; + volatile u_char pcc2_sccmoiack; + volatile u_char :8; + volatile u_char pcc2_scctxiack; + volatile u_char :8; + volatile u_char pcc2_sccrxiack; + volatile u_char pcc2_ieerr; + volatile u_char :8; + volatile u_char pcc2_ieirq; + volatile u_char pcc2_iefailirq; + volatile u_char pcc2_ncrerr; + volatile u_char :8; + volatile u_char :8; + volatile u_char pcc2_ncrirq; + volatile u_char pcc2_prtairq; + volatile u_char pcc2_prtfirq; + volatile u_char pcc2_prtsirq; + volatile u_char pcc2_prtpirq; + volatile u_char pcc2_prtbirq; + volatile u_char :8; + volatile u_char pcc2_prtstat; + volatile u_char pcc2_prtctl; + volatile u_short pcc2_speed; /* DO NOT USE */ + volatile u_short pcc2_prtdat; + volatile u_short :16; + volatile u_char pcc2_ipl; + volatile u_char pcc2_mask; }; - -/* - * Vaddrs for interrupt mask and pri registers - */ -extern volatile u_char *pcc2intr_mask; -extern volatile u_char *pcc2intr_ipl; - -extern volatile struct pcc2reg *pcc2addr; - +#define PCC2_PCC2CHIP_OFF 0x42000 +#define PCC2_CHIPID 0x20 #define PCC2_BASE_ADDR 0xFFF42000 /* base address */ #define PCC2_SIZE 0x1000 /* size */ - -#define PCC2_CHIP_ID 0x20 #define PCC2_CHIP_REV 0x00 /* General Control Register */ @@ -97,29 +92,67 @@ extern volatile struct pcc2reg *pcc2addr; #define STxIRQ 0x0e #define SRxIRQ 0x0f + +/* + * Vaddrs for interrupt mask and pri registers + */ +extern volatile u_char *pcc2intr_mask; +extern volatile u_char *pcc2intr_ipl; + +/* + * points to system's PCCTWO. This is not active until the pcctwo0 + * device has been attached. + */ +extern struct pcctworeg *sys_pcc2; + +/* + * We lock off our interrupt vector at 0x50. + */ +#define PCC2_VECBASE 0x50 +#define PCC2_NVEC 16 + /* - * Timer control regs + * Vectors we use */ +#define PCC2V_NCR 0x05 +#define PCC2V_IEFAIL 0x06 +#define PCC2V_IE 0x07 +#define PCC2V_TIMER2 0x08 +#define PCC2V_TIMER1 0x09 +#define PCC2V_GPIO 0x0a +#define PCC2V_SCC_RXE 0x0c +#define PCC2V_SCC_M 0x0d +#define PCC2V_SCC_TX 0x0e +#define PCC2V_SCC_RX 0x0f + +#define PCC2_TCTL_CEN 0x01 +#define PCC2_TCTL_COC 0x02 +#define PCC2_TCTL_COVF 0x04 +#define PCC2_TCTL_OVF 0xf0 #define PCC2_TICTL_CEN 0x01 #define PCC2_TICTL_COC 0x02 #define PCC2_TICTL_COVF 0x04 #define PCC2_TTCTL_OVF_MASK (1 << 4) /* overflow bits mask */ -/* GPIO interrupt control */ +#define PCC2_GPIO_PLTY 0x80 +#define PCC2_GPIO_EL 0x40 -#define PCC2_GPIIRQ_PLTY 0x80 -#define PCC2_GPIIRQ_EL 0x40 -#define PCC2_GPIIRQ_INT 0x20 -#define PCC2_GPIIRQ_IEN 0x10 -#define PCC2_GPIIRQ_ICLR 0x08 -#define PCC2_GPIIRQ_IL 0x07 /* IL2-IL0 */ +#define PCC2_GPIOCR_OE 0x2 +#define PCC2_GPIOCR_O 0x1 -/* GPIO Pin Control Register */ +#define PCC2_SCC_AVEC 0x08 +#define PCC2_SCCRX_INHIBIT (0 << 6) +#define PCC2_SCCRX_SNOOP (1 << 6) +#define PCC2_SCCRX_INVAL (2 << 6) +#define PCC2_SCCRX_RESV (3 << 6) -#define PCC2_GPIOPCTL_GPI 0x04 -#define PCC2_GPIOPCTL_GPOE 0x02 -#define PCC2_GPIOPCTL_GPO 0x01 +#define pcc2_timer_us2lim(us) (us) /* timer increments in "us" */ + +#define PCC2_IRQ_IPL 0x07 +#define PCC2_IRQ_ICLR 0x08 +#define PCC2_IRQ_IEN 0x10 +#define PCC2_IRQ_INT 0x20 /* Tick Timer Interrupt Control Register */ @@ -128,51 +161,13 @@ extern volatile struct pcc2reg *pcc2addr; #define PCC2_TTIRQ_ICLR 0x08 #define PCC2_TTIRQ_IL 0x07 /* mask for IL2-IL0 */ -/* SCC Error Status Register */ - -#define PCC2_SCCERRSTAT_RTRY 0x10 -#define PCC2_SCCERRSTAT_PRTY 0x08 -#define PCC2_SCCERRSTAT_EXT 0x04 -#define PCC2_SCCERRSTAT_LTO 0x02 -#define PCC2_SCCERRSTAT_SCLR 0x01 - -/* SCC Modem Interrupt Control Register */ - -#define PCC2_SCCMOIRQ_IRQ 0x20 -#define PCC2_SCCMOIRQ_IEN 0x10 -#define PCC2_SCCMOIRQ_AVEC 0x08 -#define PCC2_SCCMOIRQ_IL 0x07 /* int level mask */ - -/* SCC Tx Interrupt Control Register */ - -#define PCC2_SCCTXIRQ_IRQ 0x20 -#define PCC2_SCCTXIRQ_IEN 0x10 -#define PCC2_SCCTXIRQ_AVEC 0x08 -#define PCC2_SCCTXIRQ_IL 0x07 - -/* SCC Tx Interrupt Control Register */ - -#define PCC2_SCCRXIRQ_SNOOP (1 << 6) -#define PCC2_SCCRXIRQ_IRQ 0x20 -#define PCC2_SCCRXIRQ_IEN 0x10 -#define PCC2_SCCRXIRQ_AVEC 0x08 -#define PCC2_SCCRXIRQ_IL 0x07 - -/* SCSI Interrupt Control Register */ - -#define PCC2_SCSIIRQ_IEN 0x10 - -/* Interrupt Priority Level Register */ - -#define PCC2_IPL_IPL 0x07 - -/* Interrupt Mask Level Register */ +#define PCC2_IEERR_SCLR 0x01 -#define PCC2_IMASK_MSK 0x07 +#define PCC2_GENCTL_FAST 0x01 +#define PCC2_GENCTL_IEN 0x02 +#define PCC2_GENCTL_C040 0x03 -#define PCC2_IRQ_IPL 0x07 -#define PCC2_IRQ_ICLR 0x08 -#define PCC2_IRQ_IEN 0x10 -#define PCC2_IRQ_INT 0x20 - -#define PCC2_IEERR_SCLR 0x01 +#define PCC2_SC_INHIBIT (0 << 6) +#define PCC2_SC_SNOOP (1 << 6) +#define PCC2_SC_INVAL (2 << 6) +#define PCC2_SC_RESV (3 << 6) diff --git a/sys/arch/mvme88k/dev/rd_root.c b/sys/arch/mvme88k/dev/rd_root.c new file mode 100644 index 00000000000..1d952240d64 --- /dev/null +++ b/sys/arch/mvme88k/dev/rd_root.c @@ -0,0 +1,80 @@ +/* $OpenBSD: rd_root.c,v 1.1 1998/12/15 05:52:30 smurph Exp $ */ + +/* + * Copyright (c) 1995 Gordon W. Ross + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/reboot.h> + +#include <dev/ramdisk.h> + +extern int boothowto; + +#ifndef MINIROOTSIZE +#define MINIROOTSIZE 512 +#endif + +#define ROOTBYTES (MINIROOTSIZE << DEV_BSHIFT) + +/* + * This array will be patched to contain a file-system image. + * See the program: src/distrib/sun3/common/rdsetroot.c + */ +int rd_root_size = ROOTBYTES; +char rd_root_image[ROOTBYTES] = "|This is the root ramdisk!\n"; + +/* + * This is called during autoconfig. + */ +void +rd_attach_hook(unit, rd) + int unit; + struct rd_conf *rd; +{ + if (unit == 0) { + /* Setup root ramdisk */ + rd->rd_addr = (caddr_t) rd_root_image; + rd->rd_size = (size_t) rd_root_size; + rd->rd_type = RD_KMEM_FIXED; + printf("rd%d: fixed, %d blocks\n", unit, MINIROOTSIZE); + } +} + +/* + * This is called during open (i.e. mountroot) + */ +void +rd_open_hook(unit, rd) + int unit; + struct rd_conf *rd; +{ + if (unit == 0) { + /* The root ramdisk only works single-user. */ + boothowto |= RB_SINGLE; + printf("rd%d: mounting root, single user mode.\n", unit); + } +} diff --git a/sys/arch/mvme88k/dev/siop.c b/sys/arch/mvme88k/dev/siop.c index 67aee6e2a40..ba95e2bd449 100644 --- a/sys/arch/mvme88k/dev/siop.c +++ b/sys/arch/mvme88k/dev/siop.c @@ -1,4 +1,4 @@ -/* $NetBSD: siop.c,v 1.23 1995/08/18 15:28:08 chopps Exp $ */ +/* $OpenBSD: siop.c,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1994 Michael L. Hitch @@ -86,7 +86,7 @@ void siopsetdelay __P((int)); void siop_scsidone __P((struct siop_acb *, int)); void siop_sched __P((struct siop_softc *)); int siop_poll __P((struct siop_softc *, struct siop_acb *)); -void siopintr __P((struct siop_softc *)); +int siopintr __P((struct siop_softc *)); void scsi_period_to_siop __P((struct siop_softc *, int)); void siop_start __P((struct siop_softc *, int, int, u_char *, int, u_char *, int)); void siop_dump_acb __P((struct siop_acb *)); @@ -208,7 +208,7 @@ siop_scsicmd(xs) struct siop_acb *acb; struct siop_softc *sc; struct scsi_link *slp; - int flags, s; + int flags, s, i; slp = xs->sc_link; sc = slp->adapter_softc; @@ -298,7 +298,7 @@ siop_poll(sc, acb) (SIOP_ISTAT_SIP | SIOP_ISTAT_DIP)) == 0) { if (--i <= 0) { #ifdef DEBUG - printf ("waiting: tgt %d cmd %02x sbcl %02x dsp %lx (+%lx) dcmd %lx ds %p timeout %d\n", + printf ("waiting: tgt %d cmd %02x sbcl %02x dsp %x (+%x) dcmd %x ds %x timeout %d\n", xs->sc_link->target, acb->cmd.opcode, rp->siop_sbcl, rp->siop_dsp, rp->siop_dsp - sc->sc_scriptspa, @@ -343,11 +343,11 @@ siop_sched(sc) { struct scsi_link *slp; struct siop_acb *acb; - int i; + int stat, i; #ifdef DEBUG if (sc->sc_nexus) { - printf("%s: siop_sched- nexus %p/%d ready %p/%d\n", + printf("%s: siop_sched- nexus %x/%d ready %x/%d\n", sc->sc_dev.dv_xname, sc->sc_nexus, sc->sc_nexus->xs->sc_link->target, sc->ready_list.tqh_first, @@ -393,10 +393,10 @@ siop_scsidone(acb, stat) struct siop_acb *acb; int stat; { - struct scsi_xfer *xs; - struct scsi_link *slp; - struct siop_softc *sc; - int dosched = 0; + struct scsi_xfer *xs = acb->xs; + struct scsi_link *slp = xs->sc_link; + struct siop_softc *sc = slp->adapter_softc; + int s, dosched = 0; if (acb == NULL || (xs = acb->xs) == NULL) { #ifdef DIAGNOSTIC @@ -510,9 +510,7 @@ siopabort(sc, rp, where) siop_regmap_p rp; char *where; { -#ifdef fix_this int i; -#endif printf ("%s: abort %s: dstat %02x, sstat0 %02x sbcl %02x\n", sc->sc_dev.dv_xname, @@ -563,19 +561,11 @@ void siopinitialize(sc) struct siop_softc *sc; { - int i; - u_int inhibit_sync; - extern u_long scsi_nosync; - extern int shift_nosync; - /* - * Need to check that scripts is on a long word boundary. + * Need to check that scripts is on a long word boundary * Also should verify that dev doesn't span non-contiguous * physical pages. */ - - dma_cachectl((vm_offset_t)scripts, sizeof(scripts), DMA_CACHE_SYNC); - sc->sc_scriptspa = kvtop(scripts); /* @@ -593,32 +583,16 @@ siopinitialize(sc) sc->sc_minsync = sc->sc_tcp[1]; /* in 4ns units */ if (sc->sc_minsync < 25) sc->sc_minsync = 25; - if (sc->sc_clock_freq <= 25) { - sc->sc_dcntl |= 0x80; /* SCLK/1 */ +#if not_used + if (sc->sc_clock_freq <= 25) sc->sc_tcp[0] = sc->sc_tcp[1]; - } else if (sc->sc_clock_freq <= 37) { - sc->sc_dcntl |= 0x40; /* SCLK/1.5 */ + else if (sc->sc_clock_freq <= 37) sc->sc_tcp[0] = sc->sc_tcp[2]; - } else if (sc->sc_clock_freq <= 50) { - sc->sc_dcntl |= 0x00; /* SCLK/2 */ + else if (sc->sc_clock_freq <= 50) sc->sc_tcp[0] = sc->sc_tcp[3]; - } else { - sc->sc_dcntl |= 0xc0; /* SCLK/3 */ + else sc->sc_tcp[0] = 3000 / sc->sc_clock_freq; - } - - if (scsi_nosync) { - inhibit_sync = (scsi_nosync >> shift_nosync) & 0xff; - shift_nosync += 8; -#ifdef DEBUG - if (inhibit_sync) - printf("%s: Inhibiting synchronous transfer %02x\n", - sc->sc_dev.dv_xname, inhibit_sync); #endif - for (i = 0; i < 8; ++i) - if (inhibit_sync & (1 << i)) - siop_inhibit_sync[i] = 1; - } siopreset (sc); } @@ -637,8 +611,6 @@ siopreset(sc) if (sc->sc_flags & SIOP_ALIVE) siopabort(sc, rp, "reset"); - printf("%s: ", sc->sc_dev.dv_xname); /* XXXX */ - s = splbio(); /* @@ -667,7 +639,7 @@ siopreset(sc) rp->siop_dien = 0x00; /* don't enable interrupts yet */ rp->siop_scid = 1 << sc->sc_link.adapter_target; rp->siop_dwt = 0x00; - rp->siop_ctest0 = (SIOP_CTEST0_EAN|SIOP_CTEST0_BTD); + rp->siop_ctest0 |= SIOP_CTEST0_BTD | SIOP_CTEST0_EAN; rp->siop_ctest7 = sc->sc_ctest7; /* will need to re-negotiate sync xfers */ @@ -683,8 +655,8 @@ siopreset(sc) splx (s); delay (siop_reset_delay * 1000); - printf("siop id %d reset V%d\n", sc->sc_link.adapter_target, - rp->siop_ctest8 >> 4); + printf(": version %d target %d\n", rp->siop_ctest8 >> 4, + sc->sc_link.adapter_target); if ((sc->sc_flags & SIOP_ALIVE) == 0) { TAILQ_INIT(&sc->ready_list); @@ -709,7 +681,7 @@ siopreset(sc) sc->sc_nexus->xs->error = XS_DRIVER_STUFFUP; siop_scsidone(sc->sc_nexus, sc->sc_nexus->stat[0]); } - while ((acb = sc->nexus_list.tqh_first) != 0) { + while (acb = sc->nexus_list.tqh_first) { acb->xs->error = XS_DRIVER_STUFFUP; siop_scsidone(acb, acb->stat[0]); } @@ -742,17 +714,15 @@ siop_start (sc, target, lun, cbuf, clen, buf, len) int len; { siop_regmap_p rp = sc->sc_siopp; + int i; int nchain; int count, tcount; char *addr, *dmaend; struct siop_acb *acb = sc->sc_nexus; -#ifdef DEBUG - int i; -#endif #ifdef DEBUG if (siop_debug & 0x100 && rp->siop_sbcl & SIOP_BSY) { - printf ("ACK! siop was busy: rp %p script %p dsa %p active %ld\n", + printf ("ACK! siop was busy: rp %x script %x dsa %x active %d\n", rp, &scripts, &acb->ds, sc->sc_active); printf ("istat %02x sfbr %02x lcrc %02x sien %02x dien %02x\n", rp->siop_istat, rp->siop_sfbr, rp->siop_lcrc, @@ -857,7 +827,7 @@ siop_start (sc, target, lun, cbuf, clen, buf, len) if (nchain != 1 && len != 0 && siop_debug & 3) { printf ("DMA chaining set: %d\n", nchain); for (i = 0; i < nchain; ++i) { - printf (" [%d] %8p %lx\n", i, acb->ds.chain[i].databuf, + printf (" [%d] %8x %4x\n", i, acb->ds.chain[i].databuf, acb->ds.chain[i].datalen); } } @@ -889,7 +859,7 @@ siop_start (sc, target, lun, cbuf, clen, buf, len) #ifdef DEBUG if (siop_debug & 0x100 && rp->siop_sbcl & SIOP_BSY) { - printf ("ACK! siop was busy at start: rp %p script %p dsa %p active %ld\n", + printf ("ACK! siop was busy at start: rp %x script %x dsa %x active %d\n", rp, &scripts, &acb->ds, sc->sc_active); #ifdef DDB /*Debugger();*/ @@ -897,12 +867,9 @@ siop_start (sc, target, lun, cbuf, clen, buf, len) } #endif if (sc->nexus_list.tqh_first == NULL) { - if (rp->siop_istat & SIOP_ISTAT_CON) { - printf("%s: siop_select while connected:RABSAMCI %x scntl_con %x\n", - sc->sc_dev.dv_xname, - rp->siop_sbcl, rp->siop_scntl1 & SIOP_SCNTL1_CON); - } - + if (rp->siop_istat & SIOP_ISTAT_CON) + printf("%s: siop_select while connected?\n", + sc->sc_dev.dv_xname); rp->siop_temp = 0; rp->siop_sbcl = sc->sc_sync[target].sbcl; rp->siop_dsa = kvtop(&acb->ds); @@ -956,12 +923,12 @@ siop_checkintr(sc, istat, dstat, sstat0, status) rp->siop_ctest8 |= SIOP_CTEST8_CLF; while ((rp->siop_ctest1 & SIOP_CTEST1_FMT) != SIOP_CTEST1_FMT) ; - + rp->siop_ctest8 &= ~SIOP_CTEST8_CLF; #ifdef DEBUG ++siopints; #if 0 if (siop_debug & 0x100) { - cmmu_inval_cache(kvtop(&acb->stat[0]), 1); /* XXX */ + DCIAS(&acb->stat[0]); /* XXX */ printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", istat, dstat, sstat0, rp->siop_dsps, rp->siop_sbcl, acb->stat[0], acb->msg[0]); printf ("sync msg in: %02x %02x %02x %02x %02x %02x\n", @@ -971,7 +938,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) #endif if (rp->siop_dsp && (rp->siop_dsp < sc->sc_scriptspa || rp->siop_dsp >= sc->sc_scriptspa + sizeof(scripts))) { - printf ("%s: dsp not within script dsp %lx scripts %lx:%lx", + printf ("%s: dsp not within script dsp %x scripts %x:%x", sc->sc_dev.dv_xname, rp->siop_dsp, sc->sc_scriptspa, sc->sc_scriptspa + sizeof(scripts)); printf(" istat %x dstat %x sstat0 %x\n", @@ -986,8 +953,8 @@ siop_checkintr(sc, istat, dstat, sstat0, status) /* Normal completion status, or check condition */ #ifdef DEBUG if (rp->siop_dsa != kvtop(&acb->ds)) { - printf ("siop: invalid dsa: %lx %x\n", rp->siop_dsa, - kvtop((caddr_t)&acb->ds)); + printf ("siop: invalid dsa: %x %x\n", rp->siop_dsa, + kvtop(&acb->ds)); panic("*** siop DSA invalid ***"); } #endif @@ -1063,26 +1030,141 @@ siop_checkintr(sc, istat, dstat, sstat0, status) sc->sc_dev.dv_xname, acb->msg[0]); #endif if (sc->nexus_list.tqh_first) - rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect; + rp->siop_dcntl |= SIOP_DCNTL_STD; return 1; } + if (sstat0 & SIOP_SSTAT0_M_A) { /* Phase mismatch */ +#ifdef DEBUG + ++siopphmm; + if (acb == NULL) + printf("%s: Phase mismatch with no active command?\n", + sc->sc_dev.dv_xname); +#endif + if (acb->iob_len) { + int adjust; + adjust = ((dfifo - (dbc & 0x7f)) & 0x7f); + if (sstat1 & SIOP_SSTAT1_ORF) + ++adjust; + if (sstat1 & SIOP_SSTAT1_OLF) + ++adjust; + acb->iob_curlen = *((long *)&rp->siop_dcmd) & 0xffffff; + acb->iob_curlen += adjust; + acb->iob_curbuf = *((long *)&rp->siop_dnad) - adjust; +#ifdef DEBUG + if (siop_debug & 0x100) { + int i; + printf ("Phase mismatch: curbuf %x curlen %x dfifo %x dbc %x sstat1 %x adjust %x sbcl %x starts %d acb %x\n", + acb->iob_curbuf, acb->iob_curlen, dfifo, + dbc, sstat1, adjust, rp->siop_sbcl, siopstarts, acb); + if (acb->ds.chain[1].datalen) { + for (i = 0; acb->ds.chain[i].datalen; ++i) + printf("chain[%d] addr %x len %x\n", + i, acb->ds.chain[i].databuf, + acb->ds.chain[i].datalen); + } + } +#endif - if (dstat & SIOP_DSTAT_SIR && (rp->siop_dsps == 0xff01 || - rp->siop_dsps == 0xff02)) { - - if (acb == NULL) { - printf("%s: Disconnect with no active command?\n", +#if 0 + dma_cachectl (acb, sizeof(*acb), DMA_CACHE_SYNC)); +#endif + } +#ifdef DEBUG + SIOP_TRACE('m',rp->siop_sbcl,(rp->siop_dsp>>8),rp->siop_dsp); + if (siop_debug & 9) + printf ("Phase mismatch: %x dsp +%x dcmd %x\n", + rp->siop_sbcl, + rp->siop_dsp - sc->sc_scriptspa, + *((long *)&rp->siop_dcmd)); +#endif + if ((rp->siop_sbcl & SIOP_REQ) == 0) { + printf ("Phase mismatch: REQ not asserted! %02x dsp %x\n", + rp->siop_sbcl, rp->siop_dsp); +#ifdef DEBUG + Debugger(); +#endif + } + switch (rp->siop_sbcl & 7) { + case 0: /* data out */ + case 1: /* data in */ + case 2: /* status */ + case 3: /* command */ + case 6: /* message in */ + case 7: /* message out */ + rp->siop_dsp = sc->sc_scriptspa + Ent_switch; + break; + default: + goto bad_phase; + } + return 0; + } + if (sstat0 & SIOP_SSTAT0_STO) { /* Select timed out */ +#ifdef DEBUG + if (acb == NULL) + printf("%s: Select timeout with no active command?\n", sc->sc_dev.dv_xname); + if (rp->siop_sbcl & SIOP_BSY) { + printf ("ACK! siop was busy at timeout: rp %x script %x dsa %x\n", + rp, &scripts, &acb->ds); + printf(" sbcl %x sdid %x istat %x dstat %x sstat0 %x\n", + rp->siop_sbcl, rp->siop_sdid, istat, dstat, sstat0); + if (!(rp->siop_sbcl & SIOP_BSY)) { + printf ("Yikes, it's not busy now!\n"); +#if 0 + *status = -1; + if (sc->nexus_list.tqh_first) + rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect; + return 1; +#endif + } +/* rp->siop_dcntl |= SIOP_DCNTL_STD;*/ return (0); +#ifdef DDB + Debugger(); +#endif } +#endif + *status = -1; + acb->xs->error = XS_SELTIMEOUT; + if (sc->nexus_list.tqh_first) + rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect; + return 1; + } + if (acb) + target = acb->xs->sc_link->target; + else + target = 7; + if (sstat0 & SIOP_SSTAT0_UDC) { +#ifdef DEBUG + if (acb == NULL) + printf("%s: Unexpected disconnect with no active command?\n", + sc->sc_dev.dv_xname); + printf ("%s: target %d disconnected unexpectedly\n", + sc->sc_dev.dv_xname, target); +#endif +#if 0 + siopabort (sc, rp, "siopchkintr"); +#endif + *status = STS_BUSY; + if (sc->nexus_list.tqh_first) + rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect; + return 1; + } + if (dstat & SIOP_DSTAT_SIR && (rp->siop_dsps == 0xff01 || + rp->siop_dsps == 0xff02)) { #ifdef DEBUG if (siop_debug & 0x100) - printf ("%s: ID %02x disconnected TEMP %lx (+%lx) curbuf %lx curlen %lx buf %p len %lx dfifo %x dbc %x sstat1 %x starts %d acb %p\n", + printf ("%s: ID %02x disconnected TEMP %x (+%x) curbuf %x curlen %x buf %x len %x dfifo %x dbc %x sstat1 %x starts %d acb %x\n", sc->sc_dev.dv_xname, 1 << target, rp->siop_temp, rp->siop_temp ? rp->siop_temp - sc->sc_scriptspa : 0, acb->iob_curbuf, acb->iob_curlen, acb->ds.chain[0].databuf, acb->ds.chain[0].datalen, dfifo, dbc, sstat1, siopstarts, acb); #endif + if (acb == NULL) { + printf("%s: Disconnect with no active command?\n", + sc->sc_dev.dv_xname); + return (0); + } /* * XXXX need to update iob_curbuf/iob_curlen to reflect * current data transferred. If device disconnected in @@ -1095,7 +1177,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) int n = rp->siop_temp - sc->sc_scriptspa; if (acb->iob_curlen && acb->iob_curlen != acb->ds.chain[0].datalen) - printf("%s: iob_curbuf/len already set? n %x iob %lx/%lx chain[0] %p/%lx\n", + printf("%s: iob_curbuf/len already set? n %x iob %x/%x chain[0] %x/%x\n", sc->sc_dev.dv_xname, n, acb->iob_curbuf, acb->iob_curlen, acb->ds.chain[0].databuf, acb->ds.chain[0].datalen); if (n < Ent_datain) @@ -1111,7 +1193,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) #ifdef DEBUG if (siop_debug & 0x100) { printf("%s: TEMP offset %d", sc->sc_dev.dv_xname, n); - printf(" curbuf %lx curlen %lx\n", acb->iob_curbuf, + printf(" curbuf %x curlen %x\n", acb->iob_curbuf, acb->iob_curlen); } #endif @@ -1142,17 +1224,11 @@ siop_checkintr(sc, istat, dstat, sstat0, status) acb->ds.chain[i].datalen)) break; } - if (i >= DMAMAXIO || acb->ds.chain[i].datalen == 0) { - printf("couldn't find saved data pointer: "); - printf("curbuf %lx curlen %lx i %d\n", - acb->iob_curbuf, acb->iob_curlen, i); -#ifdef DDB - Debugger(); -#endif - } + if (i >= DMAMAXIO || acb->ds.chain[i].datalen == 0) + printf("couldn't find saved data pointer\n"); #ifdef DEBUG if (siop_debug & 0x100) - printf(" chain[0]: %p/%lx -> %lx/%lx\n", + printf(" chain[0]: %x/%x -> %x/%x\n", acb->ds.chain[0].databuf, acb->ds.chain[0].datalen, acb->iob_curbuf, @@ -1163,7 +1239,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) for (j = 1, ++i; i < DMAMAXIO && acb->ds.chain[i].datalen; ++i, ++j) { #ifdef DEBUG if (siop_debug & 0x100) - printf(" chain[%d]: %p/%lx -> %p/%lx\n", j, + printf(" chain[%d]: %x/%x -> %x/%x\n", j, acb->ds.chain[j].databuf, acb->ds.chain[j].datalen, acb->ds.chain[i].databuf, @@ -1186,25 +1262,24 @@ siop_checkintr(sc, istat, dstat, sstat0, status) * try to start another command for another target/lun */ acb->status = sc->sc_flags & SIOP_INTSOFF; - sc->sc_nexus = NULL; TAILQ_INSERT_HEAD(&sc->nexus_list, acb, chain); + sc->sc_nexus = NULL; /* no current device */ /* start script to wait for reselect */ + if (sc->sc_nexus == NULL) rp->siop_dsp = sc->sc_scriptspa + Ent_wait_reselect; +/* XXXX start another command ? */ if (sc->ready_list.tqh_first) siop_sched(sc); return (0); } - if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff03) { - int reselid = rp->siop_scratch & 0x7f; int reselun = rp->siop_sfbr & 0x07; sc->sc_sstat1 = rp->siop_sbcl; /* XXXX save current SBCL */ - #ifdef DEBUG if (siop_debug & 0x100) - printf ("%s: target ID %02x reselected dsps %lx\n", + printf ("%s: target ID %02x reselected dsps %x\n", sc->sc_dev.dv_xname, reselid, rp->siop_dsps); if ((rp->siop_sfbr & 0x80) == 0) @@ -1249,7 +1324,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) break; } if (acb == NULL) { - printf("%s: target ID %02x reselect nexus_list %p\n", + printf("%s: target ID %02x reselect nexus_list %x\n", sc->sc_dev.dv_xname, reselid, sc->nexus_list.tqh_first); panic("unable to find reselecting device"); @@ -1258,12 +1333,33 @@ siop_checkintr(sc, istat, dstat, sstat0, status) dma_cachectl (acb, sizeof(*acb)); #endif rp->siop_temp = 0; - rp->siop_dsp = sc->sc_scriptspa + Ent_switch; + rp->siop_dcntl |= SIOP_DCNTL_STD; return (0); } - if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff04) { + u_short ctest2 = rp->siop_ctest2; + /* reselect was interrupted (by Sig_P or select) */ +#ifdef DEBUG + if (siop_debug & 0x100 || + (ctest2 & SIOP_CTEST2_SIGP) == 0) + printf ("%s: reselect interrupted (Sig_P?) scntl1 %x ctest2 %x sfbr %x istat %x/%x\n", + sc->sc_dev.dv_xname, rp->siop_scntl1, + ctest2, rp->siop_sfbr, istat, rp->siop_istat); +#endif + /* XXX assumes it was not select */ + if (sc->sc_nexus == NULL) { + printf("%s: reselect interrupted, sc_nexus == NULL\n", + sc->sc_dev.dv_xname); +#if 0 + siop_dump(sc); +#ifdef DDB + Debugger(); +#endif +#endif + rp->siop_dcntl |= SIOP_DCNTL_STD; + return(0); + } target = sc->sc_nexus->xs->sc_link->target; rp->siop_temp = 0; rp->siop_dsa = kvtop(&sc->sc_nexus->ds); @@ -1272,9 +1368,7 @@ siop_checkintr(sc, istat, dstat, sstat0, status) rp->siop_dsp = sc->sc_scriptspa; return (0); } - if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff06) { - if (acb == NULL) printf("%s: Bad message-in with no active command?\n", sc->sc_dev.dv_xname); @@ -1285,11 +1379,11 @@ siop_checkintr(sc, istat, dstat, sstat0, status) #endif printf ("%s: Unrecognized message in data sfbr %x msg %x sbcl %x\n", sc->sc_dev.dv_xname, rp->siop_sfbr, acb->msg[1], rp->siop_sbcl); - siopreset (sc); - *status = -1; - return 0; /* siopreset has cleaned up */ + /* what should be done here? */ + /*DCIAS(kvtop(&acb->msg[1]));*/ + rp->siop_dsp = sc->sc_scriptspa + Ent_switch; + return (0); } - if (dstat & SIOP_DSTAT_SIR && rp->siop_dsps == 0xff0a) { /* Status phase wasn't followed by message in phase? */ printf ("%s: Status phase not followed by message in phase? sbcl %x sbdl %x\n", @@ -1504,10 +1598,8 @@ siop_checkintr(sc, istat, dstat, sstat0, status) *status = -1; return 0; /* siopreset has cleaned up */ } - if (sstat0 & SIOP_SSTAT0_SGE) printf ("SIOP: SCSI Gross Error\n"); - if (sstat0 & SIOP_SSTAT0_PAR) printf ("SIOP: Parity Error\n"); @@ -1529,24 +1621,25 @@ bad_phase: * then panics. * XXXX need to clean this up to print out the info, reset, and continue */ - printf ("siopchkintr: target %x ds %p\n", target, &acb->ds); - printf ("scripts %lx ds %x rp %x dsp %lx dcmd %lx\n", sc->sc_scriptspa, + printf ("siopchkintr: target %x ds %x\n", target, &acb->ds); + printf ("scripts %x ds %x rp %x dsp %x dcmd %x\n", sc->sc_scriptspa, kvtop(&acb->ds), kvtop(rp), rp->siop_dsp, *((long *)&rp->siop_dcmd)); - printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %lx dsa %lx sbcl %x sts %x msg %x %x sfbr %x\n", + printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x " + "dsa %x sbcl %x sts %x msg %x %x sfbr %x\n", istat, dstat, sstat0, rp->siop_dsps, rp->siop_dsa, - rp->siop_sbcl, acb->stat[0], acb->msg[0], acb->msg[1], rp->siop_sfbr); + rp->siop_sbcl, acb->stat[0], acb->msg[0], acb->msg[1], + rp->siop_sfbr); #ifdef DEBUG if (siop_debug & 0x20) panic("siopchkintr: **** temp ****"); -#endif #ifdef DDB - Debugger (); + /* Debugger(); */ +#endif #endif #endif /* XXX */ - - *status = -1; siopreset (sc); /* hard reset */ + *status = -1; return 0; /* siopreset cleaned up */ } @@ -1581,7 +1674,7 @@ siop_select(sc) } #ifdef DEBUG if (siop_debug & 1) - printf ("siop_select: target %x cmd %02x ds %p\n", + printf ("siop_select: target %x cmd %02x ds %x\n", acb->xs->sc_link->target, acb->cmd.opcode, &sc->sc_nexus->ds); #endif @@ -1596,7 +1689,7 @@ siop_select(sc) * 53C710 interrupt handler */ -void +int siopintr (sc) register struct siop_softc *sc; { @@ -1629,9 +1722,8 @@ siopintr (sc) printf ("%s: intr istat %x dstat %x sstat0 %x\n", sc->sc_dev.dv_xname, istat, dstat, sstat0); if (!sc->sc_active) { - printf ("%s: spurious interrupt? istat %x dstat %x sstat0 %x nexus %p status %x\n", - sc->sc_dev.dv_xname, istat, dstat, sstat0, - sc->sc_nexus, sc->sc_nexus ? sc->sc_nexus->stat[0] : 0); + printf ("%s: spurious interrupt? istat %x dstat %x sstat0 %x status %x\n", + sc->sc_dev.dv_xname, istat, dstat, sstat0, sc->sc_nexus->stat[0]); } #endif @@ -1655,8 +1747,10 @@ siopintr (sc) rp->siop_dien = sc->sc_dien; } if (siop_checkintr (sc, istat, dstat, sstat0, &status)) { +#if 1 if (status == 0xff) printf ("siopintr: status == 0xff\n"); +#endif if ((sc->sc_flags & (SIOP_INTSOFF | SIOP_INTDEFER)) != SIOP_INTSOFF) { #if 0 if (rp->siop_sbcl & SIOP_BSY) { @@ -1668,8 +1762,7 @@ siopintr (sc) rp->siop_dsp - sc->sc_scriptspa); } #endif - siop_scsidone(sc->sc_nexus, sc->sc_nexus ? - sc->sc_nexus->stat[0] : -1); + siop_scsidone(sc->sc_nexus, sc->sc_nexus->stat[0]); } } splx(s); @@ -1680,7 +1773,7 @@ siopintr (sc) * not be correct for other 53c710 boards. * XXX fix this - nivas */ -void +void scsi_period_to_siop (sc, target) struct siop_softc *sc; int target; @@ -1711,7 +1804,7 @@ scsi_period_to_siop (sc, target) break; } if (sbcl > 3) { - printf("siop sync: unable to compute sync params for period %dns\n", + printf("siop_sync: unable to compute sync params for period %dns\n", period * 4); /* * XXX need to pick a value we can do and renegotiate @@ -1769,10 +1862,10 @@ siop_dump_acb(acb) for (i = acb->clen; i; --i) printf(" %02x", *b++); printf("\n"); - printf(" xs: %p data %p:%04x ", acb->xs, acb->xs->data, + printf(" xs: %08x data %8x:%04x ", acb->xs, acb->xs->data, acb->xs->datalen); - printf("va %p:%lx ", acb->iob_buf, acb->iob_len); - printf("cur %lx:%lx\n", acb->iob_curbuf, acb->iob_curlen); + printf("va %8x:%04x ", acb->iob_buf, acb->iob_len); + printf("cur %8x:%04x\n", acb->iob_curbuf, acb->iob_curlen); } void @@ -1790,21 +1883,21 @@ siop_dump(sc) #endif printf("%s@%p regs %p istat %x\n", sc->sc_dev.dv_xname, sc, rp, rp->siop_istat); - if ((acb = sc->free_list.tqh_first) != 0) { + if (acb = sc->free_list.tqh_first) { printf("Free list:\n"); while (acb) { siop_dump_acb(acb); acb = acb->chain.tqe_next; } } - if ((acb = sc->ready_list.tqh_first) != 0) { + if (acb = sc->ready_list.tqh_first) { printf("Ready list:\n"); while (acb) { siop_dump_acb(acb); acb = acb->chain.tqe_next; } } - if ((acb = sc->nexus_list.tqh_first) != 0) { + if (acb = sc->nexus_list.tqh_first) { printf("Nexus list:\n"); while (acb) { siop_dump_acb(acb); diff --git a/sys/arch/mvme88k/dev/siop_script.out b/sys/arch/mvme88k/dev/siop_script.out index 5263b8e943f..c6a91178fc8 100644 --- a/sys/arch/mvme88k/dev/siop_script.out +++ b/sys/arch/mvme88k/dev/siop_script.out @@ -1,106 +1,175 @@ -unsigned long scripts[] = { - 0x47000000, 0x00000118, - 0x878B0000, 0x00000030, - 0x868A0000, 0x00000160, - 0x828A0000, 0x00000168, - 0x808A0000, 0x00000178, - 0x818A0000, 0x00000200, - 0x838A0000, 0x00000288, - 0x98080000, 0x0000FF05, - 0x1F000024, 0x00000024, - 0x808C0001, 0x00000040, - 0x808C0004, 0x00000078, - 0x808C0002, 0x00000088, - 0x808C0007, 0x00000010, - 0x808C0003, 0x00000008, - 0x98080000, 0x0000FF06, - 0x60000040, 0x00000000, - 0x60000008, 0x00000000, - 0x80880000, 0xFFFFFF78, - 0x60000040, 0x00000000, - 0x1F00002C, 0x0000002C, - 0x808C0003, 0x00000008, - 0x98080000, 0x0000FF07, - 0x60000040, 0x00000000, - 0x1F000034, 0x00000034, - 0x60000040, 0x00000000, - 0x80880000, 0xFFFFFF38, - 0x60000040, 0x00000000, - 0x48000000, 0x00000000, - 0x98080000, 0x0000FF02, - 0x60000040, 0x00000000, - 0x87830000, 0xFFFFFF10, - 0x1F00002C, 0x0000002C, - 0x98040004, 0x0000FF08, - 0x60000040, 0x00000000, - 0x48000000, 0x00000000, - 0x98080000, 0x0000FF01, - 0x54000000, 0x00000030, - 0x72230000, 0x00000000, - 0x6A340000, 0x00000000, - 0x9F030000, 0x0000FF09, - 0x1F00001C, 0x0000001C, - 0x60000040, 0x00000000, - 0x98080000, 0x0000FF03, - 0x74212800, 0x00000000, - 0x78160000, 0x00000000, - 0x980C0020, 0x0000FF04, - 0x80880000, 0xFFFFFFA8, - 0x1E000004, 0x00000004, - 0x80880000, 0xFFFFFE80, - 0x60000008, 0x00000000, - 0x1A00000C, 0x0000000C, - 0x80880000, 0xFFFFFE68, - 0x1800003C, 0x0000003C, - 0x88830000, 0xFFFFFE58, - 0x18000044, 0x00000044, - 0x88830000, 0xFFFFFE48, - 0x1800004C, 0x0000004C, - 0x88830000, 0xFFFFFE38, - 0x18000054, 0x00000054, - 0x88830000, 0xFFFFFE28, - 0x1800005C, 0x0000005C, - 0x88830000, 0xFFFFFE18, - 0x18000064, 0x00000064, - 0x88830000, 0xFFFFFE08, - 0x1800006C, 0x0000006C, - 0x88830000, 0xFFFFFDF8, - 0x18000074, 0x00000074, - 0x88830000, 0xFFFFFDE8, - 0x1800007C, 0x0000007C, - 0x88880000, 0xFFFFFDD8, - 0x1900003C, 0x0000003C, - 0x89830000, 0xFFFFFDC8, - 0x19000044, 0x00000044, - 0x89830000, 0xFFFFFDB8, - 0x1900004C, 0x0000004C, - 0x89830000, 0xFFFFFDA8, - 0x19000054, 0x00000054, - 0x89830000, 0xFFFFFD98, - 0x1900005C, 0x0000005C, - 0x89830000, 0xFFFFFD88, - 0x19000064, 0x00000064, - 0x89830000, 0xFFFFFD78, - 0x1900006C, 0x0000006C, - 0x89830000, 0xFFFFFD68, - 0x19000074, 0x00000074, - 0x89830000, 0xFFFFFD58, - 0x1900007C, 0x0000007C, - 0x88880000, 0xFFFFFD48, - 0x1B000014, 0x00000014, - 0x9F030000, 0x0000FF0A, - 0x1F00001C, 0x0000001C, - 0x60000040, 0x00000000, - 0x48000000, 0x00000000, - 0x98080000, 0x0000FF00 - +unsigned long scripts[] = { + 0x47000000, 0x00000118, /* 000 - 0 */ + 0x878b0000, 0x00000030, /* 008 - 8 */ + 0x868a0000, 0x00000168, /* 010 - 16 */ + 0x828a0000, 0x00000170, /* 018 - 24 */ + 0x808a0000, 0x00000180, /* 020 - 32 */ + 0x818a0000, 0x00000288, /* 028 - 40 */ + 0x838a0000, 0x00000390, /* 030 - 48 */ + 0x98080000, 0x0000ff05, /* 038 - 56 */ + 0x1f000024, 0x00000024, /* 040 - 64 */ + 0x808c0001, 0x00000040, /* 048 - 72 */ + 0x808c0004, 0x00000078, /* 050 - 80 */ + 0x808c0002, 0x00000088, /* 058 - 88 */ + 0x808c0007, 0x00000010, /* 060 - 96 */ + 0x808c0003, 0x00000008, /* 068 - 104 */ + 0x98080000, 0x0000ff06, /* 070 - 112 */ + 0x60000040, 0x00000000, /* 078 - 120 */ + 0x60000008, 0x00000000, /* 080 - 128 */ + 0x80880000, 0xffffff78, /* 088 - 136 */ + 0x60000040, 0x00000000, /* 090 - 144 */ + 0x1f00002c, 0x0000002c, /* 098 - 152 */ + 0x808c0003, 0x00000008, /* 0a0 - 160 */ + 0x98080000, 0x0000ff07, /* 0a8 - 168 */ + 0x60000040, 0x00000000, /* 0b0 - 176 */ + 0x1f000034, 0x00000034, /* 0b8 - 184 */ + 0x60000040, 0x00000000, /* 0c0 - 192 */ + 0x80880000, 0xffffff38, /* 0c8 - 200 */ + 0x60000040, 0x00000000, /* 0d0 - 208 */ + 0x48000000, 0x00000000, /* 0d8 - 216 */ + 0x98080000, 0x0000ff02, /* 0e0 - 224 */ + 0x60000040, 0x00000000, /* 0e8 - 232 */ + 0x87830000, 0xffffff10, /* 0f0 - 240 */ + 0x1f00002c, 0x0000002c, /* 0f8 - 248 */ + 0x98040004, 0x0000ff08, /* 100 - 256 */ + 0x60000040, 0x00000000, /* 108 - 264 */ + 0x48000000, 0x00000000, /* 110 - 272 */ + 0x98080000, 0x0000ff01, /* 118 - 280 */ + 0x54000000, 0x00000038, /* 120 - 288 */ + 0x72230000, 0x00000000, /* 128 - 296 */ + 0x6a340000, 0x00000000, /* 130 - 304 */ + 0x9f030000, 0x0000ff09, /* 138 - 312 */ + 0x1f00001c, 0x0000001c, /* 140 - 320 */ + 0x98080000, 0x0000ff03, /* 148 - 328 */ + 0x60000040, 0x00000000, /* 150 - 336 */ + 0x80880000, 0xfffffea8, /* 158 - 344 */ + 0x74011000, 0x00000000, /* 160 - 352 */ + 0x980c0000, 0x0000ff04, /* 168 - 360 */ + 0x74164000, 0x00000000, /* 170 - 368 */ + 0x80880000, 0xffffffa0, /* 178 - 376 */ + 0x1e000004, 0x00000004, /* 180 - 384 */ + 0x80880000, 0xfffffe78, /* 188 - 392 */ + 0x60000008, 0x00000000, /* 190 - 400 */ + 0x1a00000c, 0x0000000c, /* 198 - 408 */ + 0x80880000, 0xfffffe60, /* 1a0 - 416 */ + 0x1800003c, 0x0000003c, /* 1a8 - 424 */ + 0x88830000, 0xfffffe50, /* 1b0 - 432 */ + 0x18000044, 0x00000044, /* 1b8 - 440 */ + 0x88830000, 0xfffffe40, /* 1c0 - 448 */ + 0x1800004c, 0x0000004c, /* 1c8 - 456 */ + 0x88830000, 0xfffffe30, /* 1d0 - 464 */ + 0x18000054, 0x00000054, /* 1d8 - 472 */ + 0x88830000, 0xfffffe20, /* 1e0 - 480 */ + 0x1800005c, 0x0000005c, /* 1e8 - 488 */ + 0x88830000, 0xfffffe10, /* 1f0 - 496 */ + 0x18000064, 0x00000064, /* 1f8 - 504 */ + 0x88830000, 0xfffffe00, /* 200 - 512 */ + 0x1800006c, 0x0000006c, /* 208 - 520 */ + 0x88830000, 0xfffffdf0, /* 210 - 528 */ + 0x18000074, 0x00000074, /* 218 - 536 */ + 0x88830000, 0xfffffde0, /* 220 - 544 */ + 0x1800007c, 0x0000007c, /* 228 - 552 */ + 0x88830000, 0xfffffdd0, /* 230 - 560 */ + 0x18000084, 0x00000084, /* 238 - 568 */ + 0x88830000, 0xfffffdc0, /* 240 - 576 */ + 0x1800008c, 0x0000008c, /* 248 - 584 */ + 0x88830000, 0xfffffdb0, /* 250 - 592 */ + 0x18000094, 0x00000094, /* 258 - 600 */ + 0x88830000, 0xfffffda0, /* 260 - 608 */ + 0x1800009c, 0x0000009c, /* 268 - 616 */ + 0x88830000, 0xfffffd90, /* 270 - 624 */ + 0x180000a4, 0x000000a4, /* 278 - 632 */ + 0x88830000, 0xfffffd80, /* 280 - 640 */ + 0x180000ac, 0x000000ac, /* 288 - 648 */ + 0x88830000, 0xfffffd70, /* 290 - 656 */ + 0x180000b4, 0x000000b4, /* 298 - 664 */ + 0x88830000, 0xfffffd60, /* 2a0 - 672 */ + 0x180000bc, 0x000000bc, /* 2a8 - 680 */ + 0x88880000, 0xfffffd50, /* 2b0 - 688 */ + 0x1900003c, 0x0000003c, /* 2b8 - 696 */ + 0x89830000, 0xfffffd40, /* 2c0 - 704 */ + 0x19000044, 0x00000044, /* 2c8 - 712 */ + 0x89830000, 0xfffffd30, /* 2d0 - 720 */ + 0x1900004c, 0x0000004c, /* 2d8 - 728 */ + 0x89830000, 0xfffffd20, /* 2e0 - 736 */ + 0x19000054, 0x00000054, /* 2e8 - 744 */ + 0x89830000, 0xfffffd10, /* 2f0 - 752 */ + 0x1900005c, 0x0000005c, /* 2f8 - 760 */ + 0x89830000, 0xfffffd00, /* 300 - 768 */ + 0x19000064, 0x00000064, /* 308 - 776 */ + 0x89830000, 0xfffffcf0, /* 310 - 784 */ + 0x1900006c, 0x0000006c, /* 318 - 792 */ + 0x89830000, 0xfffffce0, /* 320 - 800 */ + 0x19000074, 0x00000074, /* 328 - 808 */ + 0x89830000, 0xfffffcd0, /* 330 - 816 */ + 0x1900007c, 0x0000007c, /* 338 - 824 */ + 0x89830000, 0xfffffcc0, /* 340 - 832 */ + 0x19000084, 0x00000084, /* 348 - 840 */ + 0x89830000, 0xfffffcb0, /* 350 - 848 */ + 0x1900008c, 0x0000008c, /* 358 - 856 */ + 0x89830000, 0xfffffca0, /* 360 - 864 */ + 0x19000094, 0x00000094, /* 368 - 872 */ + 0x89830000, 0xfffffc90, /* 370 - 880 */ + 0x1900009c, 0x0000009c, /* 378 - 888 */ + 0x89830000, 0xfffffc80, /* 380 - 896 */ + 0x190000a4, 0x000000a4, /* 388 - 904 */ + 0x89830000, 0xfffffc70, /* 390 - 912 */ + 0x190000ac, 0x000000ac, /* 398 - 920 */ + 0x89830000, 0xfffffc60, /* 3a0 - 928 */ + 0x190000b4, 0x000000b4, /* 3a8 - 936 */ + 0x89830000, 0xfffffc50, /* 3b0 - 944 */ + 0x190000bc, 0x000000bc, /* 3b8 - 952 */ + 0x88880000, 0xfffffc40, /* 3c0 - 960 */ + 0x1b000014, 0x00000014, /* 3c8 - 968 */ + 0x9f030000, 0x0000ff0a, /* 3d0 - 976 */ + 0x1f00001c, 0x0000001c, /* 3d8 - 984 */ + 0x60000040, 0x00000000, /* 3e0 - 992 */ + 0x48000000, 0x00000000, /* 3e8 - 1000 */ + 0x98080000, 0x0000ff00, /* 3f0 - 1008 */ + 0x80880000, 0xfffffd20, /* 3f8 - 1016 */ }; -#define Ent_scripts 0x00000000 -#define Ent_switch 0x00000008 +#define A_ds_Device 0x00000000 +#define A_ds_MsgOut 0x00000004 +#define A_ds_Cmd 0x0000000c +#define A_ds_Status 0x00000014 +#define A_ds_Msg 0x0000001c +#define A_ds_MsgIn 0x00000024 +#define A_ds_ExtMsg 0x0000002c +#define A_ds_SyncMsg 0x00000034 +#define A_ds_Data1 0x0000003c +#define A_ds_Data2 0x00000044 +#define A_ds_Data3 0x0000004c +#define A_ds_Data4 0x00000054 +#define A_ds_Data5 0x0000005c +#define A_ds_Data6 0x00000064 +#define A_ds_Data7 0x0000006c +#define A_ds_Data8 0x00000074 +#define A_ds_Data9 0x0000007c +#define A_ds_Data10 0x00000084 +#define A_ds_Data11 0x0000008c +#define A_ds_Data12 0x00000094 +#define A_ds_Data13 0x0000009c +#define A_ds_Data14 0x000000a4 +#define A_ds_Data15 0x000000ac +#define A_ds_Data16 0x000000b4 +#define A_ds_Data17 0x000000bc +#define A_ok 0x0000ff00 +#define A_err1 0x0000ff01 +#define A_err2 0x0000ff02 +#define A_err3 0x0000ff03 +#define A_err4 0x0000ff04 +#define A_err5 0x0000ff05 +#define A_err6 0x0000ff06 +#define A_err7 0x0000ff07 +#define A_err8 0x0000ff08 +#define A_err9 0x0000ff09 +#define A_err10 0x0000ff0a +#define Ent_scripts 0x00000000 +#define Ent_switch 0x00000008 #define Ent_wait_reselect 0x00000120 -#define Ent_dataout 0x000001a0 -#define Ent_datain 0x00000230 +#define Ent_dataout 0x000001a8 +#define Ent_datain 0x000002b8 -unsigned long INSTRUCTIONS = 0x0000005e; -unsigned long PATCHES = 0x00000000; +unsigned long INSTRUCTIONS = 0x00000080; +unsigned long PATCHES = 0x00000000; diff --git a/sys/arch/mvme88k/dev/siop_script.ss b/sys/arch/mvme88k/dev/siop_script.ss index c8d107091aa..c107e71469b 100644 --- a/sys/arch/mvme88k/dev/siop_script.ss +++ b/sys/arch/mvme88k/dev/siop_script.ss @@ -1,4 +1,4 @@ -; $NetBSD: siop_script.ss,v 1.3 1995/08/18 15:28:11 chopps Exp $ +; $OpenBSD: siop_script.ss,v 1.2 1998/12/15 05:52:31 smurph Exp $ ; ; Copyright (c) 1995 Michael L. Hitch @@ -91,7 +91,6 @@ msgin: JUMP REL(msg_sdp), IF 0x02 ; save data pointers JUMP REL(msg_rej), IF 0x07 ; message reject JUMP REL(msg_rdp), IF 0x03 ; restore data pointers - INT err6 ; unrecognized message msg_rdp: @@ -136,14 +135,16 @@ wait_reselect: INT err9, WHEN NOT MSG_IN ; didn't get IDENTIFY MOVE FROM ds_Msg, WHEN MSG_IN - CLEAR ACK ; acknowlege the message INT err3 ; let host know about reconnect + CLEAR ACK ; acknowlege the message + JUMP REL(switch) + select_adr: - MOVE ISTAT & 0x28 to SFBR ; get connected status - MOVE CTEST2 to CTEST2 ; clear Sig_P - INT err4, IF 0x20 ; tell host of interrupted reselect - JUMP REL(wait_reselect) ; try reselect again + MOVE SCNTL1 & 0x10 to SFBR ; get connected status + INT err4, IF 0x00 ; tell host if not connected + MOVE CTEST2 & 0x40 to SFBR ; clear Sig_P + JUMP REL(wait_reselect) ; and try reselect again msgout: MOVE FROM ds_MsgOut, WHEN MSG_OUT @@ -201,3 +202,4 @@ end: CLEAR ACK WAIT DISCONNECT INT ok ; signal completion + JUMP REL(wait_reselect) diff --git a/sys/arch/mvme88k/dev/siopdma.c b/sys/arch/mvme88k/dev/siopdma.c index 845dc3c1e6f..177f49669a0 100644 --- a/sys/arch/mvme88k/dev/siopdma.c +++ b/sys/arch/mvme88k/dev/siopdma.c @@ -1,4 +1,4 @@ -/* $NetBSD: afsc.c,v 1.6 1995/02/12 19:19:00 chopps Exp $ */ +/* $OpenBSD: siopdma.c,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1996 Nivas Madhur @@ -113,39 +113,14 @@ afscmatch(pdp, vcf, args) { struct cfdata *cf = vcf; struct confargs *ca = args; + int ret; -#if defined(MVME187) - caddr_t base; - if (cputyp != CPU_187) - { - return 0; - } - - /* - * If bus or name do not match, fail. - */ - if (ca->ca_bustype != BUS_PCCTWO || - strcmp(cf->cf_driver->cd_name, "siop")) { - return 0; - } - - base = (caddr_t)cf->cf_loc[0]; - - if (badpaddr(base, 1) == -1) { - return 0; + if ((ret = badvaddr(IIOV(ca->ca_vaddr), 4)) <=0){ + printf("==> siop: failed address check returning %ld.\n", ret); + return(0); } - /* - * tell our parent our requirements - */ - ca->ca_paddr = (caddr_t)SCSI_ADDR; - ca->ca_size = NCR710_SIZE; - ca->ca_ipl = IPL_BIO; - - return 1; -#else - return (!badvaddr(ca->ca_vaddr, 4)); -#endif /* defined(MVME187) */ + return (1); } void @@ -156,16 +131,17 @@ afscattach(parent, self, auxp) struct siop_softc *sc = (struct siop_softc *)self; struct confargs *ca = auxp; siop_regmap_p rp; + int tmp; extern int cpuspeed; - sc->sc_siopp = rp = (siop_regmap_p)ca->ca_vaddr; + sc->sc_siopp = rp = ca->ca_vaddr; /* * siop uses sc_clock_freq to define the dcntl & ctest7 reg values * (was 0x0221, but i added SIOP_CTEST7_SC0 for snooping control) + * XXX does the clock frequency change for the 33MHz processors? */ sc->sc_clock_freq = cpuspeed * 2; - #ifdef MVME177 /* XXX this is a guess! */ if (cputyp == CPU_177) @@ -226,16 +202,17 @@ afscattach(parent, self, auxp) * just in case. */ - struct pcc2reg *pcc2 = (struct pcc2reg *)ca->ca_parent; + struct pcctworeg *pcc2 = (struct pcctworeg *)ca->ca_master; pmap_cache_ctrl(pmap_kernel(), M88K_TRUNC_PAGE((vm_offset_t)sc), M88K_ROUND_PAGE((vm_offset_t)sc + sizeof(*sc)), CACHE_INH); #endif - intr_establish(PCC2_VECT + SCSIIRQ, &sc->sc_ih); + pcctwointr_establish(PCC2V_NCR, &sc->sc_ih); +/* intr_establish(PCC2_VECT + SCSIIRQ, &sc->sc_ih);*/ /* enable interrupts at ca_ipl */ - pcc2->pcc2_scsiirq = ca->ca_ipl | PCC2_SCSIIRQ_IEN; - + pcc2->pcc2_ncrirq = ca->ca_ipl | PCC2_IRQ_IEN; +/* pcc2->pcc2_scsiirq = ca->ca_ipl | PCC2_SCSIIRQ_IEN;*/ break; } #endif @@ -244,11 +221,15 @@ afscattach(parent, self, auxp) evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt); /* - * attach all scsi units on us + * attach all scsi units on us, watching for boot device + * (see dk_establish). */ - config_found(self, &sc->sc_link, afscprint); + tmp = bootpart; + if (ca->ca_paddr != bootaddr) + bootpart = -1; /* invalid flag to dk_establish */ + config_found(self, &sc->sc_link, scsiprint); + bootpart = tmp; /* restore old value */ } - /* * print diag if pnp is NULL else just extra */ @@ -298,14 +279,14 @@ afsc_dmaintr(sc) return (1); } -#ifdef DEBUG +#ifdef XXX_CD_DEBUG /* XXXsmurph What is afsccd ?? */ void afsc_dump() { int i; - for (i = 0; i < siop_cd.cd_ndevs; ++i) - if (siop_cd.cd_devs[i]) - siop_dump(siop_cd.cd_devs[i]); + for (i = 0; i < afsccd.cd_ndevs; ++i) + if (afsccd.cd_devs[i]) + siop_dump(afsccd.cd_devs[i]); } #endif diff --git a/sys/arch/mvme88k/dev/siopreg.h b/sys/arch/mvme88k/dev/siopreg.h index 0fce258fbc5..d4345934bb5 100644 --- a/sys/arch/mvme88k/dev/siopreg.h +++ b/sys/arch/mvme88k/dev/siopreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: siopreg.h,v 1.7 1995/08/18 15:28:13 chopps Exp $ */ +/* $OpenBSD: siopreg.h,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1990 The Regents of the University of California. diff --git a/sys/arch/mvme88k/dev/siopvar.h b/sys/arch/mvme88k/dev/siopvar.h index b695891841e..0e61b358401 100644 --- a/sys/arch/mvme88k/dev/siopvar.h +++ b/sys/arch/mvme88k/dev/siopvar.h @@ -1,4 +1,4 @@ -/* $Id: siopvar.h,v 1.1 1997/03/03 19:32:05 rahnds Exp $ */ +/* $OpenBSD: siopvar.h,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt diff --git a/sys/arch/mvme88k/dev/sram.c b/sys/arch/mvme88k/dev/sram.c new file mode 100644 index 00000000000..f930c54866b --- /dev/null +++ b/sys/arch/mvme88k/dev/sram.c @@ -0,0 +1,223 @@ +/* $OpenBSD: sram.c,v 1.1 1998/12/15 05:52:31 smurph Exp $ */ + +/* + * Copyright (c) 1995 Theo de Raadt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed under OpenBSD by + * Theo de Raadt for Willowglen Singapore. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/conf.h> +#include <sys/ioctl.h> +#include <sys/buf.h> +#include <sys/systm.h> +#include <sys/uio.h> +#include <sys/malloc.h> + +#include <sys/device.h> +#include <machine/cpu.h> +#include <machine/autoconf.h> +#include <machine/mioctl.h> +#include <vm/vm.h> + +struct sramsoftc { + struct device sc_dev; + void * sc_paddr; + void * sc_vaddr; + int sc_len; +}; + +void sramattach __P((struct device *, struct device *, void *)); +int srammatch __P((struct device *, void *, void *)); + +struct cfattach sram_ca = { + sizeof(struct sramsoftc), srammatch, sramattach +}; + +struct cfdriver sram_cd = { + NULL, "sram", DV_DULL, 0 +}; + +int +srammatch(parent, vcf, args) + struct device *parent; + void *vcf, *args; +{ + struct cfdata *cf = vcf; + struct confargs *ca = args; + int ret; + + if (cputyp != CPU_187) + return (0); + + ca->ca_paddr = (void *)0xffe00000; + ca->ca_vaddr = (void *)0xffe00000; + + if (ca->ca_vaddr == (void *)-1){ + if (badvaddr(ca->ca_vaddr, 4) <= 0){ + printf("==> sram: failed physical address check.\n"); + return (0); + } + } + if (badvaddr(ca->ca_vaddr, 1) <= 0){ + printf("==> sram: failed virtual address check.\n"); + return (0); + } + return (1); +} + +void +sramattach(parent, self, args) + struct device *parent, *self; + void *args; +{ + struct confargs *ca = args; + struct sramsoftc *sc = (struct sramsoftc *)self; + struct mcreg *mc; + int i; + + switch (cputyp) { +#ifdef MVME167 + case CPU_167: + case CPU_166: + sc->sc_len = 128*1024; /* always 128K */ + break; +#endif +#ifdef MVME177 + case CPU_177: + sc->sc_len = 128*1024; /* always 128K */ + break; +#endif +#ifdef MVME187 + case CPU_187: + sc->sc_len = 128*1024; /* always 128K */ + break; +#endif + default: + sc->sc_len = 0; + break; + } + + printf(": len %d", sc->sc_len); + + sc->sc_paddr = ca->ca_paddr; + sc->sc_vaddr = mapiodev((void *)sc->sc_paddr, sc->sc_len); + if (sc->sc_vaddr == NULL) { + sc->sc_len = 0; + printf(" -- failed to map"); + } + printf("\n"); +} + +/*ARGSUSED*/ +int +sramopen(dev, flag, mode) + dev_t dev; + int flag, mode; +{ + if (minor(dev) >= sram_cd.cd_ndevs || + sram_cd.cd_devs[minor(dev)] == NULL) + return (ENODEV); + return (0); +} + +/*ARGSUSED*/ +int +sramclose(dev, flag, mode) + dev_t dev; + int flag, mode; +{ + + return (0); +} + +/*ARGSUSED*/ +int +sramioctl(dev, cmd, data, flag, p) + dev_t dev; + caddr_t data; + int cmd, flag; + struct proc *p; +{ + int unit = minor(dev); + struct sramsoftc *sc = (struct sramsoftc *) sram_cd.cd_devs[unit]; + int error = 0; + + switch (cmd) { + case MIOCGSIZ: + *(int *)data = sc->sc_len; + break; + default: + error = ENOTTY; + break; + } + return (error); +} + +/*ARGSUSED*/ +int +sramread(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + int unit = minor(dev); + struct sramsoftc *sc = (struct sramsoftc *) sram_cd.cd_devs[unit]; + + return (memdevrw(sc->sc_vaddr, sc->sc_len, uio, flags)); +} + +/*ARGSUSED*/ +int +sramwrite(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + int unit = minor(dev); + struct sramsoftc *sc = (struct sramsoftc *) sram_cd.cd_devs[unit]; + + return (memdevrw(sc->sc_vaddr, sc->sc_len, uio, flags)); +} + +int +srammmap(dev, off, prot) + dev_t dev; + int off, prot; +{ + int unit = minor(dev); + struct sramsoftc *sc = (struct sramsoftc *) sram_cd.cd_devs[unit]; + + if (minor(dev) != 0) + return (-1); + + /* allow access only in RAM */ + if (off > sc->sc_len) + return (-1); + return (m88k_btop(sc->sc_paddr + off)); +} diff --git a/sys/arch/mvme88k/dev/vme.c b/sys/arch/mvme88k/dev/vme.c index 735f1037079..7e8b14fe3c9 100644 --- a/sys/arch/mvme88k/dev/vme.c +++ b/sys/arch/mvme88k/dev/vme.c @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: vme.c,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -45,6 +45,7 @@ #include <sys/device.h> #include <machine/autoconf.h> #include <machine/cpu.h> +#include <machine/frame.h> #include "pcctwo.h" @@ -56,8 +57,7 @@ void vmeattach __P((struct device *, struct device *, void *)); int vme1chip_init __P((struct vmesoftc *sc)); int vme2chip_init __P((struct vmesoftc *sc)); u_long vme2chip_map __P((u_long base, int len, int dwidth)); - -int vme2abort __P((void *cap, void *frame)); +int vme2abort __P((struct frame *frame)); static int vmebustype; @@ -70,37 +70,41 @@ struct cfdriver vme_cd = { }; int -vmematch(parent, self, args) +vmematch(parent, cf, args) struct device *parent; - void *self; + void *cf; void *args; { - /* XXX should we look at the id/rev in GCSR area? nivas */ - caddr_t base; - u_char id; - u_char rev; - struct cfdata *cf = self; struct confargs *ca = args; - /* - * If bus or name do not match, fail. - */ +#if NMC > 0 + if (ca->ca_bustype == BUS_MC) { + struct mcreg *mc = (struct mcreg *)ca->ca_master; - if (ca->ca_bustype != BUS_MAIN || - strcmp(cf->cf_driver->cd_name, "vme")) { - return 0; + if (mc->mc_ver & MC_VER_NOVME) + return (0); } - - if ((base = (caddr_t)cf->cf_loc[0]) == (caddr_t)-1) { - return 0; +#endif + return (1); } - ca->ca_size = 0x100; - ca->ca_paddr = base; - ca->ca_bustype = BUS_PCCTWO; +#if defined(MVME162) || defined(MVME167) || defined(MVME177) || defined (MVME187) +/* + * make local addresses 1G-2G correspond to VME addresses 3G-4G, + * as D32 + */ +#define VME2_D32STARTPHYS (1*1024*1024*1024UL) +#define VME2_D32ENDPHYS (2*1024*1024*1024UL) +#define VME2_D32STARTVME (3*1024*1024*1024UL) +#define VME2_D32BITSVME (3*1024*1024*1024UL) - return (1); -} +/* + * make local addresses 3G-3.75G correspond to VME addresses 3G-3.75G, + * as D16 + */ +#define VME2_D16STARTPHYS (3*1024*1024*1024UL) +#define VME2_D16ENDPHYS (3*1024*1024*1024UL + 768*1024*1024UL) +#endif /* * Returns a physical address mapping for a VME address & length. @@ -108,14 +112,14 @@ vmematch(parent, self, args) * mappings, ie. the MVME147 cannot do 32 bit accesses to VME bus * addresses from 0 to physmem. */ -caddr_t +void * vmepmap(sc, vmeaddr, len, bustype) struct vmesoftc *sc; - caddr_t vmeaddr; + void *vmeaddr; int len; int bustype; { - u_long base = (u_long)vmeaddr; + u_int32_t base = (u_int32_t)vmeaddr; len = roundup(len, NBPG); switch (vmebustype) { @@ -123,13 +127,18 @@ vmepmap(sc, vmeaddr, len, bustype) case BUS_PCC: switch (bustype) { case BUS_VMES: + printf("base 0x%8x/0x%8x len 0x%x\n", + vmeaddr, base, len); if (base > VME1_A16BASE && - (base+len - VME1_A16BASE) < VME1_A16D16LEN) + (base+len - VME1_A16BASE) < VME1_A16D16LEN) { base = base - VME1_A16BASE + VME1_A16D16BASE; - else if (base+len < VME1_A32D16LEN) - base = base + VME1_A32D16BASE; - else { - printf("%s: cannot map pa %x len %x\n", + printf("vmes1: base = 0x%8x\n", base); /* 1:1 */ + } else if (base > VME1_A32D16BASE && + base+len < VME1_A16BASE) { + /* 1:1 mapped */ + printf("vmes2: base = 0x%8x\n", base); + } else { + printf("%s: cannot map pa 0x%x len 0x%x\n", sc->sc_dev.dv_xname, base, len); return (NULL); } @@ -140,7 +149,7 @@ vmepmap(sc, vmeaddr, len, bustype) else if (base+len < VME1_A32D16LEN) /* HACK! */ base = base + VME1_A32D16BASE; else { - printf("%s: cannot map pa %x len %x\n", + printf("%s: cannot map pa 0x%x len 0x%x\n", sc->sc_dev.dv_xname, base, len); return (NULL); } @@ -153,15 +162,19 @@ vmepmap(sc, vmeaddr, len, bustype) case BUS_PCCTWO: switch (bustype) { case BUS_VMES: + /*printf("base %x len %d\n", base, len);*/ if (base > VME2_A16BASE && - (base+len-VME2_A16BASE) < VME2_A16D16LEN) + (base+len-VME2_A16BASE) < VME2_A16D16LEN) { + /* XXX busted? */ base = base - VME2_A16BASE + VME2_A16D16BASE; - else if (base > VME2_A24BASE && - (base+len-VME2_A24BASE) < VME2_A24D16LEN) - base = base - VME2_A24BASE + VME2_A24D16BASE; - else if ((base+len) < VME2_A32D16LEN) + } else if (base > VME2_A24BASE && + (base+len-VME2_A24BASE) < VME2_A24D16LEN) { + base = base - VME2_A24BASE + VME2_D16STARTPHYS; + } else if ((base+len) < VME2_A32D16LEN) { + /* XXX busted? */ base = base + VME2_A32D16BASE; - else { + } else { + printf("vme2chip_map\n"); base = vme2chip_map(base, len, 16); if (base == NULL) return (NULL); @@ -181,38 +194,32 @@ vmepmap(sc, vmeaddr, len, bustype) break; #endif } - return ((caddr_t)base); + return ((void *)base); } /* if successful, returns the va of a vme bus mapping */ -caddr_t +void * vmemap(sc, vmeaddr, len, bustype) struct vmesoftc *sc; - caddr_t vmeaddr; + void *vmeaddr; int len; int bustype; { - caddr_t pa, va; - extern vm_offset_t iomap_mapin(vm_offset_t, vm_size_t, boolean_t); + void *pa, *va; - pa = vmepmap(sc, pa, len, bustype); + pa = vmepmap(sc, vmeaddr, len, bustype); if (pa == NULL) return (NULL); -#if 0 - va = (caddr_t)iomap_mapin((vm_offset_t)pa, len, 1); -#endif - va = pa; + va = mapiodev(pa, len); return (va); } void vmeunmap(va, len) - caddr_t va; + void *va; int len; { -#if 0 - iomap_mapout(va, len); -#endif + unmapiodev(va, len); } int @@ -225,7 +232,7 @@ vmerw(sc, uio, flags, bus) register vm_offset_t o, v; register int c; register struct iovec *iov; - caddr_t vme; + void *vme; int error = 0; while (uio->uio_resid > 0 && error == 0) { @@ -244,13 +251,13 @@ vmerw(sc, uio, flags, bus) c = NBPG - (v & PGOFSET); if (c == 0) return (0); - vme = vmemap(sc, (caddr_t)(v & ~PGOFSET), + vme = vmemap(sc, (void *)(v & ~PGOFSET), NBPG, BUS_VMES); if (vme == NULL) { error = EFAULT; /* XXX? */ continue; } - error = uiomove((caddr_t)vme + (v & PGOFSET), c, uio); + error = uiomove((void *)vme + (v & PGOFSET), c, uio); vmeunmap(vme, NBPG); } return (error); @@ -259,14 +266,15 @@ vmerw(sc, uio, flags, bus) int vmeprint(args, bus) void *args; - char *bus; + const char *bus; { struct confargs *ca = args; + printf(" addr 0x%x", ca->ca_offset); + if (ca->ca_vec > 0) + printf(" vec 0x%x", ca->ca_vec); if (ca->ca_ipl > 0) printf(" ipl %d", ca->ca_ipl); - if (ca->ca_vec > 0) - printf(" vec %d", ca->ca_vec); return (UNCONF); } @@ -288,31 +296,30 @@ vmescan(parent, child, args, bustype) bzero(&oca, sizeof oca); oca.ca_bustype = bustype; - oca.ca_paddr = (caddr_t)cf->cf_loc[0]; - oca.ca_size = cf->cf_loc[1]; - oca.ca_ipl = cf->cf_loc[2]; - oca.ca_vec = cf->cf_loc[3]; - - /* - * Assign a vector if the config file did not specify - * one. - */ - -#ifdef notyet + oca.ca_paddr = (void *)cf->cf_loc[0]; + oca.ca_len = cf->cf_loc[1]; + oca.ca_vec = cf->cf_loc[2]; + oca.ca_ipl = cf->cf_loc[3]; if (oca.ca_ipl > 0 && oca.ca_vec == -1) - oca.ca_vec = intr_freevec(); -#endif /* notyet */ + oca.ca_vec = intr_findvec(255, 0); + if (oca.ca_len == -1) + oca.ca_len = 4096; - oca.ca_vaddr = (void *)vmemap(sc, oca.ca_paddr, oca.ca_size, - oca.ca_bustype); + oca.ca_offset = (u_int)oca.ca_paddr; + oca.ca_vaddr = vmemap(sc, oca.ca_paddr, oca.ca_len, oca.ca_bustype); if (!oca.ca_vaddr) oca.ca_vaddr = (void *)-1; - oca.ca_parent = (void *)sc; + oca.ca_master = (void *)sc; + oca.ca_name = cf->cf_driver->cd_name; if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0) { if (oca.ca_vaddr != (void *)-1) - vmeunmap(oca.ca_vaddr, oca.ca_size); + vmeunmap(oca.ca_vaddr, oca.ca_len); return (0); } + /* + * If match works, the driver is responsible for + * vmunmap()ing if it does not need the mapping. + */ config_attach(parent, cf, &oca, vmeprint); return (1); } @@ -351,8 +358,6 @@ vmeattach(parent, self, args) vme2chip_init(sc); break; #endif - default: - printf(" unknown parent bus %x", ca->ca_bustype); } while (config_found(self, NULL, NULL)) @@ -418,23 +423,8 @@ vme1chip_init(sc) } #endif -#if defined(MVME162) || defined(MVME167) || defined(MVME177) || defined(MVME187) - -/* - * make local addresses 1G-2G correspond to VME addresses 3G-4G, - * as D32 - */ -#define VME2_D32STARTPHYS (1*1024*1024*1024UL) -#define VME2_D32ENDPHYS (2*1024*1024*1024UL) -#define VME2_D32STARTVME (3*1024*1024*1024UL) -#define VME2_D32BITSVME (3*1024*1024*1024UL) -/* - * make local addresses 3G-3.75G correspond to VME addresses 3G-3.75G, - * as D16 - */ -#define VME2_D16STARTPHYS (3*1024*1024*1024UL) -#define VME2_D16ENDPHYS (3*1024*1024*1024UL + 768*1024*1024UL) +#if defined(MVME162) || defined(MVME167) || defined(MVME177) || defined (MVME187) /* * XXX what AM bits should be used for the D32/D16 mappings? @@ -451,48 +441,47 @@ vme2chip_init(sc) ctl = vme2->vme2_masterctl; -#if 0 - /* unused decoders 1 & 2 */ - printf("%s: phys 0x%08x-0x%08x to VMExxx 0x%08x-0x%08x\n", + /* unused decoders 1 */ + vme2->vme2_master1 = 0; + ctl &= ~(VME2_MASTERCTL_ALL << VME2_MASTERCTL_1SHIFT); + printf("%s: 1phys 0x%08x-0x%08x to VMExxx 0x%08x-0x%08x\n", sc->sc_dev.dv_xname, vme2->vme2_master1 << 16, vme2->vme2_master1 & 0xffff0000, vme2->vme2_master1 << 16, vme2->vme2_master1 & 0xffff0000); - printf("%s: phys 0x%08x-0x%08x to VMExxx 0x%08x-0x%08x\n", + + /* unused decoders 2 */ + vme2->vme2_master2 = 0; + ctl &= ~(VME2_MASTERCTL_ALL << VME2_MASTERCTL_2SHIFT); + printf("%s: 2phys 0x%08x-0x%08x to VMExxx 0x%08x-0x%08x\n", sc->sc_dev.dv_xname, vme2->vme2_master2 << 16, vme2->vme2_master2 & 0xffff0000, vme2->vme2_master2 << 16, vme2->vme2_master2 & 0xffff0000); -#endif - /* setup a D16 space */ + /* setup a A24D16 space */ vme2->vme2_master3 = ((VME2_D16ENDPHYS-1) & 0xffff0000) | (VME2_D16STARTPHYS >> 16); ctl &= ~(VME2_MASTERCTL_ALL << VME2_MASTERCTL_3SHIFT); - ctl |= (VME2_MASTERCTL_AM32SP | VME2_MASTERCTL_D16) << + ctl |= (VME2_MASTERCTL_D16 | VME2_MASTERCTL_AM24UD) << VME2_MASTERCTL_3SHIFT; -#if 0 - printf("%s: phys 0x%08x-0x%08x to VMED16 0x%08x-0x%08x\n", + printf("%s: 3phys 0x%08x-0x%08x to VMED16 0x%08x-0x%08x\n", sc->sc_dev.dv_xname, - VME2_D16STARTPHYS, VME2_D16ENDPHYS-1, - VME2_D16STARTPHYS, VME2_D16ENDPHYS-1); -#endif + vme2->vme2_master3 << 16, vme2->vme2_master3 & 0xffff0000, + vme2->vme2_master3 << 16, vme2->vme2_master3 & 0xffff0000); - /* setup a D32 space */ + /* setup a A32D32 space */ vme2->vme2_master4 = ((VME2_D32ENDPHYS-1) & 0xffff0000) | (VME2_D32STARTPHYS >> 16); vme2->vme2_master4mod = (VME2_D32STARTVME & 0xffff0000) | (VME2_D32BITSVME >> 16); ctl &= ~(VME2_MASTERCTL_ALL << VME2_MASTERCTL_4SHIFT); - ctl |= (VME2_MASTERCTL_AM32SP) << + ctl |= (VME2_MASTERCTL_AM32UD) << VME2_MASTERCTL_4SHIFT; -#if 0 - printf("%s: phys 0x%08x-0x%08x to VMED32 0x%08x-0x%08x\n", + printf("%s: 4phys 0x%08x-0x%08x to VMED32 0x%08x-0x%08x\n", sc->sc_dev.dv_xname, - VME2_D32STARTPHYS, VME2_D32ENDPHYS-1, - VME2_D32STARTVME, VME2_D32STARTVME | ~VME2_D32BITSVME); -#endif + vme2->vme2_master4 << 16, vme2->vme2_master4 & 0xffff0000, + vme2->vme2_master4 << 16, vme2->vme2_master4 & 0xffff0000); vme2->vme2_masterctl = ctl; - ctl = vme2->vme2_gcsrctl; /* enable A16 short IO map decoder (0xffffxxxx) */ @@ -520,11 +509,10 @@ vme2chip_init(sc) (6 << VME2_IRQL4_VME6SHIFT) | (5 << VME2_IRQL4_VME5SHIFT) | (4 << VME2_IRQL4_VME4SHIFT) | (3 << VME2_IRQL4_VME3SHIFT) | (2 << VME2_IRQL4_VME2SHIFT) | (1 << VME2_IRQL4_VME1SHIFT); - /* - * disable all interrupts, they will be enabled by each - * driver when it configures - */ - vme2->vme2_irqen = 0; + printf("%s: vme2_irql4 = 0x%08x\n", sc->sc_dev.dv_xname, + vme2->vme2_irql4); + +#if NPCCTWO > 0 if (vmebustype == BUS_PCCTWO){ /* * pseudo driver, abort interrupt handler @@ -539,7 +527,8 @@ vme2chip_init(sc) intr_establish(110, &sc->sc_abih); vme2->vme2_irqen |= VME2_IRQ_AB; } - +#endif + vme2->vme2_irqen = vme2->vme2_irqen | VME2_IRQ_ACF; } /* @@ -565,22 +554,22 @@ vme2chip_map(base, len, dwidth) return (base - VME2_D32STARTVME + VME2_D32STARTPHYS); } } -#if 1 + +#if NPCCTWO > 0 int -vme2abort(void *cap, void *frame) +vme2abort(frame) + struct frame *frame; { struct vmesoftc *sc = (struct vmesoftc *) vme_cd.cd_devs[0]; struct vme2reg *vme2 = (struct vme2reg *)sc->sc_vaddr; - extern void nmihand(void *); - if (!(vme2->vme2_irqstat & VME2_IRQ_AB)) { - printf("vme2abort irq not set\n"); - return 0; + if (vme2->vme2_irqstat & VME2_IRQ_AB == 0) { + printf("%s: vme2chip irq not set\n", sc->sc_dev.dv_xname); + return (0); } - vme2->vme2_irqclr = VME2_IRQ_AB; nmihand(frame); - return 1; + return (1); } #endif #endif /* MVME1[678]x */ diff --git a/sys/arch/mvme88k/dev/vme.h b/sys/arch/mvme88k/dev/vme.h index 7a20f7aa2c6..f0663440e3d 100644 --- a/sys/arch/mvme88k/dev/vme.h +++ b/sys/arch/mvme88k/dev/vme.h @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: vme.h,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -35,10 +35,18 @@ #endif struct vmesoftc { struct device sc_dev; - caddr_t sc_vaddr; -#if 1 + void * sc_vaddr; struct intrhand sc_abih; /* `abort' switch */ -#endif +}; + +struct vmessoftc { + struct device sc_dev; + struct vmesoftc *sc_vme; +}; + +struct vmelsoftc { + struct device sc_dev; + struct vmesoftc *sc_vme; }; /* @@ -222,6 +230,7 @@ struct vme2reg { /*60*/ volatile u_long vme2_tctl; #define VME2_TCTL_SCON 0x40000000 /* we are SCON */ #define VME2_TCTL_SYSFAIL 0x20000000 /* light SYSFAIL led */ +#define VME2_TCTL_SRST 0x00800000 /* system reset */ /*64*/ volatile u_long vme2_prescale; /*68*/ volatile u_long vme2_irqstat; /*6c*/ volatile u_long vme2_irqen; @@ -322,8 +331,8 @@ struct vme2reg { #define VME2_A16BASE 0xffff0000UL #define VME2_A24BASE 0xff000000UL -caddr_t vmepmap __P((struct vmesoftc *sc, caddr_t vmeaddr, int len, +void * vmepmap __P((struct vmesoftc *sc, void * vmeaddr, int len, int bustype)); -caddr_t vmemap __P((struct vmesoftc *sc, caddr_t vmeaddr, int len, +void * vmemap __P((struct vmesoftc *sc, void * vmeaddr, int len, int bustype)); int vmerw __P((struct vmesoftc *sc, struct uio *uio, int flags, int bus)); diff --git a/sys/arch/mvme88k/dev/vmel.c b/sys/arch/mvme88k/dev/vmel.c index 04f7b840ee9..064a8fb4b26 100644 --- a/sys/arch/mvme88k/dev/vmel.c +++ b/sys/arch/mvme88k/dev/vmel.c @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: vmel.c,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -50,11 +50,6 @@ void vmelattach __P((struct device *, struct device *, void *)); int vmelmatch __P((struct device *, void *, void *)); -struct vmelsoftc { - struct device sc_dev; - struct vmesoftc *sc_vme; -}; - struct cfattach vmel_ca = { sizeof(struct vmelsoftc), vmelmatch, vmelattach }; @@ -166,9 +161,9 @@ vmelmmap(dev, off, prot) { int unit = minor(dev); struct vmelsoftc *sc = (struct vmelsoftc *) vmel_cd.cd_devs[unit]; - caddr_t pa; + void * pa; - pa = vmepmap(sc->sc_vme, (caddr_t)off, NBPG, BUS_VMEL); + pa = vmepmap(sc->sc_vme, (void *)off, NBPG, BUS_VMEL); printf("vmel %x pa %x\n", off, pa); if (pa == NULL) return (-1); diff --git a/sys/arch/mvme88k/dev/vmes.c b/sys/arch/mvme88k/dev/vmes.c index 9bfa8c6dc84..dfe5a6cccb9 100644 --- a/sys/arch/mvme88k/dev/vmes.c +++ b/sys/arch/mvme88k/dev/vmes.c @@ -1,4 +1,4 @@ -/* $NetBSD$ */ +/* $OpenBSD: vmes.c,v 1.2 1998/12/15 05:52:31 smurph Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -50,11 +50,6 @@ void vmesattach __P((struct device *, struct device *, void *)); int vmesmatch __P((struct device *, void *, void *)); -struct vmessoftc { - struct device sc_dev; - struct vmesoftc *sc_vme; -}; - struct cfattach vmes_ca = { sizeof(struct vmessoftc), vmesmatch, vmesattach }; @@ -63,7 +58,6 @@ struct cfdriver vmes_cd = { NULL, "vmes", DV_DULL, 0 }; - int vmesmatch(parent, cf, args) struct device *parent; @@ -167,9 +161,9 @@ vmesmmap(dev, off, prot) { int unit = minor(dev); struct vmessoftc *sc = (struct vmessoftc *) vmes_cd.cd_devs[unit]; - caddr_t pa; + void * pa; - pa = vmepmap(sc->sc_vme, (caddr_t)off, NBPG, BUS_VMES); + pa = vmepmap(sc->sc_vme, (void *)off, NBPG, BUS_VMES); printf("vmes %x pa %x\n", off, pa); if (pa == NULL) return (-1); |