aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2006-12-20 08:53:42 -0700
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2006-12-20 08:53:42 -0700
commit5a0c8b2704b70e808742f1ec968f3b396733a77c (patch)
treede301c6badcc9e6bd8d090e46708f9aaf96872bc
parent90bd97461528f85a86d5ad83e8a17681100fb4e7 (diff)
downloadxen-5a0c8b2704b70e808742f1ec968f3b396733a77c.tar.gz
xen-5a0c8b2704b70e808742f1ec968f3b396733a77c.tar.bz2
xen-5a0c8b2704b70e808742f1ec968f3b396733a77c.zip
[IA64] Follow new interrupt deliver mechanism for PV-on-HVM/IPF
This fixes PV-on-HVM drivers for ia64 Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
-rw-r--r--unmodified_drivers/linux-2.6/platform-pci/platform-pci.c9
-rw-r--r--xen/arch/ia64/vmx/vmx_process.c13
-rw-r--r--xen/include/public/arch-ia64.h4
3 files changed, 22 insertions, 4 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 3a2453a25c..b529ce1308 100644
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
@@ -182,12 +182,17 @@ static int get_hypercall_stubs(void)
static int get_callback_irq(struct pci_dev *pdev)
{
#ifdef __ia64__
- int irq;
+ int irq, rid;
for (irq = 0; irq < 16; irq++) {
if (isa_irq_to_vector(irq) == pdev->irq)
return irq;
}
- return 0;
+ /* 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 | HVM_PARAM_CALLBACK_IRQ_RID;
#else /* !__ia64__ */
return pdev->irq;
#endif
diff --git a/xen/arch/ia64/vmx/vmx_process.c b/xen/arch/ia64/vmx/vmx_process.c
index 94011beb71..1fce5524b5 100644
--- a/xen/arch/ia64/vmx/vmx_process.c
+++ b/xen/arch/ia64/vmx/vmx_process.c
@@ -212,8 +212,17 @@ void leave_hypervisor_tail(struct pt_regs *regs)
if (callback_irq != 0 && local_events_need_delivery()) {
/* change level for para-device callback irq */
/* use level irq to send discrete event */
- viosapic_set_irq(d, callback_irq, 1);
- viosapic_set_irq(d, callback_irq, 0);
+ if (callback_irq & HVM_PARAM_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);
+ } else {
+ /* case of using GSI as callback irq */
+ viosapic_set_irq(d, callback_irq, 1);
+ viosapic_set_irq(d, callback_irq, 0);
+ }
}
}
diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h
index 65cc233af3..b2830f6c66 100644
--- a/xen/include/public/arch-ia64.h
+++ b/xen/include/public/arch-ia64.h
@@ -62,6 +62,10 @@ 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 HVM_PARAM_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