[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] Change spec of callback IRQ for PV-on-HVM on IA64
Hi all, We found some issues about interrupt for PV-on-HVM on IA64. One of them is as follow: * IRQ number issue - In IA64-Linux, IRQ is abstruct value, not hardware IRQ. (IRQ in IA64-Linux is external interrupt vector indeed.) * We had implemented PV-on-HVM feature as this semantic. - In other OS (like Windows), we can't get external interrupt vector with the driver interface. We discussed methods to modify for the issue, thus ... * We have to change the spec of callback IRQ. - Currently, it is external interrupt vector, but it has to be hardware IRQ id. - In PV-driver code for IPF-Linux, we can get hardware IRQ with isa_irq_to_vector(). I'll send patches to modify the issues. * pvdrv.patch2 - Modify to change the spec of callback IRQ in PV-driver side. - This patch brakes compatibility with previous version on IA64. I tested with our simple test of PV-on-HVM on RHEL4 U2 for IA64 with hypervisor side modification. Thanks, - Tsunehisa Doi # HG changeset patch # User Doi.Tsunehisa@xxxxxxxxxxxxxx # Node ID 1fa4ce7c60125319243add108604a066e4fe6b0c # Parent ac5330d4945a6eb388424ba8cf76f494ad9df47a Change callback_irq spec of PV-on-HVM for IPF Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx> Signed-off-by: Alex Williamson <alex.williamson@xxxxxx> diff -r ac5330d4945a -r 1fa4ce7c6012 unmodified_drivers/linux-2.6/platform-pci/platform-pci.c --- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c Wed Nov 15 12:15:34 2006 -0700 +++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c Thu Nov 16 15:29:28 2006 +0900 @@ -179,10 +179,24 @@ static int get_hypercall_stubs(void) #define get_hypercall_stubs() (0) #endif +static int get_callback_irq(struct pci_dev *pdev) +{ +#ifdef __ia64__ + int irq; + for (irq = 0; irq < 16; irq++) { + if (isa_irq_to_vector(irq) == pdev->irq) + return irq; + } + return 0; +#else /* !__ia64__ */ + return pdev->irq; +#endif +} + static int __devinit platform_pci_init(struct pci_dev *pdev, const struct pci_device_id *ent) { - int i, ret; + int i, ret, callback_irq; long ioaddr, iolen; long mmio_addr, mmio_len; @@ -196,7 +210,9 @@ static int __devinit platform_pci_init(s mmio_addr = pci_resource_start(pdev, 1); mmio_len = pci_resource_len(pdev, 1); - if (mmio_addr == 0 || ioaddr == 0) { + callback_irq = get_callback_irq(pdev); + + if (mmio_addr == 0 || ioaddr == 0 || callback_irq == 0) { printk(KERN_WARNING DRV_NAME ":no resources found\n"); return -ENOENT; } @@ -231,7 +247,7 @@ static int __devinit platform_pci_init(s goto out; } - if ((ret = set_callback_irq(pdev->irq))) + if ((ret = set_callback_irq(callback_irq))) goto out; out: _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |