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