summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-09-02 14:51:39 +0100
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2010-10-22 21:25:43 +0100
commit38aa66fcb79e0a46c24bba96b6f2b851a6ec2037 (patch)
treeada0747fc6a242581dc8c612bae53161f97ab14a /drivers
parent6b0661a5e6fbfb159b78a39c0476905aa9b575fe (diff)
downloadlinux-38aa66fcb79e0a46c24bba96b6f2b851a6ec2037.tar.gz
linux-38aa66fcb79e0a46c24bba96b6f2b851a6ec2037.tar.bz2
linux-38aa66fcb79e0a46c24bba96b6f2b851a6ec2037.zip
xen: remap GSIs as pirqs when running as initial domain
Implement xen_register_gsi to setup the correct triggering and polarity properties of a gsi. Implement xen_register_pirq to register a particular gsi as pirq and receive interrupts as events. Call xen_setup_pirqs to register all the legacy ISA irqs as pirqs. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/xen/events.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index efa683ee8840..c649ac0aaeef 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -681,6 +681,8 @@ out:
int xen_destroy_irq(int irq)
{
struct irq_desc *desc;
+ struct physdev_unmap_pirq unmap_irq;
+ struct irq_info *info = info_for_irq(irq);
int rc = -ENOENT;
spin_lock(&irq_mapping_update_lock);
@@ -689,6 +691,15 @@ int xen_destroy_irq(int irq)
if (!desc)
goto out;
+ if (xen_initial_domain()) {
+ unmap_irq.pirq = info->u.pirq.gsi;
+ unmap_irq.domid = DOMID_SELF;
+ rc = HYPERVISOR_physdev_op(PHYSDEVOP_unmap_pirq, &unmap_irq);
+ if (rc) {
+ printk(KERN_WARNING "unmap irq failed %d\n", rc);
+ goto out;
+ }
+ }
irq_info[irq] = mk_unbound_info();
irq_free_desc(irq);
@@ -1425,5 +1436,7 @@ void __init xen_init_IRQ(void)
pci_xen_hvm_init();
} else {
irq_ctx_init(smp_processor_id());
+ if (xen_initial_domain())
+ xen_setup_pirqs();
}
}