All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mrzyglod <daniel.t.mrzyglod@intel.com>
To: igt-dev@lists.freedesktop.org
Subject: [igt-dev] [PATCH i-g-t v4 1/6] lib/igt_device: add igt_device_get_pci_addr by fd
Date: Thu, 25 Apr 2019 22:58:17 +0200	[thread overview]
Message-ID: <20190425205822.8995-2-daniel.t.mrzyglod@intel.com> (raw)
In-Reply-To: <20190425205822.8995-1-daniel.t.mrzyglod@intel.com>

From: Michał Winiarski <michal.winiarski@intel.com>

This function get us pci address based by fd.
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.

v4: close sysfs fd
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Mrzyglod <daniel.t.mrzyglod@intel.com>
---
 lib/igt_device.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_device.h |   2 +
 2 files changed, 126 insertions(+)

diff --git a/lib/igt_device.c b/lib/igt_device.c
index 08f39c8b..88f35cad 100644
--- a/lib/igt_device.c
+++ b/lib/igt_device.c
@@ -21,11 +21,14 @@
  * IN THE SOFTWARE.
  *
  */
+#include <sys/types.h>
+#include <fcntl.h>
 
 #include <sys/stat.h>
 #include <sys/sysmacros.h>
 #include "igt.h"
 #include "igt_device.h"
+#include "igt_sysfs.h"
 
 int __igt_device_set_master(int fd)
 {
@@ -103,3 +106,124 @@ 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);
+	close(sysfs);
+	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);
+	close(sysfs);
+	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..860b3a8a 100644
--- a/lib/igt_device.h
+++ b/lib/igt_device.h
@@ -25,6 +25,7 @@
 #ifndef __IGT_DEVICE_H__
 #define __IGT_DEVICE_H__
 
+#include <stdint.h>
 int __igt_device_set_master(int fd);
 void igt_device_set_master(int fd);
 
@@ -32,5 +33,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__ */
-- 
2.20.1

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2019-04-25 20:59 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-25 20:58 [igt-dev] [PATCH i-g-t v4 0/6] Remove global igt_global_mmio Daniel Mrzyglod
2019-04-25 20:58 ` Daniel Mrzyglod [this message]
2019-04-26  5:37   ` [igt-dev] [PATCH i-g-t v4 1/6] lib/igt_device: add igt_device_get_pci_addr by fd Chris Wilson
2019-04-25 20:58 ` [igt-dev] [PATCH i-g-t v4 2/6] lib/igt_device: add igt_device_map_pci_bar_region Daniel Mrzyglod
2019-04-25 20:58 ` [igt-dev] [PATCH i-g-t v4 3/6] lib/intel_mmio: use igt_device_map_pci_bar_region for mmap if fd is known Daniel Mrzyglod
2019-04-26  5:40   ` Chris Wilson
2019-04-25 20:58 ` [igt-dev] [PATCH i-g-t v4 4/6] lib/intel_mmio: add pointer for read/write register funtions Daniel Mrzyglod
2019-04-25 20:58 ` [igt-dev] [PATCH i-g-t v4 5/6] lib/intel_mmio: remove igt_global_mmio and move it to mmio_data Daniel Mrzyglod
2019-04-25 20:58 ` [igt-dev] [PATCH i-g-t v4 6/6] lib/ioctl_wrappers: add fd to aperture_mmap Daniel Mrzyglod
2019-04-25 21:55 ` [igt-dev] ✓ Fi.CI.BAT: success for Remove global igt_global_mmio (rev4) Patchwork
2019-04-26  9:38 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190425205822.8995-2-daniel.t.mrzyglod@intel.com \
    --to=daniel.t.mrzyglod@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.