diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86/pci/xen.c | 27 | ||||
| -rw-r--r-- | arch/x86/xen/platform-pci-unplug.c | 2 | ||||
| -rw-r--r-- | arch/x86/xen/suspend.c | 1 | ||||
| -rw-r--r-- | arch/x86/xen/xen-ops.h | 2 |
4 files changed, 23 insertions, 9 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index d7b5109f7a9c..25cd4a07d09f 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -70,6 +70,9 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi, | |||
| 70 | struct xen_pci_frontend_ops *xen_pci_frontend; | 70 | struct xen_pci_frontend_ops *xen_pci_frontend; |
| 71 | EXPORT_SYMBOL_GPL(xen_pci_frontend); | 71 | EXPORT_SYMBOL_GPL(xen_pci_frontend); |
| 72 | 72 | ||
| 73 | #define XEN_PIRQ_MSI_DATA (MSI_DATA_TRIGGER_EDGE | \ | ||
| 74 | MSI_DATA_LEVEL_ASSERT | (3 << 8) | MSI_DATA_VECTOR(0)) | ||
| 75 | |||
| 73 | static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq, | 76 | static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq, |
| 74 | struct msi_msg *msg) | 77 | struct msi_msg *msg) |
| 75 | { | 78 | { |
| @@ -83,12 +86,7 @@ static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq, | |||
| 83 | MSI_ADDR_REDIRECTION_CPU | | 86 | MSI_ADDR_REDIRECTION_CPU | |
| 84 | MSI_ADDR_DEST_ID(pirq); | 87 | MSI_ADDR_DEST_ID(pirq); |
| 85 | 88 | ||
| 86 | msg->data = | 89 | msg->data = XEN_PIRQ_MSI_DATA; |
| 87 | MSI_DATA_TRIGGER_EDGE | | ||
| 88 | MSI_DATA_LEVEL_ASSERT | | ||
| 89 | /* delivery mode reserved */ | ||
| 90 | (3 << 8) | | ||
| 91 | MSI_DATA_VECTOR(0); | ||
| 92 | } | 90 | } |
| 93 | 91 | ||
| 94 | static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 92 | static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
| @@ -98,8 +96,23 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
| 98 | struct msi_msg msg; | 96 | struct msi_msg msg; |
| 99 | 97 | ||
| 100 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 98 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
| 99 | __read_msi_msg(msidesc, &msg); | ||
| 100 | pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) | | ||
| 101 | ((msg.address_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff); | ||
| 102 | if (xen_irq_from_pirq(pirq) >= 0 && msg.data == XEN_PIRQ_MSI_DATA) { | ||
| 103 | xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ? | ||
| 104 | "msi-x" : "msi", &irq, &pirq, XEN_ALLOC_IRQ); | ||
| 105 | if (irq < 0) | ||
| 106 | goto error; | ||
| 107 | ret = set_irq_msi(irq, msidesc); | ||
| 108 | if (ret < 0) | ||
| 109 | goto error_while; | ||
| 110 | printk(KERN_DEBUG "xen: msi already setup: msi --> irq=%d" | ||
| 111 | " pirq=%d\n", irq, pirq); | ||
| 112 | return 0; | ||
| 113 | } | ||
| 101 | xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ? | 114 | xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ? |
| 102 | "msi-x" : "msi", &irq, &pirq); | 115 | "msi-x" : "msi", &irq, &pirq, (XEN_ALLOC_IRQ | XEN_ALLOC_PIRQ)); |
| 103 | if (irq < 0 || pirq < 0) | 116 | if (irq < 0 || pirq < 0) |
| 104 | goto error; | 117 | goto error; |
| 105 | printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq); | 118 | printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq); |
diff --git a/arch/x86/xen/platform-pci-unplug.c b/arch/x86/xen/platform-pci-unplug.c index 0f456386cce5..25c52f94a27c 100644 --- a/arch/x86/xen/platform-pci-unplug.c +++ b/arch/x86/xen/platform-pci-unplug.c | |||
| @@ -68,7 +68,7 @@ static int __init check_platform_magic(void) | |||
| 68 | return 0; | 68 | return 0; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | void __init xen_unplug_emulated_devices(void) | 71 | void xen_unplug_emulated_devices(void) |
| 72 | { | 72 | { |
| 73 | int r; | 73 | int r; |
| 74 | 74 | ||
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index 1d789d56877c..9bbd63a129b5 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c | |||
| @@ -31,6 +31,7 @@ void xen_hvm_post_suspend(int suspend_cancelled) | |||
| 31 | int cpu; | 31 | int cpu; |
| 32 | xen_hvm_init_shared_info(); | 32 | xen_hvm_init_shared_info(); |
| 33 | xen_callback_vector(); | 33 | xen_callback_vector(); |
| 34 | xen_unplug_emulated_devices(); | ||
| 34 | if (xen_feature(XENFEAT_hvm_safe_pvclock)) { | 35 | if (xen_feature(XENFEAT_hvm_safe_pvclock)) { |
| 35 | for_each_online_cpu(cpu) { | 36 | for_each_online_cpu(cpu) { |
| 36 | xen_setup_runstate_info(cpu); | 37 | xen_setup_runstate_info(cpu); |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index 64044747348e..9d41bf985757 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
| @@ -43,7 +43,7 @@ void xen_vcpu_restore(void); | |||
| 43 | 43 | ||
| 44 | void xen_callback_vector(void); | 44 | void xen_callback_vector(void); |
| 45 | void xen_hvm_init_shared_info(void); | 45 | void xen_hvm_init_shared_info(void); |
| 46 | void __init xen_unplug_emulated_devices(void); | 46 | void xen_unplug_emulated_devices(void); |
| 47 | 47 | ||
| 48 | void __init xen_build_dynamic_phys_to_machine(void); | 48 | void __init xen_build_dynamic_phys_to_machine(void); |
| 49 | 49 | ||
