diff options
author | Keir Fraser <keir@xensource.com> | 2007-11-07 15:20:06 +0000 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-11-07 15:20:06 +0000 |
commit | 111b6ba18bd91cfc6160ce938a87af636d69799a (patch) | |
tree | c6ad22758e8595da6bce8300df776c228cb7e886 /xen/arch/x86/hvm/irq.c | |
parent | 30efc7f5f073a8a6126d9d162b07080f6ebb1242 (diff) | |
download | xen-111b6ba18bd91cfc6160ce938a87af636d69799a.tar.gz xen-111b6ba18bd91cfc6160ce938a87af636d69799a.tar.bz2 xen-111b6ba18bd91cfc6160ce938a87af636d69799a.zip |
vt-d: Support intra-domain shared interrupt.
Inter-domain shared interrupt has been supported by timeout method,
but it still doesn't support intra-domain shared interrupt, that is
assigning multiple devices which share a physical irq to the same
domain. This patch implements intra-domain shared interrupt
support. In addition, this patch maps link to guest device/intx
instead of directly mapping isairq in pt_irq_create_bind_vtd(),
because at this point the isairqs got from pci_link are always 0.
Note that assigning multiple devices to guests which uses PIC to
handle interrupts may be failed, because different links possibly
connect to same irq.
Signed-off-by: Weidong Han <weidong.han@intel.com>
Diffstat (limited to 'xen/arch/x86/hvm/irq.c')
-rw-r--r-- | xen/arch/x86/hvm/irq.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index b4f85cb562..ecff77f01f 100644 --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -192,15 +192,12 @@ void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq) hvm_irq->pci_link.route[link] = isa_irq; /* PCI pass-through fixup. */ - if ( hvm_irq->dpci && hvm_irq->dpci->girq[old_isa_irq].valid ) + if ( hvm_irq->dpci && hvm_irq->dpci->link[link].valid ) { - uint32_t device = hvm_irq->dpci->girq[old_isa_irq].device; - uint32_t intx = hvm_irq->dpci->girq[old_isa_irq].intx; - if ( link == hvm_pci_intx_link(device, intx) ) - { - hvm_irq->dpci->girq[isa_irq] = hvm_irq->dpci->girq[old_isa_irq]; + hvm_irq->dpci->girq[isa_irq] = hvm_irq->dpci->link[link]; + if ( hvm_irq->dpci->girq[old_isa_irq].device == + hvm_irq->dpci->link[link].device ) hvm_irq->dpci->girq[old_isa_irq].valid = 0; - } } if ( hvm_irq->pci_link_assert_count[link] == 0 ) |