xref: /linux-6.15/arch/alpha/kernel/sys_dp264.c (revision 1da177e4)
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