summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_device.c28
-rw-r--r--lib/igt_device.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/igt_device.c b/lib/igt_device.c
index 9794a992..fddfba72 100644
--- a/lib/igt_device.c
+++ b/lib/igt_device.c
@@ -257,3 +257,31 @@ struct pci_device *igt_device_get_pci_device(int fd)
return pci_dev;
}
+
+/**
+ * igt_device_get_pci_root_port:
+ * @fd: the device.
+ *
+ * Looks up the graphics pci device root port using libpciaccess.
+ *
+ * Returns:
+ * The root port pci_device.
+ */
+struct pci_device *
+igt_device_get_pci_root_port(int fd)
+{
+ struct pci_device *pci_dev, *prev;
+
+ pci_dev = __igt_device_get_pci_device(fd, 0);
+ igt_require(pci_dev);
+
+ while (pci_dev) {
+ prev = pci_dev;
+ pci_dev = pci_device_get_parent_bridge(pci_dev);
+ }
+
+ igt_debug("Root Port PCI device %04x:%02x:%02x.%01x\n",
+ prev->domain, prev->bus, prev->dev, prev->func);
+
+ return prev;
+}
diff --git a/lib/igt_device.h b/lib/igt_device.h
index 1aaa840e..800a0fcc 100644
--- a/lib/igt_device.h
+++ b/lib/igt_device.h
@@ -34,5 +34,6 @@ void igt_device_drop_master(int fd);
int igt_device_get_card_index(int fd);
struct pci_device *igt_device_get_pci_device(int fd);
struct pci_device *__igt_device_get_pci_device(int fd, unsigned int vf_id);
+struct pci_device *igt_device_get_pci_root_port(int fd);
#endif /* __IGT_DEVICE_H__ */