Signed-off-by: Anthony Liguori <aligu...@us.ibm.com>
---
 tests/libqos/pci.c | 32 ++++++++++++++++++++++++++++++++
 tests/libqos/pci.h |  3 +++
 2 files changed, 35 insertions(+)

diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c
index 78d0bc0..57caf3a 100644
--- a/tests/libqos/pci.c
+++ b/tests/libqos/pci.c
@@ -5,6 +5,38 @@
 
 #include <stdio.h>
 
+void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id,
+                         void (*func)(QPCIDevice *dev, int devfn, void *data),
+                         void *data)
+{
+    int slot;
+
+    for (slot = 0; slot < 32; slot++) {
+        int fn;
+
+        for (fn = 0; fn < 8; fn++) {
+            QPCIDevice *dev;
+
+            dev = qpci_device_find(bus, QPCI_DEVFN(slot, fn));
+            if (!dev) {
+                continue;
+            }
+
+            if (vendor_id != -1 &&
+                qpci_config_readw(dev, PCI_VENDOR_ID) != vendor_id) {
+                continue;
+            }
+
+            if (device_id != -1 &&
+                qpci_config_readw(dev, PCI_DEVICE_ID) != device_id) {
+                continue;
+            }
+
+            func(dev, QPCI_DEVFN(slot, fn), data);
+        }
+    }
+}
+
 QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn)
 {
     QPCIDevice *dev;
diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h
index 5162a79..355ef40 100644
--- a/tests/libqos/pci.h
+++ b/tests/libqos/pci.h
@@ -39,6 +39,9 @@ struct QPCIDevice
     int devfn;
 };
 
+void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id,
+                         void (*func)(QPCIDevice *dev, int devfn, void *data),
+                         void *data);
 QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn);
 
 void qpci_device_enable(QPCIDevice *dev);
-- 
1.8.0


Reply via email to