diff options
author | Peter Xu <peterx@redhat.com> | 2016-05-17 19:26:10 +0800 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2016-06-17 03:28:02 +0300 |
commit | 4a94b3aa6d97dfa67a20c7a0315c9773352f0e8e (patch) | |
tree | 9c12a5330bb5d1ed0f3ad4591d56940e45bd8b1c /hw/i386/kvm | |
parent | 49237b856ae58ee7955be0b959c504c51b014f20 (diff) | |
download | qemu-4a94b3aa6d97dfa67a20c7a0315c9773352f0e8e.tar.gz qemu-4a94b3aa6d97dfa67a20c7a0315c9773352f0e8e.tar.bz2 qemu-4a94b3aa6d97dfa67a20c7a0315c9773352f0e8e.zip |
pci: fix pci_requester_id()
This fix SID verification failure when IOMMU IR is enabled with PCI
bridges. Existing pci_requester_id() is more like getting BDF info
only. Renaming it to pci_get_bdf(). Meanwhile, we provide the correct
implementation to get requester ID. VT-d spec 5.1.1 is a good reference
to go, though it talks only about interrupt delivery, the rule works
exactly the same for non-interrupt cases.
Currently, there are three use cases for pci_requester_id():
- PCIX status bits: here we need BDF only, not requester ID. Replacing
with pci_get_bdf().
- PCIe Error injection and MSI delivery: for both these cases, we are
looking for requester IDs. Here we should use the new impl.
To avoid a PCI walk every time we send MSI message, one requester_id
cache field is added to PCIDevice to cache the result when initialize
PCI device.
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/i386/kvm')
-rw-r--r-- | hw/i386/kvm/pci-assign.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c index db2cbd2002..bceed091e8 100644 --- a/hw/i386/kvm/pci-assign.c +++ b/hw/i386/kvm/pci-assign.c @@ -1482,7 +1482,7 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev, Error **errp) * error bits, leave the rest. */ status = pci_get_long(pci_dev->config + pos + PCI_X_STATUS); status &= ~(PCI_X_STATUS_BUS | PCI_X_STATUS_DEVFN); - status |= pci_requester_id(pci_dev); + status |= pci_get_bdf(pci_dev); status &= ~(PCI_X_STATUS_SPL_DISC | PCI_X_STATUS_UNX_SPL | PCI_X_STATUS_SPL_ERR); pci_set_long(pci_dev->config + pos + PCI_X_STATUS, status); |