1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * linux/arch/alpha/kernel/sys_dp264.c 3*1da177e4SLinus Torvalds * 4*1da177e4SLinus Torvalds * Copyright (C) 1995 David A Rusling 5*1da177e4SLinus Torvalds * Copyright (C) 1996, 1999 Jay A Estabrook 6*1da177e4SLinus Torvalds * Copyright (C) 1998, 1999 Richard Henderson 7*1da177e4SLinus Torvalds * 8*1da177e4SLinus Torvalds * Modified by Christopher C. Chimelis, 2001 to 9*1da177e4SLinus Torvalds * add support for the addition of Shark to the 10*1da177e4SLinus Torvalds * Tsunami family. 11*1da177e4SLinus Torvalds * 12*1da177e4SLinus Torvalds * Code supporting the DP264 (EV6+TSUNAMI). 13*1da177e4SLinus Torvalds */ 14*1da177e4SLinus Torvalds 15*1da177e4SLinus Torvalds #include <linux/config.h> 16*1da177e4SLinus Torvalds #include <linux/kernel.h> 17*1da177e4SLinus Torvalds #include <linux/types.h> 18*1da177e4SLinus Torvalds #include <linux/mm.h> 19*1da177e4SLinus Torvalds #include <linux/sched.h> 20*1da177e4SLinus Torvalds #include <linux/pci.h> 21*1da177e4SLinus Torvalds #include <linux/init.h> 22*1da177e4SLinus Torvalds #include <linux/bitops.h> 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds #include <asm/ptrace.h> 25*1da177e4SLinus Torvalds #include <asm/system.h> 26*1da177e4SLinus Torvalds #include <asm/dma.h> 27*1da177e4SLinus Torvalds #include <asm/irq.h> 28*1da177e4SLinus Torvalds #include <asm/mmu_context.h> 29*1da177e4SLinus Torvalds #include <asm/io.h> 30*1da177e4SLinus Torvalds #include <asm/pgtable.h> 31*1da177e4SLinus Torvalds #include <asm/core_tsunami.h> 32*1da177e4SLinus Torvalds #include <asm/hwrpb.h> 33*1da177e4SLinus Torvalds #include <asm/tlbflush.h> 34*1da177e4SLinus Torvalds 35*1da177e4SLinus Torvalds #include "proto.h" 36*1da177e4SLinus Torvalds #include "irq_impl.h" 37*1da177e4SLinus Torvalds #include "pci_impl.h" 38*1da177e4SLinus Torvalds #include "machvec_impl.h" 39*1da177e4SLinus Torvalds 40*1da177e4SLinus Torvalds 41*1da177e4SLinus Torvalds /* Note mask bit is true for ENABLED irqs. */ 42*1da177e4SLinus Torvalds static unsigned long cached_irq_mask; 43*1da177e4SLinus Torvalds /* dp264 boards handle at max four CPUs */ 44*1da177e4SLinus Torvalds static unsigned long cpu_irq_affinity[4] = { 0UL, 0UL, 0UL, 0UL }; 45*1da177e4SLinus Torvalds 46*1da177e4SLinus Torvalds DEFINE_SPINLOCK(dp264_irq_lock); 47*1da177e4SLinus Torvalds 48*1da177e4SLinus Torvalds static void 49*1da177e4SLinus Torvalds tsunami_update_irq_hw(unsigned long mask) 50*1da177e4SLinus Torvalds { 51*1da177e4SLinus Torvalds register tsunami_cchip *cchip = TSUNAMI_cchip; 52*1da177e4SLinus Torvalds unsigned long isa_enable = 1UL << 55; 53*1da177e4SLinus Torvalds register int bcpu = boot_cpuid; 54*1da177e4SLinus Torvalds 55*1da177e4SLinus Torvalds #ifdef CONFIG_SMP 56*1da177e4SLinus Torvalds volatile unsigned long *dim0, *dim1, *dim2, *dim3; 57*1da177e4SLinus Torvalds unsigned long mask0, mask1, mask2, mask3, dummy; 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds mask &= ~isa_enable; 60*1da177e4SLinus Torvalds mask0 = mask & cpu_irq_affinity[0]; 61*1da177e4SLinus Torvalds mask1 = mask & cpu_irq_affinity[1]; 62*1da177e4SLinus Torvalds mask2 = mask & cpu_irq_affinity[2]; 63*1da177e4SLinus Torvalds mask3 = mask & cpu_irq_affinity[3]; 64*1da177e4SLinus Torvalds 65*1da177e4SLinus Torvalds if (bcpu == 0) mask0 |= isa_enable; 66*1da177e4SLinus Torvalds else if (bcpu == 1) mask1 |= isa_enable; 67*1da177e4SLinus Torvalds else if (bcpu == 2) mask2 |= isa_enable; 68*1da177e4SLinus Torvalds else mask3 |= isa_enable; 69*1da177e4SLinus Torvalds 70*1da177e4SLinus Torvalds dim0 = &cchip->dim0.csr; 71*1da177e4SLinus Torvalds dim1 = &cchip->dim1.csr; 72*1da177e4SLinus Torvalds dim2 = &cchip->dim2.csr; 73*1da177e4SLinus Torvalds dim3 = &cchip->dim3.csr; 74*1da177e4SLinus Torvalds if (!cpu_possible(0)) dim0 = &dummy; 75*1da177e4SLinus Torvalds if (!cpu_possible(1)) dim1 = &dummy; 76*1da177e4SLinus Torvalds if (!cpu_possible(2)) dim2 = &dummy; 77*1da177e4SLinus Torvalds if (!cpu_possible(3)) dim3 = &dummy; 78*1da177e4SLinus Torvalds 79*1da177e4SLinus Torvalds *dim0 = mask0; 80*1da177e4SLinus Torvalds *dim1 = mask1; 81*1da177e4SLinus Torvalds *dim2 = mask2; 82*1da177e4SLinus Torvalds *dim3 = mask3; 83*1da177e4SLinus Torvalds mb(); 84*1da177e4SLinus Torvalds *dim0; 85*1da177e4SLinus Torvalds *dim1; 86*1da177e4SLinus Torvalds *dim2; 87*1da177e4SLinus Torvalds *dim3; 88*1da177e4SLinus Torvalds #else 89*1da177e4SLinus Torvalds volatile unsigned long *dimB; 90*1da177e4SLinus Torvalds if (bcpu == 0) dimB = &cchip->dim0.csr; 91*1da177e4SLinus Torvalds else if (bcpu == 1) dimB = &cchip->dim1.csr; 92*1da177e4SLinus Torvalds else if (bcpu == 2) dimB = &cchip->dim2.csr; 93*1da177e4SLinus Torvalds else dimB = &cchip->dim3.csr; 94*1da177e4SLinus Torvalds 95*1da177e4SLinus Torvalds *dimB = mask | isa_enable; 96*1da177e4SLinus Torvalds mb(); 97*1da177e4SLinus Torvalds *dimB; 98*1da177e4SLinus Torvalds #endif 99*1da177e4SLinus Torvalds } 100*1da177e4SLinus Torvalds 101*1da177e4SLinus Torvalds static void 102*1da177e4SLinus Torvalds dp264_enable_irq(unsigned int irq) 103*1da177e4SLinus Torvalds { 104*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 105*1da177e4SLinus Torvalds cached_irq_mask |= 1UL << irq; 106*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 107*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 108*1da177e4SLinus Torvalds } 109*1da177e4SLinus Torvalds 110*1da177e4SLinus Torvalds static void 111*1da177e4SLinus Torvalds dp264_disable_irq(unsigned int irq) 112*1da177e4SLinus Torvalds { 113*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 114*1da177e4SLinus Torvalds cached_irq_mask &= ~(1UL << irq); 115*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 116*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 117*1da177e4SLinus Torvalds } 118*1da177e4SLinus Torvalds 119*1da177e4SLinus Torvalds static unsigned int 120*1da177e4SLinus Torvalds dp264_startup_irq(unsigned int irq) 121*1da177e4SLinus Torvalds { 122*1da177e4SLinus Torvalds dp264_enable_irq(irq); 123*1da177e4SLinus Torvalds return 0; /* never anything pending */ 124*1da177e4SLinus Torvalds } 125*1da177e4SLinus Torvalds 126*1da177e4SLinus Torvalds static void 127*1da177e4SLinus Torvalds dp264_end_irq(unsigned int irq) 128*1da177e4SLinus Torvalds { 129*1da177e4SLinus Torvalds if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) 130*1da177e4SLinus Torvalds dp264_enable_irq(irq); 131*1da177e4SLinus Torvalds } 132*1da177e4SLinus Torvalds 133*1da177e4SLinus Torvalds static void 134*1da177e4SLinus Torvalds clipper_enable_irq(unsigned int irq) 135*1da177e4SLinus Torvalds { 136*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 137*1da177e4SLinus Torvalds cached_irq_mask |= 1UL << (irq - 16); 138*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 139*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 140*1da177e4SLinus Torvalds } 141*1da177e4SLinus Torvalds 142*1da177e4SLinus Torvalds static void 143*1da177e4SLinus Torvalds clipper_disable_irq(unsigned int irq) 144*1da177e4SLinus Torvalds { 145*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 146*1da177e4SLinus Torvalds cached_irq_mask &= ~(1UL << (irq - 16)); 147*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 148*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 149*1da177e4SLinus Torvalds } 150*1da177e4SLinus Torvalds 151*1da177e4SLinus Torvalds static unsigned int 152*1da177e4SLinus Torvalds clipper_startup_irq(unsigned int irq) 153*1da177e4SLinus Torvalds { 154*1da177e4SLinus Torvalds clipper_enable_irq(irq); 155*1da177e4SLinus Torvalds return 0; /* never anything pending */ 156*1da177e4SLinus Torvalds } 157*1da177e4SLinus Torvalds 158*1da177e4SLinus Torvalds static void 159*1da177e4SLinus Torvalds clipper_end_irq(unsigned int irq) 160*1da177e4SLinus Torvalds { 161*1da177e4SLinus Torvalds if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) 162*1da177e4SLinus Torvalds clipper_enable_irq(irq); 163*1da177e4SLinus Torvalds } 164*1da177e4SLinus Torvalds 165*1da177e4SLinus Torvalds static void 166*1da177e4SLinus Torvalds cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) 167*1da177e4SLinus Torvalds { 168*1da177e4SLinus Torvalds int cpu; 169*1da177e4SLinus Torvalds 170*1da177e4SLinus Torvalds for (cpu = 0; cpu < 4; cpu++) { 171*1da177e4SLinus Torvalds unsigned long aff = cpu_irq_affinity[cpu]; 172*1da177e4SLinus Torvalds if (cpu_isset(cpu, affinity)) 173*1da177e4SLinus Torvalds aff |= 1UL << irq; 174*1da177e4SLinus Torvalds else 175*1da177e4SLinus Torvalds aff &= ~(1UL << irq); 176*1da177e4SLinus Torvalds cpu_irq_affinity[cpu] = aff; 177*1da177e4SLinus Torvalds } 178*1da177e4SLinus Torvalds } 179*1da177e4SLinus Torvalds 180*1da177e4SLinus Torvalds static void 181*1da177e4SLinus Torvalds dp264_set_affinity(unsigned int irq, cpumask_t affinity) 182*1da177e4SLinus Torvalds { 183*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 184*1da177e4SLinus Torvalds cpu_set_irq_affinity(irq, affinity); 185*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 186*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 187*1da177e4SLinus Torvalds } 188*1da177e4SLinus Torvalds 189*1da177e4SLinus Torvalds static void 190*1da177e4SLinus Torvalds clipper_set_affinity(unsigned int irq, cpumask_t affinity) 191*1da177e4SLinus Torvalds { 192*1da177e4SLinus Torvalds spin_lock(&dp264_irq_lock); 193*1da177e4SLinus Torvalds cpu_set_irq_affinity(irq - 16, affinity); 194*1da177e4SLinus Torvalds tsunami_update_irq_hw(cached_irq_mask); 195*1da177e4SLinus Torvalds spin_unlock(&dp264_irq_lock); 196*1da177e4SLinus Torvalds } 197*1da177e4SLinus Torvalds 198*1da177e4SLinus Torvalds static struct hw_interrupt_type dp264_irq_type = { 199*1da177e4SLinus Torvalds .typename = "DP264", 200*1da177e4SLinus Torvalds .startup = dp264_startup_irq, 201*1da177e4SLinus Torvalds .shutdown = dp264_disable_irq, 202*1da177e4SLinus Torvalds .enable = dp264_enable_irq, 203*1da177e4SLinus Torvalds .disable = dp264_disable_irq, 204*1da177e4SLinus Torvalds .ack = dp264_disable_irq, 205*1da177e4SLinus Torvalds .end = dp264_end_irq, 206*1da177e4SLinus Torvalds .set_affinity = dp264_set_affinity, 207*1da177e4SLinus Torvalds }; 208*1da177e4SLinus Torvalds 209*1da177e4SLinus Torvalds static struct hw_interrupt_type clipper_irq_type = { 210*1da177e4SLinus Torvalds .typename = "CLIPPER", 211*1da177e4SLinus Torvalds .startup = clipper_startup_irq, 212*1da177e4SLinus Torvalds .shutdown = clipper_disable_irq, 213*1da177e4SLinus Torvalds .enable = clipper_enable_irq, 214*1da177e4SLinus Torvalds .disable = clipper_disable_irq, 215*1da177e4SLinus Torvalds .ack = clipper_disable_irq, 216*1da177e4SLinus Torvalds .end = clipper_end_irq, 217*1da177e4SLinus Torvalds .set_affinity = clipper_set_affinity, 218*1da177e4SLinus Torvalds }; 219*1da177e4SLinus Torvalds 220*1da177e4SLinus Torvalds static void 221*1da177e4SLinus Torvalds dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) 222*1da177e4SLinus Torvalds { 223*1da177e4SLinus Torvalds #if 1 224*1da177e4SLinus Torvalds printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n"); 225*1da177e4SLinus Torvalds #else 226*1da177e4SLinus Torvalds unsigned long pld; 227*1da177e4SLinus Torvalds unsigned int i; 228*1da177e4SLinus Torvalds 229*1da177e4SLinus Torvalds /* Read the interrupt summary register of TSUNAMI */ 230*1da177e4SLinus Torvalds pld = TSUNAMI_cchip->dir0.csr; 231*1da177e4SLinus Torvalds 232*1da177e4SLinus Torvalds /* 233*1da177e4SLinus Torvalds * Now for every possible bit set, work through them and call 234*1da177e4SLinus Torvalds * the appropriate interrupt handler. 235*1da177e4SLinus Torvalds */ 236*1da177e4SLinus Torvalds while (pld) { 237*1da177e4SLinus Torvalds i = ffz(~pld); 238*1da177e4SLinus Torvalds pld &= pld - 1; /* clear least bit set */ 239*1da177e4SLinus Torvalds if (i == 55) 240*1da177e4SLinus Torvalds isa_device_interrupt(vector, regs); 241*1da177e4SLinus Torvalds else 242*1da177e4SLinus Torvalds handle_irq(16 + i, 16 + i, regs); 243*1da177e4SLinus Torvalds #if 0 244*1da177e4SLinus Torvalds TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); 245*1da177e4SLinus Torvalds tmp = TSUNAMI_cchip->dir0.csr; 246*1da177e4SLinus Torvalds #endif 247*1da177e4SLinus Torvalds } 248*1da177e4SLinus Torvalds #endif 249*1da177e4SLinus Torvalds } 250*1da177e4SLinus Torvalds 251*1da177e4SLinus Torvalds static void 252*1da177e4SLinus Torvalds dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 253*1da177e4SLinus Torvalds { 254*1da177e4SLinus Torvalds int irq; 255*1da177e4SLinus Torvalds 256*1da177e4SLinus Torvalds irq = (vector - 0x800) >> 4; 257*1da177e4SLinus Torvalds 258*1da177e4SLinus Torvalds /* 259*1da177e4SLinus Torvalds * The SRM console reports PCI interrupts with a vector calculated by: 260*1da177e4SLinus Torvalds * 261*1da177e4SLinus Torvalds * 0x900 + (0x10 * DRIR-bit) 262*1da177e4SLinus Torvalds * 263*1da177e4SLinus Torvalds * So bit 16 shows up as IRQ 32, etc. 264*1da177e4SLinus Torvalds * 265*1da177e4SLinus Torvalds * On DP264/BRICK/MONET, we adjust it down by 16 because at least 266*1da177e4SLinus Torvalds * that many of the low order bits of the DRIR are not used, and 267*1da177e4SLinus Torvalds * so we don't count them. 268*1da177e4SLinus Torvalds */ 269*1da177e4SLinus Torvalds if (irq >= 32) 270*1da177e4SLinus Torvalds irq -= 16; 271*1da177e4SLinus Torvalds 272*1da177e4SLinus Torvalds handle_irq(irq, regs); 273*1da177e4SLinus Torvalds } 274*1da177e4SLinus Torvalds 275*1da177e4SLinus Torvalds static void 276*1da177e4SLinus Torvalds clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 277*1da177e4SLinus Torvalds { 278*1da177e4SLinus Torvalds int irq; 279*1da177e4SLinus Torvalds 280*1da177e4SLinus Torvalds irq = (vector - 0x800) >> 4; 281*1da177e4SLinus Torvalds 282*1da177e4SLinus Torvalds /* 283*1da177e4SLinus Torvalds * The SRM console reports PCI interrupts with a vector calculated by: 284*1da177e4SLinus Torvalds * 285*1da177e4SLinus Torvalds * 0x900 + (0x10 * DRIR-bit) 286*1da177e4SLinus Torvalds * 287*1da177e4SLinus Torvalds * So bit 16 shows up as IRQ 32, etc. 288*1da177e4SLinus Torvalds * 289*1da177e4SLinus Torvalds * CLIPPER uses bits 8-47 for PCI interrupts, so we do not need 290*1da177e4SLinus Torvalds * to scale down the vector reported, we just use it. 291*1da177e4SLinus Torvalds * 292*1da177e4SLinus Torvalds * Eg IRQ 24 is DRIR bit 8, etc, etc 293*1da177e4SLinus Torvalds */ 294*1da177e4SLinus Torvalds handle_irq(irq, regs); 295*1da177e4SLinus Torvalds } 296*1da177e4SLinus Torvalds 297*1da177e4SLinus Torvalds static void __init 298*1da177e4SLinus Torvalds init_tsunami_irqs(struct hw_interrupt_type * ops, int imin, int imax) 299*1da177e4SLinus Torvalds { 300*1da177e4SLinus Torvalds long i; 301*1da177e4SLinus Torvalds for (i = imin; i <= imax; ++i) { 302*1da177e4SLinus Torvalds irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; 303*1da177e4SLinus Torvalds irq_desc[i].handler = ops; 304*1da177e4SLinus Torvalds } 305*1da177e4SLinus Torvalds } 306*1da177e4SLinus Torvalds 307*1da177e4SLinus Torvalds static void __init 308*1da177e4SLinus Torvalds dp264_init_irq(void) 309*1da177e4SLinus Torvalds { 310*1da177e4SLinus Torvalds outb(0, DMA1_RESET_REG); 311*1da177e4SLinus Torvalds outb(0, DMA2_RESET_REG); 312*1da177e4SLinus Torvalds outb(DMA_MODE_CASCADE, DMA2_MODE_REG); 313*1da177e4SLinus Torvalds outb(0, DMA2_MASK_REG); 314*1da177e4SLinus Torvalds 315*1da177e4SLinus Torvalds if (alpha_using_srm) 316*1da177e4SLinus Torvalds alpha_mv.device_interrupt = dp264_srm_device_interrupt; 317*1da177e4SLinus Torvalds 318*1da177e4SLinus Torvalds tsunami_update_irq_hw(0); 319*1da177e4SLinus Torvalds 320*1da177e4SLinus Torvalds init_i8259a_irqs(); 321*1da177e4SLinus Torvalds init_tsunami_irqs(&dp264_irq_type, 16, 47); 322*1da177e4SLinus Torvalds } 323*1da177e4SLinus Torvalds 324*1da177e4SLinus Torvalds static void __init 325*1da177e4SLinus Torvalds clipper_init_irq(void) 326*1da177e4SLinus Torvalds { 327*1da177e4SLinus Torvalds outb(0, DMA1_RESET_REG); 328*1da177e4SLinus Torvalds outb(0, DMA2_RESET_REG); 329*1da177e4SLinus Torvalds outb(DMA_MODE_CASCADE, DMA2_MODE_REG); 330*1da177e4SLinus Torvalds outb(0, DMA2_MASK_REG); 331*1da177e4SLinus Torvalds 332*1da177e4SLinus Torvalds if (alpha_using_srm) 333*1da177e4SLinus Torvalds alpha_mv.device_interrupt = clipper_srm_device_interrupt; 334*1da177e4SLinus Torvalds 335*1da177e4SLinus Torvalds tsunami_update_irq_hw(0); 336*1da177e4SLinus Torvalds 337*1da177e4SLinus Torvalds init_i8259a_irqs(); 338*1da177e4SLinus Torvalds init_tsunami_irqs(&clipper_irq_type, 24, 63); 339*1da177e4SLinus Torvalds } 340*1da177e4SLinus Torvalds 341*1da177e4SLinus Torvalds 342*1da177e4SLinus Torvalds /* 343*1da177e4SLinus Torvalds * PCI Fixup configuration. 344*1da177e4SLinus Torvalds * 345*1da177e4SLinus Torvalds * Summary @ TSUNAMI_CSR_DIM0: 346*1da177e4SLinus Torvalds * Bit Meaning 347*1da177e4SLinus Torvalds * 0-17 Unused 348*1da177e4SLinus Torvalds *18 Interrupt SCSI B (Adaptec 7895 builtin) 349*1da177e4SLinus Torvalds *19 Interrupt SCSI A (Adaptec 7895 builtin) 350*1da177e4SLinus Torvalds *20 Interrupt Line D from slot 2 PCI0 351*1da177e4SLinus Torvalds *21 Interrupt Line C from slot 2 PCI0 352*1da177e4SLinus Torvalds *22 Interrupt Line B from slot 2 PCI0 353*1da177e4SLinus Torvalds *23 Interrupt Line A from slot 2 PCI0 354*1da177e4SLinus Torvalds *24 Interrupt Line D from slot 1 PCI0 355*1da177e4SLinus Torvalds *25 Interrupt Line C from slot 1 PCI0 356*1da177e4SLinus Torvalds *26 Interrupt Line B from slot 1 PCI0 357*1da177e4SLinus Torvalds *27 Interrupt Line A from slot 1 PCI0 358*1da177e4SLinus Torvalds *28 Interrupt Line D from slot 0 PCI0 359*1da177e4SLinus Torvalds *29 Interrupt Line C from slot 0 PCI0 360*1da177e4SLinus Torvalds *30 Interrupt Line B from slot 0 PCI0 361*1da177e4SLinus Torvalds *31 Interrupt Line A from slot 0 PCI0 362*1da177e4SLinus Torvalds * 363*1da177e4SLinus Torvalds *32 Interrupt Line D from slot 3 PCI1 364*1da177e4SLinus Torvalds *33 Interrupt Line C from slot 3 PCI1 365*1da177e4SLinus Torvalds *34 Interrupt Line B from slot 3 PCI1 366*1da177e4SLinus Torvalds *35 Interrupt Line A from slot 3 PCI1 367*1da177e4SLinus Torvalds *36 Interrupt Line D from slot 2 PCI1 368*1da177e4SLinus Torvalds *37 Interrupt Line C from slot 2 PCI1 369*1da177e4SLinus Torvalds *38 Interrupt Line B from slot 2 PCI1 370*1da177e4SLinus Torvalds *39 Interrupt Line A from slot 2 PCI1 371*1da177e4SLinus Torvalds *40 Interrupt Line D from slot 1 PCI1 372*1da177e4SLinus Torvalds *41 Interrupt Line C from slot 1 PCI1 373*1da177e4SLinus Torvalds *42 Interrupt Line B from slot 1 PCI1 374*1da177e4SLinus Torvalds *43 Interrupt Line A from slot 1 PCI1 375*1da177e4SLinus Torvalds *44 Interrupt Line D from slot 0 PCI1 376*1da177e4SLinus Torvalds *45 Interrupt Line C from slot 0 PCI1 377*1da177e4SLinus Torvalds *46 Interrupt Line B from slot 0 PCI1 378*1da177e4SLinus Torvalds *47 Interrupt Line A from slot 0 PCI1 379*1da177e4SLinus Torvalds *48-52 Unused 380*1da177e4SLinus Torvalds *53 PCI0 NMI (from Cypress) 381*1da177e4SLinus Torvalds *54 PCI0 SMI INT (from Cypress) 382*1da177e4SLinus Torvalds *55 PCI0 ISA Interrupt (from Cypress) 383*1da177e4SLinus Torvalds *56-60 Unused 384*1da177e4SLinus Torvalds *61 PCI1 Bus Error 385*1da177e4SLinus Torvalds *62 PCI0 Bus Error 386*1da177e4SLinus Torvalds *63 Reserved 387*1da177e4SLinus Torvalds * 388*1da177e4SLinus Torvalds * IdSel 389*1da177e4SLinus Torvalds * 5 Cypress Bridge I/O 390*1da177e4SLinus Torvalds * 6 SCSI Adaptec builtin 391*1da177e4SLinus Torvalds * 7 64 bit PCI option slot 0 (all busses) 392*1da177e4SLinus Torvalds * 8 64 bit PCI option slot 1 (all busses) 393*1da177e4SLinus Torvalds * 9 64 bit PCI option slot 2 (all busses) 394*1da177e4SLinus Torvalds * 10 64 bit PCI option slot 3 (not bus 0) 395*1da177e4SLinus Torvalds */ 396*1da177e4SLinus Torvalds 397*1da177e4SLinus Torvalds static int __init 398*1da177e4SLinus Torvalds dp264_map_irq(struct pci_dev *dev, u8 slot, u8 pin) 399*1da177e4SLinus Torvalds { 400*1da177e4SLinus Torvalds static char irq_tab[6][5] __initdata = { 401*1da177e4SLinus Torvalds /*INT INTA INTB INTC INTD */ 402*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 5 ISA Bridge */ 403*1da177e4SLinus Torvalds { 16+ 3, 16+ 3, 16+ 2, 16+ 2, 16+ 2}, /* IdSel 6 SCSI builtin*/ 404*1da177e4SLinus Torvalds { 16+15, 16+15, 16+14, 16+13, 16+12}, /* IdSel 7 slot 0 */ 405*1da177e4SLinus Torvalds { 16+11, 16+11, 16+10, 16+ 9, 16+ 8}, /* IdSel 8 slot 1 */ 406*1da177e4SLinus Torvalds { 16+ 7, 16+ 7, 16+ 6, 16+ 5, 16+ 4}, /* IdSel 9 slot 2 */ 407*1da177e4SLinus Torvalds { 16+ 3, 16+ 3, 16+ 2, 16+ 1, 16+ 0} /* IdSel 10 slot 3 */ 408*1da177e4SLinus Torvalds }; 409*1da177e4SLinus Torvalds const long min_idsel = 5, max_idsel = 10, irqs_per_slot = 5; 410*1da177e4SLinus Torvalds 411*1da177e4SLinus Torvalds struct pci_controller *hose = dev->sysdata; 412*1da177e4SLinus Torvalds int irq = COMMON_TABLE_LOOKUP; 413*1da177e4SLinus Torvalds 414*1da177e4SLinus Torvalds if (irq > 0) { 415*1da177e4SLinus Torvalds irq += 16 * hose->index; 416*1da177e4SLinus Torvalds } else { 417*1da177e4SLinus Torvalds /* ??? The Contaq IDE controller on the ISA bridge uses 418*1da177e4SLinus Torvalds "legacy" interrupts 14 and 15. I don't know if anything 419*1da177e4SLinus Torvalds can wind up at the same slot+pin on hose1, so we'll 420*1da177e4SLinus Torvalds just have to trust whatever value the console might 421*1da177e4SLinus Torvalds have assigned. */ 422*1da177e4SLinus Torvalds 423*1da177e4SLinus Torvalds u8 irq8; 424*1da177e4SLinus Torvalds pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq8); 425*1da177e4SLinus Torvalds irq = irq8; 426*1da177e4SLinus Torvalds } 427*1da177e4SLinus Torvalds 428*1da177e4SLinus Torvalds return irq; 429*1da177e4SLinus Torvalds } 430*1da177e4SLinus Torvalds 431*1da177e4SLinus Torvalds static int __init 432*1da177e4SLinus Torvalds monet_map_irq(struct pci_dev *dev, u8 slot, u8 pin) 433*1da177e4SLinus Torvalds { 434*1da177e4SLinus Torvalds static char irq_tab[13][5] __initdata = { 435*1da177e4SLinus Torvalds /*INT INTA INTB INTC INTD */ 436*1da177e4SLinus Torvalds { 45, 45, 45, 45, 45}, /* IdSel 3 21143 PCI1 */ 437*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 4 unused */ 438*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 5 unused */ 439*1da177e4SLinus Torvalds { 47, 47, 47, 47, 47}, /* IdSel 6 SCSI PCI1 */ 440*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 7 ISA Bridge */ 441*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 8 P2P PCI1 */ 442*1da177e4SLinus Torvalds #if 1 443*1da177e4SLinus Torvalds { 28, 28, 29, 30, 31}, /* IdSel 14 slot 4 PCI2*/ 444*1da177e4SLinus Torvalds { 24, 24, 25, 26, 27}, /* IdSel 15 slot 5 PCI2*/ 445*1da177e4SLinus Torvalds #else 446*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 9 unused */ 447*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 10 unused */ 448*1da177e4SLinus Torvalds #endif 449*1da177e4SLinus Torvalds { 40, 40, 41, 42, 43}, /* IdSel 11 slot 1 PCI0*/ 450*1da177e4SLinus Torvalds { 36, 36, 37, 38, 39}, /* IdSel 12 slot 2 PCI0*/ 451*1da177e4SLinus Torvalds { 32, 32, 33, 34, 35}, /* IdSel 13 slot 3 PCI0*/ 452*1da177e4SLinus Torvalds { 28, 28, 29, 30, 31}, /* IdSel 14 slot 4 PCI2*/ 453*1da177e4SLinus Torvalds { 24, 24, 25, 26, 27} /* IdSel 15 slot 5 PCI2*/ 454*1da177e4SLinus Torvalds }; 455*1da177e4SLinus Torvalds const long min_idsel = 3, max_idsel = 15, irqs_per_slot = 5; 456*1da177e4SLinus Torvalds return COMMON_TABLE_LOOKUP; 457*1da177e4SLinus Torvalds } 458*1da177e4SLinus Torvalds 459*1da177e4SLinus Torvalds static u8 __init 460*1da177e4SLinus Torvalds monet_swizzle(struct pci_dev *dev, u8 *pinp) 461*1da177e4SLinus Torvalds { 462*1da177e4SLinus Torvalds struct pci_controller *hose = dev->sysdata; 463*1da177e4SLinus Torvalds int slot, pin = *pinp; 464*1da177e4SLinus Torvalds 465*1da177e4SLinus Torvalds if (!dev->bus->parent) { 466*1da177e4SLinus Torvalds slot = PCI_SLOT(dev->devfn); 467*1da177e4SLinus Torvalds } 468*1da177e4SLinus Torvalds /* Check for the built-in bridge on hose 1. */ 469*1da177e4SLinus Torvalds else if (hose->index == 1 && PCI_SLOT(dev->bus->self->devfn) == 8) { 470*1da177e4SLinus Torvalds slot = PCI_SLOT(dev->devfn); 471*1da177e4SLinus Torvalds } else { 472*1da177e4SLinus Torvalds /* Must be a card-based bridge. */ 473*1da177e4SLinus Torvalds do { 474*1da177e4SLinus Torvalds /* Check for built-in bridge on hose 1. */ 475*1da177e4SLinus Torvalds if (hose->index == 1 && 476*1da177e4SLinus Torvalds PCI_SLOT(dev->bus->self->devfn) == 8) { 477*1da177e4SLinus Torvalds slot = PCI_SLOT(dev->devfn); 478*1da177e4SLinus Torvalds break; 479*1da177e4SLinus Torvalds } 480*1da177e4SLinus Torvalds pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ; 481*1da177e4SLinus Torvalds 482*1da177e4SLinus Torvalds /* Move up the chain of bridges. */ 483*1da177e4SLinus Torvalds dev = dev->bus->self; 484*1da177e4SLinus Torvalds /* Slot of the next bridge. */ 485*1da177e4SLinus Torvalds slot = PCI_SLOT(dev->devfn); 486*1da177e4SLinus Torvalds } while (dev->bus->self); 487*1da177e4SLinus Torvalds } 488*1da177e4SLinus Torvalds *pinp = pin; 489*1da177e4SLinus Torvalds return slot; 490*1da177e4SLinus Torvalds } 491*1da177e4SLinus Torvalds 492*1da177e4SLinus Torvalds static int __init 493*1da177e4SLinus Torvalds webbrick_map_irq(struct pci_dev *dev, u8 slot, u8 pin) 494*1da177e4SLinus Torvalds { 495*1da177e4SLinus Torvalds static char irq_tab[13][5] __initdata = { 496*1da177e4SLinus Torvalds /*INT INTA INTB INTC INTD */ 497*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 7 ISA Bridge */ 498*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 8 unused */ 499*1da177e4SLinus Torvalds { 29, 29, 29, 29, 29}, /* IdSel 9 21143 #1 */ 500*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 10 unused */ 501*1da177e4SLinus Torvalds { 30, 30, 30, 30, 30}, /* IdSel 11 21143 #2 */ 502*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 12 unused */ 503*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1}, /* IdSel 13 unused */ 504*1da177e4SLinus Torvalds { 35, 35, 34, 33, 32}, /* IdSel 14 slot 0 */ 505*1da177e4SLinus Torvalds { 39, 39, 38, 37, 36}, /* IdSel 15 slot 1 */ 506*1da177e4SLinus Torvalds { 43, 43, 42, 41, 40}, /* IdSel 16 slot 2 */ 507*1da177e4SLinus Torvalds { 47, 47, 46, 45, 44}, /* IdSel 17 slot 3 */ 508*1da177e4SLinus Torvalds }; 509*1da177e4SLinus Torvalds const long min_idsel = 7, max_idsel = 17, irqs_per_slot = 5; 510*1da177e4SLinus Torvalds return COMMON_TABLE_LOOKUP; 511*1da177e4SLinus Torvalds } 512*1da177e4SLinus Torvalds 513*1da177e4SLinus Torvalds static int __init 514*1da177e4SLinus Torvalds clipper_map_irq(struct pci_dev *dev, u8 slot, u8 pin) 515*1da177e4SLinus Torvalds { 516*1da177e4SLinus Torvalds static char irq_tab[7][5] __initdata = { 517*1da177e4SLinus Torvalds /*INT INTA INTB INTC INTD */ 518*1da177e4SLinus Torvalds { 16+ 8, 16+ 8, 16+ 9, 16+10, 16+11}, /* IdSel 1 slot 1 */ 519*1da177e4SLinus Torvalds { 16+12, 16+12, 16+13, 16+14, 16+15}, /* IdSel 2 slot 2 */ 520*1da177e4SLinus Torvalds { 16+16, 16+16, 16+17, 16+18, 16+19}, /* IdSel 3 slot 3 */ 521*1da177e4SLinus Torvalds { 16+20, 16+20, 16+21, 16+22, 16+23}, /* IdSel 4 slot 4 */ 522*1da177e4SLinus Torvalds { 16+24, 16+24, 16+25, 16+26, 16+27}, /* IdSel 5 slot 5 */ 523*1da177e4SLinus Torvalds { 16+28, 16+28, 16+29, 16+30, 16+31}, /* IdSel 6 slot 6 */ 524*1da177e4SLinus Torvalds { -1, -1, -1, -1, -1} /* IdSel 7 ISA Bridge */ 525*1da177e4SLinus Torvalds }; 526*1da177e4SLinus Torvalds const long min_idsel = 1, max_idsel = 7, irqs_per_slot = 5; 527*1da177e4SLinus Torvalds 528*1da177e4SLinus Torvalds struct pci_controller *hose = dev->sysdata; 529*1da177e4SLinus Torvalds int irq = COMMON_TABLE_LOOKUP; 530*1da177e4SLinus Torvalds 531*1da177e4SLinus Torvalds if (irq > 0) 532*1da177e4SLinus Torvalds irq += 16 * hose->index; 533*1da177e4SLinus Torvalds 534*1da177e4SLinus Torvalds return irq; 535*1da177e4SLinus Torvalds } 536*1da177e4SLinus Torvalds 537*1da177e4SLinus Torvalds static void __init 538*1da177e4SLinus Torvalds dp264_init_pci(void) 539*1da177e4SLinus Torvalds { 540*1da177e4SLinus Torvalds common_init_pci(); 541*1da177e4SLinus Torvalds SMC669_Init(0); 542*1da177e4SLinus Torvalds } 543*1da177e4SLinus Torvalds 544*1da177e4SLinus Torvalds static void __init 545*1da177e4SLinus Torvalds monet_init_pci(void) 546*1da177e4SLinus Torvalds { 547*1da177e4SLinus Torvalds common_init_pci(); 548*1da177e4SLinus Torvalds SMC669_Init(1); 549*1da177e4SLinus Torvalds es1888_init(); 550*1da177e4SLinus Torvalds } 551*1da177e4SLinus Torvalds 552*1da177e4SLinus Torvalds static void __init 553*1da177e4SLinus Torvalds webbrick_init_arch(void) 554*1da177e4SLinus Torvalds { 555*1da177e4SLinus Torvalds tsunami_init_arch(); 556*1da177e4SLinus Torvalds 557*1da177e4SLinus Torvalds /* Tsunami caches 4 PTEs at a time; DS10 has only 1 hose. */ 558*1da177e4SLinus Torvalds hose_head->sg_isa->align_entry = 4; 559*1da177e4SLinus Torvalds hose_head->sg_pci->align_entry = 4; 560*1da177e4SLinus Torvalds } 561*1da177e4SLinus Torvalds 562*1da177e4SLinus Torvalds 563*1da177e4SLinus Torvalds /* 564*1da177e4SLinus Torvalds * The System Vectors 565*1da177e4SLinus Torvalds */ 566*1da177e4SLinus Torvalds 567*1da177e4SLinus Torvalds struct alpha_machine_vector dp264_mv __initmv = { 568*1da177e4SLinus Torvalds .vector_name = "DP264", 569*1da177e4SLinus Torvalds DO_EV6_MMU, 570*1da177e4SLinus Torvalds DO_DEFAULT_RTC, 571*1da177e4SLinus Torvalds DO_TSUNAMI_IO, 572*1da177e4SLinus Torvalds .machine_check = tsunami_machine_check, 573*1da177e4SLinus Torvalds .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS, 574*1da177e4SLinus Torvalds .min_io_address = DEFAULT_IO_BASE, 575*1da177e4SLinus Torvalds .min_mem_address = DEFAULT_MEM_BASE, 576*1da177e4SLinus Torvalds .pci_dac_offset = TSUNAMI_DAC_OFFSET, 577*1da177e4SLinus Torvalds 578*1da177e4SLinus Torvalds .nr_irqs = 64, 579*1da177e4SLinus Torvalds .device_interrupt = dp264_device_interrupt, 580*1da177e4SLinus Torvalds 581*1da177e4SLinus Torvalds .init_arch = tsunami_init_arch, 582*1da177e4SLinus Torvalds .init_irq = dp264_init_irq, 583*1da177e4SLinus Torvalds .init_rtc = common_init_rtc, 584*1da177e4SLinus Torvalds .init_pci = dp264_init_pci, 585*1da177e4SLinus Torvalds .kill_arch = tsunami_kill_arch, 586*1da177e4SLinus Torvalds .pci_map_irq = dp264_map_irq, 587*1da177e4SLinus Torvalds .pci_swizzle = common_swizzle, 588*1da177e4SLinus Torvalds }; 589*1da177e4SLinus Torvalds ALIAS_MV(dp264) 590*1da177e4SLinus Torvalds 591*1da177e4SLinus Torvalds struct alpha_machine_vector monet_mv __initmv = { 592*1da177e4SLinus Torvalds .vector_name = "Monet", 593*1da177e4SLinus Torvalds DO_EV6_MMU, 594*1da177e4SLinus Torvalds DO_DEFAULT_RTC, 595*1da177e4SLinus Torvalds DO_TSUNAMI_IO, 596*1da177e4SLinus Torvalds .machine_check = tsunami_machine_check, 597*1da177e4SLinus Torvalds .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS, 598*1da177e4SLinus Torvalds .min_io_address = DEFAULT_IO_BASE, 599*1da177e4SLinus Torvalds .min_mem_address = DEFAULT_MEM_BASE, 600*1da177e4SLinus Torvalds .pci_dac_offset = TSUNAMI_DAC_OFFSET, 601*1da177e4SLinus Torvalds 602*1da177e4SLinus Torvalds .nr_irqs = 64, 603*1da177e4SLinus Torvalds .device_interrupt = dp264_device_interrupt, 604*1da177e4SLinus Torvalds 605*1da177e4SLinus Torvalds .init_arch = tsunami_init_arch, 606*1da177e4SLinus Torvalds .init_irq = dp264_init_irq, 607*1da177e4SLinus Torvalds .init_rtc = common_init_rtc, 608*1da177e4SLinus Torvalds .init_pci = monet_init_pci, 609*1da177e4SLinus Torvalds .kill_arch = tsunami_kill_arch, 610*1da177e4SLinus Torvalds .pci_map_irq = monet_map_irq, 611*1da177e4SLinus Torvalds .pci_swizzle = monet_swizzle, 612*1da177e4SLinus Torvalds }; 613*1da177e4SLinus Torvalds 614*1da177e4SLinus Torvalds struct alpha_machine_vector webbrick_mv __initmv = { 615*1da177e4SLinus Torvalds .vector_name = "Webbrick", 616*1da177e4SLinus Torvalds DO_EV6_MMU, 617*1da177e4SLinus Torvalds DO_DEFAULT_RTC, 618*1da177e4SLinus Torvalds DO_TSUNAMI_IO, 619*1da177e4SLinus Torvalds .machine_check = tsunami_machine_check, 620*1da177e4SLinus Torvalds .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS, 621*1da177e4SLinus Torvalds .min_io_address = DEFAULT_IO_BASE, 622*1da177e4SLinus Torvalds .min_mem_address = DEFAULT_MEM_BASE, 623*1da177e4SLinus Torvalds .pci_dac_offset = TSUNAMI_DAC_OFFSET, 624*1da177e4SLinus Torvalds 625*1da177e4SLinus Torvalds .nr_irqs = 64, 626*1da177e4SLinus Torvalds .device_interrupt = dp264_device_interrupt, 627*1da177e4SLinus Torvalds 628*1da177e4SLinus Torvalds .init_arch = webbrick_init_arch, 629*1da177e4SLinus Torvalds .init_irq = dp264_init_irq, 630*1da177e4SLinus Torvalds .init_rtc = common_init_rtc, 631*1da177e4SLinus Torvalds .init_pci = common_init_pci, 632*1da177e4SLinus Torvalds .kill_arch = tsunami_kill_arch, 633*1da177e4SLinus Torvalds .pci_map_irq = webbrick_map_irq, 634*1da177e4SLinus Torvalds .pci_swizzle = common_swizzle, 635*1da177e4SLinus Torvalds }; 636*1da177e4SLinus Torvalds 637*1da177e4SLinus Torvalds struct alpha_machine_vector clipper_mv __initmv = { 638*1da177e4SLinus Torvalds .vector_name = "Clipper", 639*1da177e4SLinus Torvalds DO_EV6_MMU, 640*1da177e4SLinus Torvalds DO_DEFAULT_RTC, 641*1da177e4SLinus Torvalds DO_TSUNAMI_IO, 642*1da177e4SLinus Torvalds .machine_check = tsunami_machine_check, 643*1da177e4SLinus Torvalds .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS, 644*1da177e4SLinus Torvalds .min_io_address = DEFAULT_IO_BASE, 645*1da177e4SLinus Torvalds .min_mem_address = DEFAULT_MEM_BASE, 646*1da177e4SLinus Torvalds .pci_dac_offset = TSUNAMI_DAC_OFFSET, 647*1da177e4SLinus Torvalds 648*1da177e4SLinus Torvalds .nr_irqs = 64, 649*1da177e4SLinus Torvalds .device_interrupt = dp264_device_interrupt, 650*1da177e4SLinus Torvalds 651*1da177e4SLinus Torvalds .init_arch = tsunami_init_arch, 652*1da177e4SLinus Torvalds .init_irq = clipper_init_irq, 653*1da177e4SLinus Torvalds .init_rtc = common_init_rtc, 654*1da177e4SLinus Torvalds .init_pci = common_init_pci, 655*1da177e4SLinus Torvalds .kill_arch = tsunami_kill_arch, 656*1da177e4SLinus Torvalds .pci_map_irq = clipper_map_irq, 657*1da177e4SLinus Torvalds .pci_swizzle = common_swizzle, 658*1da177e4SLinus Torvalds }; 659*1da177e4SLinus Torvalds 660*1da177e4SLinus Torvalds /* Sharks strongly resemble Clipper, at least as far 661*1da177e4SLinus Torvalds * as interrupt routing, etc, so we're using the 662*1da177e4SLinus Torvalds * same functions as Clipper does 663*1da177e4SLinus Torvalds */ 664*1da177e4SLinus Torvalds 665*1da177e4SLinus Torvalds struct alpha_machine_vector shark_mv __initmv = { 666*1da177e4SLinus Torvalds .vector_name = "Shark", 667*1da177e4SLinus Torvalds DO_EV6_MMU, 668*1da177e4SLinus Torvalds DO_DEFAULT_RTC, 669*1da177e4SLinus Torvalds DO_TSUNAMI_IO, 670*1da177e4SLinus Torvalds .machine_check = tsunami_machine_check, 671*1da177e4SLinus Torvalds .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS, 672*1da177e4SLinus Torvalds .min_io_address = DEFAULT_IO_BASE, 673*1da177e4SLinus Torvalds .min_mem_address = DEFAULT_MEM_BASE, 674*1da177e4SLinus Torvalds .pci_dac_offset = TSUNAMI_DAC_OFFSET, 675*1da177e4SLinus Torvalds 676*1da177e4SLinus Torvalds .nr_irqs = 64, 677*1da177e4SLinus Torvalds .device_interrupt = dp264_device_interrupt, 678*1da177e4SLinus Torvalds 679*1da177e4SLinus Torvalds .init_arch = tsunami_init_arch, 680*1da177e4SLinus Torvalds .init_irq = clipper_init_irq, 681*1da177e4SLinus Torvalds .init_rtc = common_init_rtc, 682*1da177e4SLinus Torvalds .init_pci = common_init_pci, 683*1da177e4SLinus Torvalds .kill_arch = tsunami_kill_arch, 684*1da177e4SLinus Torvalds .pci_map_irq = clipper_map_irq, 685*1da177e4SLinus Torvalds .pci_swizzle = common_swizzle, 686*1da177e4SLinus Torvalds }; 687*1da177e4SLinus Torvalds 688*1da177e4SLinus Torvalds /* No alpha_mv alias for webbrick/monet/clipper, since we compile them 689*1da177e4SLinus Torvalds in unconditionally with DP264; setup_arch knows how to cope. */ 690