aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/irq.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-11-07 15:20:06 +0000
committerKeir Fraser <keir@xensource.com>2007-11-07 15:20:06 +0000
commit111b6ba18bd91cfc6160ce938a87af636d69799a (patch)
treec6ad22758e8595da6bce8300df776c228cb7e886 /xen/arch/x86/hvm/irq.c
parent30efc7f5f073a8a6126d9d162b07080f6ebb1242 (diff)
downloadxen-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.c11
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 )