diff options
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 29290f554e79..40a4aa3f4061 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -1070,6 +1070,11 @@ static int mp_map_pin_to_irq(u32 gsi, int idx, int ioapic, int pin, | |||
| 1070 | } | 1070 | } |
| 1071 | 1071 | ||
| 1072 | if (flags & IOAPIC_MAP_ALLOC) { | 1072 | if (flags & IOAPIC_MAP_ALLOC) { |
| 1073 | /* special handling for legacy IRQs */ | ||
| 1074 | if (irq < nr_legacy_irqs() && info->count == 1 && | ||
| 1075 | mp_irqdomain_map(domain, irq, pin) != 0) | ||
| 1076 | irq = -1; | ||
| 1077 | |||
| 1073 | if (irq > 0) | 1078 | if (irq > 0) |
| 1074 | info->count++; | 1079 | info->count++; |
| 1075 | else if (info->count == 0) | 1080 | else if (info->count == 0) |
| @@ -3896,7 +3901,15 @@ int mp_irqdomain_map(struct irq_domain *domain, unsigned int virq, | |||
| 3896 | info->polarity = 1; | 3901 | info->polarity = 1; |
| 3897 | } | 3902 | } |
| 3898 | info->node = NUMA_NO_NODE; | 3903 | info->node = NUMA_NO_NODE; |
| 3899 | info->set = 1; | 3904 | |
| 3905 | /* | ||
| 3906 | * setup_IO_APIC_irqs() programs all legacy IRQs with default | ||
| 3907 | * trigger and polarity attributes. Don't set the flag for that | ||
| 3908 | * case so the first legacy IRQ user could reprogram the pin | ||
| 3909 | * with real trigger and polarity attributes. | ||
| 3910 | */ | ||
| 3911 | if (virq >= nr_legacy_irqs() || info->count) | ||
| 3912 | info->set = 1; | ||
| 3900 | } | 3913 | } |
| 3901 | set_io_apic_irq_attr(&attr, ioapic, hwirq, info->trigger, | 3914 | set_io_apic_irq_attr(&attr, ioapic, hwirq, info->trigger, |
| 3902 | info->polarity); | 3915 | info->polarity); |
