diff options
-rw-r--r-- | lib/igt_aux.c | 32 | ||||
-rw-r--r-- | lib/igt_aux.h | 5 | ||||
-rw-r--r-- | tests/drv_suspend.c | 68 |
3 files changed, 82 insertions, 23 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c index b31f0cdb..131ff4b6 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"), @@ -343,7 +343,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. */ @@ -362,6 +362,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 7f42b337..0c361f26 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"), @@ -55,8 +55,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 d96f316a..e61a7234 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); |