diff options
author | Han, Weidong <weidong.han@intel.com> | 2009-04-03 05:15:50 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-04-04 05:42:28 -0400 |
commit | d0b03bd1c6725a3463290d7f9626e4b583518a5a (patch) | |
tree | ce4ef17315c5435a8a77cd8fdb47e17193093349 /arch/x86/kernel/apic/io_apic.c | |
parent | 34aaaa948e3c9dd65b27fa499c5c9e8d8f1227cf (diff) |
x2apic/intr-remap: decouple interrupt remapping from x2apic
interrupt remapping must be enabled before enabling x2apic, but
interrupt remapping doesn't depend on x2apic, it can be used
separately. Enable interrupt remapping in init_dmars even x2apic
is not supported.
[dwmw2: Update Kconfig accordingly, fix build with INTR_REMAP && !X2APIC]
Signed-off-by: Weidong Han <weidong.han@intel.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 0ad3fe77641a..767fe7e46d68 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -2524,7 +2524,7 @@ static void irq_complete_move(struct irq_desc **descp) | |||
2524 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2524 | static inline void irq_complete_move(struct irq_desc **descp) {} |
2525 | #endif | 2525 | #endif |
2526 | 2526 | ||
2527 | #ifdef CONFIG_INTR_REMAP | 2527 | #ifdef CONFIG_X86_X2APIC |
2528 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | 2528 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) |
2529 | { | 2529 | { |
2530 | int apic, pin; | 2530 | int apic, pin; |
@@ -2569,7 +2569,6 @@ static void ack_x2apic_edge(unsigned int irq) | |||
2569 | { | 2569 | { |
2570 | ack_x2APIC_irq(); | 2570 | ack_x2APIC_irq(); |
2571 | } | 2571 | } |
2572 | |||
2573 | #endif | 2572 | #endif |
2574 | 2573 | ||
2575 | static void ack_apic_edge(unsigned int irq) | 2574 | static void ack_apic_edge(unsigned int irq) |
@@ -2680,6 +2679,26 @@ static void ack_apic_level(unsigned int irq) | |||
2680 | #endif | 2679 | #endif |
2681 | } | 2680 | } |
2682 | 2681 | ||
2682 | #ifdef CONFIG_INTR_REMAP | ||
2683 | static void ir_ack_apic_edge(unsigned int irq) | ||
2684 | { | ||
2685 | #ifdef CONFIG_X86_X2APIC | ||
2686 | if (x2apic_enabled()) | ||
2687 | return ack_x2apic_edge(irq); | ||
2688 | #endif | ||
2689 | return ack_apic_edge(irq); | ||
2690 | } | ||
2691 | |||
2692 | static void ir_ack_apic_level(unsigned int irq) | ||
2693 | { | ||
2694 | #ifdef CONFIG_X86_X2APIC | ||
2695 | if (x2apic_enabled()) | ||
2696 | return ack_x2apic_level(irq); | ||
2697 | #endif | ||
2698 | return ack_apic_level(irq); | ||
2699 | } | ||
2700 | #endif /* CONFIG_INTR_REMAP */ | ||
2701 | |||
2683 | static struct irq_chip ioapic_chip __read_mostly = { | 2702 | static struct irq_chip ioapic_chip __read_mostly = { |
2684 | .name = "IO-APIC", | 2703 | .name = "IO-APIC", |
2685 | .startup = startup_ioapic_irq, | 2704 | .startup = startup_ioapic_irq, |
@@ -2699,8 +2718,8 @@ static struct irq_chip ir_ioapic_chip __read_mostly = { | |||
2699 | .mask = mask_IO_APIC_irq, | 2718 | .mask = mask_IO_APIC_irq, |
2700 | .unmask = unmask_IO_APIC_irq, | 2719 | .unmask = unmask_IO_APIC_irq, |
2701 | #ifdef CONFIG_INTR_REMAP | 2720 | #ifdef CONFIG_INTR_REMAP |
2702 | .ack = ack_x2apic_edge, | 2721 | .ack = ir_ack_apic_edge, |
2703 | .eoi = ack_x2apic_level, | 2722 | .eoi = ir_ack_apic_level, |
2704 | #ifdef CONFIG_SMP | 2723 | #ifdef CONFIG_SMP |
2705 | .set_affinity = set_ir_ioapic_affinity_irq, | 2724 | .set_affinity = set_ir_ioapic_affinity_irq, |
2706 | #endif | 2725 | #endif |
@@ -3426,7 +3445,7 @@ static struct irq_chip msi_ir_chip = { | |||
3426 | .unmask = unmask_msi_irq, | 3445 | .unmask = unmask_msi_irq, |
3427 | .mask = mask_msi_irq, | 3446 | .mask = mask_msi_irq, |
3428 | #ifdef CONFIG_INTR_REMAP | 3447 | #ifdef CONFIG_INTR_REMAP |
3429 | .ack = ack_x2apic_edge, | 3448 | .ack = ir_ack_apic_edge, |
3430 | #ifdef CONFIG_SMP | 3449 | #ifdef CONFIG_SMP |
3431 | .set_affinity = ir_set_msi_irq_affinity, | 3450 | .set_affinity = ir_set_msi_irq_affinity, |
3432 | #endif | 3451 | #endif |