diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index aefa0863e9e9..c39ccd86db63 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007, 2011, 2013, 2014 Intel Corporation
+ * Copyright © 2007, 2011, 2013, 2014, 2015 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -411,7 +411,7 @@ void igt_cleanup_aperture_trashers(void)
  * igt_system_suspend_autoresume:
  *
  * Execute a system suspend-to-mem cycle and automatically wake up again using
- * the firmwares resume timer.
+ * the firmware's resume timer.
  *
  * This is very handy for implementing any kind of suspend/resume test.
  */
@@ -430,6 +430,34 @@ void igt_system_suspend_autoresume(void)
 }
 
 /**
+ * igt_system_hibernate_autoresume:
+ *
+ * Execute a system suspend-to-disk cycle and automatically wake up again using
+ * the firmware's resume timer.
+ *
+ * This is very handy for implementing any kind of hibernate/resume test.
+ */
+void igt_system_hibernate_autoresume(void)
+{
+	int ret;
+
+	/* FIXME: I'm guessing simulation behaves the same way as with
+	 * suspend/resume, but it might be prudent to make sure
+	 */
+	/* FIXME: Simulation doesn't like suspend/resume, and not even a lighter
+	 * approach using /sys/power/pm_test to just test our driver's callbacks
+	 * seems to fare better. We need to investigate what's going on. */
+	igt_skip_on_simulation();
+
+	/* The timeout might need to be adjusted if hibernation takes too long
+	 * or if we have to wait excessively long before resume
+	 */
+	ret = system("rtcwake -s 90 -m disk");
+	igt_assert_f(ret == 0, "This failure means that something is wrong with the rtcwake tool "
+		     "or how your distro is set up. This is not a i915.ko or i-g-t bug.");
+}
+
+/**
  * igt_drop_root:
  *
  * Drop root privileges and make sure it actually worked. Useful for tests
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index 798a5b45fcb9..636ab3dc06fc 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2014 Intel Corporation
+ * Copyright © 2014, 2015 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -58,8 +58,9 @@ void igt_init_aperture_trashers(drm_intel_bufmgr *bufmgr);
 void igt_trash_aperture(void);
 void igt_cleanup_aperture_trashers(void);
 
-/* suspend and auto-resume system */
+/* suspend/hibernate and auto-resume system */
 void igt_system_suspend_autoresume(void);
+void igt_system_hibernate_autoresume(void);
 
 /* dropping priviledges */
 void igt_drop_root(void);
diff --git a/tests/drv_suspend.c b/tests/drv_suspend.c
index 80f6a2254b75..8165cef9b333 100644
--- a/tests/drv_suspend.c
+++ b/tests/drv_suspend.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2013 Intel Corporation
+ * Copyright © 2013, 2015 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -22,6 +22,7 @@
  *
  * Authors:
  *    Daniel Vetter <daniel.vetter@ffwll.ch>
+ *    David Weinehall <david.weinehall@intel.com>
  *
  */
 
@@ -45,7 +46,7 @@
 #define OBJECT_SIZE (16*1024*1024)
 
 static void
-test_fence_restore(int fd, bool tiled2untiled)
+test_fence_restore(int fd, bool tiled2untiled, bool hibernate)
 {
 	uint32_t handle1, handle2, handle_tiled;
 	uint32_t *ptr1, *ptr2, *ptr_tiled;
@@ -80,7 +81,10 @@ test_fence_restore(int fd, bool tiled2untiled)
 	else
 		gem_set_tiling(fd, handle_tiled, I915_TILING_X, 2048);
 
-	igt_system_suspend_autoresume();
+	if (hibernate)
+		igt_system_hibernate_autoresume();
+	else
+		igt_system_suspend_autoresume();
 
 	igt_info("checking the first canary object\n");
 	for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
@@ -100,7 +104,7 @@ test_fence_restore(int fd, bool tiled2untiled)
 }
 
 static void
-test_debugfs_reader(void)
+test_debugfs_reader(bool hibernate)
 {
 	struct igt_helper_process reader = {};
 	reader.use_SIGKILL = true;
@@ -117,7 +121,10 @@ test_debugfs_reader(void)
 
 	sleep(1);
 
-	igt_system_suspend_autoresume();
+	if (hibernate)
+		igt_system_hibernate_autoresume();
+	else
+		igt_system_suspend_autoresume();
 
 	sleep(1);
 
@@ -125,7 +132,7 @@ test_debugfs_reader(void)
 }
 
 static void
-test_sysfs_reader(void)
+test_sysfs_reader(bool hibernate)
 {
 	struct igt_helper_process reader = {};
 	reader.use_SIGKILL = true;
@@ -142,7 +149,10 @@ test_sysfs_reader(void)
 
 	sleep(1);
 
-	igt_system_suspend_autoresume();
+	if (hibernate)
+		igt_system_hibernate_autoresume();
+	else
+		igt_system_suspend_autoresume();
 
 	sleep(1);
 
@@ -150,13 +160,18 @@ test_sysfs_reader(void)
 }
 
 static void
-test_forcewake(void)
+test_forcewake(bool hibernate)
 {
 	int fw_fd;
 
 	fw_fd = igt_open_forcewake_handle();
 	igt_assert(fw_fd >= 0);
-	igt_system_suspend_autoresume();
+
+	if (hibernate)
+		igt_system_hibernate_autoresume();
+	else
+		igt_system_suspend_autoresume();
+
 	close (fw_fd);
 }
 
@@ -169,20 +184,35 @@ igt_main
 	igt_fixture
 		fd = drm_open_any();
 
-	igt_subtest("fence-restore-tiled2untiled")
-		test_fence_restore(fd, true);
+	igt_subtest("fence-restore-tiled2untiled-suspend")
+		test_fence_restore(fd, true, false);
+
+	igt_subtest("fence-restore-untiled-suspend")
+		test_fence_restore(fd, false, false);
+
+	igt_subtest("debugfs-reader-suspend")
+		test_debugfs_reader(false);
+
+	igt_subtest("sysfs-reader-suspend")
+		test_sysfs_reader(false);
+
+	igt_subtest("forcewake-suspend")
+		test_forcewake(false);
+
+	igt_subtest("fence-restore-tiled2untiled-hibernate")
+		test_fence_restore(fd, true, true);
 
-	igt_subtest("fence-restore-untiled")
-		test_fence_restore(fd, false);
+	igt_subtest("fence-restore-untiled-hibernate")
+		test_fence_restore(fd, false, true);
 
-	igt_subtest("debugfs-reader")
-		test_debugfs_reader();
+	igt_subtest("debugfs-reader-hibernate")
+		test_debugfs_reader(true);
 
-	igt_subtest("sysfs-reader")
-		test_sysfs_reader();
+	igt_subtest("sysfs-reader-hibernate")
+		test_sysfs_reader(true);
 
-	igt_subtest("forcewake")
-		test_forcewake();
+	igt_subtest("forcewake-hibernate")
+		test_forcewake(true);
 
 	igt_fixture
 		close(fd);
