157a9c56bSSepherosa Ziehau /*-
257a9c56bSSepherosa Ziehau * Copyright (c) 1991 The Regents of the University of California.
357a9c56bSSepherosa Ziehau * Copyright (c) 2008 The DragonFly Project.
457a9c56bSSepherosa Ziehau * All rights reserved.
557a9c56bSSepherosa Ziehau *
657a9c56bSSepherosa Ziehau * This code is derived from software contributed to Berkeley by
757a9c56bSSepherosa Ziehau * William Jolitz.
857a9c56bSSepherosa Ziehau *
957a9c56bSSepherosa Ziehau * Redistribution and use in source and binary forms, with or without
1057a9c56bSSepherosa Ziehau * modification, are permitted provided that the following conditions
1157a9c56bSSepherosa Ziehau * are met:
1257a9c56bSSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright
1357a9c56bSSepherosa Ziehau * notice, this list of conditions and the following disclaimer.
1457a9c56bSSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright
1557a9c56bSSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the
1657a9c56bSSepherosa Ziehau * documentation and/or other materials provided with the distribution.
17*2c64e990Szrj * 3. Neither the name of the University nor the names of its contributors
1857a9c56bSSepherosa Ziehau * may be used to endorse or promote products derived from this software
1957a9c56bSSepherosa Ziehau * without specific prior written permission.
2057a9c56bSSepherosa Ziehau *
2157a9c56bSSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2257a9c56bSSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2357a9c56bSSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2457a9c56bSSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2557a9c56bSSepherosa Ziehau * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2657a9c56bSSepherosa Ziehau * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2757a9c56bSSepherosa Ziehau * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2857a9c56bSSepherosa Ziehau * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2957a9c56bSSepherosa Ziehau * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3057a9c56bSSepherosa Ziehau * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3157a9c56bSSepherosa Ziehau * SUCH DAMAGE.
3257a9c56bSSepherosa Ziehau *
3357a9c56bSSepherosa Ziehau * from: @(#)isa.c 7.2 (Berkeley) 5/13/91
3457a9c56bSSepherosa Ziehau * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $
3557a9c56bSSepherosa Ziehau */
3657a9c56bSSepherosa Ziehau /*
3757a9c56bSSepherosa Ziehau * This file contains an aggregated module marked:
3857a9c56bSSepherosa Ziehau * Copyright (c) 1997, Stefan Esser <se@freebsd.org>
3957a9c56bSSepherosa Ziehau * All rights reserved.
4057a9c56bSSepherosa Ziehau * See the notice for details.
4157a9c56bSSepherosa Ziehau */
4257a9c56bSSepherosa Ziehau
4357a9c56bSSepherosa Ziehau #include <sys/param.h>
4457a9c56bSSepherosa Ziehau #include <sys/systm.h>
4557a9c56bSSepherosa Ziehau #include <sys/syslog.h>
4657a9c56bSSepherosa Ziehau #include <sys/bus.h>
4757a9c56bSSepherosa Ziehau #include <bus/isa/isavar.h>
4857a9c56bSSepherosa Ziehau
4957a9c56bSSepherosa Ziehau #include <machine_base/icu/icu_var.h>
5057a9c56bSSepherosa Ziehau #include <machine_base/isa/isa_intr.h>
5157a9c56bSSepherosa Ziehau
5257a9c56bSSepherosa Ziehau #define NMI_PARITY (1 << 7)
5357a9c56bSSepherosa Ziehau #define NMI_IOCHAN (1 << 6)
5457a9c56bSSepherosa Ziehau #define ENMI_WATCHDOG (1 << 7)
5557a9c56bSSepherosa Ziehau #define ENMI_BUSTIMER (1 << 6)
5657a9c56bSSepherosa Ziehau #define ENMI_IOSTATUS (1 << 5)
5757a9c56bSSepherosa Ziehau
5857a9c56bSSepherosa Ziehau /*
5957a9c56bSSepherosa Ziehau * Handle a NMI, possibly a machine check.
6057a9c56bSSepherosa Ziehau * return true to panic system, false to ignore.
6157a9c56bSSepherosa Ziehau */
6257a9c56bSSepherosa Ziehau int
isa_nmi(int cd)6357a9c56bSSepherosa Ziehau isa_nmi(int cd)
6457a9c56bSSepherosa Ziehau {
6557a9c56bSSepherosa Ziehau int retval = 0;
6657a9c56bSSepherosa Ziehau int isa_port = inb(0x61);
6757a9c56bSSepherosa Ziehau int eisa_port = inb(0x461);
6857a9c56bSSepherosa Ziehau
6957a9c56bSSepherosa Ziehau log(LOG_CRIT, "NMI ISA %x, EISA %x\n", isa_port, eisa_port);
7057a9c56bSSepherosa Ziehau
7157a9c56bSSepherosa Ziehau if (isa_port & NMI_PARITY) {
7257a9c56bSSepherosa Ziehau log(LOG_CRIT, "RAM parity error, likely hardware failure.");
7357a9c56bSSepherosa Ziehau retval = 1;
7457a9c56bSSepherosa Ziehau }
7557a9c56bSSepherosa Ziehau
7657a9c56bSSepherosa Ziehau if (isa_port & NMI_IOCHAN) {
7757a9c56bSSepherosa Ziehau log(LOG_CRIT, "I/O channel check, likely hardware failure.");
7857a9c56bSSepherosa Ziehau retval = 1;
7957a9c56bSSepherosa Ziehau }
8057a9c56bSSepherosa Ziehau
8157a9c56bSSepherosa Ziehau /*
8257a9c56bSSepherosa Ziehau * On a real EISA machine, this will never happen. However it can
8357a9c56bSSepherosa Ziehau * happen on ISA machines which implement XT style floating point
8457a9c56bSSepherosa Ziehau * error handling (very rare). Save them from a meaningless panic.
8557a9c56bSSepherosa Ziehau */
8657a9c56bSSepherosa Ziehau if (eisa_port == 0xff)
8757a9c56bSSepherosa Ziehau return(retval);
8857a9c56bSSepherosa Ziehau
8957a9c56bSSepherosa Ziehau if (eisa_port & ENMI_WATCHDOG) {
9057a9c56bSSepherosa Ziehau log(LOG_CRIT, "EISA watchdog timer expired, likely hardware failure.");
9157a9c56bSSepherosa Ziehau retval = 1;
9257a9c56bSSepherosa Ziehau }
9357a9c56bSSepherosa Ziehau
9457a9c56bSSepherosa Ziehau if (eisa_port & ENMI_BUSTIMER) {
9557a9c56bSSepherosa Ziehau log(LOG_CRIT, "EISA bus timeout, likely hardware failure.");
9657a9c56bSSepherosa Ziehau retval = 1;
9757a9c56bSSepherosa Ziehau }
9857a9c56bSSepherosa Ziehau
9957a9c56bSSepherosa Ziehau if (eisa_port & ENMI_IOSTATUS) {
10057a9c56bSSepherosa Ziehau log(LOG_CRIT, "EISA I/O port status error.");
10157a9c56bSSepherosa Ziehau retval = 1;
10257a9c56bSSepherosa Ziehau }
10357a9c56bSSepherosa Ziehau return(retval);
10457a9c56bSSepherosa Ziehau }
10557a9c56bSSepherosa Ziehau
10657a9c56bSSepherosa Ziehau /*
10757a9c56bSSepherosa Ziehau * Fill in default interrupt table (in case of spurious interrupt
10857a9c56bSSepherosa Ziehau * during configuration of kernel, setup interrupt control unit
10957a9c56bSSepherosa Ziehau */
11057a9c56bSSepherosa Ziehau void
isa_defaultirq(void)11157a9c56bSSepherosa Ziehau isa_defaultirq(void)
11257a9c56bSSepherosa Ziehau {
11357a9c56bSSepherosa Ziehau icu_definit();
11457a9c56bSSepherosa Ziehau }
11557a9c56bSSepherosa Ziehau
11657a9c56bSSepherosa Ziehau intrmask_t
isa_irq_pending(void)11757a9c56bSSepherosa Ziehau isa_irq_pending(void)
11857a9c56bSSepherosa Ziehau {
11957a9c56bSSepherosa Ziehau return icu_irq_pending();
12057a9c56bSSepherosa Ziehau }
121