diff options
Diffstat (limited to 'arch/x86_64/kernel/io_apic.c')
-rw-r--r-- | arch/x86_64/kernel/io_apic.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index d7bad90a5ad8..950682f35766 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -810,11 +810,9 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger) | |||
810 | trigger == IOAPIC_LEVEL) | 810 | trigger == IOAPIC_LEVEL) |
811 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 811 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
812 | handle_fasteoi_irq, "fasteoi"); | 812 | handle_fasteoi_irq, "fasteoi"); |
813 | else { | 813 | else |
814 | irq_desc[irq].status |= IRQ_DELAYED_DISABLE; | ||
815 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 814 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
816 | handle_edge_irq, "edge"); | 815 | handle_edge_irq, "edge"); |
817 | } | ||
818 | } | 816 | } |
819 | static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) | 817 | static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) |
820 | { | 818 | { |
@@ -831,7 +829,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) | |||
831 | entry.delivery_mode = INT_DELIVERY_MODE; | 829 | entry.delivery_mode = INT_DELIVERY_MODE; |
832 | entry.dest_mode = INT_DEST_MODE; | 830 | entry.dest_mode = INT_DEST_MODE; |
833 | entry.mask = 0; /* enable IRQ */ | 831 | entry.mask = 0; /* enable IRQ */ |
834 | entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS); | 832 | entry.dest = cpu_mask_to_apicid(TARGET_CPUS); |
835 | 833 | ||
836 | entry.trigger = irq_trigger(idx); | 834 | entry.trigger = irq_trigger(idx); |
837 | entry.polarity = irq_polarity(idx); | 835 | entry.polarity = irq_polarity(idx); |
@@ -839,7 +837,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) | |||
839 | if (irq_trigger(idx)) { | 837 | if (irq_trigger(idx)) { |
840 | entry.trigger = 1; | 838 | entry.trigger = 1; |
841 | entry.mask = 1; | 839 | entry.mask = 1; |
842 | entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS); | 840 | entry.dest = cpu_mask_to_apicid(TARGET_CPUS); |
843 | } | 841 | } |
844 | 842 | ||
845 | if (!apic && !IO_APIC_IRQ(irq)) | 843 | if (!apic && !IO_APIC_IRQ(irq)) |
@@ -851,7 +849,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) | |||
851 | if (vector < 0) | 849 | if (vector < 0) |
852 | return; | 850 | return; |
853 | 851 | ||
854 | entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask); | 852 | entry.dest = cpu_mask_to_apicid(mask); |
855 | entry.vector = vector; | 853 | entry.vector = vector; |
856 | 854 | ||
857 | ioapic_register_intr(irq, vector, IOAPIC_AUTO); | 855 | ioapic_register_intr(irq, vector, IOAPIC_AUTO); |
@@ -920,7 +918,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in | |||
920 | */ | 918 | */ |
921 | entry.dest_mode = INT_DEST_MODE; | 919 | entry.dest_mode = INT_DEST_MODE; |
922 | entry.mask = 0; /* unmask IRQ now */ | 920 | entry.mask = 0; /* unmask IRQ now */ |
923 | entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS); | 921 | entry.dest = cpu_mask_to_apicid(TARGET_CPUS); |
924 | entry.delivery_mode = INT_DELIVERY_MODE; | 922 | entry.delivery_mode = INT_DELIVERY_MODE; |
925 | entry.polarity = 0; | 923 | entry.polarity = 0; |
926 | entry.trigger = 0; | 924 | entry.trigger = 0; |
@@ -1020,18 +1018,17 @@ void __apicdebuginit print_IO_APIC(void) | |||
1020 | 1018 | ||
1021 | printk(KERN_DEBUG ".... IRQ redirection table:\n"); | 1019 | printk(KERN_DEBUG ".... IRQ redirection table:\n"); |
1022 | 1020 | ||
1023 | printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol" | 1021 | printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" |
1024 | " Stat Dest Deli Vect: \n"); | 1022 | " Stat Dmod Deli Vect: \n"); |
1025 | 1023 | ||
1026 | for (i = 0; i <= reg_01.bits.entries; i++) { | 1024 | for (i = 0; i <= reg_01.bits.entries; i++) { |
1027 | struct IO_APIC_route_entry entry; | 1025 | struct IO_APIC_route_entry entry; |
1028 | 1026 | ||
1029 | entry = ioapic_read_entry(apic, i); | 1027 | entry = ioapic_read_entry(apic, i); |
1030 | 1028 | ||
1031 | printk(KERN_DEBUG " %02x %03X %02X ", | 1029 | printk(KERN_DEBUG " %02x %03X ", |
1032 | i, | 1030 | i, |
1033 | entry.dest.logical.logical_dest, | 1031 | entry.dest |
1034 | entry.dest.physical.physical_dest | ||
1035 | ); | 1032 | ); |
1036 | 1033 | ||
1037 | printk("%1d %1d %1d %1d %1d %1d %1d %02X\n", | 1034 | printk("%1d %1d %1d %1d %1d %1d %1d %02X\n", |
@@ -1293,8 +1290,7 @@ void disable_IO_APIC(void) | |||
1293 | entry.dest_mode = 0; /* Physical */ | 1290 | entry.dest_mode = 0; /* Physical */ |
1294 | entry.delivery_mode = dest_ExtINT; /* ExtInt */ | 1291 | entry.delivery_mode = dest_ExtINT; /* ExtInt */ |
1295 | entry.vector = 0; | 1292 | entry.vector = 0; |
1296 | entry.dest.physical.physical_dest = | 1293 | entry.dest = GET_APIC_ID(apic_read(APIC_ID)); |
1297 | GET_APIC_ID(apic_read(APIC_ID)); | ||
1298 | 1294 | ||
1299 | /* | 1295 | /* |
1300 | * Add it to the IO-APIC irq-routing table: | 1296 | * Add it to the IO-APIC irq-routing table: |
@@ -1556,7 +1552,7 @@ static inline void unlock_ExtINT_logic(void) | |||
1556 | 1552 | ||
1557 | entry1.dest_mode = 0; /* physical delivery */ | 1553 | entry1.dest_mode = 0; /* physical delivery */ |
1558 | entry1.mask = 0; /* unmask IRQ now */ | 1554 | entry1.mask = 0; /* unmask IRQ now */ |
1559 | entry1.dest.physical.physical_dest = hard_smp_processor_id(); | 1555 | entry1.dest = hard_smp_processor_id(); |
1560 | entry1.delivery_mode = dest_ExtINT; | 1556 | entry1.delivery_mode = dest_ExtINT; |
1561 | entry1.polarity = entry0.polarity; | 1557 | entry1.polarity = entry0.polarity; |
1562 | entry1.trigger = 0; | 1558 | entry1.trigger = 0; |
@@ -1956,24 +1952,31 @@ static struct irq_chip msi_chip = { | |||
1956 | .retrigger = ioapic_retrigger_irq, | 1952 | .retrigger = ioapic_retrigger_irq, |
1957 | }; | 1953 | }; |
1958 | 1954 | ||
1959 | int arch_setup_msi_irq(unsigned int irq, struct pci_dev *dev) | 1955 | int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) |
1960 | { | 1956 | { |
1961 | struct msi_msg msg; | 1957 | struct msi_msg msg; |
1962 | int ret; | 1958 | int irq, ret; |
1959 | irq = create_irq(); | ||
1960 | if (irq < 0) | ||
1961 | return irq; | ||
1962 | |||
1963 | set_irq_msi(irq, desc); | ||
1963 | ret = msi_compose_msg(dev, irq, &msg); | 1964 | ret = msi_compose_msg(dev, irq, &msg); |
1964 | if (ret < 0) | 1965 | if (ret < 0) { |
1966 | destroy_irq(irq); | ||
1965 | return ret; | 1967 | return ret; |
1968 | } | ||
1966 | 1969 | ||
1967 | write_msi_msg(irq, &msg); | 1970 | write_msi_msg(irq, &msg); |
1968 | 1971 | ||
1969 | set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge"); | 1972 | set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge"); |
1970 | 1973 | ||
1971 | return 0; | 1974 | return irq; |
1972 | } | 1975 | } |
1973 | 1976 | ||
1974 | void arch_teardown_msi_irq(unsigned int irq) | 1977 | void arch_teardown_msi_irq(unsigned int irq) |
1975 | { | 1978 | { |
1976 | return; | 1979 | destroy_irq(irq); |
1977 | } | 1980 | } |
1978 | 1981 | ||
1979 | #endif /* CONFIG_PCI_MSI */ | 1982 | #endif /* CONFIG_PCI_MSI */ |
@@ -2124,7 +2127,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int p | |||
2124 | 2127 | ||
2125 | entry.delivery_mode = INT_DELIVERY_MODE; | 2128 | entry.delivery_mode = INT_DELIVERY_MODE; |
2126 | entry.dest_mode = INT_DEST_MODE; | 2129 | entry.dest_mode = INT_DEST_MODE; |
2127 | entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask); | 2130 | entry.dest = cpu_mask_to_apicid(mask); |
2128 | entry.trigger = triggering; | 2131 | entry.trigger = triggering; |
2129 | entry.polarity = polarity; | 2132 | entry.polarity = polarity; |
2130 | entry.mask = 1; /* Disabled (masked) */ | 2133 | entry.mask = 1; /* Disabled (masked) */ |