xref: /dragonfly/sys/platform/pc64/isa/isa_intr.c (revision 2c64e990)
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