1
2
3
4
5
6
7#include <linux/types.h>
8#include <linux/kernel.h>
9#include <linux/pci.h>
10#include <linux/init.h>
11#include <linux/interrupt.h>
12#include <linux/dmi.h>
13#include <linux/io.h>
14#include <linux/smp.h>
15#include <asm/io_apic.h>
16#include <linux/irq.h>
17#include <linux/acpi.h>
18#include <asm/pci_x86.h>
19
20#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
21#define PIRQ_VERSION 0x0100
22
23static int broken_hp_bios_irq9;
24static int acer_tm360_irqrouting;
25
26static struct irq_routing_table *pirq_table;
27
28static int pirq_enable_irq(struct pci_dev *dev);
29
30
31
32
33
34
35unsigned int pcibios_irq_mask = 0xfff8;
36
37static int pirq_penalty[16] = {
38 1000000, 1000000, 1000000, 1000, 1000, 0, 1000, 1000,
39 0, 0, 0, 0, 1000, 100000, 100000, 100000
40};
41
42struct irq_router {
43 char *name;
44 u16 vendor, device;
45 int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq);
46 int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq,
47 int new);
48};
49
50struct irq_router_handler {
51 u16 vendor;
52 int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device);
53};
54
55int (*pcibios_enable_irq)(struct pci_dev *dev) = pirq_enable_irq;
56void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL;
57
58
59
60
61
62
63static inline struct irq_routing_table *pirq_check_routing_table(u8 *addr)
64{
65 struct irq_routing_table *rt;
66 int i;
67 u8 sum;
68
69 rt = (struct irq_routing_table *) addr;
70 if (rt->signature != PIRQ_SIGNATURE ||
71 rt->version != PIRQ_VERSION ||
72 rt->size % 16 ||
73 rt->size < sizeof(struct irq_routing_table))
74 return NULL;
75 sum = 0;
76 for (i = 0; i < rt->size; i++)
77 sum += addr[i];
78 if (!sum) {
79 DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n",
80 rt);
81 return rt;
82 }
83 return NULL;
84}
85
86
87
88
89
90
91
92static struct irq_routing_table * __init pirq_find_routing_table(void)
93{
94 u8 *addr;
95 struct irq_routing_table *rt;
96
97 if (pirq_table_addr) {
98 rt = pirq_check_routing_table((u8 *) __va(pirq_table_addr));
99 if (rt)
100 return rt;
101 printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
102 }
103 for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
104 rt = pirq_check_routing_table(addr);
105 if (rt)
106 return rt;
107 }
108 return NULL;
109}
110
111
112
113
114
115
116
117static void __init pirq_peer_trick(void)
118{
119 struct irq_routing_table *rt = pirq_table;
120 u8 busmap[256];
121 int i;
122 struct irq_info *e;
123
124 memset(busmap, 0, sizeof(busmap));
125 for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
126 e = &rt->slots[i];
127#ifdef DEBUG
128 {
129 int j;
130 DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot);
131 for (j = 0; j < 4; j++)
132 DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap);
133 DBG("\n");
134 }
135#endif
136 busmap[e->bus] = 1;
137 }
138 for (i = 1; i < 256; i++) {
139 int node;
140 if (!busmap[i] || pci_find_bus(0, i))
141 continue;
142 node = get_mp_bus_to_node(i);
143 if (pci_scan_bus_on_node(i, &pci_root_ops, node))
144 printk(KERN_INFO "PCI: Discovered primary peer "
145 "bus %02x [IRQ]\n", i);
146 }
147 pcibios_last_bus = -1;
148}
149
150
151
152
153
154void eisa_set_level_irq(unsigned int irq)
155{
156 unsigned char mask = 1 << (irq & 7);
157 unsigned int port = 0x4d0 + (irq >> 3);
158 unsigned char val;
159 static u16 eisa_irq_mask;
160
161 if (irq >= 16 || (1 << irq) & eisa_irq_mask)
162 return;
163
164 eisa_irq_mask |= (1 << irq);
165 printk(KERN_DEBUG "PCI: setting IRQ %u as level-triggered\n", irq);
166 val = inb(port);
167 if (!(val & mask)) {
168 DBG(KERN_DEBUG " -> edge");
169 outb(val | mask, port);
170 }
171}
172
173
174
175
176
177static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
178{
179 u8 x;
180 unsigned reg = offset + (nr >> 1);
181
182 pci_read_config_byte(router, reg, &x);
183 return (nr & 1) ? (x >> 4) : (x & 0xf);
184}
185
186static void write_config_nybble(struct pci_dev *router, unsigned offset,
187 unsigned nr, unsigned int val)
188{
189 u8 x;
190 unsigned reg = offset + (nr >> 1);
191
192 pci_read_config_byte(router, reg, &x);
193 x = (nr & 1) ? ((x & 0x0f) | (val << 4)) : ((x & 0xf0) | val);
194 pci_write_config_byte(router, reg, x);
195}
196
197
198
199
200
201
202static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
203{
204 static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
205
206 WARN_ON_ONCE(pirq > 16);
207 return irqmap[read_config_nybble(router, 0x48, pirq-1)];
208}
209
210static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
211{
212 static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
213 unsigned int val = irqmap[irq];
214
215 WARN_ON_ONCE(pirq > 16);
216 if (val) {
217 write_config_nybble(router, 0x48, pirq-1, val);
218 return 1;
219 }
220 return 0;
221}
222
223
224
225
226
227static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
228{
229 u8 x;
230
231 pci_read_config_byte(router, pirq, &x);
232 return (x < 16) ? x : 0;
233}
234
235static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
236{
237 pci_write_config_byte(router, pirq, irq);
238 return 1;
239}
240
241
242
243
244
245
246static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
247{
248 return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
249}
250
251static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
252{
253 write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
254 return 1;
255}
256
257
258
259
260
261
262static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
263{
264 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
265
266 WARN_ON_ONCE(pirq > 5);
267 return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
268}
269
270static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
271{
272 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
273
274 WARN_ON_ONCE(pirq > 5);
275 write_config_nybble(router, 0x55, pirqmap[pirq-1], irq);
276 return 1;
277}
278
279
280
281
282
283
284static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
285{
286 static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
287
288 WARN_ON_ONCE(pirq > 4);
289 return read_config_nybble(router, 0x43, pirqmap[pirq-1]);
290}
291
292static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
293{
294 static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
295
296 WARN_ON_ONCE(pirq > 4);
297 write_config_nybble(router, 0x43, pirqmap[pirq-1], irq);
298 return 1;
299}
300
301
302
303
304
305static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
306{
307 return read_config_nybble(router, 0xb8, pirq >> 4);
308}
309
310static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
311{
312 write_config_nybble(router, 0xb8, pirq >> 4, irq);
313 return 1;
314}
315
316
317
318
319
320
321static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
322{
323 return read_config_nybble(router, 0x5C, (pirq-1)^1);
324}
325
326static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
327{
328 write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
329 return 1;
330}
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393#define PIRQ_SIS_IRQ_MASK 0x0f
394#define PIRQ_SIS_IRQ_DISABLE 0x80
395#define PIRQ_SIS_USB_ENABLE 0x40
396
397static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
398{
399 u8 x;
400 int reg;
401
402 reg = pirq;
403 if (reg >= 0x01 && reg <= 0x04)
404 reg += 0x40;
405 pci_read_config_byte(router, reg, &x);
406 return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK);
407}
408
409static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
410{
411 u8 x;
412 int reg;
413
414 reg = pirq;
415 if (reg >= 0x01 && reg <= 0x04)
416 reg += 0x40;
417 pci_read_config_byte(router, reg, &x);
418 x &= ~(PIRQ_SIS_IRQ_MASK | PIRQ_SIS_IRQ_DISABLE);
419 x |= irq ? irq: PIRQ_SIS_IRQ_DISABLE;
420 pci_write_config_byte(router, reg, x);
421 return 1;
422}
423
424
425
426
427
428
429
430
431
432
433static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
434{
435 WARN_ON_ONCE(pirq >= 9);
436 if (pirq > 8) {
437 dev_info(&dev->dev, "VLSI router PIRQ escape (%d)\n", pirq);
438 return 0;
439 }
440 return read_config_nybble(router, 0x74, pirq-1);
441}
442
443static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
444{
445 WARN_ON_ONCE(pirq >= 9);
446 if (pirq > 8) {
447 dev_info(&dev->dev, "VLSI router PIRQ escape (%d)\n", pirq);
448 return 0;
449 }
450 write_config_nybble(router, 0x74, pirq-1, irq);
451 return 1;
452}
453
454
455
456
457
458
459
460
461
462
463
464
465static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
466{
467 outb(pirq, 0xc00);
468 return inb(0xc01) & 0xf;
469}
470
471static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev,
472 int pirq, int irq)
473{
474 outb(pirq, 0xc00);
475 outb(irq, 0xc01);
476 return 1;
477}
478
479
480
481
482
483
484
485
486
487static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
488{
489 u8 irq;
490 irq = 0;
491 if (pirq <= 4)
492 irq = read_config_nybble(router, 0x56, pirq - 1);
493 dev_info(&dev->dev,
494 "AMD756: dev [%04x:%04x], router PIRQ %d get IRQ %d\n",
495 dev->vendor, dev->device, pirq, irq);
496 return irq;
497}
498
499static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
500{
501 dev_info(&dev->dev,
502 "AMD756: dev [%04x:%04x], router PIRQ %d set IRQ %d\n",
503 dev->vendor, dev->device, pirq, irq);
504 if (pirq <= 4)
505 write_config_nybble(router, 0x56, pirq - 1, irq);
506 return 1;
507}
508
509
510
511
512static int pirq_pico_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
513{
514 outb(0x10 + ((pirq - 1) >> 1), 0x24);
515 return ((pirq - 1) & 1) ? (inb(0x26) >> 4) : (inb(0x26) & 0xf);
516}
517
518static int pirq_pico_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
519 int irq)
520{
521 unsigned int x;
522 outb(0x10 + ((pirq - 1) >> 1), 0x24);
523 x = inb(0x26);
524 x = ((pirq - 1) & 1) ? ((x & 0x0f) | (irq << 4)) : ((x & 0xf0) | (irq));
525 outb(x, 0x26);
526 return 1;
527}
528
529#ifdef CONFIG_PCI_BIOS
530
531static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
532{
533 struct pci_dev *bridge;
534 int pin = pci_get_interrupt_pin(dev, &bridge);
535 return pcibios_set_irq_routing(bridge, pin - 1, irq);
536}
537
538#endif
539
540static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
541{
542 static struct pci_device_id __initdata pirq_440gx[] = {
543 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
544 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
545 { },
546 };
547
548
549 if (pci_dev_present(pirq_440gx))
550 return 0;
551
552 switch (device) {
553 case PCI_DEVICE_ID_INTEL_82371FB_0:
554 case PCI_DEVICE_ID_INTEL_82371SB_0:
555 case PCI_DEVICE_ID_INTEL_82371AB_0:
556 case PCI_DEVICE_ID_INTEL_82371MX:
557 case PCI_DEVICE_ID_INTEL_82443MX_0:
558 case PCI_DEVICE_ID_INTEL_82801AA_0:
559 case PCI_DEVICE_ID_INTEL_82801AB_0:
560 case PCI_DEVICE_ID_INTEL_82801BA_0:
561 case PCI_DEVICE_ID_INTEL_82801BA_10:
562 case PCI_DEVICE_ID_INTEL_82801CA_0:
563 case PCI_DEVICE_ID_INTEL_82801CA_12:
564 case PCI_DEVICE_ID_INTEL_82801DB_0:
565 case PCI_DEVICE_ID_INTEL_82801E_0:
566 case PCI_DEVICE_ID_INTEL_82801EB_0:
567 case PCI_DEVICE_ID_INTEL_ESB_1:
568 case PCI_DEVICE_ID_INTEL_ICH6_0:
569 case PCI_DEVICE_ID_INTEL_ICH6_1:
570 case PCI_DEVICE_ID_INTEL_ICH7_0:
571 case PCI_DEVICE_ID_INTEL_ICH7_1:
572 case PCI_DEVICE_ID_INTEL_ICH7_30:
573 case PCI_DEVICE_ID_INTEL_ICH7_31:
574 case PCI_DEVICE_ID_INTEL_TGP_LPC:
575 case PCI_DEVICE_ID_INTEL_ESB2_0:
576 case PCI_DEVICE_ID_INTEL_ICH8_0:
577 case PCI_DEVICE_ID_INTEL_ICH8_1:
578 case PCI_DEVICE_ID_INTEL_ICH8_2:
579 case PCI_DEVICE_ID_INTEL_ICH8_3:
580 case PCI_DEVICE_ID_INTEL_ICH8_4:
581 case PCI_DEVICE_ID_INTEL_ICH9_0:
582 case PCI_DEVICE_ID_INTEL_ICH9_1:
583 case PCI_DEVICE_ID_INTEL_ICH9_2:
584 case PCI_DEVICE_ID_INTEL_ICH9_3:
585 case PCI_DEVICE_ID_INTEL_ICH9_4:
586 case PCI_DEVICE_ID_INTEL_ICH9_5:
587 case PCI_DEVICE_ID_INTEL_EP80579_0:
588 case PCI_DEVICE_ID_INTEL_ICH10_0:
589 case PCI_DEVICE_ID_INTEL_ICH10_1:
590 case PCI_DEVICE_ID_INTEL_ICH10_2:
591 case PCI_DEVICE_ID_INTEL_ICH10_3:
592 case PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0:
593 case PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1:
594 r->name = "PIIX/ICH";
595 r->get = pirq_piix_get;
596 r->set = pirq_piix_set;
597 return 1;
598 }
599
600 if ((device >= PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN &&
601 device <= PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX)
602 || (device >= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN &&
603 device <= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX)
604 || (device >= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN &&
605 device <= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX)) {
606 r->name = "PIIX/ICH";
607 r->get = pirq_piix_get;
608 r->set = pirq_piix_set;
609 return 1;
610 }
611
612 return 0;
613}
614
615static __init int via_router_probe(struct irq_router *r,
616 struct pci_dev *router, u16 device)
617{
618
619
620
621
622
623 if (device == PCI_DEVICE_ID_VIA_82C586_0) {
624 switch (router->device) {
625 case PCI_DEVICE_ID_VIA_82C686:
626
627
628
629
630 device = PCI_DEVICE_ID_VIA_82C686;
631 break;
632 case PCI_DEVICE_ID_VIA_8235:
633
634
635
636
637 device = PCI_DEVICE_ID_VIA_8235;
638 break;
639 case PCI_DEVICE_ID_VIA_8237:
640
641
642
643
644 device = PCI_DEVICE_ID_VIA_8237;
645 break;
646 }
647 }
648
649 switch (device) {
650 case PCI_DEVICE_ID_VIA_82C586_0:
651 r->name = "VIA";
652 r->get = pirq_via586_get;
653 r->set = pirq_via586_set;
654 return 1;
655 case PCI_DEVICE_ID_VIA_82C596:
656 case PCI_DEVICE_ID_VIA_82C686:
657 case PCI_DEVICE_ID_VIA_8231:
658 case PCI_DEVICE_ID_VIA_8233A:
659 case PCI_DEVICE_ID_VIA_8235:
660 case PCI_DEVICE_ID_VIA_8237:
661
662 r->name = "VIA";
663 r->get = pirq_via_get;
664 r->set = pirq_via_set;
665 return 1;
666 }
667 return 0;
668}
669
670static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
671{
672 switch (device) {
673 case PCI_DEVICE_ID_VLSI_82C534:
674 r->name = "VLSI 82C534";
675 r->get = pirq_vlsi_get;
676 r->set = pirq_vlsi_set;
677 return 1;
678 }
679 return 0;
680}
681
682
683static __init int serverworks_router_probe(struct irq_router *r,
684 struct pci_dev *router, u16 device)
685{
686 switch (device) {
687 case PCI_DEVICE_ID_SERVERWORKS_OSB4:
688 case PCI_DEVICE_ID_SERVERWORKS_CSB5:
689 r->name = "ServerWorks";
690 r->get = pirq_serverworks_get;
691 r->set = pirq_serverworks_set;
692 return 1;
693 }
694 return 0;
695}
696
697static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
698{
699 if (device != PCI_DEVICE_ID_SI_503)
700 return 0;
701
702 r->name = "SIS";
703 r->get = pirq_sis_get;
704 r->set = pirq_sis_set;
705 return 1;
706}
707
708static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
709{
710 switch (device) {
711 case PCI_DEVICE_ID_CYRIX_5520:
712 r->name = "NatSemi";
713 r->get = pirq_cyrix_get;
714 r->set = pirq_cyrix_set;
715 return 1;
716 }
717 return 0;
718}
719
720static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
721{
722 switch (device) {
723 case PCI_DEVICE_ID_OPTI_82C700:
724 r->name = "OPTI";
725 r->get = pirq_opti_get;
726 r->set = pirq_opti_set;
727 return 1;
728 }
729 return 0;
730}
731
732static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
733{
734 switch (device) {
735 case PCI_DEVICE_ID_ITE_IT8330G_0:
736 r->name = "ITE";
737 r->get = pirq_ite_get;
738 r->set = pirq_ite_set;
739 return 1;
740 }
741 return 0;
742}
743
744static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
745{
746 switch (device) {
747 case PCI_DEVICE_ID_AL_M1533:
748 case PCI_DEVICE_ID_AL_M1563:
749 r->name = "ALI";
750 r->get = pirq_ali_get;
751 r->set = pirq_ali_set;
752 return 1;
753 }
754 return 0;
755}
756
757static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
758{
759 switch (device) {
760 case PCI_DEVICE_ID_AMD_VIPER_740B:
761 r->name = "AMD756";
762 break;
763 case PCI_DEVICE_ID_AMD_VIPER_7413:
764 r->name = "AMD766";
765 break;
766 case PCI_DEVICE_ID_AMD_VIPER_7443:
767 r->name = "AMD768";
768 break;
769 default:
770 return 0;
771 }
772 r->get = pirq_amd756_get;
773 r->set = pirq_amd756_set;
774 return 1;
775}
776
777static __init int pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
778{
779 switch (device) {
780 case PCI_DEVICE_ID_PICOPOWER_PT86C523:
781 r->name = "PicoPower PT86C523";
782 r->get = pirq_pico_get;
783 r->set = pirq_pico_set;
784 return 1;
785
786 case PCI_DEVICE_ID_PICOPOWER_PT86C523BBP:
787 r->name = "PicoPower PT86C523 rev. BB+";
788 r->get = pirq_pico_get;
789 r->set = pirq_pico_set;
790 return 1;
791 }
792 return 0;
793}
794
795static __initdata struct irq_router_handler pirq_routers[] = {
796 { PCI_VENDOR_ID_INTEL, intel_router_probe },
797 { PCI_VENDOR_ID_AL, ali_router_probe },
798 { PCI_VENDOR_ID_ITE, ite_router_probe },
799 { PCI_VENDOR_ID_VIA, via_router_probe },
800 { PCI_VENDOR_ID_OPTI, opti_router_probe },
801 { PCI_VENDOR_ID_SI, sis_router_probe },
802 { PCI_VENDOR_ID_CYRIX, cyrix_router_probe },
803 { PCI_VENDOR_ID_VLSI, vlsi_router_probe },
804 { PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe },
805 { PCI_VENDOR_ID_AMD, amd_router_probe },
806 { PCI_VENDOR_ID_PICOPOWER, pico_router_probe },
807
808 { 0, NULL }
809};
810static struct irq_router pirq_router;
811static struct pci_dev *pirq_router_dev;
812
813
814
815
816
817
818
819static void __init pirq_find_router(struct irq_router *r)
820{
821 struct irq_routing_table *rt = pirq_table;
822 struct irq_router_handler *h;
823
824#ifdef CONFIG_PCI_BIOS
825 if (!rt->signature) {
826 printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n");
827 r->set = pirq_bios_set;
828 r->name = "BIOS";
829 return;
830 }
831#endif
832
833
834 r->name = "default";
835 r->get = NULL;
836 r->set = NULL;
837
838 DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for [%04x:%04x]\n",
839 rt->rtr_vendor, rt->rtr_device);
840
841 pirq_router_dev = pci_get_bus_and_slot(rt->rtr_bus, rt->rtr_devfn);
842 if (!pirq_router_dev) {
843 DBG(KERN_DEBUG "PCI: Interrupt router not found at "
844 "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn);
845 return;
846 }
847
848 for (h = pirq_routers; h->vendor; h++) {
849
850 if (rt->rtr_vendor == h->vendor &&
851 h->probe(r, pirq_router_dev, rt->rtr_device))
852 break;
853
854 if (pirq_router_dev->vendor == h->vendor &&
855 h->probe(r, pirq_router_dev, pirq_router_dev->device))
856 break;
857 }
858 dev_info(&pirq_router_dev->dev, "%s IRQ router [%04x:%04x]\n",
859 pirq_router.name,
860 pirq_router_dev->vendor, pirq_router_dev->device);
861
862
863}
864
865static struct irq_info *pirq_get_info(struct pci_dev *dev)
866{
867 struct irq_routing_table *rt = pirq_table;
868 int entries = (rt->size - sizeof(struct irq_routing_table)) /
869 sizeof(struct irq_info);
870 struct irq_info *info;
871
872 for (info = rt->slots; entries--; info++)
873 if (info->bus == dev->bus->number &&
874 PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn))
875 return info;
876 return NULL;
877}
878
879static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
880{
881 u8 pin;
882 struct irq_info *info;
883 int i, pirq, newirq;
884 int irq = 0;
885 u32 mask;
886 struct irq_router *r = &pirq_router;
887 struct pci_dev *dev2 = NULL;
888 char *msg = NULL;
889
890
891 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
892 if (!pin) {
893 dev_dbg(&dev->dev, "no interrupt pin\n");
894 return 0;
895 }
896
897 if (io_apic_assign_pci_irqs)
898 return 0;
899
900
901
902 if (!pirq_table)
903 return 0;
904
905 info = pirq_get_info(dev);
906 if (!info) {
907 dev_dbg(&dev->dev, "PCI INT %c not found in routing table\n",
908 'A' + pin - 1);
909 return 0;
910 }
911 pirq = info->irq[pin - 1].link;
912 mask = info->irq[pin - 1].bitmap;
913 if (!pirq) {
914 dev_dbg(&dev->dev, "PCI INT %c not routed\n", 'A' + pin - 1);
915 return 0;
916 }
917 dev_dbg(&dev->dev, "PCI INT %c -> PIRQ %02x, mask %04x, excl %04x",
918 'A' + pin - 1, pirq, mask, pirq_table->exclusive_irqs);
919 mask &= pcibios_irq_mask;
920
921
922
923
924 if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) {
925 dev->irq = 11;
926 pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
927 r->set(pirq_router_dev, dev, pirq, 11);
928 }
929
930
931 if (acer_tm360_irqrouting && dev->irq == 11 &&
932 dev->vendor == PCI_VENDOR_ID_O2) {
933 pirq = 0x68;
934 mask = 0x400;
935 dev->irq = r->get(pirq_router_dev, dev, pirq);
936 pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
937 }
938
939
940
941
942
943 newirq = dev->irq;
944 if (newirq && !((1 << newirq) & mask)) {
945 if (pci_probe & PCI_USE_PIRQ_MASK)
946 newirq = 0;
947 else
948 dev_warn(&dev->dev, "IRQ %d doesn't match PIRQ mask "
949 "%#x; try pci=usepirqmask\n", newirq, mask);
950 }
951 if (!newirq && assign) {
952 for (i = 0; i < 16; i++) {
953 if (!(mask & (1 << i)))
954 continue;
955 if (pirq_penalty[i] < pirq_penalty[newirq] &&
956 can_request_irq(i, IRQF_SHARED))
957 newirq = i;
958 }
959 }
960 dev_dbg(&dev->dev, "PCI INT %c -> newirq %d", 'A' + pin - 1, newirq);
961
962
963 if ((pirq & 0xf0) == 0xf0) {
964 irq = pirq & 0xf;
965 msg = "hardcoded";
966 } else if (r->get && (irq = r->get(pirq_router_dev, dev, pirq)) && \
967 ((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask))) {
968 msg = "found";
969 eisa_set_level_irq(irq);
970 } else if (newirq && r->set &&
971 (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
972 if (r->set(pirq_router_dev, dev, pirq, newirq)) {
973 eisa_set_level_irq(newirq);
974 msg = "assigned";
975 irq = newirq;
976 }
977 }
978
979 if (!irq) {
980 if (newirq && mask == (1 << newirq)) {
981 msg = "guessed";
982 irq = newirq;
983 } else {
984 dev_dbg(&dev->dev, "can't route interrupt\n");
985 return 0;
986 }
987 }
988 dev_info(&dev->dev, "%s PCI INT %c -> IRQ %d\n", msg, 'A' + pin - 1, irq);
989
990
991 for_each_pci_dev(dev2) {
992 pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin);
993 if (!pin)
994 continue;
995
996 info = pirq_get_info(dev2);
997 if (!info)
998 continue;
999 if (info->irq[pin - 1].link == pirq) {
1000
1001
1002
1003
1004 if (dev2->irq && dev2->irq != irq && \
1005 (!(pci_probe & PCI_USE_PIRQ_MASK) || \
1006 ((1 << dev2->irq) & mask))) {
1007#ifndef CONFIG_PCI_MSI
1008 dev_info(&dev2->dev, "IRQ routing conflict: "
1009 "have IRQ %d, want IRQ %d\n",
1010 dev2->irq, irq);
1011#endif
1012 continue;
1013 }
1014 dev2->irq = irq;
1015 pirq_penalty[irq]++;
1016 if (dev != dev2)
1017 dev_info(&dev->dev, "sharing IRQ %d with %s\n",
1018 irq, pci_name(dev2));
1019 }
1020 }
1021 return 1;
1022}
1023
1024void __init pcibios_fixup_irqs(void)
1025{
1026 struct pci_dev *dev = NULL;
1027 u8 pin;
1028
1029 DBG(KERN_DEBUG "PCI: IRQ fixup\n");
1030 for_each_pci_dev(dev) {
1031
1032
1033
1034
1035
1036 if (dev->irq >= 16) {
1037 dev_dbg(&dev->dev, "ignoring bogus IRQ %d\n", dev->irq);
1038 dev->irq = 0;
1039 }
1040
1041
1042
1043
1044 if (pirq_penalty[dev->irq] >= 100 &&
1045 pirq_penalty[dev->irq] < 100000)
1046 pirq_penalty[dev->irq] = 0;
1047 pirq_penalty[dev->irq]++;
1048 }
1049
1050 if (io_apic_assign_pci_irqs)
1051 return;
1052
1053 dev = NULL;
1054 for_each_pci_dev(dev) {
1055 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
1056 if (!pin)
1057 continue;
1058
1059
1060
1061
1062 if (!dev->irq)
1063 pcibios_lookup_irq(dev, 0);
1064 }
1065}
1066
1067
1068
1069
1070
1071static int __init fix_broken_hp_bios_irq9(const struct dmi_system_id *d)
1072{
1073 if (!broken_hp_bios_irq9) {
1074 broken_hp_bios_irq9 = 1;
1075 printk(KERN_INFO "%s detected - fixing broken IRQ routing\n",
1076 d->ident);
1077 }
1078 return 0;
1079}
1080
1081
1082
1083
1084
1085static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d)
1086{
1087 if (!acer_tm360_irqrouting) {
1088 acer_tm360_irqrouting = 1;
1089 printk(KERN_INFO "%s detected - fixing broken IRQ routing\n",
1090 d->ident);
1091 }
1092 return 0;
1093}
1094
1095static struct dmi_system_id __initdata pciirq_dmi_table[] = {
1096 {
1097 .callback = fix_broken_hp_bios_irq9,
1098 .ident = "HP Pavilion N5400 Series Laptop",
1099 .matches = {
1100 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1101 DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"),
1102 DMI_MATCH(DMI_PRODUCT_VERSION,
1103 "HP Pavilion Notebook Model GE"),
1104 DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
1105 },
1106 },
1107 {
1108 .callback = fix_acer_tm360_irqrouting,
1109 .ident = "Acer TravelMate 36x Laptop",
1110 .matches = {
1111 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1112 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
1113 },
1114 },
1115 { }
1116};
1117
1118void __init pcibios_irq_init(void)
1119{
1120 DBG(KERN_DEBUG "PCI: IRQ init\n");
1121
1122 if (raw_pci_ops == NULL)
1123 return;
1124
1125 dmi_check_system(pciirq_dmi_table);
1126
1127 pirq_table = pirq_find_routing_table();
1128
1129#ifdef CONFIG_PCI_BIOS
1130 if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN))
1131 pirq_table = pcibios_get_irq_routing_table();
1132#endif
1133 if (pirq_table) {
1134 pirq_peer_trick();
1135 pirq_find_router(&pirq_router);
1136 if (pirq_table->exclusive_irqs) {
1137 int i;
1138 for (i = 0; i < 16; i++)
1139 if (!(pirq_table->exclusive_irqs & (1 << i)))
1140 pirq_penalty[i] += 100;
1141 }
1142
1143
1144
1145
1146 if (io_apic_assign_pci_irqs)
1147 pirq_table = NULL;
1148 }
1149
1150 x86_init.pci.fixup_irqs();
1151
1152 if (io_apic_assign_pci_irqs && pci_routeirq) {
1153 struct pci_dev *dev = NULL;
1154
1155
1156
1157
1158
1159 printk(KERN_INFO "PCI: Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n");
1160 for_each_pci_dev(dev)
1161 pirq_enable_irq(dev);
1162 }
1163}
1164
1165static void pirq_penalize_isa_irq(int irq, int active)
1166{
1167
1168
1169
1170
1171 if (irq < 16) {
1172 if (active)
1173 pirq_penalty[irq] += 1000;
1174 else
1175 pirq_penalty[irq] += 100;
1176 }
1177}
1178
1179void pcibios_penalize_isa_irq(int irq, int active)
1180{
1181#ifdef CONFIG_ACPI
1182 if (!acpi_noirq)
1183 acpi_penalize_isa_irq(irq, active);
1184 else
1185#endif
1186 pirq_penalize_isa_irq(irq, active);
1187}
1188
1189static int pirq_enable_irq(struct pci_dev *dev)
1190{
1191 u8 pin;
1192
1193 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
1194 if (pin && !pcibios_lookup_irq(dev, 1)) {
1195 char *msg = "";
1196
1197 if (!io_apic_assign_pci_irqs && dev->irq)
1198 return 0;
1199
1200 if (io_apic_assign_pci_irqs) {
1201#ifdef CONFIG_X86_IO_APIC
1202 struct pci_dev *temp_dev;
1203 int irq;
1204 struct io_apic_irq_attr irq_attr;
1205
1206 irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
1207 PCI_SLOT(dev->devfn),
1208 pin - 1, &irq_attr);
1209
1210
1211
1212
1213
1214
1215 temp_dev = dev;
1216 while (irq < 0 && dev->bus->parent) {
1217 struct pci_dev *bridge = dev->bus->self;
1218
1219 pin = pci_swizzle_interrupt_pin(dev, pin);
1220 irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
1221 PCI_SLOT(bridge->devfn),
1222 pin - 1, &irq_attr);
1223 if (irq >= 0)
1224 dev_warn(&dev->dev, "using bridge %s "
1225 "INT %c to get IRQ %d\n",
1226 pci_name(bridge), 'A' + pin - 1,
1227 irq);
1228 dev = bridge;
1229 }
1230 dev = temp_dev;
1231 if (irq >= 0) {
1232 io_apic_set_pci_routing(&dev->dev, irq,
1233 &irq_attr);
1234 dev->irq = irq;
1235 dev_info(&dev->dev, "PCI->APIC IRQ transform: "
1236 "INT %c -> IRQ %d\n", 'A' + pin - 1, irq);
1237 return 0;
1238 } else
1239 msg = "; probably buggy MP table";
1240#endif
1241 } else if (pci_probe & PCI_BIOS_IRQ_SCAN)
1242 msg = "";
1243 else
1244 msg = "; please try using pci=biosirq";
1245
1246
1247
1248
1249
1250 if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
1251 !(dev->class & 0x5))
1252 return 0;
1253
1254 dev_warn(&dev->dev, "can't find IRQ for PCI INT %c%s\n",
1255 'A' + pin - 1, msg);
1256 }
1257 return 0;
1258}
1259