mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
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>
This commit is contained in:
parent
49237b856a
commit
4a94b3aa6d
3 changed files with 101 additions and 3 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue