diff options
| -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 | } | ||
