summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authormdodd <mdodd@FreeBSD.org>1999-09-03 02:04:28 +0000
committermdodd <mdodd@FreeBSD.org>1999-09-03 02:04:28 +0000
commit787d2575bc4a4fa6e8289b60ee2405e15fb0158b (patch)
treef8d141221ef5dd681a29d52481f755622bd37c72 /sys/i386/isa
parent974aea3e4ce095b6052dd022878c5e475ec147b7 (diff)
downloadFreeBSD-src-787d2575bc4a4fa6e8289b60ee2405e15fb0158b.zip
FreeBSD-src-787d2575bc4a4fa6e8289b60ee2405e15fb0158b.tar.gz
This adds the i386 specific support for systems with a MicroChannel
Architecture bus. Reviewed by: msmith
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/clock.c10
-rw-r--r--sys/i386/isa/intr_machdep.c25
-rw-r--r--sys/i386/isa/mca_machdep.c161
-rw-r--r--sys/i386/isa/mca_machdep.h31
-rw-r--r--sys/i386/isa/nmi.c25
5 files changed, 248 insertions, 4 deletions
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c
index 8a3e1c9..c659741 100644
--- a/sys/i386/isa/clock.c
+++ b/sys/i386/isa/clock.c
@@ -85,6 +85,11 @@
#include <i386/isa/intr_machdep.h>
+#include "mca.h"
+#if NMCA > 0
+#include <i386/isa/mca_machdep.h>
+#endif
+
#ifdef SMP
#define disable_intr() CLOCK_DISABLE_INTR()
#define enable_intr() CLOCK_ENABLE_INTR()
@@ -258,6 +263,11 @@ clkintr(struct clockframe frame)
}
break;
}
+#if NMCA > 0
+ /* Reset clock interrupt by asserting bit 7 of port 0x61 */
+ if (MCA_system)
+ outb(0x61, inb(0x61) | 0x80);
+#endif
}
/*
diff --git a/sys/i386/isa/intr_machdep.c b/sys/i386/isa/intr_machdep.c
index 8bdb4b6..a429ef4 100644
--- a/sys/i386/isa/intr_machdep.c
+++ b/sys/i386/isa/intr_machdep.c
@@ -79,6 +79,11 @@
#include <machine/clock.h>
#endif
+#include "mca.h"
+#if NMCA > 0
+#include <i386/isa/mca_machdep.h>
+#endif
+
/* XXX should be in suitable include files */
#ifdef PC98
#define ICU_IMR_OFFSET 2 /* IO_ICU{1,2} + 2 */
@@ -169,6 +174,11 @@ isa_nmi(cd)
int isa_port = inb(0x61);
int eisa_port = inb(0x461);
+#if NMCA > 0
+ if (MCA_system && mca_bus_nmi())
+ return;
+#endif
+
if (isa_port & NMI_PARITY)
panic("RAM parity error, likely hardware failure.");
@@ -211,7 +221,12 @@ isa_defaultirq()
icu_unset(i, (inthand2_t *)NULL);
/* initialize 8259's */
- outb(IO_ICU1, 0x11); /* reset; program device, four bytes */
+#if NMCA > 0
+ if (MCA_system)
+ outb(IO_ICU1, 0x19); /* reset; program device, four bytes */
+ else
+#endif
+ outb(IO_ICU1, 0x11); /* reset; program device, four bytes */
outb(IO_ICU1+ICU_IMR_OFFSET, NRSVIDT); /* starting at this vector index */
outb(IO_ICU1+ICU_IMR_OFFSET, IRQ_SLAVE); /* slave on line 7 */
@@ -234,7 +249,13 @@ isa_defaultirq()
outb(IO_ICU1, 0xc0 | (3 - 1)); /* pri order 3-7, 0-2 (com2 first) */
#endif /* !PC98 */
- outb(IO_ICU2, 0x11); /* reset; program device, four bytes */
+#if NMCA > 0
+ if (MCA_system)
+ outb(IO_ICU2, 0x19); /* reset; program device, four bytes */
+ else
+#endif
+ outb(IO_ICU2, 0x11); /* reset; program device, four bytes */
+
outb(IO_ICU2+ICU_IMR_OFFSET, NRSVIDT+8); /* staring at this vector index */
outb(IO_ICU2+ICU_IMR_OFFSET, ICU_SLAVEID); /* my slave id is 7 */
#ifdef PC98
diff --git a/sys/i386/isa/mca_machdep.c b/sys/i386/isa/mca_machdep.c
new file mode 100644
index 0000000..8eaf682
--- /dev/null
+++ b/sys/i386/isa/mca_machdep.c
@@ -0,0 +1,161 @@
+/*-
+ * Copyright (c) 1999 Matthew N. Dodd <winter@jurai.net>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $FreeBSD$
+ */
+
+#include "mca.h"
+#if NMCA > 0
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <machine/pmap.h>
+#include <machine/md_var.h>
+#include <machine/vm86.h>
+#include <machine/pc/bios.h>
+#include <machine/cpufunc.h>
+
+#include <dev/mca/mca_busreg.h>
+#include <i386/isa/mca_machdep.h>
+
+/* Global MCA bus flag */
+int MCA_system = 0;
+
+/* System Configuration Block */
+struct sys_config {
+ u_int16_t count;
+ u_int8_t model;
+ u_int8_t submodel;
+ u_int8_t bios_rev;
+ u_int8_t feature;
+#define FEATURE_RESV 0x01 /* Reserved */
+#define FEATURE_MCABUS 0x02 /* MicroChannel Architecture */
+#define FEATURE_EBDA 0x04 /* Extended BIOS data area allocated */
+#define FEATURE_WAITEV 0x08 /* Wait for external event is supported */
+#define FEATURE_KBDINT 0x10 /* Keyboard intercept called by Int 09h */
+#define FEATURE_RTC 0x20 /* Real-time clock present */
+#define FEATURE_IC2 0x40 /* Second interrupt chip present */
+#define FEATURE_DMA3 0x80 /* DMA channel 3 used by hard disk BIOS */
+ u_int8_t pad[3];
+} __attribute__ ((packed));
+
+/* Function Prototypes */
+static void bios_mcabus_present (void *);
+SYSINIT(mca_present, SI_SUB_CPU, SI_ORDER_ANY, bios_mcabus_present, NULL);
+
+/* Functions */
+static void
+bios_mcabus_present(void * dummy)
+{
+ struct vm86frame vmf;
+ struct sys_config * scp;
+ vm_offset_t paddr;
+
+ bzero(&vmf, sizeof(struct vm86frame));
+
+ vmf.vmf_ah = 0xc0;
+ if (vm86_intcall(0x15, &vmf)) {
+ if (bootverbose) {
+ printf("BIOS SDT: INT call failed.\n");
+ }
+ return (0);
+ }
+
+ if ((vmf.vmf_ah != 0) && (vmf.vmf_flags != 0)) {
+ if (bootverbose) {
+ printf("BIOS SDT: Not supported. Not PS/2?\n");
+ printf("BIOS SDT: AH 0x%02x, Flags 0x%04x\n",
+ vmf.vmf_ah, vmf.vmf_flags);
+ }
+ return (0);
+ }
+
+ paddr = vmf.vmf_es;
+ paddr = (paddr << 4) + vmf.vmf_bx;
+ scp = (struct sys_config *)BIOS_PADDRTOVADDR(paddr);
+
+ if (bootverbose) {
+ printf("BIOS SDT: model 0x%02x, submodel 0x%02x, bios_rev 0x%02x\n",
+ scp->model, scp->submodel, scp->bios_rev);
+ printf("BIOS SDT: features 0x%b\n", scp->feature,
+ "\20"
+ "\01RESV"
+ "\02MCABUS"
+ "\03EBDA"
+ "\04WAITEV"
+ "\05KBDINT"
+ "\06RTC"
+ "\07IC2"
+ "\08DMA3\n");
+ }
+
+ MCA_system = ((scp->feature & FEATURE_MCABUS) ? 1 : 0);
+
+ if (MCA_system)
+ printf("MicroChannel Architecture System detected.\n");
+
+ return;
+}
+
+int
+mca_bus_nmi (void)
+{
+ int slot;
+ int retval = 0;
+ int pos5 = 0;
+
+ /* Disable motherboard setup */
+ outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS);
+
+ /* For each slot */
+ for (slot = 0; slot < MCA_MAX_SLOTS; slot++) {
+
+ /* Select the slot */
+ outb(MCA_ADAP_SETUP_REG, slot | MCA_ADAP_SET);
+ pos5 = inb(MCA_POS_REG(MCA_POS5));
+
+ /* If Adapter Check is low */
+ if ((pos5 & MCA_POS5_CHCK) == 0) {
+ retval++;
+
+ /* If Adapter Check Status is available */
+ if ((pos5 & MCA_POS5_CHCK_STAT) == 0) {
+ printf("MCA NMI: slot %d, POS6=0x%02x, POS7=0x%02x\n",
+ slot+1,
+ inb( MCA_POS_REG(MCA_POS6) ),
+ inb( MCA_POS_REG(MCA_POS7) ));
+ } else {
+ printf("MCA NMI: slot %d\n", slot+1);
+ }
+ }
+ /* Disable adapter setup */
+ outb(MCA_ADAP_SETUP_REG, MCA_ADAP_SETUP_DIS);
+ }
+
+ return (retval);
+}
+#endif
diff --git a/sys/i386/isa/mca_machdep.h b/sys/i386/isa/mca_machdep.h
new file mode 100644
index 0000000..c639b5b
--- /dev/null
+++ b/sys/i386/isa/mca_machdep.h
@@ -0,0 +1,31 @@
+/*-
+ * Copyright (c) 1999 Matthew N. Dodd <winter@jurai.net>
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $FreeBSD$
+ */
+
+extern int MCA_system;
+
+extern int mca_bus_nmi (void);
diff --git a/sys/i386/isa/nmi.c b/sys/i386/isa/nmi.c
index 8bdb4b6..a429ef4 100644
--- a/sys/i386/isa/nmi.c
+++ b/sys/i386/isa/nmi.c
@@ -79,6 +79,11 @@
#include <machine/clock.h>
#endif
+#include "mca.h"
+#if NMCA > 0
+#include <i386/isa/mca_machdep.h>
+#endif
+
/* XXX should be in suitable include files */
#ifdef PC98
#define ICU_IMR_OFFSET 2 /* IO_ICU{1,2} + 2 */
@@ -169,6 +174,11 @@ isa_nmi(cd)
int isa_port = inb(0x61);
int eisa_port = inb(0x461);
+#if NMCA > 0
+ if (MCA_system && mca_bus_nmi())
+ return;
+#endif
+
if (isa_port & NMI_PARITY)
panic("RAM parity error, likely hardware failure.");
@@ -211,7 +221,12 @@ isa_defaultirq()
icu_unset(i, (inthand2_t *)NULL);
/* initialize 8259's */
- outb(IO_ICU1, 0x11); /* reset; program device, four bytes */
+#if NMCA > 0
+ if (MCA_system)
+ outb(IO_ICU1, 0x19); /* reset; program device, four bytes */
+ else
+#endif
+ outb(IO_ICU1, 0x11); /* reset; program device, four bytes */
outb(IO_ICU1+ICU_IMR_OFFSET, NRSVIDT); /* starting at this vector index */
outb(IO_ICU1+ICU_IMR_OFFSET, IRQ_SLAVE); /* slave on line 7 */
@@ -234,7 +249,13 @@ isa_defaultirq()
outb(IO_ICU1, 0xc0 | (3 - 1)); /* pri order 3-7, 0-2 (com2 first) */
#endif /* !PC98 */
- outb(IO_ICU2, 0x11); /* reset; program device, four bytes */
+#if NMCA > 0
+ if (MCA_system)
+ outb(IO_ICU2, 0x19); /* reset; program device, four bytes */
+ else
+#endif
+ outb(IO_ICU2, 0x11); /* reset; program device, four bytes */
+
outb(IO_ICU2+ICU_IMR_OFFSET, NRSVIDT+8); /* staring at this vector index */
outb(IO_ICU2+ICU_IMR_OFFSET, ICU_SLAVEID); /* my slave id is 7 */
#ifdef PC98
OpenPOWER on IntegriCloud