diff options
Diffstat (limited to 'arch/x86/pci/irq.c')
-rw-r--r-- | arch/x86/pci/irq.c | 143 |
1 files changed, 48 insertions, 95 deletions
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index c422e10337be..6a06a2eb0597 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -102,8 +102,7 @@ static struct irq_routing_table * __init pirq_find_routing_table(void) | |||
102 | return rt; | 102 | return rt; |
103 | printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n"); | 103 | printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n"); |
104 | } | 104 | } |
105 | for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); | 105 | for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) { |
106 | addr += 16) { | ||
107 | rt = pirq_check_routing_table(addr); | 106 | rt = pirq_check_routing_table(addr); |
108 | if (rt) | 107 | if (rt) |
109 | return rt; | 108 | return rt; |
@@ -125,17 +124,14 @@ static void __init pirq_peer_trick(void) | |||
125 | struct irq_info *e; | 124 | struct irq_info *e; |
126 | 125 | ||
127 | memset(busmap, 0, sizeof(busmap)); | 126 | memset(busmap, 0, sizeof(busmap)); |
128 | for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / | 127 | for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) { |
129 | sizeof(struct irq_info); i++) { | ||
130 | e = &rt->slots[i]; | 128 | e = &rt->slots[i]; |
131 | #ifdef DEBUG | 129 | #ifdef DEBUG |
132 | { | 130 | { |
133 | int j; | 131 | int j; |
134 | DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, | 132 | DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot); |
135 | e->devfn/8, e->slot); | ||
136 | for (j = 0; j < 4; j++) | 133 | for (j = 0; j < 4; j++) |
137 | DBG(" %d:%02x/%04x", j, e->irq[j].link, | 134 | DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap); |
138 | e->irq[j].bitmap); | ||
139 | DBG("\n"); | 135 | DBG("\n"); |
140 | } | 136 | } |
141 | #endif | 137 | #endif |
@@ -180,8 +176,7 @@ void eisa_set_level_irq(unsigned int irq) | |||
180 | * Common IRQ routing practice: nibbles in config space, | 176 | * Common IRQ routing practice: nibbles in config space, |
181 | * offset by some magic constant. | 177 | * offset by some magic constant. |
182 | */ | 178 | */ |
183 | static unsigned int | 179 | static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr) |
184 | read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr) | ||
185 | { | 180 | { |
186 | u8 x; | 181 | u8 x; |
187 | unsigned reg = offset + (nr >> 1); | 182 | unsigned reg = offset + (nr >> 1); |
@@ -208,18 +203,15 @@ static void write_config_nybble(struct pci_dev *router, unsigned offset, | |||
208 | */ | 203 | */ |
209 | static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | 204 | static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
210 | { | 205 | { |
211 | static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, | 206 | static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 }; |
212 | 11, 0, 12, 0, 14, 0, 15 }; | ||
213 | 207 | ||
214 | WARN_ON_ONCE(pirq > 16); | 208 | WARN_ON_ONCE(pirq > 16); |
215 | return irqmap[read_config_nybble(router, 0x48, pirq-1)]; | 209 | return irqmap[read_config_nybble(router, 0x48, pirq-1)]; |
216 | } | 210 | } |
217 | 211 | ||
218 | static int | 212 | static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
219 | pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
220 | { | 213 | { |
221 | static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, | 214 | static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 }; |
222 | 3, 9, 11, 0, 13, 15 }; | ||
223 | unsigned int val = irqmap[irq]; | 215 | unsigned int val = irqmap[irq]; |
224 | 216 | ||
225 | WARN_ON_ONCE(pirq > 16); | 217 | WARN_ON_ONCE(pirq > 16); |
@@ -242,8 +234,7 @@ static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
242 | return (x < 16) ? x : 0; | 234 | return (x < 16) ? x : 0; |
243 | } | 235 | } |
244 | 236 | ||
245 | static int | 237 | static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
246 | pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
247 | { | 238 | { |
248 | pci_write_config_byte(router, pirq, irq); | 239 | pci_write_config_byte(router, pirq, irq); |
249 | return 1; | 240 | return 1; |
@@ -259,8 +250,7 @@ static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
259 | return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq); | 250 | return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq); |
260 | } | 251 | } |
261 | 252 | ||
262 | static int | 253 | static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
263 | pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
264 | { | 254 | { |
265 | write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq); | 255 | write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq); |
266 | return 1; | 256 | return 1; |
@@ -271,8 +261,7 @@ pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | |||
271 | * but without the ugly irq number munging. | 261 | * but without the ugly irq number munging. |
272 | * However, for 82C586, nibble map is different . | 262 | * However, for 82C586, nibble map is different . |
273 | */ | 263 | */ |
274 | static int | 264 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
275 | pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | ||
276 | { | 265 | { |
277 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; | 266 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
278 | 267 | ||
@@ -280,8 +269,7 @@ pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
280 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); | 269 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); |
281 | } | 270 | } |
282 | 271 | ||
283 | static int | 272 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
284 | pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
285 | { | 273 | { |
286 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; | 274 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
287 | 275 | ||
@@ -303,8 +291,7 @@ static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
303 | return read_config_nybble(router, 0x43, pirqmap[pirq-1]); | 291 | return read_config_nybble(router, 0x43, pirqmap[pirq-1]); |
304 | } | 292 | } |
305 | 293 | ||
306 | static int | 294 | static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
307 | pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
308 | { | 295 | { |
309 | static const unsigned char pirqmap[4] = { 1, 0, 2, 3 }; | 296 | static const unsigned char pirqmap[4] = { 1, 0, 2, 3 }; |
310 | 297 | ||
@@ -322,8 +309,7 @@ static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
322 | return read_config_nybble(router, 0xb8, pirq >> 4); | 309 | return read_config_nybble(router, 0xb8, pirq >> 4); |
323 | } | 310 | } |
324 | 311 | ||
325 | static int | 312 | static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
326 | pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
327 | { | 313 | { |
328 | write_config_nybble(router, 0xb8, pirq >> 4, irq); | 314 | write_config_nybble(router, 0xb8, pirq >> 4, irq); |
329 | return 1; | 315 | return 1; |
@@ -339,8 +325,7 @@ static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
339 | return read_config_nybble(router, 0x5C, (pirq-1)^1); | 325 | return read_config_nybble(router, 0x5C, (pirq-1)^1); |
340 | } | 326 | } |
341 | 327 | ||
342 | static int | 328 | static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
343 | pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
344 | { | 329 | { |
345 | write_config_nybble(router, 0x5C, (pirq-1)^1, irq); | 330 | write_config_nybble(router, 0x5C, (pirq-1)^1, irq); |
346 | return 1; | 331 | return 1; |
@@ -423,8 +408,7 @@ static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
423 | return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); | 408 | return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); |
424 | } | 409 | } |
425 | 410 | ||
426 | static int | 411 | static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
427 | pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
428 | { | 412 | { |
429 | u8 x; | 413 | u8 x; |
430 | int reg; | 414 | int reg; |
@@ -458,8 +442,7 @@ static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | |||
458 | return read_config_nybble(router, 0x74, pirq-1); | 442 | return read_config_nybble(router, 0x74, pirq-1); |
459 | } | 443 | } |
460 | 444 | ||
461 | static int | 445 | static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
462 | pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
463 | { | 446 | { |
464 | WARN_ON_ONCE(pirq >= 9); | 447 | WARN_ON_ONCE(pirq >= 9); |
465 | if (pirq > 8) { | 448 | if (pirq > 8) { |
@@ -481,8 +464,7 @@ pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | |||
481 | * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1, | 464 | * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1, |
482 | * and 0x03 for SMBus. | 465 | * and 0x03 for SMBus. |
483 | */ | 466 | */ |
484 | static int | 467 | static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
485 | pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | ||
486 | { | 468 | { |
487 | outb(pirq, 0xc00); | 469 | outb(pirq, 0xc00); |
488 | return inb(0xc01) & 0xf; | 470 | return inb(0xc01) & 0xf; |
@@ -504,24 +486,20 @@ static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, | |||
504 | * offset 0x56 0-3 PIRQA 4-7 PIRQB | 486 | * offset 0x56 0-3 PIRQA 4-7 PIRQB |
505 | * offset 0x57 0-3 PIRQC 4-7 PIRQD | 487 | * offset 0x57 0-3 PIRQC 4-7 PIRQD |
506 | */ | 488 | */ |
507 | static int | 489 | static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
508 | pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | ||
509 | { | 490 | { |
510 | u8 irq; | 491 | u8 irq; |
511 | irq = 0; | 492 | irq = 0; |
512 | if (pirq <= 4) | 493 | if (pirq <= 4) |
513 | irq = read_config_nybble(router, 0x56, pirq - 1); | 494 | irq = read_config_nybble(router, 0x56, pirq - 1); |
514 | printk(KERN_INFO | 495 | printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n", |
515 | "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n", | ||
516 | dev->vendor, dev->device, pirq, irq); | 496 | dev->vendor, dev->device, pirq, irq); |
517 | return irq; | 497 | return irq; |
518 | } | 498 | } |
519 | 499 | ||
520 | static int | 500 | static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
521 | pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
522 | { | 501 | { |
523 | printk(KERN_INFO | 502 | printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", |
524 | "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", | ||
525 | dev->vendor, dev->device, pirq, irq); | 503 | dev->vendor, dev->device, pirq, irq); |
526 | if (pirq <= 4) | 504 | if (pirq <= 4) |
527 | write_config_nybble(router, 0x56, pirq - 1, irq); | 505 | write_config_nybble(router, 0x56, pirq - 1, irq); |
@@ -550,8 +528,7 @@ static int pirq_pico_set(struct pci_dev *router, struct pci_dev *dev, int pirq, | |||
550 | 528 | ||
551 | #ifdef CONFIG_PCI_BIOS | 529 | #ifdef CONFIG_PCI_BIOS |
552 | 530 | ||
553 | static int | 531 | static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
554 | pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
555 | { | 532 | { |
556 | struct pci_dev *bridge; | 533 | struct pci_dev *bridge; |
557 | int pin = pci_get_interrupt_pin(dev, &bridge); | 534 | int pin = pci_get_interrupt_pin(dev, &bridge); |
@@ -560,14 +537,11 @@ pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | |||
560 | 537 | ||
561 | #endif | 538 | #endif |
562 | 539 | ||
563 | static __init int | 540 | static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
564 | intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
565 | { | 541 | { |
566 | static struct pci_device_id __initdata pirq_440gx[] = { | 542 | static struct pci_device_id __initdata pirq_440gx[] = { |
567 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, | 543 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) }, |
568 | PCI_DEVICE_ID_INTEL_82443GX_0) }, | 544 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) }, |
569 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, | ||
570 | PCI_DEVICE_ID_INTEL_82443GX_2) }, | ||
571 | { }, | 545 | { }, |
572 | }; | 546 | }; |
573 | 547 | ||
@@ -677,8 +651,7 @@ static __init int via_router_probe(struct irq_router *r, | |||
677 | return 0; | 651 | return 0; |
678 | } | 652 | } |
679 | 653 | ||
680 | static __init int | 654 | static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
681 | vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
682 | { | 655 | { |
683 | switch (device) { | 656 | switch (device) { |
684 | case PCI_DEVICE_ID_VLSI_82C534: | 657 | case PCI_DEVICE_ID_VLSI_82C534: |
@@ -705,8 +678,7 @@ static __init int serverworks_router_probe(struct irq_router *r, | |||
705 | return 0; | 678 | return 0; |
706 | } | 679 | } |
707 | 680 | ||
708 | static __init int | 681 | static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
709 | sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
710 | { | 682 | { |
711 | if (device != PCI_DEVICE_ID_SI_503) | 683 | if (device != PCI_DEVICE_ID_SI_503) |
712 | return 0; | 684 | return 0; |
@@ -717,8 +689,7 @@ sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
717 | return 1; | 689 | return 1; |
718 | } | 690 | } |
719 | 691 | ||
720 | static __init int | 692 | static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
721 | cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
722 | { | 693 | { |
723 | switch (device) { | 694 | switch (device) { |
724 | case PCI_DEVICE_ID_CYRIX_5520: | 695 | case PCI_DEVICE_ID_CYRIX_5520: |
@@ -730,8 +701,7 @@ cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
730 | return 0; | 701 | return 0; |
731 | } | 702 | } |
732 | 703 | ||
733 | static __init int | 704 | static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
734 | opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
735 | { | 705 | { |
736 | switch (device) { | 706 | switch (device) { |
737 | case PCI_DEVICE_ID_OPTI_82C700: | 707 | case PCI_DEVICE_ID_OPTI_82C700: |
@@ -743,8 +713,7 @@ opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
743 | return 0; | 713 | return 0; |
744 | } | 714 | } |
745 | 715 | ||
746 | static __init int | 716 | static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
747 | ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
748 | { | 717 | { |
749 | switch (device) { | 718 | switch (device) { |
750 | case PCI_DEVICE_ID_ITE_IT8330G_0: | 719 | case PCI_DEVICE_ID_ITE_IT8330G_0: |
@@ -756,8 +725,7 @@ ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
756 | return 0; | 725 | return 0; |
757 | } | 726 | } |
758 | 727 | ||
759 | static __init int | 728 | static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
760 | ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
761 | { | 729 | { |
762 | switch (device) { | 730 | switch (device) { |
763 | case PCI_DEVICE_ID_AL_M1533: | 731 | case PCI_DEVICE_ID_AL_M1533: |
@@ -771,8 +739,7 @@ ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
771 | return 0; | 739 | return 0; |
772 | } | 740 | } |
773 | 741 | ||
774 | static __init int | 742 | static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
775 | amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
776 | { | 743 | { |
777 | switch (device) { | 744 | switch (device) { |
778 | case PCI_DEVICE_ID_AMD_VIPER_740B: | 745 | case PCI_DEVICE_ID_AMD_VIPER_740B: |
@@ -792,8 +759,7 @@ amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | |||
792 | return 1; | 759 | return 1; |
793 | } | 760 | } |
794 | 761 | ||
795 | static __init int | 762 | static __init int pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
796 | pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | ||
797 | { | 763 | { |
798 | switch (device) { | 764 | switch (device) { |
799 | case PCI_DEVICE_ID_PICOPOWER_PT86C523: | 765 | case PCI_DEVICE_ID_PICOPOWER_PT86C523: |
@@ -1030,9 +996,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
1030 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ | 996 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ |
1031 | ((1 << dev2->irq) & mask))) { | 997 | ((1 << dev2->irq) & mask))) { |
1032 | #ifndef CONFIG_PCI_MSI | 998 | #ifndef CONFIG_PCI_MSI |
1033 | printk(KERN_INFO | 999 | printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n", |
1034 | "IRQ routing conflict for %s, have irq %d, want irq %d\n", | 1000 | pci_name(dev2), dev2->irq, irq); |
1035 | pci_name(dev2), dev2->irq, irq); | ||
1036 | #endif | 1001 | #endif |
1037 | continue; | 1002 | continue; |
1038 | } | 1003 | } |
@@ -1098,23 +1063,18 @@ static void __init pcibios_fixup_irqs(void) | |||
1098 | * parent slot, and pin number. The SMP code detects such bridged | 1063 | * parent slot, and pin number. The SMP code detects such bridged |
1099 | * busses itself so we should get into this branch reliably. | 1064 | * busses itself so we should get into this branch reliably. |
1100 | */ | 1065 | */ |
1101 | if (irq < 0 && dev->bus->parent) { | 1066 | if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ |
1102 | /* go back to the bridge */ | ||
1103 | struct pci_dev *bridge = dev->bus->self; | 1067 | struct pci_dev *bridge = dev->bus->self; |
1104 | 1068 | ||
1105 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 1069 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; |
1106 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1070 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
1107 | PCI_SLOT(bridge->devfn), | 1071 | PCI_SLOT(bridge->devfn), pin); |
1108 | pin); | ||
1109 | if (irq >= 0) | 1072 | if (irq >= 0) |
1110 | printk(KERN_WARNING | 1073 | printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n", |
1111 | "PCI: using PPB %s[%c] to get irq %d\n", | 1074 | pci_name(bridge), 'A' + pin, irq); |
1112 | pci_name(bridge), | ||
1113 | 'A' + pin, irq); | ||
1114 | } | 1075 | } |
1115 | if (irq >= 0) { | 1076 | if (irq >= 0) { |
1116 | printk(KERN_INFO | 1077 | printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", |
1117 | "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", | ||
1118 | pci_name(dev), 'A' + pin, irq); | 1078 | pci_name(dev), 'A' + pin, irq); |
1119 | dev->irq = irq; | 1079 | dev->irq = irq; |
1120 | } | 1080 | } |
@@ -1180,7 +1140,7 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = { | |||
1180 | { } | 1140 | { } |
1181 | }; | 1141 | }; |
1182 | 1142 | ||
1183 | static int __init pcibios_irq_init(void) | 1143 | int __init pcibios_irq_init(void) |
1184 | { | 1144 | { |
1185 | DBG(KERN_DEBUG "PCI: IRQ init\n"); | 1145 | DBG(KERN_DEBUG "PCI: IRQ init\n"); |
1186 | 1146 | ||
@@ -1218,9 +1178,6 @@ static int __init pcibios_irq_init(void) | |||
1218 | return 0; | 1178 | return 0; |
1219 | } | 1179 | } |
1220 | 1180 | ||
1221 | subsys_initcall(pcibios_irq_init); | ||
1222 | |||
1223 | |||
1224 | static void pirq_penalize_isa_irq(int irq, int active) | 1181 | static void pirq_penalize_isa_irq(int irq, int active) |
1225 | { | 1182 | { |
1226 | /* | 1183 | /* |
@@ -1259,19 +1216,15 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1259 | if (io_apic_assign_pci_irqs) { | 1216 | if (io_apic_assign_pci_irqs) { |
1260 | int irq; | 1217 | int irq; |
1261 | 1218 | ||
1262 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | 1219 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); |
1263 | PCI_SLOT(dev->devfn), pin); | ||
1264 | /* | 1220 | /* |
1265 | * Busses behind bridges are typically not | 1221 | * Busses behind bridges are typically not listed in the MP-table. |
1266 | * listed in the MP-table. In this case we have | 1222 | * In this case we have to look up the IRQ based on the parent bus, |
1267 | * to look up the IRQ based on the parent bus, | 1223 | * parent slot, and pin number. The SMP code detects such bridged |
1268 | * parent slot, and pin number. The SMP code | 1224 | * busses itself so we should get into this branch reliably. |
1269 | * detects such bridged busses itself so we | ||
1270 | * should get into this branch reliably. | ||
1271 | */ | 1225 | */ |
1272 | temp_dev = dev; | 1226 | temp_dev = dev; |
1273 | while (irq < 0 && dev->bus->parent) { | 1227 | while (irq < 0 && dev->bus->parent) { /* go back to the bridge */ |
1274 | /* go back to the bridge */ | ||
1275 | struct pci_dev *bridge = dev->bus->self; | 1228 | struct pci_dev *bridge = dev->bus->self; |
1276 | 1229 | ||
1277 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 1230 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; |