summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichał Winiarski <michal.winiarski@intel.com>2019-03-12 13:48:13 +0100
committerMichał Winiarski <michal.winiarski@intel.com>2019-03-20 10:36:36 +0100
commit8ae86621d6fff60b6e20c6b0f9b336785c935b0f (patch)
tree12d83d267f5dafb16bcef5edec173ff57cf4dfbd /lib
parent1bbe0b11a40cbb8433a3863745b7023e54c36ae3 (diff)
lib/igt_device: Move intel_get_pci_device under igt_device
It allows us to make things a little bit more generic. Also, we now require fd rather than doing guesswork when it comes to pci address. v2: Use readlinkat rather than string concat, move stuff around, provide a version that does not assert. (Chris) v3: Print addr on failure, avoid assignment in conditionals. (Chris) Signed-off-by: Michał Winiarski <michal.winiarski@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_device.c120
-rw-r--r--lib/igt_device.h1
-rw-r--r--lib/intel_chipset.c51
-rw-r--r--lib/intel_chipset.h1
-rw-r--r--lib/intel_mmio.c4
-rw-r--r--lib/ioctl_wrappers.c5
-rw-r--r--lib/ioctl_wrappers.h2
7 files changed, 127 insertions, 57 deletions
diff --git a/lib/igt_device.c b/lib/igt_device.c
index 08f39c8b..a2f9bb3a 100644
--- a/lib/igt_device.c
+++ b/lib/igt_device.c
@@ -26,6 +26,7 @@
#include <sys/sysmacros.h>
#include "igt.h"
#include "igt_device.h"
+#include "igt_sysfs.h"
int __igt_device_set_master(int fd)
{
@@ -103,3 +104,122 @@ int igt_device_get_card_index(int fd)
return minor(st.st_rdev);
}
+
+#define IGT_DEV_PATH_LEN 80
+
+static bool igt_device_is_pci(int fd)
+{
+ char path[IGT_DEV_PATH_LEN];
+ char *subsystem;
+ int sysfs;
+ int len;
+
+ sysfs = igt_sysfs_open(fd);
+ if (sysfs == -1)
+ return false;
+
+ len = readlinkat(sysfs, "device/subsystem", path, sizeof(path) - 1);
+ if (len == -1)
+ return false;
+ path[len] = '\0';
+
+ subsystem = strrchr(path, '/');
+ if (!subsystem)
+ return false;
+
+ return strcmp(subsystem, "/pci") == 0;
+}
+
+struct igt_pci_addr {
+ unsigned int domain;
+ unsigned int bus;
+ unsigned int device;
+ unsigned int function;
+};
+
+static int igt_device_get_pci_addr(int fd, struct igt_pci_addr *pci)
+{
+ char path[IGT_DEV_PATH_LEN];
+ char *buf;
+ int sysfs;
+ int len;
+
+ if (!igt_device_is_pci(fd))
+ return -ENODEV;
+
+ sysfs = igt_sysfs_open(fd);
+ if (sysfs == -1)
+ return -ENOENT;
+
+ len = readlinkat(sysfs, "device", path, sizeof(path) - 1);
+ if (len == -1)
+ return -ENOENT;
+ path[len] = '\0';
+
+ buf = strrchr(path, '/');
+ if (!buf)
+ return -ENOENT;
+
+ if (sscanf(buf, "/%4x:%2x:%2x.%2x",
+ &pci->domain, &pci->bus,
+ &pci->device, &pci->function) != 4) {
+ igt_warn("Unable to extract PCI device address from '%s'\n", buf);
+ return -ENOENT;
+ }
+
+ return 0;
+}
+
+static struct pci_device *__igt_device_get_pci_device(int fd)
+{
+ struct igt_pci_addr pci_addr;
+ struct pci_device *pci_dev;
+
+ if (igt_device_get_pci_addr(fd, &pci_addr)) {
+ igt_warn("Unable to find device PCI address\n");
+ return NULL;
+ }
+
+ if (pci_system_init()) {
+ igt_warn("Couldn't initialize PCI system\n");
+ return NULL;
+ }
+
+ pci_dev = pci_device_find_by_slot(pci_addr.domain,
+ pci_addr.bus,
+ pci_addr.device,
+ pci_addr.function);
+ if (!pci_dev) {
+ igt_warn("Couldn't find PCI device %04x:%02x:%02x:%02x\n",
+ pci_addr.domain, pci_addr.bus,
+ pci_addr.device, pci_addr.function);
+ return NULL;
+ }
+
+ if (pci_device_probe(pci_dev)) {
+ igt_warn("Couldn't probe PCI device\n");
+ return NULL;
+ }
+
+ return pci_dev;
+}
+
+/**
+ * igt_device_get_pci_device:
+ *
+ * @fd: the device
+ *
+ * Looks up the main graphics pci device using libpciaccess.
+ *
+ * Returns:
+ * The pci_device, skips the test on any failures.
+ */
+struct pci_device *igt_device_get_pci_device(int fd)
+{
+ struct pci_device *pci_dev;
+
+ pci_dev = __igt_device_get_pci_device(fd);
+ igt_require(pci_dev);
+
+ return pci_dev;
+}
diff --git a/lib/igt_device.h b/lib/igt_device.h
index 9d7dc2c3..278ba7a9 100644
--- a/lib/igt_device.h
+++ b/lib/igt_device.h
@@ -32,5 +32,6 @@ int __igt_device_drop_master(int fd);
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);
#endif /* __IGT_DEVICE_H__ */
diff --git a/lib/intel_chipset.c b/lib/intel_chipset.c
index 4748a3fb..0577f77a 100644
--- a/lib/intel_chipset.c
+++ b/lib/intel_chipset.c
@@ -62,57 +62,6 @@
enum pch_type intel_pch;
/**
- * intel_get_pci_device:
- *
- * Looks up the main graphics pci device using libpciaccess.
- *
- * Returns:
- * The pci_device, exits the program on any failures.
- */
-struct pci_device *
-intel_get_pci_device(void)
-{
- struct pci_device *pci_dev;
- int error;
-
- error = pci_system_init();
- igt_fail_on_f(error != 0,
- "Couldn't initialize PCI system\n");
-
- /* Grab the graphics card. Try the canonical slot first, then
- * walk the entire PCI bus for a matching device. */
- pci_dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (pci_dev == NULL || pci_dev->vendor_id != 0x8086) {
- struct pci_device_iterator *iter;
- struct pci_id_match match;
-
- match.vendor_id = 0x8086; /* Intel */
- match.device_id = PCI_MATCH_ANY;
- match.subvendor_id = PCI_MATCH_ANY;
- match.subdevice_id = PCI_MATCH_ANY;
-
- match.device_class = 0x3 << 16;
- match.device_class_mask = 0xff << 16;
-
- match.match_data = 0;
-
- iter = pci_id_match_iterator_create(&match);
- pci_dev = pci_device_next(iter);
- pci_iterator_destroy(iter);
- }
- igt_require_f(pci_dev, "Couldn't find Intel graphics card\n");
-
- error = pci_device_probe(pci_dev);
- igt_fail_on_f(error != 0,
- "Couldn't probe graphics card\n");
-
- if (pci_dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
-
- return pci_dev;
-}
-
-/**
* intel_get_drm_devid:
* @fd: open i915 drm file descriptor
*
diff --git a/lib/intel_chipset.h b/lib/intel_chipset.h
index 40170b7b..dd31d3fb 100644
--- a/lib/intel_chipset.h
+++ b/lib/intel_chipset.h
@@ -31,7 +31,6 @@
#include <pciaccess.h>
#include <stdbool.h>
-struct pci_device *intel_get_pci_device(void);
uint32_t intel_get_drm_devid(int fd);
struct intel_device_info {
diff --git a/lib/intel_mmio.c b/lib/intel_mmio.c
index a5458aeb..f5e0be0c 100644
--- a/lib/intel_mmio.c
+++ b/lib/intel_mmio.c
@@ -112,7 +112,7 @@ intel_mmio_use_dump_file(char *file)
*
* Sets up #igt_global_mmio to point at the mmio bar.
*
- * @pci_dev can be obtained from intel_get_pci_device().
+ * @pci_dev can be obtained from igt_device_get_pci_device().
*/
void
intel_mmio_use_pci_bar(struct pci_device *pci_dev)
@@ -162,7 +162,7 @@ release_forcewake_lock(int fd)
*
* It also initializes #igt_global_mmio like intel_mmio_use_pci_bar().
*
- * @pci_dev can be obtained from intel_get_pci_device().
+ * @pci_dev can be obtained from igt_device_get_pci_device().
*/
int
intel_register_access_init(struct pci_device *pci_dev, int safe, int fd)
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index 39920f87..a66eb4bc 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -53,6 +53,7 @@
#include "intel_chipset.h"
#include "intel_io.h"
#include "igt_debugfs.h"
+#include "igt_device.h"
#include "igt_sysfs.h"
#include "config.h"
@@ -1096,9 +1097,9 @@ uint64_t gem_aperture_size(int fd)
*
* Returns: The mappable gtt address space size.
*/
-uint64_t gem_mappable_aperture_size(void)
+uint64_t gem_mappable_aperture_size(int fd)
{
- struct pci_device *pci_dev = intel_get_pci_device();
+ struct pci_device *pci_dev = igt_device_get_pci_device(fd);
int bar;
if (intel_gen(pci_dev->device_id) < 3)
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index f0be2608..ad93daff 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -136,7 +136,7 @@ uint64_t gem_total_stolen_size(int fd);
uint64_t gem_available_aperture_size(int fd);
uint64_t gem_aperture_size(int fd);
uint64_t gem_global_aperture_size(int fd);
-uint64_t gem_mappable_aperture_size(void);
+uint64_t gem_mappable_aperture_size(int fd);
bool gem_has_softpin(int fd);
bool gem_has_exec_fence(int fd);