diff options
-rw-r--r-- | unmodified_drivers/linux-2.6/platform-pci/platform-pci.c | 9 | ||||
-rw-r--r-- | xen/arch/ia64/vmx/vmx_process.c | 13 | ||||
-rw-r--r-- | xen/include/public/arch-ia64.h | 4 |
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 |