Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, hpet: Introduce x86_msi_ops.setup_hpet_msi

This function pointer can be overwritten by the IRQ
remapping code. The irq_remapping_enabled check can be
removed from default_setup_hpet_msi.

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>

+14 -15
+3 -2
arch/x86/include/asm/hpet.h
··· 80 80 extern void hpet_msi_read(struct hpet_dev *hdev, struct msi_msg *msg); 81 81 82 82 #ifdef CONFIG_PCI_MSI 83 - extern int arch_setup_hpet_msi(unsigned int irq, unsigned int id); 83 + extern int default_setup_hpet_msi(unsigned int irq, unsigned int id); 84 84 #else 85 - static inline int arch_setup_hpet_msi(unsigned int irq, unsigned int id) 85 + static inline int default_setup_hpet_msi(unsigned int irq, unsigned int id) 86 86 { 87 87 return -EINVAL; 88 88 } ··· 111 111 static inline int hpet_enable(void) { return 0; } 112 112 static inline int is_hpet_enabled(void) { return 0; } 113 113 #define hpet_readl(a) 0 114 + #define default_setup_hpet_msi NULL 114 115 115 116 #endif 116 117 #endif /* _ASM_X86_HPET_H */
+1
arch/x86/include/asm/x86_init.h
··· 187 187 void (*teardown_msi_irq)(unsigned int irq); 188 188 void (*teardown_msi_irqs)(struct pci_dev *dev); 189 189 void (*restore_msi_irqs)(struct pci_dev *dev, int irq); 190 + int (*setup_hpet_msi)(unsigned int irq, unsigned int id); 190 191 }; 191 192 192 193 struct x86_io_apic_ops {
+1 -7
arch/x86/kernel/apic/io_apic.c
··· 3399 3399 .irq_retrigger = ioapic_retrigger_irq, 3400 3400 }; 3401 3401 3402 - int arch_setup_hpet_msi(unsigned int irq, unsigned int id) 3402 + int default_setup_hpet_msi(unsigned int irq, unsigned int id) 3403 3403 { 3404 3404 struct irq_chip *chip = &hpet_msi_type; 3405 3405 struct msi_msg msg; 3406 3406 int ret; 3407 - 3408 - if (irq_remapping_enabled) { 3409 - ret = setup_hpet_msi_remapped(irq, id); 3410 - if (ret) 3411 - return ret; 3412 - } 3413 3407 3414 3408 ret = msi_compose_msg(NULL, irq, &msg, id); 3415 3409 if (ret < 0)
+1 -1
arch/x86/kernel/hpet.c
··· 478 478 479 479 static int hpet_setup_msi_irq(unsigned int irq) 480 480 { 481 - if (arch_setup_hpet_msi(irq, hpet_blockid)) { 481 + if (x86_msi.setup_hpet_msi(irq, hpet_blockid)) { 482 482 destroy_irq(irq); 483 483 return -EINVAL; 484 484 }
+6 -4
arch/x86/kernel/x86_init.c
··· 19 19 #include <asm/time.h> 20 20 #include <asm/irq.h> 21 21 #include <asm/io_apic.h> 22 + #include <asm/hpet.h> 22 23 #include <asm/pat.h> 23 24 #include <asm/tsc.h> 24 25 #include <asm/iommu.h> ··· 112 111 113 112 EXPORT_SYMBOL_GPL(x86_platform); 114 113 struct x86_msi_ops x86_msi = { 115 - .setup_msi_irqs = native_setup_msi_irqs, 116 - .teardown_msi_irq = native_teardown_msi_irq, 117 - .teardown_msi_irqs = default_teardown_msi_irqs, 118 - .restore_msi_irqs = default_restore_msi_irqs, 114 + .setup_msi_irqs = native_setup_msi_irqs, 115 + .teardown_msi_irq = native_teardown_msi_irq, 116 + .teardown_msi_irqs = default_teardown_msi_irqs, 117 + .restore_msi_irqs = default_restore_msi_irqs, 118 + .setup_hpet_msi = default_setup_hpet_msi, 119 119 }; 120 120 121 121 struct x86_io_apic_ops x86_io_apic_ops = {
+2 -1
drivers/iommu/irq_remapping.c
··· 36 36 37 37 static void __init irq_remapping_modify_x86_ops(void) 38 38 { 39 - x86_io_apic_ops.disable = irq_remapping_disable_io_apic; 39 + x86_io_apic_ops.disable = irq_remapping_disable_io_apic; 40 + x86_msi.setup_hpet_msi = setup_hpet_msi_remapped; 40 41 } 41 42 42 43 static __init int setup_nointremap(char *str)