diff options
-rw-r--r-- | arch/x86_64/kernel/io_apic.c | 92 | ||||
-rw-r--r-- | arch/x86_64/kernel/mpparse.c | 9 | ||||
-rw-r--r-- | include/asm-x86_64/mpspec.h | 8 |
3 files changed, 27 insertions, 82 deletions
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 8bbff64c20d7..a1412042b918 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -308,7 +308,7 @@ static int __init find_isa_irq_pin(int irq, int type) | |||
308 | for (i = 0; i < mp_irq_entries; i++) { | 308 | for (i = 0; i < mp_irq_entries; i++) { |
309 | int lbus = mp_irqs[i].mpc_srcbus; | 309 | int lbus = mp_irqs[i].mpc_srcbus; |
310 | 310 | ||
311 | if (mp_bus_id_to_type[lbus] == MP_BUS_ISA && | 311 | if (test_bit(lbus, mp_bus_not_pci) && |
312 | (mp_irqs[i].mpc_irqtype == type) && | 312 | (mp_irqs[i].mpc_irqtype == type) && |
313 | (mp_irqs[i].mpc_srcbusirq == irq)) | 313 | (mp_irqs[i].mpc_srcbusirq == irq)) |
314 | 314 | ||
@@ -324,7 +324,7 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
324 | for (i = 0; i < mp_irq_entries; i++) { | 324 | for (i = 0; i < mp_irq_entries; i++) { |
325 | int lbus = mp_irqs[i].mpc_srcbus; | 325 | int lbus = mp_irqs[i].mpc_srcbus; |
326 | 326 | ||
327 | if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA) && | 327 | if (test_bit(lbus, mp_bus_not_pci) && |
328 | (mp_irqs[i].mpc_irqtype == type) && | 328 | (mp_irqs[i].mpc_irqtype == type) && |
329 | (mp_irqs[i].mpc_srcbusirq == irq)) | 329 | (mp_irqs[i].mpc_srcbusirq == irq)) |
330 | break; | 330 | break; |
@@ -364,7 +364,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) | |||
364 | mp_irqs[i].mpc_dstapic == MP_APIC_ALL) | 364 | mp_irqs[i].mpc_dstapic == MP_APIC_ALL) |
365 | break; | 365 | break; |
366 | 366 | ||
367 | if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) && | 367 | if (!test_bit(lbus, mp_bus_not_pci) && |
368 | !mp_irqs[i].mpc_irqtype && | 368 | !mp_irqs[i].mpc_irqtype && |
369 | (bus == lbus) && | 369 | (bus == lbus) && |
370 | (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) { | 370 | (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) { |
@@ -410,28 +410,11 @@ static int __init MPBIOS_polarity(int idx) | |||
410 | switch (mp_irqs[idx].mpc_irqflag & 3) | 410 | switch (mp_irqs[idx].mpc_irqflag & 3) |
411 | { | 411 | { |
412 | case 0: /* conforms, ie. bus-type dependent polarity */ | 412 | case 0: /* conforms, ie. bus-type dependent polarity */ |
413 | { | 413 | if (test_bit(bus, mp_bus_not_pci)) |
414 | switch (mp_bus_id_to_type[bus]) | 414 | polarity = default_ISA_polarity(idx); |
415 | { | 415 | else |
416 | case MP_BUS_ISA: /* ISA pin */ | 416 | polarity = default_PCI_polarity(idx); |
417 | { | ||
418 | polarity = default_ISA_polarity(idx); | ||
419 | break; | ||
420 | } | ||
421 | case MP_BUS_PCI: /* PCI pin */ | ||
422 | { | ||
423 | polarity = default_PCI_polarity(idx); | ||
424 | break; | ||
425 | } | ||
426 | default: | ||
427 | { | ||
428 | printk(KERN_WARNING "broken BIOS!!\n"); | ||
429 | polarity = 1; | ||
430 | break; | ||
431 | } | ||
432 | } | ||
433 | break; | 417 | break; |
434 | } | ||
435 | case 1: /* high active */ | 418 | case 1: /* high active */ |
436 | { | 419 | { |
437 | polarity = 0; | 420 | polarity = 0; |
@@ -469,28 +452,11 @@ static int MPBIOS_trigger(int idx) | |||
469 | switch ((mp_irqs[idx].mpc_irqflag>>2) & 3) | 452 | switch ((mp_irqs[idx].mpc_irqflag>>2) & 3) |
470 | { | 453 | { |
471 | case 0: /* conforms, ie. bus-type dependent */ | 454 | case 0: /* conforms, ie. bus-type dependent */ |
472 | { | 455 | if (test_bit(bus, mp_bus_not_pci)) |
473 | switch (mp_bus_id_to_type[bus]) | 456 | trigger = default_ISA_trigger(idx); |
474 | { | 457 | else |
475 | case MP_BUS_ISA: /* ISA pin */ | 458 | trigger = default_PCI_trigger(idx); |
476 | { | ||
477 | trigger = default_ISA_trigger(idx); | ||
478 | break; | ||
479 | } | ||
480 | case MP_BUS_PCI: /* PCI pin */ | ||
481 | { | ||
482 | trigger = default_PCI_trigger(idx); | ||
483 | break; | ||
484 | } | ||
485 | default: | ||
486 | { | ||
487 | printk(KERN_WARNING "broken BIOS!!\n"); | ||
488 | trigger = 1; | ||
489 | break; | ||
490 | } | ||
491 | } | ||
492 | break; | 459 | break; |
493 | } | ||
494 | case 1: /* edge */ | 460 | case 1: /* edge */ |
495 | { | 461 | { |
496 | trigger = 0; | 462 | trigger = 0; |
@@ -596,31 +562,17 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
596 | if (mp_irqs[idx].mpc_dstirq != pin) | 562 | if (mp_irqs[idx].mpc_dstirq != pin) |
597 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); | 563 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); |
598 | 564 | ||
599 | switch (mp_bus_id_to_type[bus]) | 565 | if (test_bit(bus, mp_bus_not_pci)) { |
600 | { | 566 | irq = mp_irqs[idx].mpc_srcbusirq; |
601 | case MP_BUS_ISA: /* ISA pin */ | 567 | } else { |
602 | { | 568 | /* |
603 | irq = mp_irqs[idx].mpc_srcbusirq; | 569 | * PCI IRQs are mapped in order |
604 | break; | 570 | */ |
605 | } | 571 | i = irq = 0; |
606 | case MP_BUS_PCI: /* PCI pin */ | 572 | while (i < apic) |
607 | { | 573 | irq += nr_ioapic_registers[i++]; |
608 | /* | 574 | irq += pin; |
609 | * PCI IRQs are mapped in order | 575 | irq = gsi_irq_sharing(irq); |
610 | */ | ||
611 | i = irq = 0; | ||
612 | while (i < apic) | ||
613 | irq += nr_ioapic_registers[i++]; | ||
614 | irq += pin; | ||
615 | irq = gsi_irq_sharing(irq); | ||
616 | break; | ||
617 | } | ||
618 | default: | ||
619 | { | ||
620 | printk(KERN_ERR "unknown bus type %d.\n",bus); | ||
621 | irq = 0; | ||
622 | break; | ||
623 | } | ||
624 | } | 576 | } |
625 | BUG_ON(irq >= NR_IRQS); | 577 | BUG_ON(irq >= NR_IRQS); |
626 | return irq; | 578 | return irq; |
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c index c12acc3b5552..a8d38c0bb449 100644 --- a/arch/x86_64/kernel/mpparse.c +++ b/arch/x86_64/kernel/mpparse.c | |||
@@ -42,7 +42,7 @@ int acpi_found_madt; | |||
42 | * MP-table. | 42 | * MP-table. |
43 | */ | 43 | */ |
44 | unsigned char apic_version [MAX_APICS]; | 44 | unsigned char apic_version [MAX_APICS]; |
45 | unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; | 45 | DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); |
46 | int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; | 46 | int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; |
47 | 47 | ||
48 | static int mp_current_pci_id = 0; | 48 | static int mp_current_pci_id = 0; |
@@ -173,9 +173,9 @@ static void __init MP_bus_info (struct mpc_config_bus *m) | |||
173 | Dprintk("Bus #%d is %s\n", m->mpc_busid, str); | 173 | Dprintk("Bus #%d is %s\n", m->mpc_busid, str); |
174 | 174 | ||
175 | if (strncmp(str, "ISA", 3) == 0) { | 175 | if (strncmp(str, "ISA", 3) == 0) { |
176 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; | 176 | set_bit(m->mpc_busid, mp_bus_not_pci); |
177 | } else if (strncmp(str, "PCI", 3) == 0) { | 177 | } else if (strncmp(str, "PCI", 3) == 0) { |
178 | mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI; | 178 | clear_bit(m->mpc_busid, mp_bus_not_pci); |
179 | mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id; | 179 | mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id; |
180 | mp_current_pci_id++; | 180 | mp_current_pci_id++; |
181 | } else { | 181 | } else { |
@@ -808,8 +808,7 @@ void __init mp_config_acpi_legacy_irqs (void) | |||
808 | /* | 808 | /* |
809 | * Fabricate the legacy ISA bus (bus #31). | 809 | * Fabricate the legacy ISA bus (bus #31). |
810 | */ | 810 | */ |
811 | mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA; | 811 | set_bit(MP_ISA_BUS, mp_bus_not_pci); |
812 | Dprintk("Bus #%d is ISA\n", MP_ISA_BUS); | ||
813 | 812 | ||
814 | /* | 813 | /* |
815 | * Locate the IOAPIC that manages the ISA IRQs (0-15). | 814 | * Locate the IOAPIC that manages the ISA IRQs (0-15). |
diff --git a/include/asm-x86_64/mpspec.h b/include/asm-x86_64/mpspec.h index 1dc83436cc91..017fddb61dc5 100644 --- a/include/asm-x86_64/mpspec.h +++ b/include/asm-x86_64/mpspec.h | |||
@@ -159,13 +159,7 @@ struct mpc_config_lintsrc | |||
159 | #define MAX_MP_BUSSES 256 | 159 | #define MAX_MP_BUSSES 256 |
160 | /* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */ | 160 | /* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */ |
161 | #define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4) | 161 | #define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4) |
162 | enum mp_bustype { | 162 | extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); |
163 | MP_BUS_ISA = 1, | ||
164 | MP_BUS_EISA, | ||
165 | MP_BUS_PCI, | ||
166 | MP_BUS_MCA | ||
167 | }; | ||
168 | extern unsigned char mp_bus_id_to_type [MAX_MP_BUSSES]; | ||
169 | extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES]; | 163 | extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES]; |
170 | 164 | ||
171 | extern unsigned int boot_cpu_physical_apicid; | 165 | extern unsigned int boot_cpu_physical_apicid; |