diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 5c0290197e44..79b2618b4273 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 90e31d7046eb..5e153b175401 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 930a44f838fb..224800989189 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 5c74b2342e01..c672e809d04e 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());
