aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/io_apic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/io_apic.c')
-rw-r--r--arch/x86_64/kernel/io_apic.c45
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}
819static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq) 817static 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
1959int arch_setup_msi_irq(unsigned int irq, struct pci_dev *dev) 1955int 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
1974void arch_teardown_msi_irq(unsigned int irq) 1977void 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) */