aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>2014-12-02 15:19:12 -0500
committerDavid Vrabel <david.vrabel@citrix.com>2014-12-04 08:00:51 -0500
commit066d79e4e2a41fbd0da62bd994f9b77ef8fa040a (patch)
treeb6b782cfb99fd1ac627b8426c48d9e3afe663d52 /arch/x86
parent6945c59c772be5edd578b12831dee3f7c8576103 (diff)
xen/pci: Defer initialization of MSI ops on HVM guests
If the hardware supports APIC virtualization we may decide not to use pirqs and instead use APIC/x2APIC directly, meaning that we don't want to set x86_msi.setup_msi_irqs and x86_msi.teardown_msi_irq to Xen-specific routines. However, x2APIC is not set up by the time pci_xen_hvm_init() is called so we need to postpone setting these ops until later, when we know which APIC mode is used. (Note that currently x2APIC is never initialized on HVM guests. This may change in the future) Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/pci/xen.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 093f5f4272d3..1370716907e1 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -431,6 +431,14 @@ int __init pci_xen_init(void)
431 return 0; 431 return 0;
432} 432}
433 433
434#ifdef CONFIG_PCI_MSI
435void __init xen_msi_init(void)
436{
437 x86_msi.setup_msi_irqs = xen_hvm_setup_msi_irqs;
438 x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
439}
440#endif
441
434int __init pci_xen_hvm_init(void) 442int __init pci_xen_hvm_init(void)
435{ 443{
436 if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs)) 444 if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs))
@@ -445,8 +453,11 @@ int __init pci_xen_hvm_init(void)
445#endif 453#endif
446 454
447#ifdef CONFIG_PCI_MSI 455#ifdef CONFIG_PCI_MSI
448 x86_msi.setup_msi_irqs = xen_hvm_setup_msi_irqs; 456 /*
449 x86_msi.teardown_msi_irq = xen_teardown_msi_irq; 457 * We need to wait until after x2apic is initialized
458 * before we can set MSI IRQ ops.
459 */
460 x86_platform.apic_post_init = xen_msi_init;
450#endif 461#endif
451 return 0; 462 return 0;
452} 463}