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
|