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