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