summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_debugfs.c45
-rw-r--r--lib/igt_debugfs.h1
-rw-r--r--lib/intel_mmio.c52
-rw-r--r--tests/pm_pc8.c5
4 files changed, 45 insertions, 58 deletions
diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 5c029019..79b2618b 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -76,13 +76,7 @@
* General debugfs helpers
*/
-/**
- * igt_debugfs_init:
- * @debugfs: debugfs access structure to initialize
- *
- * Initializes the debugfs access helper library.
- */
-void igt_debugfs_init(igt_debugfs_t *debugfs)
+static bool __igt_debugfs_init(igt_debugfs_t *debugfs)
{
const char *path = "/sys/kernel/debug";
struct stat st;
@@ -107,13 +101,24 @@ find_minor:
sprintf(debugfs->dri_path + len, "/i915_error_state");
if (stat(debugfs->dri_path, &st) == 0) {
debugfs->dri_path[len] = '\0';
- return;
+ return true;
}
}
debugfs->dri_path[0] = '\0';
- igt_fail(4);
+ return false;
+}
+
+/**
+ * igt_debugfs_init:
+ * @debugfs: debugfs access structure to initialize
+ *
+ * Initializes the debugfs access helper library.
+ */
+void igt_debugfs_init(igt_debugfs_t *debugfs)
+{
+ igt_assert(__igt_debugfs_init(debugfs));
}
/**
@@ -578,3 +583,25 @@ void igt_enable_prefault(void)
{
igt_prefault_control(true);
}
+
+/**
+ * igt_open_forcewake_handle:
+ *
+ * This functions opens the debugfs forcewake file and so prevents the GT from
+ * suspending. The reference is automatically dropped when the is closed.
+ *
+ * Returns: The file descriptor of the forcewake handle or -1 if that didn't
+ * work out.
+ */
+int igt_open_forcewake_handle(void)
+{
+ igt_debugfs_t debugfs;
+ int fd;
+
+ if (!__igt_debugfs_init(&debugfs))
+ return -1;
+
+ fd = igt_debugfs_open(&debugfs, "i915_forcewake_user", O_WRONLY);
+
+ return fd;
+}
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index 90e31d70..5e153b17 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -154,5 +154,6 @@ void igt_drop_caches_set(uint64_t val);
void igt_disable_prefault(void);
void igt_enable_prefault(void);
+int igt_open_forcewake_handle(void);
#endif /* __IGT_DEBUGFS_H__ */
diff --git a/lib/intel_mmio.c b/lib/intel_mmio.c
index 930a44f8..22480098 100644
--- a/lib/intel_mmio.c
+++ b/lib/intel_mmio.c
@@ -42,6 +42,7 @@
#include <sys/mman.h>
#include "intel_gpu_tools.h"
+#include "igt_debugfs.h"
#define FAKEKEY 0x2468ace0
@@ -50,8 +51,6 @@ void *mmio;
static struct _mmio_data {
int inited;
bool safe;
- char debugfs_path[FILENAME_MAX];
- char debugfs_forcewake_path[FILENAME_MAX];
uint32_t i915_devid;
struct intel_register_map map;
int key;
@@ -113,42 +112,6 @@ intel_get_mmio(struct pci_device *pci_dev)
}
}
-/*
- * If successful, i915_debugfs_path and i915_debugfs_forcewake_path are both
- * updated with the correct path.
- */
-static int
-find_debugfs_path(const char *dri_base)
-{
- char buf[FILENAME_MAX];
- struct stat sb;
- int i, ret;
-
- for (i = 0; i < 16; i++) {
- snprintf(buf, FILENAME_MAX, "%s/%i/name", dri_base, i);
-
- snprintf(mmio_data.debugfs_path, FILENAME_MAX,
- "%s/%i/", dri_base, i);
- snprintf(mmio_data.debugfs_forcewake_path, FILENAME_MAX,
- "%s/%i/i915_forcewake_user", dri_base, i);
-
- ret = stat(mmio_data.debugfs_forcewake_path, &sb);
- if (ret) {
- mmio_data.debugfs_path[0] = 0;
- mmio_data.debugfs_forcewake_path[0] = 0;
- } else
- return 0;
- }
-
- return -1;
-}
-
-static int
-get_forcewake_lock(void)
-{
- return open(mmio_data.debugfs_forcewake_path, 0);
-}
-
static void
release_forcewake_lock(int fd)
{
@@ -184,16 +147,11 @@ intel_register_access_init(struct pci_device *pci_dev, int safe)
/* Find where the forcewake lock is. Forcewake doesn't exist
* gen < 6, but the debugfs should do the right things for us.
*/
- ret = find_debugfs_path("/sys/kernel/debug/dri");
- if (ret) {
- ret = find_debugfs_path("/debug/dri");
- if (ret) {
- fprintf(stderr, "Couldn't find path to dri/debugfs entry\n");
- fprintf(stderr, "warning: forcewake will not be handled\n");
- }
+ ret = igt_open_forcewake_handle();
+ if (ret == -1)
mmio_data.key = FAKEKEY;
- } else
- mmio_data.key = get_forcewake_lock();
+ else
+ mmio_data.key = ret;
mmio_data.inited++;
return 0;
diff --git a/tests/pm_pc8.c b/tests/pm_pc8.c
index 5c74b234..c672e809 100644
--- a/tests/pm_pc8.c
+++ b/tests/pm_pc8.c
@@ -46,6 +46,7 @@
#include "intel_gpu_tools.h"
#include "i915_drm.h"
#include "igt_kms.h"
+#include "igt_debugfs.h"
#define MSR_PC8_RES 0x630
#define MSR_PC9_RES 0x631
@@ -1009,8 +1010,8 @@ static void debugfs_forcewake_user_subtest(void)
disable_all_screens(&ms_data);
igt_assert(wait_for_suspended());
- fd = open("/sys/kernel/debug/dri/0/i915_forcewake_user", O_RDONLY);
- igt_require(fd);
+ fd = igt_open_forcewake_handle();
+ igt_require(fd >= 0);
if (has_runtime_pm) {
igt_assert(wait_for_active());