11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	linux/arch/alpha/kernel/sys_miata.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1995 David A Rusling
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1996 Jay A Estabrook
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1998, 1999, 2000 Richard Henderson
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Code supporting the MIATA (EV56+PYXIS).
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reboot.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/ptrace.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/dma.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mmu_context.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/core_cia.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/tlbflush.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "proto.h"
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "irq_impl.h"
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pci_impl.h"
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "machvec_impl.h"
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
357ca56053b29633ef08b14e5ca16c663363edac36Al Viromiata_srm_device_interrupt(unsigned long vector)
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int irq;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irq = (vector - 0x800) >> 4;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * I really hate to do this, but the MIATA SRM console ignores the
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  low 8 bits in the interrupt summary register, and reports the
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  vector 0x80 *lower* than I expected from the bit numbering in
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  the documentation.
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * This was done because the low 8 summary bits really aren't used
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  for reporting any interrupts (the PCI-ISA bridge, bit 7, isn't
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  used for this purpose, as PIC interrupts are delivered as the
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  vectors 0x800-0x8f0).
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * But I really don't want to change the fixup code for allocation
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  of IRQs, nor the alpha_irq_mask maintenance stuff, both of which
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *  look nice and clean now.
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * So, here's this grotty hack... :-(
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (irq >= 16)
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irq = irq + 8;
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
583dbb8c62897f96bbf5d4e4fe649e5d3791fc33c5Al Viro	handle_irq(irq);
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmiata_init_irq(void)
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (alpha_using_srm)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		alpha_mv.device_interrupt = miata_srm_device_interrupt;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* These break on MiataGL so we'll try not to do it at all.  */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*(vulp)PYXIS_INT_HILO = 0x000000B2UL; mb();	/* ISA/NMI HI */
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*(vulp)PYXIS_RT_COUNT = 0UL; mb();		/* clear count */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_i8259a_irqs();
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Not interested in the bogus interrupts (3,10), Fan Fault (0),
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds           NMI (1), or EIDE (9).
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   We also disable the risers (4,5), since we don't know how to
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   route the interrupts behind the bridge.  */
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_pyxis_irqs(0x63b0000);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	common_init_isa_dma();
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setup_irq(16+2, &halt_switch_irqaction);	/* SRM only? */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setup_irq(16+6, &timer_cascade_irqaction);
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PCI Fixup configuration.
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Summary @ PYXIS_INT_REQ:
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bit      Meaning
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0        Fan Fault
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1        NMI
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2        Halt/Reset switch
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3        none
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4        CID0 (Riser ID)
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5        CID1 (Riser ID)
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6        Interval timer
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7        PCI-ISA Bridge
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8        Ethernet
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9        EIDE (deprecated, ISA 14/15 used)
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *10        none
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *11        USB
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *12        Interrupt Line A from slot 4
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *13        Interrupt Line B from slot 4
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *14        Interrupt Line C from slot 4
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *15        Interrupt Line D from slot 4
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *16        Interrupt Line A from slot 5
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *17        Interrupt line B from slot 5
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *18        Interrupt Line C from slot 5
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *19        Interrupt Line D from slot 5
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *20        Interrupt Line A from slot 1
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *21        Interrupt Line B from slot 1
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *22        Interrupt Line C from slot 1
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *23        Interrupt Line D from slot 1
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *24        Interrupt Line A from slot 2
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *25        Interrupt Line B from slot 2
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *26        Interrupt Line C from slot 2
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *27        Interrupt Line D from slot 2
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *27        Interrupt Line A from slot 3
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *29        Interrupt Line B from slot 3
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *30        Interrupt Line C from slot 3
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *31        Interrupt Line D from slot 3
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The device to slot mapping looks like:
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Slot     Device
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  3       DC21142 Ethernet
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  4       EIDE CMD646
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  5       none
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  6       USB
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  7       PCI-ISA bridge
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  8       PCI-PCI Bridge      (SBU Riser)
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  9       none
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 10       none
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 11       PCI on board slot 4 (SBU Riser)
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 12       PCI on board slot 5 (SBU Riser)
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  These are behind the bridge, so I'm not sure what to do...
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 13       PCI on board slot 1 (SBU Riser)
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 14       PCI on board slot 2 (SBU Riser)
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 15       PCI on board slot 3 (SBU Riser)
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This two layered interrupt approach means that we allocate IRQ 16 and
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * above for PCI interrupts.  The IRQ relates to which bit the interrupt
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * comes in on.  This makes interrupt processing much easier.
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init
153d5341942d784134f2997b3ff82cd63cf71d1f932Ralf Baechlemiata_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        static char irq_tab[18][5] __initdata = {
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*INT    INTA   INTB   INTC   INTD */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+ 8, 16+ 8, 16+ 8, 16+ 8, 16+ 8},  /* IdSel 14,  DC21142 */
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 15,  EIDE    */
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 16,  none    */
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 17,  none    */
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 18,  PCI-ISA */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 19,  PCI-PCI */
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 20,  none    */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 21,  none    */
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+12, 16+12, 16+13, 16+14, 16+15},  /* IdSel 22,  slot 4  */
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+16, 16+16, 16+17, 16+18, 16+19},  /* IdSel 23,  slot 5  */
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* the next 7 are actually on PCI bus 1, across the bridge */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+11, 16+11, 16+11, 16+11, 16+11},  /* IdSel 24,  QLISP/GL*/
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 25,  none    */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 26,  none    */
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 27,  none    */
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+20, 16+20, 16+21, 16+22, 16+23},  /* IdSel 28,  slot 1  */
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+24, 16+24, 16+25, 16+26, 16+27},  /* IdSel 29,  slot 2  */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{16+28, 16+28, 16+29, 16+30, 16+31},  /* IdSel 30,  slot 3  */
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* This bridge is on the main bus of the later orig MIATA */
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 31,  PCI-PCI */
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        };
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const long min_idsel = 3, max_idsel = 20, irqs_per_slot = 5;
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* the USB function of the 82c693 has it's interrupt connected to
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds           the 2nd 8259 controller. So we have to check for it first. */
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if((slot == 7) && (PCI_FUNC(dev->devfn) == 3)) {
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u8 irq=0;
185074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox		struct pci_dev *pdev = pci_get_slot(dev->bus, dev->devfn & ~7);
186074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox		if(pdev == NULL || pci_read_config_byte(pdev, 0x40,&irq) != PCIBIOS_SUCCESSFUL) {
187074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox			pci_dev_put(pdev);
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
189074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox		}
190074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox		else	{
191074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox			pci_dev_put(pdev);
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return irq;
193074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox		}
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return COMMON_TABLE_LOOKUP;
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u8 __init
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmiata_swizzle(struct pci_dev *dev, u8 *pinp)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int slot, pin = *pinp;
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus->number == 0) {
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		slot = PCI_SLOT(dev->devfn);
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Check for the built-in bridge.  */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else if ((PCI_SLOT(dev->bus->self->devfn) == 8) ||
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 (PCI_SLOT(dev->bus->self->devfn) == 20)) {
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		slot = PCI_SLOT(dev->devfn) + 9;
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Must be a card-based bridge.  */
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		do {
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if ((PCI_SLOT(dev->bus->self->devfn) == 8) ||
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    (PCI_SLOT(dev->bus->self->devfn) == 20)) {
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				slot = PCI_SLOT(dev->devfn) + 9;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
2211be9baa09340bbe3329aab3bd0d41076f59c8f22Bjorn Helgaas			pin = pci_swizzle_interrupt_pin(dev, pin);
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Move up the chain of bridges.  */
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dev = dev->bus->self;
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Slot of the next bridge.  */
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			slot = PCI_SLOT(dev->devfn);
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} while (dev->bus->self);
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*pinp = pin;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return slot;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmiata_init_pci(void)
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cia_init_pci();
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SMC669_Init(0); /* it might be a GL (fails harmlessly if not) */
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	es1888_init();
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmiata_kill_arch(int mode)
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cia_kill_arch(mode);
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ALPHA_RESTORE_SRM_SETUP
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch(mode) {
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINUX_REBOOT_CMD_RESTART:
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Who said DEC engineers have no sense of humor? ;-)  */
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (alpha_using_srm) {
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*(vuip) PYXIS_RESET = 0x0000dead;
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			mb();
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINUX_REBOOT_CMD_HALT:
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINUX_REBOOT_CMD_POWER_OFF:
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	halt();
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The System Vector
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct alpha_machine_vector miata_mv __initmv = {
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.vector_name		= "Miata",
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_EV5_MMU,
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_DEFAULT_RTC,
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_PYXIS_IO,
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.machine_check		= cia_machine_check,
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.max_isa_dma_address	= ALPHA_MAX_ISA_DMA_ADDRESS,
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.min_io_address		= DEFAULT_IO_BASE,
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.min_mem_address	= DEFAULT_MEM_BASE,
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.pci_dac_offset		= PYXIS_DAC_OFFSET,
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.nr_irqs		= 48,
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.device_interrupt	= pyxis_device_interrupt,
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_arch		= pyxis_init_arch,
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_irq		= miata_init_irq,
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_rtc		= common_init_rtc,
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_pci		= miata_init_pci,
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.kill_arch		= miata_kill_arch,
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.pci_map_irq		= miata_map_irq,
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.pci_swizzle		= miata_swizzle,
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsALIAS_MV(miata)
293