[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/5] Return the physical IRQ number instead of the allocated IRQ number to pcifront.
The allocation of IRQ numbers in Linux privileged domains is based on finding the first unbound IRQ number. After the allocation is done a HYPERCALL to Xen is done, which allocates a PIRQ globally. That PIRQ->IRQ binding is saved in data structures that are used during ISR executions. Before this patch, for non-privileged domains we would return the local IRQ number instead of the PIRQ. The non-privileged domains require the PIRQ so that they can attach the their own interrupt handler to it. Fortunatly there is a function, 'xen_gsi_from_irq' that returns that global IRQ number. This has been succesfully tested with MSI devices. I hadn't tested it with MSI-X yet. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- drivers/xen/pciback/conf_space_capability_msi.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/xen/pciback/conf_space_capability_msi.c b/drivers/xen/pciback/conf_space_capability_msi.c index 762e396..7fb5371 100644 --- a/drivers/xen/pciback/conf_space_capability_msi.c +++ b/drivers/xen/pciback/conf_space_capability_msi.c @@ -6,6 +6,7 @@ #include "conf_space.h" #include "conf_space_capability.h" #include <xen/interface/io/pciif.h> +#include <xen/events.h> #include "pciback.h" int pciback_enable_msi(struct pciback_device *pdev, @@ -22,7 +23,9 @@ int pciback_enable_msi(struct pciback_device *pdev, return XEN_PCI_ERR_op_failed; } - op->value = dev->irq; + /* The value the guest needs is actually the IDT vector, not the + * the local domain's IRQ number. */ + op->value = xen_gsi_from_irq(dev->irq); return 0; } @@ -31,7 +34,7 @@ int pciback_disable_msi(struct pciback_device *pdev, { pci_disable_msi(dev); - op->value = dev->irq; + op->value = xen_gsi_from_irq(dev->irq); return 0; } @@ -57,7 +60,8 @@ int pciback_enable_msix(struct pciback_device *pdev, for (i = 0; i < op->value; i++) { op->msix_entries[i].entry = entries[i].entry; - op->msix_entries[i].vector = entries[i].vector; + op->msix_entries[i].vector = + xen_gsi_from_irq(entries[i].vector); } kfree(entries); @@ -73,7 +77,7 @@ int pciback_disable_msix(struct pciback_device *pdev, pci_disable_msix(dev); - op->value = dev->irq; + op->value = xen_gsi_from_irq(dev->irq); return 0; } -- 1.6.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |