11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	linux/arch/alpha/kernel/sys_nautilus.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1995 David A Rusling
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1998 Richard Henderson
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Copyright (C) 1999 Alpha Processor, Inc.,
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *		(David Daniel, Stig Telfer, Soohoon Lee)
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Code supporting NAUTILUS systems.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NAUTILUS has the following I/O features:
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a) Driven by AMD 751 aka IRONGATE (northbridge):
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     4 PCI slots
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     1 AGP slot
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * b) Driven by ALI M1543C (southbridge)
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     2 ISA slots
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     2 IDE connectors
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     1 dual drive capable FDD controller
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     2 serial ports
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     1 ECP/EPP/SP parallel port
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     2 USB ports
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reboot.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bootmem.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/ptrace.h>
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/dma.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mmu_context.h>
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pci.h>
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h>
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/core_irongate.h>
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/hwrpb.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/tlbflush.h>
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "proto.h"
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "err_impl.h"
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "irq_impl.h"
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pci_impl.h"
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "machvec_impl.h"
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnautilus_init_irq(void)
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (alpha_using_srm) {
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		alpha_mv.device_interrupt = srm_device_interrupt;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_i8259a_irqs();
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	common_init_isa_dma();
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init
67d5341942d784134f2997b3ff82cd63cf71d1f932Ralf Baechlenautilus_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Preserve the IRQ set up by the console.  */
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 irq;
727fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky	/* UP1500: AGP INTA is actually routed to IRQ 5, not IRQ 10 as
737fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky	   console reports. Check the device id of AGP bridge to distinguish
747fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky	   UP1500 from UP1000/1100. Note: 'pin' is 2 due to bridge swizzle. */
757fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky	if (slot == 1 && pin == 2 &&
767fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky	    dev->bus->self && dev->bus->self->device == 0x700f)
777fc1a1abc1eca1278d6d37ec54b72005d15b5c1eIvan Kokshaysky		return 5;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return irq;
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnautilus_kill_arch(int mode)
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_bus *bus = pci_isa_hose->bus;
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 pmuport;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int off;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (mode) {
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINUX_REBOOT_CMD_RESTART:
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (! alpha_using_srm) {
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u8 t8;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pci_bus_read_config_byte(bus, 0x38, 0x43, &t8);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pci_bus_write_config_byte(bus, 0x38, 0x43, t8 | 0x80);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(1, 0x92);
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(0, 0x92);
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* NOTREACHED */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINUX_REBOOT_CMD_POWER_OFF:
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Assume M1543C */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		off = 0x2000;		/* SLP_TYPE = 0, SLP_EN = 1 */
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pci_bus_read_config_dword(bus, 0x88, 0x10, &pmuport);
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!pmuport) {
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* M1535D/D+ */
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			off = 0x3400;	/* SLP_TYPE = 5, SLP_EN = 1 */
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pci_bus_read_config_dword(bus, 0x88, 0xe0, &pmuport);
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pmuport &= 0xfffe;
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outw(0xffff, pmuport);	/* Clear pending events. */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outw(off, pmuport + 4);
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* NOTREACHED */
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Perform analysis of a machine check that arrived from the system (NMI) */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnaut_sys_machine_check(unsigned long vector, unsigned long la_ptr,
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       struct pt_regs *regs)
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("PC %lx RA %lx\n", regs->pc, regs->r26);
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irongate_pci_clr_err();
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Machine checks can come from two sources - those on the CPU and those
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   in the system.  They are analysed separately but all starts here.  */
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
1324fa1970a23bf8fc68e86b65a87c32556e20a6be6Al Vironautilus_machine_check(unsigned long vector, unsigned long la_ptr)
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *mchk_class;
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Now for some analysis.  Machine checks fall into two classes --
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   those picked up by the system, and those picked up by the CPU.
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   Add to that the two levels of severity - correctable or not.  */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (vector == SCB_Q_SYSMCHK
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    && ((IRONGATE0->dramms & 0x300) == 0x300)) {
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned long nmi_ctl;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Clear ALI NMI */
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		nmi_ctl = inb(0x61);
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		nmi_ctl |= 0x0c;
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(nmi_ctl, 0x61);
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		nmi_ctl &= ~0x0c;
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(nmi_ctl, 0x61);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Write again clears error bits.  */
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRONGATE0->stat_cmd = IRONGATE0->stat_cmd & ~0x100;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb();
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRONGATE0->stat_cmd;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Write again clears error bits.  */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRONGATE0->dramms = IRONGATE0->dramms;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb();
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRONGATE0->dramms;
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		draina();
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wrmces(0x7);
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb();
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (vector == SCB_Q_SYSERR)
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mchk_class = "Correctable";
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else if (vector == SCB_Q_SYSMCHK)
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mchk_class = "Fatal";
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
1724fa1970a23bf8fc68e86b65a87c32556e20a6be6Al Viro		ev6_machine_check(vector, la_ptr);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_CRIT "NAUTILUS Machine check 0x%lx "
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 "[%s System Machine Check (NMI)]\n",
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       vector, mchk_class);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1804fa1970a23bf8fc68e86b65a87c32556e20a6be6Al Viro	naut_sys_machine_check(vector, la_ptr, get_irq_regs());
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Tell the PALcode to clear the machine check */
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	draina();
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	wrmces(0x7);
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb();
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18872cff12397cd6648b8b5abfaeb00502f45b76cb8Ivan Kokshayskyextern void pcibios_claim_one_bus(struct pci_bus *);
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
190aa8b4be3ac049c8b1df2a87e4d1d902ccfc1f7a9Jay Estabrookstatic struct resource irongate_io = {
191aa8b4be3ac049c8b1df2a87e4d1d902ccfc1f7a9Jay Estabrook	.name	= "Irongate PCI IO",
192aa8b4be3ac049c8b1df2a87e4d1d902ccfc1f7a9Jay Estabrook	.flags	= IORESOURCE_IO,
193aa8b4be3ac049c8b1df2a87e4d1d902ccfc1f7a9Jay Estabrook};
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource irongate_mem = {
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name	= "Irongate PCI MEM",
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.flags	= IORESOURCE_MEM,
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnautilus_init_pci(void)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_controller *hose = hose_head;
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_bus *bus;
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev *irongate;
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long bus_align, bus_size, pci_mem;
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long memtop = max_low_pfn << PAGE_SHIFT;
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Scan our single hose.  */
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus = pci_scan_bus(0, alpha_mv.pci_ops, hose);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hose->bus = bus;
21172cff12397cd6648b8b5abfaeb00502f45b76cb8Ivan Kokshaysky	pcibios_claim_one_bus(bus);
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
213074cec54d1049ab580ecd0026623b553e0e270c4Alan Cox	irongate = pci_get_bus_and_slot(0, 0);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->self = irongate;
215aa8b4be3ac049c8b1df2a87e4d1d902ccfc1f7a9Jay Estabrook	bus->resource[0] = &irongate_io;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->resource[1] = &irongate_mem;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pci_bus_size_bridges(bus);
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* IO port range. */
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->resource[0]->start = 0;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->resource[0]->end = 0xffff;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up PCI memory range - limit is hardwired to 0xffffffff,
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   base must be at aligned to 16Mb. */
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus_align = bus->resource[1]->start;
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus_size = bus->resource[1]->end + 1 - bus_align;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bus_align < 0x1000000UL)
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bus_align = 0x1000000UL;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pci_mem = (0x100000000UL - bus_size) & -bus_align;
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->resource[1]->start = pci_mem;
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bus->resource[1]->end = 0xffffffffUL;
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (request_resource(&iomem_resource, bus->resource[1]) < 0)
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_ERR "Failed to request MEM on hose 0\n");
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (pci_mem < memtop)
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memtop = pci_mem;
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (memtop > alpha_mv.min_mem_address) {
24111199692d83dd3fe1511203024fb9853d176ec4cJiang Liu		free_reserved_area(__va(alpha_mv.min_mem_address),
242dbe67df4ba78c79db547c7864e1120981c144c97Jiang Liu				   __va(memtop), -1, NULL);
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("nautilus_init_pci: %ldk freed\n",
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			(memtop - alpha_mv.min_mem_address) >> 10);
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((IRONGATE0->dev_vendor >> 16) > 0x7006)	/* Albacore? */
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRONGATE0->pci_mem = pci_mem;
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pci_bus_assign_resources(bus);
2512f88d151cb8e73587983d7feccd70672ff6730feIvan Kokshaysky
2522f88d151cb8e73587983d7feccd70672ff6730feIvan Kokshaysky	/* pci_common_swizzle() relies on bus->self being NULL
2532f88d151cb8e73587983d7feccd70672ff6730feIvan Kokshaysky	   for the root bus, so just clear it. */
2542f88d151cb8e73587983d7feccd70672ff6730feIvan Kokshaysky	bus->self = NULL;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The System Vectors
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct alpha_machine_vector nautilus_mv __initmv = {
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.vector_name		= "Nautilus",
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_EV6_MMU,
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_DEFAULT_RTC,
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DO_IRONGATE_IO,
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.machine_check		= nautilus_machine_check,
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.max_isa_dma_address	= ALPHA_MAX_ISA_DMA_ADDRESS,
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.min_io_address		= DEFAULT_IO_BASE,
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.min_mem_address	= IRONGATE_DEFAULT_MEM_BASE,
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.nr_irqs		= 16,
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.device_interrupt	= isa_device_interrupt,
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_arch		= irongate_init_arch,
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_irq		= nautilus_init_irq,
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_rtc		= common_init_rtc,
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_pci		= nautilus_init_pci,
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.kill_arch		= nautilus_kill_arch,
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.pci_map_irq		= nautilus_map_irq,
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.pci_swizzle		= common_swizzle,
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsALIAS_MV(nautilus)
284