xref: /linux-6.15/arch/alpha/kernel/sys_wildfire.c (revision 1da177e4)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  *  linux/arch/alpha/kernel/sys_wildfire.c
3*1da177e4SLinus Torvalds  *
4*1da177e4SLinus Torvalds  *  Wildfire support.
5*1da177e4SLinus Torvalds  *
6*1da177e4SLinus Torvalds  *  Copyright (C) 2000 Andrea Arcangeli <[email protected]> SuSE
7*1da177e4SLinus Torvalds  */
8*1da177e4SLinus Torvalds 
9*1da177e4SLinus Torvalds #include <linux/kernel.h>
10*1da177e4SLinus Torvalds #include <linux/types.h>
11*1da177e4SLinus Torvalds #include <linux/mm.h>
12*1da177e4SLinus Torvalds #include <linux/sched.h>
13*1da177e4SLinus Torvalds #include <linux/pci.h>
14*1da177e4SLinus Torvalds #include <linux/init.h>
15*1da177e4SLinus Torvalds #include <linux/bitops.h>
16*1da177e4SLinus Torvalds 
17*1da177e4SLinus Torvalds #include <asm/ptrace.h>
18*1da177e4SLinus Torvalds #include <asm/system.h>
19*1da177e4SLinus Torvalds #include <asm/dma.h>
20*1da177e4SLinus Torvalds #include <asm/irq.h>
21*1da177e4SLinus Torvalds #include <asm/mmu_context.h>
22*1da177e4SLinus Torvalds #include <asm/io.h>
23*1da177e4SLinus Torvalds #include <asm/pgtable.h>
24*1da177e4SLinus Torvalds #include <asm/core_wildfire.h>
25*1da177e4SLinus Torvalds #include <asm/hwrpb.h>
26*1da177e4SLinus Torvalds #include <asm/tlbflush.h>
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds #include "proto.h"
29*1da177e4SLinus Torvalds #include "irq_impl.h"
30*1da177e4SLinus Torvalds #include "pci_impl.h"
31*1da177e4SLinus Torvalds #include "machvec_impl.h"
32*1da177e4SLinus Torvalds 
33*1da177e4SLinus Torvalds static unsigned long cached_irq_mask[WILDFIRE_NR_IRQS/(sizeof(long)*8)];
34*1da177e4SLinus Torvalds 
35*1da177e4SLinus Torvalds DEFINE_SPINLOCK(wildfire_irq_lock);
36*1da177e4SLinus Torvalds 
37*1da177e4SLinus Torvalds static int doing_init_irq_hw = 0;
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds static void
40*1da177e4SLinus Torvalds wildfire_update_irq_hw(unsigned int irq)
41*1da177e4SLinus Torvalds {
42*1da177e4SLinus Torvalds 	int qbbno = (irq >> 8) & (WILDFIRE_MAX_QBB - 1);
43*1da177e4SLinus Torvalds 	int pcano = (irq >> 6) & (WILDFIRE_PCA_PER_QBB - 1);
44*1da177e4SLinus Torvalds 	wildfire_pca *pca;
45*1da177e4SLinus Torvalds 	volatile unsigned long * enable0;
46*1da177e4SLinus Torvalds 
47*1da177e4SLinus Torvalds 	if (!WILDFIRE_PCA_EXISTS(qbbno, pcano)) {
48*1da177e4SLinus Torvalds 		if (!doing_init_irq_hw) {
49*1da177e4SLinus Torvalds 			printk(KERN_ERR "wildfire_update_irq_hw:"
50*1da177e4SLinus Torvalds 			       " got irq %d for non-existent PCA %d"
51*1da177e4SLinus Torvalds 			       " on QBB %d.\n",
52*1da177e4SLinus Torvalds 			       irq, pcano, qbbno);
53*1da177e4SLinus Torvalds 		}
54*1da177e4SLinus Torvalds 		return;
55*1da177e4SLinus Torvalds 	}
56*1da177e4SLinus Torvalds 
57*1da177e4SLinus Torvalds 	pca = WILDFIRE_pca(qbbno, pcano);
58*1da177e4SLinus Torvalds 	enable0 = (unsigned long *) &pca->pca_int[0].enable; /* ??? */
59*1da177e4SLinus Torvalds 
60*1da177e4SLinus Torvalds 	*enable0 = cached_irq_mask[qbbno * WILDFIRE_PCA_PER_QBB + pcano];
61*1da177e4SLinus Torvalds 	mb();
62*1da177e4SLinus Torvalds 	*enable0;
63*1da177e4SLinus Torvalds }
64*1da177e4SLinus Torvalds 
65*1da177e4SLinus Torvalds static void __init
66*1da177e4SLinus Torvalds wildfire_init_irq_hw(void)
67*1da177e4SLinus Torvalds {
68*1da177e4SLinus Torvalds #if 0
69*1da177e4SLinus Torvalds 	register wildfire_pca * pca = WILDFIRE_pca(0, 0);
70*1da177e4SLinus Torvalds 	volatile unsigned long * enable0, * enable1, * enable2, *enable3;
71*1da177e4SLinus Torvalds 	volatile unsigned long * target0, * target1, * target2, *target3;
72*1da177e4SLinus Torvalds 
73*1da177e4SLinus Torvalds 	enable0 = (unsigned long *) &pca->pca_int[0].enable;
74*1da177e4SLinus Torvalds 	enable1 = (unsigned long *) &pca->pca_int[1].enable;
75*1da177e4SLinus Torvalds 	enable2 = (unsigned long *) &pca->pca_int[2].enable;
76*1da177e4SLinus Torvalds 	enable3 = (unsigned long *) &pca->pca_int[3].enable;
77*1da177e4SLinus Torvalds 
78*1da177e4SLinus Torvalds 	target0 = (unsigned long *) &pca->pca_int[0].target;
79*1da177e4SLinus Torvalds 	target1 = (unsigned long *) &pca->pca_int[1].target;
80*1da177e4SLinus Torvalds 	target2 = (unsigned long *) &pca->pca_int[2].target;
81*1da177e4SLinus Torvalds 	target3 = (unsigned long *) &pca->pca_int[3].target;
82*1da177e4SLinus Torvalds 
83*1da177e4SLinus Torvalds 	*enable0 = *enable1 = *enable2 = *enable3 = 0;
84*1da177e4SLinus Torvalds 
85*1da177e4SLinus Torvalds 	*target0 = (1UL<<8) | WILDFIRE_QBB(0);
86*1da177e4SLinus Torvalds 	*target1 = *target2 = *target3 = 0;
87*1da177e4SLinus Torvalds 
88*1da177e4SLinus Torvalds 	mb();
89*1da177e4SLinus Torvalds 
90*1da177e4SLinus Torvalds 	*enable0; *enable1; *enable2; *enable3;
91*1da177e4SLinus Torvalds 	*target0; *target1; *target2; *target3;
92*1da177e4SLinus Torvalds 
93*1da177e4SLinus Torvalds #else
94*1da177e4SLinus Torvalds 	int i;
95*1da177e4SLinus Torvalds 
96*1da177e4SLinus Torvalds 	doing_init_irq_hw = 1;
97*1da177e4SLinus Torvalds 
98*1da177e4SLinus Torvalds 	/* Need to update only once for every possible PCA. */
99*1da177e4SLinus Torvalds 	for (i = 0; i < WILDFIRE_NR_IRQS; i+=WILDFIRE_IRQ_PER_PCA)
100*1da177e4SLinus Torvalds 		wildfire_update_irq_hw(i);
101*1da177e4SLinus Torvalds 
102*1da177e4SLinus Torvalds 	doing_init_irq_hw = 0;
103*1da177e4SLinus Torvalds #endif
104*1da177e4SLinus Torvalds }
105*1da177e4SLinus Torvalds 
106*1da177e4SLinus Torvalds static void
107*1da177e4SLinus Torvalds wildfire_enable_irq(unsigned int irq)
108*1da177e4SLinus Torvalds {
109*1da177e4SLinus Torvalds 	if (irq < 16)
110*1da177e4SLinus Torvalds 		i8259a_enable_irq(irq);
111*1da177e4SLinus Torvalds 
112*1da177e4SLinus Torvalds 	spin_lock(&wildfire_irq_lock);
113*1da177e4SLinus Torvalds 	set_bit(irq, &cached_irq_mask);
114*1da177e4SLinus Torvalds 	wildfire_update_irq_hw(irq);
115*1da177e4SLinus Torvalds 	spin_unlock(&wildfire_irq_lock);
116*1da177e4SLinus Torvalds }
117*1da177e4SLinus Torvalds 
118*1da177e4SLinus Torvalds static void
119*1da177e4SLinus Torvalds wildfire_disable_irq(unsigned int irq)
120*1da177e4SLinus Torvalds {
121*1da177e4SLinus Torvalds 	if (irq < 16)
122*1da177e4SLinus Torvalds 		i8259a_disable_irq(irq);
123*1da177e4SLinus Torvalds 
124*1da177e4SLinus Torvalds 	spin_lock(&wildfire_irq_lock);
125*1da177e4SLinus Torvalds 	clear_bit(irq, &cached_irq_mask);
126*1da177e4SLinus Torvalds 	wildfire_update_irq_hw(irq);
127*1da177e4SLinus Torvalds 	spin_unlock(&wildfire_irq_lock);
128*1da177e4SLinus Torvalds }
129*1da177e4SLinus Torvalds 
130*1da177e4SLinus Torvalds static void
131*1da177e4SLinus Torvalds wildfire_mask_and_ack_irq(unsigned int irq)
132*1da177e4SLinus Torvalds {
133*1da177e4SLinus Torvalds 	if (irq < 16)
134*1da177e4SLinus Torvalds 		i8259a_mask_and_ack_irq(irq);
135*1da177e4SLinus Torvalds 
136*1da177e4SLinus Torvalds 	spin_lock(&wildfire_irq_lock);
137*1da177e4SLinus Torvalds 	clear_bit(irq, &cached_irq_mask);
138*1da177e4SLinus Torvalds 	wildfire_update_irq_hw(irq);
139*1da177e4SLinus Torvalds 	spin_unlock(&wildfire_irq_lock);
140*1da177e4SLinus Torvalds }
141*1da177e4SLinus Torvalds 
142*1da177e4SLinus Torvalds static unsigned int
143*1da177e4SLinus Torvalds wildfire_startup_irq(unsigned int irq)
144*1da177e4SLinus Torvalds {
145*1da177e4SLinus Torvalds 	wildfire_enable_irq(irq);
146*1da177e4SLinus Torvalds 	return 0; /* never anything pending */
147*1da177e4SLinus Torvalds }
148*1da177e4SLinus Torvalds 
149*1da177e4SLinus Torvalds static void
150*1da177e4SLinus Torvalds wildfire_end_irq(unsigned int irq)
151*1da177e4SLinus Torvalds {
152*1da177e4SLinus Torvalds #if 0
153*1da177e4SLinus Torvalds 	if (!irq_desc[irq].action)
154*1da177e4SLinus Torvalds 		printk("got irq %d\n", irq);
155*1da177e4SLinus Torvalds #endif
156*1da177e4SLinus Torvalds 	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
157*1da177e4SLinus Torvalds 		wildfire_enable_irq(irq);
158*1da177e4SLinus Torvalds }
159*1da177e4SLinus Torvalds 
160*1da177e4SLinus Torvalds static struct hw_interrupt_type wildfire_irq_type = {
161*1da177e4SLinus Torvalds 	.typename	= "WILDFIRE",
162*1da177e4SLinus Torvalds 	.startup	= wildfire_startup_irq,
163*1da177e4SLinus Torvalds 	.shutdown	= wildfire_disable_irq,
164*1da177e4SLinus Torvalds 	.enable		= wildfire_enable_irq,
165*1da177e4SLinus Torvalds 	.disable	= wildfire_disable_irq,
166*1da177e4SLinus Torvalds 	.ack		= wildfire_mask_and_ack_irq,
167*1da177e4SLinus Torvalds 	.end		= wildfire_end_irq,
168*1da177e4SLinus Torvalds };
169*1da177e4SLinus Torvalds 
170*1da177e4SLinus Torvalds static void __init
171*1da177e4SLinus Torvalds wildfire_init_irq_per_pca(int qbbno, int pcano)
172*1da177e4SLinus Torvalds {
173*1da177e4SLinus Torvalds 	int i, irq_bias;
174*1da177e4SLinus Torvalds 	unsigned long io_bias;
175*1da177e4SLinus Torvalds 	static struct irqaction isa_enable = {
176*1da177e4SLinus Torvalds 		.handler	= no_action,
177*1da177e4SLinus Torvalds 		.name		= "isa_enable",
178*1da177e4SLinus Torvalds 	};
179*1da177e4SLinus Torvalds 
180*1da177e4SLinus Torvalds 	irq_bias = qbbno * (WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)
181*1da177e4SLinus Torvalds 		 + pcano * WILDFIRE_IRQ_PER_PCA;
182*1da177e4SLinus Torvalds 
183*1da177e4SLinus Torvalds 	/* Only need the following for first PCI bus per PCA. */
184*1da177e4SLinus Torvalds 	io_bias = WILDFIRE_IO(qbbno, pcano<<1) - WILDFIRE_IO_BIAS;
185*1da177e4SLinus Torvalds 
186*1da177e4SLinus Torvalds #if 0
187*1da177e4SLinus Torvalds 	outb(0, DMA1_RESET_REG + io_bias);
188*1da177e4SLinus Torvalds 	outb(0, DMA2_RESET_REG + io_bias);
189*1da177e4SLinus Torvalds 	outb(DMA_MODE_CASCADE, DMA2_MODE_REG + io_bias);
190*1da177e4SLinus Torvalds 	outb(0, DMA2_MASK_REG + io_bias);
191*1da177e4SLinus Torvalds #endif
192*1da177e4SLinus Torvalds 
193*1da177e4SLinus Torvalds #if 0
194*1da177e4SLinus Torvalds 	/* ??? Not sure how to do this, yet... */
195*1da177e4SLinus Torvalds 	init_i8259a_irqs(); /* ??? */
196*1da177e4SLinus Torvalds #endif
197*1da177e4SLinus Torvalds 
198*1da177e4SLinus Torvalds 	for (i = 0; i < 16; ++i) {
199*1da177e4SLinus Torvalds 		if (i == 2)
200*1da177e4SLinus Torvalds 			continue;
201*1da177e4SLinus Torvalds 		irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL;
202*1da177e4SLinus Torvalds 		irq_desc[i+irq_bias].handler = &wildfire_irq_type;
203*1da177e4SLinus Torvalds 	}
204*1da177e4SLinus Torvalds 
205*1da177e4SLinus Torvalds 	irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL;
206*1da177e4SLinus Torvalds 	irq_desc[36+irq_bias].handler = &wildfire_irq_type;
207*1da177e4SLinus Torvalds 	for (i = 40; i < 64; ++i) {
208*1da177e4SLinus Torvalds 		irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL;
209*1da177e4SLinus Torvalds 		irq_desc[i+irq_bias].handler = &wildfire_irq_type;
210*1da177e4SLinus Torvalds 	}
211*1da177e4SLinus Torvalds 
212*1da177e4SLinus Torvalds 	setup_irq(32+irq_bias, &isa_enable);
213*1da177e4SLinus Torvalds }
214*1da177e4SLinus Torvalds 
215*1da177e4SLinus Torvalds static void __init
216*1da177e4SLinus Torvalds wildfire_init_irq(void)
217*1da177e4SLinus Torvalds {
218*1da177e4SLinus Torvalds 	int qbbno, pcano;
219*1da177e4SLinus Torvalds 
220*1da177e4SLinus Torvalds #if 1
221*1da177e4SLinus Torvalds 	wildfire_init_irq_hw();
222*1da177e4SLinus Torvalds 	init_i8259a_irqs();
223*1da177e4SLinus Torvalds #endif
224*1da177e4SLinus Torvalds 
225*1da177e4SLinus Torvalds 	for (qbbno = 0; qbbno < WILDFIRE_MAX_QBB; qbbno++) {
226*1da177e4SLinus Torvalds 	  if (WILDFIRE_QBB_EXISTS(qbbno)) {
227*1da177e4SLinus Torvalds 	    for (pcano = 0; pcano < WILDFIRE_PCA_PER_QBB; pcano++) {
228*1da177e4SLinus Torvalds 	      if (WILDFIRE_PCA_EXISTS(qbbno, pcano)) {
229*1da177e4SLinus Torvalds 		wildfire_init_irq_per_pca(qbbno, pcano);
230*1da177e4SLinus Torvalds 	      }
231*1da177e4SLinus Torvalds 	    }
232*1da177e4SLinus Torvalds 	  }
233*1da177e4SLinus Torvalds 	}
234*1da177e4SLinus Torvalds }
235*1da177e4SLinus Torvalds 
236*1da177e4SLinus Torvalds static void
237*1da177e4SLinus Torvalds wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
238*1da177e4SLinus Torvalds {
239*1da177e4SLinus Torvalds 	int irq;
240*1da177e4SLinus Torvalds 
241*1da177e4SLinus Torvalds 	irq = (vector - 0x800) >> 4;
242*1da177e4SLinus Torvalds 
243*1da177e4SLinus Torvalds 	/*
244*1da177e4SLinus Torvalds 	 * bits 10-8:	source QBB ID
245*1da177e4SLinus Torvalds 	 * bits 7-6:	PCA
246*1da177e4SLinus Torvalds 	 * bits 5-0:	irq in PCA
247*1da177e4SLinus Torvalds 	 */
248*1da177e4SLinus Torvalds 
249*1da177e4SLinus Torvalds 	handle_irq(irq, regs);
250*1da177e4SLinus Torvalds 	return;
251*1da177e4SLinus Torvalds }
252*1da177e4SLinus Torvalds 
253*1da177e4SLinus Torvalds /*
254*1da177e4SLinus Torvalds  * PCI Fixup configuration.
255*1da177e4SLinus Torvalds  *
256*1da177e4SLinus Torvalds  * Summary per PCA (2 PCI or HIPPI buses):
257*1da177e4SLinus Torvalds  *
258*1da177e4SLinus Torvalds  * Bit      Meaning
259*1da177e4SLinus Torvalds  * 0-15     ISA
260*1da177e4SLinus Torvalds  *
261*1da177e4SLinus Torvalds  *32        ISA summary
262*1da177e4SLinus Torvalds  *33        SMI
263*1da177e4SLinus Torvalds  *34        NMI
264*1da177e4SLinus Torvalds  *36        builtin QLogic SCSI (or slot 0 if no IO module)
265*1da177e4SLinus Torvalds  *40        Interrupt Line A from slot 2 PCI0
266*1da177e4SLinus Torvalds  *41        Interrupt Line B from slot 2 PCI0
267*1da177e4SLinus Torvalds  *42        Interrupt Line C from slot 2 PCI0
268*1da177e4SLinus Torvalds  *43        Interrupt Line D from slot 2 PCI0
269*1da177e4SLinus Torvalds  *44        Interrupt Line A from slot 3 PCI0
270*1da177e4SLinus Torvalds  *45        Interrupt Line B from slot 3 PCI0
271*1da177e4SLinus Torvalds  *46        Interrupt Line C from slot 3 PCI0
272*1da177e4SLinus Torvalds  *47        Interrupt Line D from slot 3 PCI0
273*1da177e4SLinus Torvalds  *
274*1da177e4SLinus Torvalds  *48        Interrupt Line A from slot 4 PCI1
275*1da177e4SLinus Torvalds  *49        Interrupt Line B from slot 4 PCI1
276*1da177e4SLinus Torvalds  *50        Interrupt Line C from slot 4 PCI1
277*1da177e4SLinus Torvalds  *51        Interrupt Line D from slot 4 PCI1
278*1da177e4SLinus Torvalds  *52        Interrupt Line A from slot 5 PCI1
279*1da177e4SLinus Torvalds  *53        Interrupt Line B from slot 5 PCI1
280*1da177e4SLinus Torvalds  *54        Interrupt Line C from slot 5 PCI1
281*1da177e4SLinus Torvalds  *55        Interrupt Line D from slot 5 PCI1
282*1da177e4SLinus Torvalds  *56        Interrupt Line A from slot 6 PCI1
283*1da177e4SLinus Torvalds  *57        Interrupt Line B from slot 6 PCI1
284*1da177e4SLinus Torvalds  *58        Interrupt Line C from slot 6 PCI1
285*1da177e4SLinus Torvalds  *50        Interrupt Line D from slot 6 PCI1
286*1da177e4SLinus Torvalds  *60        Interrupt Line A from slot 7 PCI1
287*1da177e4SLinus Torvalds  *61        Interrupt Line B from slot 7 PCI1
288*1da177e4SLinus Torvalds  *62        Interrupt Line C from slot 7 PCI1
289*1da177e4SLinus Torvalds  *63        Interrupt Line D from slot 7 PCI1
290*1da177e4SLinus Torvalds  *
291*1da177e4SLinus Torvalds  *
292*1da177e4SLinus Torvalds  * IdSel
293*1da177e4SLinus Torvalds  *   0	 Cypress Bridge I/O (ISA summary interrupt)
294*1da177e4SLinus Torvalds  *   1	 64 bit PCI 0 option slot 1 (SCSI QLogic builtin)
295*1da177e4SLinus Torvalds  *   2	 64 bit PCI 0 option slot 2
296*1da177e4SLinus Torvalds  *   3	 64 bit PCI 0 option slot 3
297*1da177e4SLinus Torvalds  *   4	 64 bit PCI 1 option slot 4
298*1da177e4SLinus Torvalds  *   5	 64 bit PCI 1 option slot 5
299*1da177e4SLinus Torvalds  *   6	 64 bit PCI 1 option slot 6
300*1da177e4SLinus Torvalds  *   7	 64 bit PCI 1 option slot 7
301*1da177e4SLinus Torvalds  */
302*1da177e4SLinus Torvalds 
303*1da177e4SLinus Torvalds static int __init
304*1da177e4SLinus Torvalds wildfire_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
305*1da177e4SLinus Torvalds {
306*1da177e4SLinus Torvalds 	static char irq_tab[8][5] __initdata = {
307*1da177e4SLinus Torvalds 		/*INT    INTA   INTB   INTC   INTD */
308*1da177e4SLinus Torvalds 		{ -1,    -1,    -1,    -1,    -1}, /* IdSel 0 ISA Bridge */
309*1da177e4SLinus Torvalds 		{ 36,    36,    36+1, 36+2, 36+3}, /* IdSel 1 SCSI builtin */
310*1da177e4SLinus Torvalds 		{ 40,    40,    40+1, 40+2, 40+3}, /* IdSel 2 PCI 0 slot 2 */
311*1da177e4SLinus Torvalds 		{ 44,    44,    44+1, 44+2, 44+3}, /* IdSel 3 PCI 0 slot 3 */
312*1da177e4SLinus Torvalds 		{ 48,    48,    48+1, 48+2, 48+3}, /* IdSel 4 PCI 1 slot 4 */
313*1da177e4SLinus Torvalds 		{ 52,    52,    52+1, 52+2, 52+3}, /* IdSel 5 PCI 1 slot 5 */
314*1da177e4SLinus Torvalds 		{ 56,    56,    56+1, 56+2, 56+3}, /* IdSel 6 PCI 1 slot 6 */
315*1da177e4SLinus Torvalds 		{ 60,    60,    60+1, 60+2, 60+3}, /* IdSel 7 PCI 1 slot 7 */
316*1da177e4SLinus Torvalds 	};
317*1da177e4SLinus Torvalds 	long min_idsel = 0, max_idsel = 7, irqs_per_slot = 5;
318*1da177e4SLinus Torvalds 
319*1da177e4SLinus Torvalds 	struct pci_controller *hose = dev->sysdata;
320*1da177e4SLinus Torvalds 	int irq = COMMON_TABLE_LOOKUP;
321*1da177e4SLinus Torvalds 
322*1da177e4SLinus Torvalds 	if (irq > 0) {
323*1da177e4SLinus Torvalds 		int qbbno = hose->index >> 3;
324*1da177e4SLinus Torvalds 		int pcano = (hose->index >> 1) & 3;
325*1da177e4SLinus Torvalds 		irq += (qbbno << 8) + (pcano << 6);
326*1da177e4SLinus Torvalds 	}
327*1da177e4SLinus Torvalds 	return irq;
328*1da177e4SLinus Torvalds }
329*1da177e4SLinus Torvalds 
330*1da177e4SLinus Torvalds 
331*1da177e4SLinus Torvalds /*
332*1da177e4SLinus Torvalds  * The System Vectors
333*1da177e4SLinus Torvalds  */
334*1da177e4SLinus Torvalds 
335*1da177e4SLinus Torvalds struct alpha_machine_vector wildfire_mv __initmv = {
336*1da177e4SLinus Torvalds 	.vector_name		= "WILDFIRE",
337*1da177e4SLinus Torvalds 	DO_EV6_MMU,
338*1da177e4SLinus Torvalds 	DO_DEFAULT_RTC,
339*1da177e4SLinus Torvalds 	DO_WILDFIRE_IO,
340*1da177e4SLinus Torvalds 	.machine_check		= wildfire_machine_check,
341*1da177e4SLinus Torvalds 	.max_isa_dma_address	= ALPHA_MAX_ISA_DMA_ADDRESS,
342*1da177e4SLinus Torvalds 	.min_io_address		= DEFAULT_IO_BASE,
343*1da177e4SLinus Torvalds 	.min_mem_address	= DEFAULT_MEM_BASE,
344*1da177e4SLinus Torvalds 
345*1da177e4SLinus Torvalds 	.nr_irqs		= WILDFIRE_NR_IRQS,
346*1da177e4SLinus Torvalds 	.device_interrupt	= wildfire_device_interrupt,
347*1da177e4SLinus Torvalds 
348*1da177e4SLinus Torvalds 	.init_arch		= wildfire_init_arch,
349*1da177e4SLinus Torvalds 	.init_irq		= wildfire_init_irq,
350*1da177e4SLinus Torvalds 	.init_rtc		= common_init_rtc,
351*1da177e4SLinus Torvalds 	.init_pci		= common_init_pci,
352*1da177e4SLinus Torvalds 	.kill_arch		= wildfire_kill_arch,
353*1da177e4SLinus Torvalds 	.pci_map_irq		= wildfire_map_irq,
354*1da177e4SLinus Torvalds 	.pci_swizzle		= common_swizzle,
355*1da177e4SLinus Torvalds 
356*1da177e4SLinus Torvalds 	.pa_to_nid		= wildfire_pa_to_nid,
357*1da177e4SLinus Torvalds 	.cpuid_to_nid		= wildfire_cpuid_to_nid,
358*1da177e4SLinus Torvalds 	.node_mem_start		= wildfire_node_mem_start,
359*1da177e4SLinus Torvalds 	.node_mem_size		= wildfire_node_mem_size,
360*1da177e4SLinus Torvalds };
361*1da177e4SLinus Torvalds ALIAS_MV(wildfire)
362