| 
         
xen-devel
[Xen-devel] [PATCH 8/8] xen/pci:use hypercall	PHYSDEVOP_restore_msi_ext 
 
| 
To:  | 
linux-kernel@xxxxxxxxxxxxxxx, rjw@xxxxxxx, tglx@xxxxxxxxxxxxx,	hpa@xxxxxxxxx, x86@xxxxxxxxxx, len.brown@xxxxxxxxx,	joseph.cihula@xxxxxxxxx, shane.wang@xxxxxxxxx,	xen-devel@xxxxxxxxxxxxxxxxxxx, linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx,	tboot-devel@xxxxxxxxxxxxxxxxxxxxx, linux-acpi@xxxxxxxxxxxxxxx,	liang.tang@xxxxxxxxxx, ke.yu@xxxxxxxxx, kevin.tian@xxxxxxxxx,	jeremy@xxxxxxxx | 
 
| 
Subject:  | 
[Xen-devel] [PATCH 8/8] xen/pci:use hypercall	PHYSDEVOP_restore_msi_ext to restore MSI/MSI-X vectors | 
 
| 
From:  | 
Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> | 
 
| 
Date:  | 
Thu, 29 Sep 2011 16:16:54 -0400 | 
 
| 
Cc:  | 
Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> | 
 
| 
Delivery-date:  | 
Thu, 29 Sep 2011 13:23:43 -0700 | 
 
| 
Envelope-to:  | 
www-data@xxxxxxxxxxxxxxxxxxx | 
 
| 
In-reply-to:  | 
<1317327414-24072-1-git-send-email-konrad.wilk@xxxxxxxxxx> | 
 
| 
List-help:  | 
<mailto:xen-devel-request@lists.xensource.com?subject=help> | 
 
| 
List-id:  | 
Xen developer discussion <xen-devel.lists.xensource.com> | 
 
| 
List-post:  | 
<mailto:xen-devel@lists.xensource.com> | 
 
| 
List-subscribe:  | 
<http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe> | 
 
| 
List-unsubscribe:  | 
<http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe> | 
 
| 
References:  | 
<1317327414-24072-1-git-send-email-konrad.wilk@xxxxxxxxxx> | 
 
| 
Sender:  | 
xen-devel-bounces@xxxxxxxxxxxxxxxxxxx | 
 
 
 
From: Liang Tang <liang.tang@xxxxxxxxxx>
.. to use the new hypercall to restore the vectors for MSI/MSI-X devices.
If the new hypercall fail, we will call the old one (PHYSDEVOP_restore_msi).
[v1: Attempt only once to make the new hypercall, not everytime]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Signed-off-by: Liang Tang <liang.tang@xxxxxxxxxx>
---
 arch/x86/pci/xen.c              |   27 ++++++++++++++++++++++-----
 include/xen/interface/physdev.h |    8 ++++++++
 2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 9eea4ed..4521b05 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -248,6 +248,8 @@ error:
 }
 
 #ifdef CONFIG_XEN_DOM0
+static bool __read_mostly pci_seg_supported = true;
+
 static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 {
        int ret = 0;
@@ -308,12 +310,27 @@ out:
 static void xen_initdom_restore_msi_irqs(struct pci_dev *dev, int irq)
 {
        int ret = 0;
-       struct physdev_restore_msi restore;
 
-       restore.bus = dev->bus->number;
-       restore.devfn = dev->devfn;
-       ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore);
-       WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret);
+       if (pci_seg_supported) {
+               struct physdev_pci_device restore_ext;
+
+               restore_ext.seg = pci_domain_nr(dev->bus);
+               restore_ext.bus = dev->bus->number;
+               restore_ext.devfn = dev->devfn;
+               ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi_ext,
+                                           &restore_ext);
+               if (ret == -ENOSYS)
+                       pci_seg_supported = false;
+               WARN(ret && ret != -ENOSYS, "restore_msi_ext -> %d\n", ret);
+       }
+       if (!pci_seg_supported) {
+               struct physdev_restore_msi restore;
+
+               restore.bus = dev->bus->number;
+               restore.devfn = dev->devfn;
+               ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore);
+               WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret);
+       }
 }
 #endif
 
diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h
index 44aefa9..9818456 100644
--- a/include/xen/interface/physdev.h
+++ b/include/xen/interface/physdev.h
@@ -205,6 +205,14 @@ struct physdev_get_free_pirq {
     uint32_t pirq;
 };
 
+#define PHYSDEVOP_restore_msi_ext       27
+struct physdev_pci_device {
+       /* IN */
+       uint16_t seg;
+       uint8_t bus;
+       uint8_t devfn;
+};
+
 /*
  * Notify that some PIRQ-bound event channels have been unmasked.
  * ** This command is obsolete since interface version 0x00030202 and is **
-- 
1.7.4.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |   
 
| <Prev in Thread] | 
Current Thread | 
[Next in Thread>
 |  
- [Xen-devel] [PATCH v2] ACPI S3 to work under Xen., Konrad Rzeszutek Wilk
- [Xen-devel] [PATCH 1/8] x86: Expand the x86_msi_ops to have a	restore MSIs., Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 2/8] x86, acpi,	tboot: Have a ACPI sleep override instead of calling tboot_sleep., Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 4/8] xen: Utilize the restore_msi_irqs hook., Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 8/8] xen/pci:use hypercall	PHYSDEVOP_restore_msi_ext to restore MSI/MSI-X vectors,
Konrad Rzeszutek Wilk <=
 
- [Xen-devel] [PATCH 7/8] xen/acpi/sleep: Register to the	acpi_suspend_lowlevel a callback., Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 3/8] x86/acpi/sleep: Provide registration for	acpi_suspend_lowlevel., Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 6/8] xen/acpi/sleep: Enable ACPI sleep via the	__acpi_override_sleep, Konrad Rzeszutek Wilk
 
- [Xen-devel] [PATCH 5/8] xen/acpi: Domain0 acpi parser related	platform hypercall, Konrad Rzeszutek Wilk
 
 
 
 
 |  
  
 | 
    |