aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-02-06 09:26:25 -0700
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-02-06 09:26:25 -0700
commita356cbd5f6fd8c7a786e1ff6d3b330431ccbc296 (patch)
treecc81a653527022ceb387e2075c2dbdcf736c8ca2
parentd7e51f76c87e031bab860bfc2086136d53c2f05a (diff)
downloadxen-a356cbd5f6fd8c7a786e1ff6d3b330431ccbc296.tar.gz
xen-a356cbd5f6fd8c7a786e1ff6d3b330431ccbc296.tar.bz2
xen-a356cbd5f6fd8c7a786e1ff6d3b330431ccbc296.zip
[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@jp.fujitsu.com>
-rw-r--r--unmodified_drivers/linux-2.6/platform-pci/platform-pci.c12
-rw-r--r--xen/arch/ia64/vmx/vmx_process.c20
-rw-r--r--xen/include/public/arch-ia64.h4
3 files changed, 16 insertions, 20 deletions
diff --git a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
index e6ff4107cb..1cbfcf11b9 100644
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
@@ -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;
+ return irq; /* ISA 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;
#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 pci_dev *pdev)
((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 --git a/xen/arch/ia64/vmx/vmx_process.c b/xen/arch/ia64/vmx/vmx_process.c
index 37f8780426..0b4858e682 100644
--- a/xen/arch/ia64/vmx/vmx_process.c
+++ b/xen/arch/ia64/vmx/vmx_process.c
@@ -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 --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h
index cdb8f9de85..24e7020649 100644
--- a/xen/include/public/arch-ia64.h
+++ b/xen/include/public/arch-ia64.h
@@ -64,10 +64,6 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
#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 */
#define MAX_VIRT_CPUS 64