summaryrefslogtreecommitdiffstats
path: root/sys/isa
diff options
context:
space:
mode:
authorfsmp <fsmp@FreeBSD.org>1997-07-26 01:53:04 +0000
committerfsmp <fsmp@FreeBSD.org>1997-07-26 01:53:04 +0000
commit78cff7365d666ea82c32d53ae429cb3f5b843259 (patch)
tree37ad503dbdfcbe9eded05c7a112a0412b228f949 /sys/isa
parent7b1e0dfbb931fa6122580673d4ff133380b6b569 (diff)
downloadFreeBSD-src-78cff7365d666ea82c32d53ae429cb3f5b843259.zip
FreeBSD-src-78cff7365d666ea82c32d53ae429cb3f5b843259.tar.gz
clock.c:
- removed TEST_ALTTIMER. - removed APIC_PIN0_TIMER. - removed TIMER_ALL. apic_vector.s: - new algorithm where a CPU uses try_mplock instead of get_mplock: if successful continue as before. if fail set ipending bit, mask INT (to avoid recursion), cleanup & iret. This allows the CPU to return to successful work, while the ISR will be run by the CPU holding the lock as part of the doreti dance.
Diffstat (limited to 'sys/isa')
-rw-r--r--sys/isa/atrtc.c77
1 files changed, 23 insertions, 54 deletions
diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c
index a9d2110..5b54178 100644
--- a/sys/isa/atrtc.c
+++ b/sys/isa/atrtc.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)clock.c 7.2 (Berkeley) 5/12/91
- * $Id: clock.c,v 1.6 1997/07/22 18:36:06 smp Exp smp $
+ * $Id: clock.c,v 1.97 1997/07/22 20:12:04 fsmp Exp $
*/
/*
@@ -66,7 +66,7 @@
#include <machine/ipl.h>
#ifdef APIC_IO
#include <machine/smp.h>
-#include <machine/smptests.h> /** TEST_ALTTIMER, APIC_PIN0_TIMER */
+#include <machine/smptests.h> /** NEW_STRATEGY (,SMP_TIMER_NC) */
#endif /* APIC_IO */
#include <i386/isa/icu.h>
@@ -860,6 +860,10 @@ cpu_initclocks()
#ifdef APIC_IO
#ifdef NEW_STRATEGY
+#ifdef SMP_TIMER_NC
+#error 'options SMP_TIMER_NC' no longer used, remove & reconfig.
+#endif /** XXX SMP_TIMER_NC */
+
/* 1st look for ExtInt on pin 0 */
if (apic_int_type(0, 0) == 3) {
/*
@@ -868,7 +872,7 @@ cpu_initclocks()
* reset; prog 4 bytes, single ICU, edge triggered
*/
outb(IO_ICU1, 0x13);
- outb(IO_ICU1 + 1, NRSVIDT); /* start vector */
+ outb(IO_ICU1 + 1, NRSVIDT); /* start vector (unused) */
outb(IO_ICU1 + 1, 0x00); /* ignore slave */
outb(IO_ICU1 + 1, 0x03); /* auto EOI, 8086 */
outb(IO_ICU1 + 1, 0xfe); /* unmask INT0 */
@@ -878,14 +882,14 @@ cpu_initclocks()
panic("8254 redirect via APIC pin0 impossible!");
x = 0;
- /** if (bootverbose */
+ /* XXX if (bootverbose) */
printf("APIC_IO: routing 8254 via 8259 on pin 0\n");
}
/* failing that, look for 8254 on pin 2 */
else if (isa_apic_pin(0) == 2) {
x = 2;
- /** if (bootverbose */
+ /* XXX if (bootverbose) */
printf("APIC_IO: routing 8254 via pin 2\n");
}
@@ -893,62 +897,24 @@ cpu_initclocks()
else
panic("neither pin 0 or pin 2 works for 8254");
- /* setup the vectors for the chosen method */
- vec[x] = (u_int)vec8254;
- Xintr8254 = (u_int)ivectors[x];
- mask8254 = (1 << x);
-
- register_intr(/* irq */ x, /* XXX id */ 0, /* flags */ 0,
- /* XXX */ (inthand2_t *)clkintr, &clk_imask,
- /* unit */ 0);
- INTREN(mask8254);
-
#else /** NEW_STRATEGY */
-#ifdef APIC_PIN0_TIMER
- /*
- * Allow 8254 timer to INTerrupt 8259:
- * re-initialize master 8259:
- * reset; prog 4 bytes, single ICU, edge triggered
- */
- outb(IO_ICU1, 0x13);
- outb(IO_ICU1 + 1, NRSVIDT); /* start vector */
- outb(IO_ICU1 + 1, 0x00); /* ignore slave */
- outb(IO_ICU1 + 1, 0x03); /* auto EOI, 8086 */
- outb(IO_ICU1 + 1, 0xfe); /* unmask INT0 */
-
- /* program IO APIC for type 3 INT on INT0 */
- if (ext_int_setup(0, 0) < 0)
- panic("8254 redirect via APIC pin0 impossible!");
-
- register_intr(/* irq */ 0, /* XXX id */ 0, /* flags */ 0,
- /* XXX */ (inthand2_t *)clkintr, &clk_imask,
- /* unit */ 0);
- INTREN(APIC_IRQ0);
-#else /* APIC_PIN0_TIMER */
/* 8254 is traditionally on ISA IRQ0 */
- if ((x = isa_apic_pin(0)) < 0) {
+#if defined(SMP_TIMER_NC)
+ x = -1;
+#else
+ x = isa_apic_pin(0);
+#endif /** XXX SMP_TIMER_NC */
+
+ if (x < 0) {
/* bummer, attempt to redirect thru the 8259 */
if (bootverbose)
printf("APIC missing 8254 connection\n");
/* allow 8254 timer to INTerrupt 8259 */
-#ifdef TEST_ALTTIMER
- /*
- * re-initialize master 8259:
- * reset; prog 4 bytes, single ICU, edge triggered
- */
- outb(IO_ICU1, 0x13);
- outb(IO_ICU1 + 1, NRSVIDT); /* start vector */
- outb(IO_ICU1 + 1, 0x00); /* ignore slave */
- outb(IO_ICU1 + 1, 0x03); /* auto EOI, 8086 */
-
- outb(IO_ICU1 + 1, 0xfe); /* unmask INT0 */
-#else
x = inb(IO_ICU1 + 1); /* current mask in 8259 */
x &= ~1; /* clear 8254 timer mask */
outb(IO_ICU1 + 1, x); /* write new mask */
-#endif /* TEST_ALTTIMER */
/* program IO APIC for type 3 INT on INT0 */
if (ext_int_setup(0, 0) < 0)
@@ -956,22 +922,25 @@ cpu_initclocks()
x = 0; /* 8259 is on 0 */
}
+#endif /** NEW_STRATEGY */
+
+ /* setup the vectors */
vec[x] = (u_int)vec8254;
- Xintr8254 = (u_int)ivectors[x]; /* XXX might need Xfastintr# */
+ Xintr8254 = (u_int)ivectors[x];
mask8254 = (1 << x);
+
register_intr(/* irq */ x, /* XXX id */ 0, /* flags */ 0,
/* XXX */ (inthand2_t *)clkintr, &clk_imask,
/* unit */ 0);
INTREN(mask8254);
-#endif /* APIC_PIN0_TIMER */
-
-#endif /** NEW_STRATEGY */
#else /* APIC_IO */
+
register_intr(/* irq */ 0, /* XXX id */ 0, /* flags */ 0,
/* XXX */ (inthand2_t *)clkintr, &clk_imask,
/* unit */ 0);
INTREN(IRQ0);
+
#endif /* APIC_IO */
#if (defined(I586_CPU) || defined(I686_CPU)) && !defined(SMP)
OpenPOWER on IntegriCloud