diff options
author | Joerg Roedel <joro@8bytes.org> | 2012-09-26 06:44:48 -0400 |
---|---|---|
committer | Joerg Roedel <joro@8bytes.org> | 2013-01-28 06:17:28 -0500 |
commit | 2976fd8417f5744de3bb9109e4f30f353a36b1c0 (patch) | |
tree | 7c39a649cacb45c12ccf88aa16783741cbdce037 | |
parent | 11b4a1cc3836ac71a214446d350e923c76012368 (diff) |
x86, irq: Introduce setup_remapped_irq()
This function does irq-remapping specific interrupt setup
like modifying the chip defaults.
Signed-off-by: Joerg Roedel <joro@8bytes.org>
Acked-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r-- | arch/x86/include/asm/irq_remapping.h | 9 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 13 | ||||
-rw-r--r-- | drivers/iommu/irq_remapping.c | 9 |
3 files changed, 21 insertions, 10 deletions
diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h index 562db68906f8..b30fca156644 100644 --- a/arch/x86/include/asm/irq_remapping.h +++ b/arch/x86/include/asm/irq_remapping.h | |||
@@ -44,6 +44,9 @@ extern void compose_remapped_msi_msg(struct pci_dev *pdev, | |||
44 | struct msi_msg *msg, u8 hpet_id); | 44 | struct msi_msg *msg, u8 hpet_id); |
45 | extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id); | 45 | extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id); |
46 | extern void panic_if_irq_remap(const char *msg); | 46 | extern void panic_if_irq_remap(const char *msg); |
47 | extern bool setup_remapped_irq(int irq, | ||
48 | struct irq_cfg *cfg, | ||
49 | struct irq_chip *chip); | ||
47 | 50 | ||
48 | static inline bool irq_remapped(struct irq_cfg *cfg) | 51 | static inline bool irq_remapped(struct irq_cfg *cfg) |
49 | { | 52 | { |
@@ -93,6 +96,12 @@ static inline void irq_remap_modify_chip_defaults(struct irq_chip *chip) | |||
93 | { | 96 | { |
94 | } | 97 | } |
95 | 98 | ||
99 | static inline bool setup_remapped_irq(int irq, | ||
100 | struct irq_cfg *cfg, | ||
101 | struct irq_chip *chip) | ||
102 | { | ||
103 | return false; | ||
104 | } | ||
96 | #endif /* CONFIG_IRQ_REMAP */ | 105 | #endif /* CONFIG_IRQ_REMAP */ |
97 | 106 | ||
98 | #endif /* __X86_IRQ_REMAPPING_H */ | 107 | #endif /* __X86_IRQ_REMAPPING_H */ |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 110483906dd3..372512219a9b 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -1288,11 +1288,8 @@ static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg, | |||
1288 | fasteoi = false; | 1288 | fasteoi = false; |
1289 | } | 1289 | } |
1290 | 1290 | ||
1291 | if (irq_remapped(cfg)) { | 1291 | if (setup_remapped_irq(irq, cfg, chip)) |
1292 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | ||
1293 | irq_remap_modify_chip_defaults(chip); | ||
1294 | fasteoi = trigger != 0; | 1292 | fasteoi = trigger != 0; |
1295 | } | ||
1296 | 1293 | ||
1297 | hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq; | 1294 | hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq; |
1298 | irq_set_chip_and_handler_name(irq, chip, hdl, | 1295 | irq_set_chip_and_handler_name(irq, chip, hdl, |
@@ -3131,10 +3128,7 @@ int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, | |||
3131 | if (!irq_offset) | 3128 | if (!irq_offset) |
3132 | write_msi_msg(irq, &msg); | 3129 | write_msi_msg(irq, &msg); |
3133 | 3130 | ||
3134 | if (irq_remapped(irq_get_chip_data(irq))) { | 3131 | setup_remapped_irq(irq, irq_get_chip_data(irq), chip); |
3135 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | ||
3136 | irq_remap_modify_chip_defaults(chip); | ||
3137 | } | ||
3138 | 3132 | ||
3139 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); | 3133 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); |
3140 | 3134 | ||
@@ -3272,8 +3266,7 @@ int default_setup_hpet_msi(unsigned int irq, unsigned int id) | |||
3272 | 3266 | ||
3273 | hpet_msi_write(irq_get_handler_data(irq), &msg); | 3267 | hpet_msi_write(irq_get_handler_data(irq), &msg); |
3274 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | 3268 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); |
3275 | if (irq_remapped(irq_get_chip_data(irq))) | 3269 | setup_remapped_irq(irq, irq_get_chip_data(irq), chip); |
3276 | irq_remap_modify_chip_defaults(chip); | ||
3277 | 3270 | ||
3278 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); | 3271 | irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); |
3279 | return 0; | 3272 | return 0; |
diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c index cff04789e1a3..339260c98cf9 100644 --- a/drivers/iommu/irq_remapping.c +++ b/drivers/iommu/irq_remapping.c | |||
@@ -355,3 +355,12 @@ void irq_remap_modify_chip_defaults(struct irq_chip *chip) | |||
355 | chip->irq_eoi = ir_ack_apic_level; | 355 | chip->irq_eoi = ir_ack_apic_level; |
356 | chip->irq_set_affinity = x86_io_apic_ops.set_affinity; | 356 | chip->irq_set_affinity = x86_io_apic_ops.set_affinity; |
357 | } | 357 | } |
358 | |||
359 | bool setup_remapped_irq(int irq, struct irq_cfg *cfg, struct irq_chip *chip) | ||
360 | { | ||
361 | if (!irq_remapped(cfg)) | ||
362 | return false; | ||
363 | irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); | ||
364 | irq_remap_modify_chip_defaults(chip); | ||
365 | return true; | ||
366 | } | ||