summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2003-10-08 22:36:12 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2003-10-08 22:36:12 +0000
commit8f167219007d99193220cb340c7fb5e760fccf3d (patch)
treed91904a93ffc381874de04686aeb10f009894eea /sys
parentaed69c053f17e2089eaf663c73da3b75a5a6e0dc (diff)
Sync VMEChip2 timer usage with mvme68k (i.e. make it slightly more sane).
Also, use it even when the 1x7 is not a system controller - this does not matter.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/mvme88k/dev/clock.c53
-rw-r--r--sys/arch/mvme88k/dev/sclock.c17
-rw-r--r--sys/arch/mvme88k/dev/vme.c47
3 files changed, 56 insertions, 61 deletions
diff --git a/sys/arch/mvme88k/dev/clock.c b/sys/arch/mvme88k/dev/clock.c
index 5166a30746a..03b2fa8f1ad 100644
--- a/sys/arch/mvme88k/dev/clock.c
+++ b/sys/arch/mvme88k/dev/clock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clock.c,v 1.24 2003/10/08 19:10:04 miod Exp $ */
+/* $OpenBSD: clock.c,v 1.25 2003/10/08 22:36:11 miod Exp $ */
/*
* Copyright (c) 1999 Steve Murphree, Jr.
* Copyright (c) 1995 Theo de Raadt
@@ -87,15 +87,14 @@
#include <machine/bugio.h>
#include <machine/cpu.h>
#include <machine/cmmu.h> /* DMA_CACHE_SYNC, etc... */
+
#include "pcctwo.h"
#if NPCCTWO > 0
#include <mvme88k/dev/pcctwofunc.h>
#include <mvme88k/dev/pcctworeg.h>
-#include "bugtty.h"
-#if NBUGTTY > 0
-#include <mvme88k/dev/bugttyfunc.h>
-#endif
+extern struct vme2reg *sys_vme2;
#endif
+
#include "syscon.h"
#if NSYSCON > 0
#include <mvme88k/dev/sysconfunc.h>
@@ -103,7 +102,10 @@
#endif
#include <mvme88k/dev/vme.h>
-extern struct vme2reg *sys_vme2;
+#include "bugtty.h"
+#if NBUGTTY > 0
+#include <mvme88k/dev/bugttyfunc.h>
+#endif
int clockmatch(struct device *, void *, void *);
void clockattach(struct device *, struct device *, void *);
@@ -129,7 +131,6 @@ struct cfdriver clock_cd = {
int sbc_clockintr(void *);
int m188_clockintr(void *);
-int clockbus;
u_char prof_reset;
/*
@@ -153,9 +154,9 @@ clockmatch(parent, vcf, args)
* We return the ipl here so that the parent can print
* a message if it is different from what ioconf.c says.
*/
- ca->ca_ipl = IPL_CLOCK;
+ ca->ca_ipl = IPL_CLOCK;
/* set size to 0 - see pcctwo.c:match for details */
- ca->ca_len = 0;
+ ca->ca_len = 0;
return (1);
}
@@ -167,9 +168,7 @@ clockattach(parent, self, args)
struct confargs *ca = args;
struct clocksoftc *sc = (struct clocksoftc *)self;
- clockbus = ca->ca_bustype;
-
- switch (clockbus) {
+ switch (ca->ca_bustype) {
#if NPCCTWO > 0
case BUS_PCCTWO:
sc->sc_profih.ih_fn = sbc_clockintr;
@@ -179,7 +178,6 @@ clockattach(parent, self, args)
prof_reset = ca->ca_ipl | PCC2_IRQ_IEN | PCC2_IRQ_ICLR;
pcctwointr_establish(PCC2V_TIMER1, &sc->sc_profih);
md.clock_init_func = sbc_initclock;
- printf(": VME1x7");
break;
#endif /* NPCCTWO */
#if NSYSCON > 0
@@ -190,7 +188,6 @@ clockattach(parent, self, args)
sc->sc_profih.ih_ipl = ca->ca_ipl;
sysconintr_establish(SYSCV_TIMER1, &sc->sc_profih);
md.clock_init_func = m188_initclock;
- printf(": VME188");
break;
#endif /* NSYSCON */
}
@@ -214,8 +211,7 @@ sbc_initclock(void)
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_t1ctl = PCC2_TCTL_CEN | PCC2_TCTL_COC | PCC2_TCTL_COVF;
sys_pcc2->pcc2_t1irq = prof_reset;
}
@@ -245,23 +241,26 @@ delay(us)
{
volatile int c;
+#if NPCCTWO > 0
/*
* We use the vme system controller for the delay clock.
* Do not go to the real timer until vme device is present.
* Or, in the case of MVME188, not at all.
*/
- if (sys_vme2 == NULL || brdtyp == BRD_188) {
- c = 3 * us; /* XXX not accurate! */
- while (--c > 0);
+ if (sys_vme2 != NULL) {
+ sys_vme2->vme2_t1cmp = 0xffffffff;
+ sys_vme2->vme2_t1count = 0;
+ sys_vme2->vme2_tctl |= VME2_TCTL1_CEN;
+
+ while (sys_vme2->vme2_t1count < us)
+ ;
+ sys_vme2->vme2_tctl &= ~VME2_TCTL1_CEN;
return;
}
- sys_vme2->vme2_irql1 |= (0 << VME2_IRQL1_TIC1SHIFT);
- sys_vme2->vme2_t1count = 0;
- sys_vme2->vme2_tctl |= (VME2_TCTL1_CEN | VME2_TCTL1_COVF);
-
- while (sys_vme2->vme2_t1count < us)
+#endif
+ c = 3 * us; /* XXX not accurate! */
+ while (--c > 0)
;
- sys_vme2->vme2_tctl &= ~(VME2_TCTL1_CEN | VME2_TCTL1_COVF);
}
#if NSYSCON > 0
@@ -274,11 +273,7 @@ m188_clockintr(eframe)
volatile int tmp;
/* acknowledge the timer interrupt */
-#if 0
- dma_cachectl(DART_BASE, PAGE_SIZE, DMA_CACHE_SYNC_INVAL);
-#else
tmp = *(int *volatile)DART_ISR;
-#endif
/* stop the timer while the interrupt is being serviced */
tmp = *(int *volatile)DART_STOPC;
diff --git a/sys/arch/mvme88k/dev/sclock.c b/sys/arch/mvme88k/dev/sclock.c
index 6814ffaa40e..e389a17da59 100644
--- a/sys/arch/mvme88k/dev/sclock.c
+++ b/sys/arch/mvme88k/dev/sclock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sclock.c,v 1.15 2003/10/05 20:25:08 miod Exp $ */
+/* $OpenBSD: sclock.c,v 1.16 2003/10/08 22:36:11 miod Exp $ */
/*
* Copyright (c) 1999 Steve Murphree, Jr.
*
@@ -81,19 +81,19 @@
#include <machine/psl.h>
#include <machine/autoconf.h>
#include <machine/cpu.h>
+
#include "pcctwo.h"
#if NPCCTWO > 0
#include <mvme88k/dev/pcctwofunc.h>
#include <mvme88k/dev/pcctworeg.h>
#endif
+
#include "syscon.h"
#if NSYSCON > 0
#include <mvme88k/dev/sysconfunc.h>
#include <mvme88k/dev/sysconreg.h>
#endif
-#include <mvme88k/dev/vme.h>
-extern struct vme2reg *sys_vme2;
struct simplelock cio_lock;
/*
* Statistics clock interval and variance, in usec. Variance must be a
@@ -131,7 +131,6 @@ struct cfdriver sclock_cd = {
int sbc_statintr(void *);
int m188_statintr(void *);
-int sclockbus;
u_char stat_reset;
/*
@@ -155,9 +154,9 @@ sclockmatch(parent, vcf, args)
* We return the ipl here so that the parent can print
* a message if it is different from what ioconf.c says.
*/
- ca->ca_ipl = IPL_CLOCK;
+ ca->ca_ipl = IPL_CLOCK;
/* set size to 0 - see pcctwo.c:match for details */
- ca->ca_len = 0;
+ ca->ca_len = 0;
return (1);
}
@@ -169,9 +168,7 @@ sclockattach(parent, self, args)
struct confargs *ca = args;
struct sclocksoftc *sc = (struct sclocksoftc *)self;
- sclockbus = ca->ca_bustype;
-
- switch (sclockbus) {
+ switch (ca->ca_bustype) {
#if NPCCTWO > 0
case BUS_PCCTWO:
sc->sc_statih.ih_fn = sbc_statintr;
@@ -181,7 +178,6 @@ sclockattach(parent, self, args)
stat_reset = ca->ca_ipl | PCC2_IRQ_IEN | PCC2_IRQ_ICLR;
pcctwointr_establish(PCC2V_TIMER2, &sc->sc_statih);
md.statclock_init_func = sbc_initstatclock;
- printf(": VME1x7");
break;
#endif /* NPCCTWO */
#if NSYSCON > 0
@@ -192,7 +188,6 @@ sclockattach(parent, self, args)
sc->sc_statih.ih_ipl = ca->ca_ipl;
sysconintr_establish(SYSCV_TIMER2, &sc->sc_statih);
md.statclock_init_func = m188_initstatclock;
- printf(": VME188");
break;
#endif /* NSYSCON */
}
diff --git a/sys/arch/mvme88k/dev/vme.c b/sys/arch/mvme88k/dev/vme.c
index 0c206d0c8de..79deee14eee 100644
--- a/sys/arch/mvme88k/dev/vme.c
+++ b/sys/arch/mvme88k/dev/vme.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vme.c,v 1.22 2003/10/05 20:27:48 miod Exp $ */
+/* $OpenBSD: vme.c,v 1.23 2003/10/08 22:36:11 miod Exp $ */
/*
* Copyright (c) 1999 Steve Murphree, Jr.
* Copyright (c) 1995 Theo de Raadt
@@ -68,7 +68,7 @@ void vmesyscon_init(struct vmesoftc *);
int vmebustype;
int vmevecbase;
-struct vme2reg *sys_vme2 = NULL;
+struct vme2reg *sys_vme2;
struct cfattach vme_ca = {
sizeof(struct vmesoftc), vmematch, vmeattach
@@ -297,7 +297,6 @@ vmeattach(parent, self, args)
#if NPCCTWO > 0
case BUS_PCCTWO:
{
- int scon;
struct vme2reg *vme2;
vme2 = (struct vme2reg *)sc->sc_vaddr;
@@ -306,12 +305,9 @@ vmeattach(parent, self, args)
panic("Correct the VME Vector Base Registers in the Bug ROM.\nSuggested values are 0x60 for VME Vec0 and 0x70 for VME Vec1.");
}
vmevecbase = VME2_GET_VBR1(vme2) + 0x10;
- scon = (vme2->vme2_tctl & VME2_TCTL_SCON);
printf(": vector base 0x%x", vmevecbase);
- if (scon != 0)
+ if (vme2->vme2_tctl & VME2_TCTL_SCON)
printf(", system controller");
- if (scon)
- sys_vme2 = vme2;
printf("\n");
vme2chip_init(sc);
}
@@ -407,6 +403,8 @@ vme2chip_init(sc)
struct vme2reg *vme2 = (struct vme2reg *)sc->sc_vaddr;
u_long ctl;
+ sys_vme2 = vme2;
+
/* turn off SYSFAIL LED */
vme2->vme2_tctl &= ~VME2_TCTL_SYSFAIL;
@@ -459,20 +457,27 @@ vme2chip_init(sc)
/*
* Map the Software VME irq levels to the cpu level 7.
*/
- vme2->vme2_irql3 = (7 << VME2_IRQL3_SW7SHIFT) | (7 << VME2_IRQL3_SW6SHIFT) |
- (7 << VME2_IRQL3_SW5SHIFT) | (7 << VME2_IRQL3_SW4SHIFT) |
- (7 << VME2_IRQL3_SW3SHIFT) | (7 << VME2_IRQL3_SW2SHIFT) |
- (7 << VME2_IRQL3_SW1SHIFT) | (7 << VME2_IRQL3_SW0SHIFT);
- /*
- * pseudo driver, abort interrupt handler
- */
- sc->sc_abih.ih_fn = vme2abort;
- sc->sc_abih.ih_arg = 0;
- sc->sc_abih.ih_wantframe = 1;
- sc->sc_abih.ih_ipl = IPL_NMI;
- intr_establish(110, &sc->sc_abih);
- vme2->vme2_irqen |= VME2_IRQ_AB;
- vme2->vme2_irqen |= VME2_IRQ_ACF;
+ vme2->vme2_irql3 = (7 << VME2_IRQL3_SW7SHIFT) |
+ (7 << VME2_IRQL3_SW6SHIFT) | (7 << VME2_IRQL3_SW5SHIFT) |
+ (7 << VME2_IRQL3_SW4SHIFT) | (7 << VME2_IRQL3_SW3SHIFT) |
+ (7 << VME2_IRQL3_SW2SHIFT) | (7 << VME2_IRQL3_SW1SHIFT) |
+ (7 << VME2_IRQL3_SW0SHIFT);
+
+ /*
+ * pseudo driver, abort interrupt handler
+ */
+ sc->sc_abih.ih_fn = vme2abort;
+ sc->sc_abih.ih_arg = 0;
+ sc->sc_abih.ih_wantframe = 1;
+ sc->sc_abih.ih_ipl = IPL_NMI;
+ intr_establish(110, &sc->sc_abih);
+ vme2->vme2_irqen |= VME2_IRQ_AB;
+
+ /*
+ * Enable ACFAIL interrupt, but disable Timer 1 interrupt - we
+ * prefer it without for delay().
+ */
+ vme2->vme2_irqen = (vme2->vme2_irqen | VME2_IRQ_ACF) & ~VME2_IRQ_TIC1;
}
#endif /* NPCCTWO */