[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [IA64] Follow to allow PV-on-HVM callback irq to be identified by PCI device.



# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1170779185 25200
# Node ID 311b27546cf66c6e6aa330e19cae350b155dd39a
# Parent  d7f7021902a2c6b5beee0abfdbdc89fce7892450
[IA64] Follow to allow PV-on-HVM callback irq to be identified by PCI device.

Also delete IA64 specific spec concerned with IA64_CALLBACK_IRQ_RID.

Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
---
 unmodified_drivers/linux-2.6/platform-pci/platform-pci.c |   14 +++-------
 xen/arch/ia64/vmx/vmx_process.c                          |   20 +++++++++------
 xen/include/public/arch-ia64.h                           |    4 ---
 3 files changed, 17 insertions(+), 21 deletions(-)

diff -r d7f7021902a2 -r 311b27546cf6 
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Mon Feb 05 
15:41:58 2007 -0700
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Tue Feb 06 
09:26:25 2007 -0700
@@ -181,23 +181,18 @@ static int get_hypercall_stubs(void)
 
 static uint64_t get_callback_via(struct pci_dev *pdev)
 {
+       u8 pin;
 #ifdef __ia64__
        int irq, rid;
        for (irq = 0; irq < 16; irq++) {
                if (isa_irq_to_vector(irq) == pdev->irq)
-                       return irq;
-       }
-       /* use Requester-ID as callback_irq */
-       /* RID: '<#bus(8)><#dev(5)><#func(3)>' (cf. PCI-Express spec) */
-       rid = ((pdev->bus->number & 0xff) << 8) | pdev->devfn;
-       printk(KERN_INFO DRV_NAME ":use Requester-ID(%04x) as callback irq\n",
-              rid);
-       return rid | IA64_CALLBACK_IRQ_RID;
+                       return irq; /* ISA IRQ */
+       }
 #else /* !__ia64__ */
-       u8 pin;
 
        if (pdev->irq < 16)
                return pdev->irq; /* ISA IRQ */
+#endif
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
        pin = pdev->pin;
@@ -211,7 +206,6 @@ static uint64_t get_callback_via(struct 
                ((uint64_t)pdev->bus->number << 16) |
                ((uint64_t)(pdev->devfn & 0xff) << 8) |
                ((uint64_t)(pin - 1) & 3));
-#endif
 }
 
 /* Invalidate foreign mappings (e.g., in qemu-based device model). */
diff -r d7f7021902a2 -r 311b27546cf6 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Mon Feb 05 15:41:58 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue Feb 06 09:26:25 2007 -0700
@@ -227,17 +227,23 @@ void leave_hypervisor_tail(void)
         local_irq_disable();
 
         if (v->vcpu_id == 0) {
-            int callback_irq =
+            unsigned long callback_irq =
                 d->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
+            /*
+             * val[63:56] == 1: val[55:0] is a delivery PCI INTx line:
+             *                  Domain = val[47:32], Bus  = val[31:16],
+             *                  DevFn  = val[15: 8], IntX = val[ 1: 0]
+             * val[63:56] == 0: val[55:0] is a delivery as GSI
+             */
             if (callback_irq != 0 && local_events_need_delivery()) {
                 /* change level for para-device callback irq */
                 /* use level irq to send discrete event */
-                if (callback_irq & IA64_CALLBACK_IRQ_RID) {
-                    /* case of using Requester-ID as callback irq */
-                    /* RID: '<#bus(8)><#dev(5)><#func(3)>' */
-                    int dev = (callback_irq >> 3) & 0x1f;
-                    viosapic_set_pci_irq(d, dev, 0, 1);
-                    viosapic_set_pci_irq(d, dev, 0, 0);
+                if ((uint8_t)(callback_irq >> 56) == 1) {
+                    /* case of using PCI INTx line as callback irq */
+                    int pdev = (callback_irq >> 11) & 0x1f;
+                    int pintx = callback_irq & 3;
+                    viosapic_set_pci_irq(d, pdev, pintx, 1);
+                    viosapic_set_pci_irq(d, pdev, pintx, 0);
                 } else {
                     /* case of using GSI as callback irq */
                     viosapic_set_irq(d, callback_irq, 1);
diff -r d7f7021902a2 -r 311b27546cf6 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Mon Feb 05 15:41:58 2007 -0700
+++ b/xen/include/public/arch-ia64.h    Tue Feb 06 09:26:25 2007 -0700
@@ -63,10 +63,6 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
 #define VIRQ_ITC        VIRQ_ARCH_0 /* V. Virtual itc timer */
 #define VIRQ_MCA_CMC    VIRQ_ARCH_1 /* MCA cmc interrupt */
 #define VIRQ_MCA_CPE    VIRQ_ARCH_2 /* MCA cpe interrupt */
-
-/* Arch specific callback irq definition */
-/* using Requester-ID(RID) as callback irq */
-#define IA64_CALLBACK_IRQ_RID        (1 << 31)
 
 /* Maximum number of virtual CPUs in multi-processor guests. */
 /* WARNING: before changing this, check that shared_info fits on a page */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.