[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] pci: fix requester id to be the one on root bus
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH] pci: fix requester id to be the one on root bus |
Date: |
Wed, 11 May 2016 14:40:31 +0800 |
When there are devices under PCI bridge (or bridges), PCI requester ID
should be the one that hooked on the root PCI bus, not the PCI device
itself.
Signed-off-by: Peter Xu <address@hidden>
---
hw/pci/msi.c | 2 +-
hw/pci/pci.c | 9 +++++++++
include/hw/pci/pci.h | 2 ++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/pci/msi.c b/hw/pci/msi.c
index e0e64c2..1719716 100644
--- a/hw/pci/msi.c
+++ b/hw/pci/msi.c
@@ -315,7 +315,7 @@ void msi_send_message(PCIDevice *dev, MSIMessage msg)
{
MemTxAttrs attrs = {};
- attrs.requester_id = pci_requester_id(dev);
+ attrs.requester_id = pci_requester_id_recursive(dev);
address_space_stl_le(&dev->bus_master_as, msg.address, msg.data,
attrs, NULL);
}
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index bb605ef..c14299b 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2498,6 +2498,15 @@ PCIDevice *pci_get_function_0(PCIDevice *pci_dev)
}
}
+uint16_t pci_requester_id_recursive(PCIDevice *dev)
+{
+ while (pci_bus_num(dev->bus)) {
+ /* This is not on root PCI bus, we find its parent */
+ dev = dev->bus->parent_dev;
+ }
+ return pci_requester_id(dev);
+}
+
static const TypeInfo pci_device_type_info = {
.name = TYPE_PCI_DEVICE,
.parent = TYPE_DEVICE,
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index ef6ba51..4cb5b50 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -776,4 +776,6 @@ extern const VMStateDescription vmstate_pci_device;
.offset = vmstate_offset_pointer(_state, _field, PCIDevice), \
}
+uint16_t pci_requester_id_recursive(PCIDevice *dev);
+
#endif
--
2.4.11
Re: [Qemu-devel] [PATCH] pci: fix requester id with PCI bridges, Peter Xu, 2016/05/11