diff -ur xen-4.2.1.orig/xen/drivers/passthrough/vtd/intremap.c xen-4.2.1/xen/drivers/passthrough/vtd/intremap.c --- xen/drivers/passthrough/vtd/intremap.c 2012-12-17 23:01:55.000000000 +0800 +++ xen/drivers/passthrough/vtd/intremap.c 2013-05-15 23:09:06.704546506 +0800 @@ -440,16 +440,17 @@ type = pdev_type(seg, bus, devfn); switch ( type ) { + case DEV_TYPE_PCIe_ENDPOINT: case DEV_TYPE_PCIe_BRIDGE: case DEV_TYPE_PCIe2PCI_BRIDGE: - case DEV_TYPE_LEGACY_PCI_BRIDGE: - break; - case DEV_TYPE_PCIe_ENDPOINT: set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, PCI_BDF2(bus, devfn)); break; case DEV_TYPE_PCI: + case DEV_TYPE_LEGACY_PCI_BRIDGE: + /* case DEV_TYPE_PCI2PCIe_BRIDGE: */ + ret = find_upstream_bridge(seg, &bus, &devfn, &secbus); if ( ret == 0 ) /* integrated PCI device */ { @@ -461,10 +462,15 @@ if ( pdev_type(seg, bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE ) set_ire_sid(ire, SVT_VERIFY_BUS, SQ_ALL_16, (bus << 8) | pdev->bus); - else if ( pdev_type(seg, bus, devfn) == DEV_TYPE_LEGACY_PCI_BRIDGE ) + else set_ire_sid(ire, SVT_VERIFY_BUS, SQ_ALL_16, PCI_BDF2(bus, devfn)); } + else + dprintk(XENLOG_WARNING VTDPREFIX, + "d%d: no upstream bridge for %04x:%02x:%02x.%u\n", + pdev->domain->domain_id, + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); break; default: