12 #include <linux/kernel.h>
13 #include <linux/types.h>
15 #include <linux/sched.h>
16 #include <linux/pci.h>
18 #include <linux/bitops.h>
20 #include <asm/ptrace.h>
23 #include <asm/mmu_context.h>
25 #include <asm/pgtable.h>
29 #include <asm/tlbflush.h>
38 static unsigned long cached_irq_mask = ~0
UL;
41 cabriolet_update_irq_hw(
unsigned int irq,
unsigned long mask)
43 int ofs = (irq - 16) / 8;
44 outb(mask >> (16 + ofs * 8), 0x804 + ofs);
50 cabriolet_update_irq_hw(d->
irq, cached_irq_mask &= ~(1
UL << d->
irq));
56 cabriolet_update_irq_hw(d->
irq, cached_irq_mask |= 1
UL << d->
irq);
59 static struct irq_chip cabriolet_irq_type = {
61 .irq_unmask = cabriolet_enable_irq,
62 .irq_mask = cabriolet_disable_irq,
63 .irq_mask_ack = cabriolet_disable_irq,
67 cabriolet_device_interrupt(
unsigned long v)
73 pld =
inb(0x804) | (
inb(0x805) << 8) | (
inb(0x806) << 16);
91 common_init_irq(
void (*srm_dev_int)(
unsigned long v))
95 if (alpha_using_srm) {
96 alpha_mv.device_interrupt = srm_dev_int;
106 for (i = 16; i < 35; ++
i) {
107 irq_set_chip_and_handler(i, &cabriolet_irq_type,
117 #ifndef CONFIG_ALPHA_PC164
119 cabriolet_init_irq(
void)
125 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_PC164)
140 pc164_srm_device_interrupt(
unsigned long v)
148 pc164_device_interrupt(
unsigned long v)
151 cabriolet_device_interrupt(v);
158 common_init_irq(pc164_srm_device_interrupt);
181 {16+0, 16+0, 16+5, 16+9, 16+13},
182 {16+1, 16+1, 16+6, 16+10, 16+14},
183 { -1, -1, -1, -1, -1},
184 {16+2, 16+2, 16+7, 16+11, 16+15},
185 {16+3, 16+3, 16+8, 16+12, 16+6}
187 const long min_idsel = 6, max_idsel = 10, irqs_per_slot = 5;
211 { 16+2, 16+2, 16+7, 16+11, 16+15},
212 { 16+0, 16+0, 16+5, 16+9, 16+13},
213 { 16+1, 16+1, 16+6, 16+10, 16+14},
214 { -1, -1, -1, -1, -1},
215 { 16+3, 16+3, 16+8, 16+12, 16+16}
217 const long min_idsel = 5, max_idsel = 9, irqs_per_slot = 5;
222 cabriolet_enable_ide(
void)
235 cabriolet_init_pci(
void)
238 cabriolet_enable_ide();
242 cia_cab_init_pci(
void)
245 cabriolet_enable_ide();
295 { 16+2, 16+2, 16+9, 16+13, 16+17},
296 { 16+0, 16+0, 16+7, 16+11, 16+15},
297 { 16+1, 16+1, 16+8, 16+12, 16+16},
298 { -1, -1, -1, -1, -1},
299 { 16+3, 16+3, 16+10, 16+14, 16+18},
300 { 16+6, 16+6, 16+6, 16+6, 16+6},
301 { 16+5, 16+5, 16+5, 16+5, 16+5}
303 const long min_idsel = 5, max_idsel = 11, irqs_per_slot = 5;
308 alphapc164_init_pci(
void)
319 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_CABRIOLET)
320 struct alpha_machine_vector cabriolet_mv
__initmv = {
321 .vector_name =
"Cabriolet",
331 .device_interrupt = cabriolet_device_interrupt,
334 .init_irq = cabriolet_init_irq,
336 .init_pci = cabriolet_init_pci,
337 .pci_map_irq = cabriolet_map_irq,
340 #ifndef CONFIG_ALPHA_EB64P
345 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EB164)
346 struct alpha_machine_vector eb164_mv __initmv = {
347 .vector_name =
"EB164",
357 .device_interrupt = cabriolet_device_interrupt,
360 .init_irq = cabriolet_init_irq,
362 .init_pci = cia_cab_init_pci,
364 .pci_map_irq = cabriolet_map_irq,
370 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EB66P)
371 struct alpha_machine_vector eb66p_mv __initmv = {
372 .vector_name =
"EB66+",
382 .device_interrupt = cabriolet_device_interrupt,
385 .init_irq = cabriolet_init_irq,
387 .init_pci = cabriolet_init_pci,
388 .pci_map_irq = eb66p_map_irq,
394 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LX164)
395 struct alpha_machine_vector lx164_mv __initmv = {
396 .vector_name =
"LX164",
407 .device_interrupt = cabriolet_device_interrupt,
410 .init_irq = cabriolet_init_irq,
412 .init_pci = alphapc164_init_pci,
414 .pci_map_irq = alphapc164_map_irq,
420 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_PC164)
421 struct alpha_machine_vector pc164_mv __initmv = {
422 .vector_name =
"PC164",
432 .device_interrupt = pc164_device_interrupt,
435 .init_irq = pc164_init_irq,
437 .init_pci = alphapc164_init_pci,
439 .pci_map_irq = alphapc164_map_irq,