/*
* Copyright (c) 1996 Leo Weppelman. All rights reserved.
* Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved.
* Copyright (c) 1994 Charles M. Hannum. 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Charles M. Hannum.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
*/
/*
* The interrupt stuff is rather ugly. On the Hades, all interrupt lines
* for a slot are wired together and connected to IO 0,1,2 or 5 (slots:
* (0-3) on the TT-MFP. The Pci-config code initializes the irq. number
* to the slot position.
*/
static pci_intr_info_t iinfo[4] = { { -1 }, { -1 }, { -1 }, { -1 } };
static int iifun(int, int);
static int
iifun(int slot, int sr)
{
pci_intr_info_t *iinfo_p;
int s;
iinfo_p = &iinfo[slot];
/*
* Disable the interrupts
*/
MFP2->mf_imrb &= ~iinfo_p->imask;
if ((sr & PSL_IPL) >= (iinfo_p->ipl & PSL_IPL)) {
/*
* We're running at a too high priority now.
*/
add_sicallback((si_farg)iifun, (void*)slot, 0);
} else {
s = splx(iinfo_p->ipl);
(void)(iinfo_p->ifunc)(iinfo_p->iarg);
splx(s);
/*
* Make sure we're allowed to write all crt-registers and reload them.
*/
WCrt(ba, CRT_ID_END_VER_RETR, (RCrt(ba, CRT_ID_END_VER_RETR) & 0x7f));
for (i = 0; i < 0x18; i++)
WCrt(ba, i, crt_tab[i]);
for (i = 0; i < 8; i++)
WSeq(ba, i, seq_tab[i]);
for (i = 0; i < 9; i++)
WGfx(ba, i, gdc_tab[i]);
for (i = 0x10; i < 0x18; i++)
WAttr(ba, i, attr_tab[i - 0x10]);
WAttr(ba, 0x20, 0);
}