tests/pm_rpm: add subtests for fences
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Wed, 6 Aug 2014 21:50:57 +0000 (18:50 -0300)
committerPaulo Zanoni <paulo.r.zanoni@intel.com>
Thu, 7 Aug 2014 18:44:28 +0000 (15:44 -0300)
Daniel thought fences were not surviving runtime PM on DPMS, so we
wrote this test to check. The good news is that the test passed, so
there's no need for a Kernel patch, at least on the Kernel I tested.

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
tests/pm_rpm.c

index cd26063..0a4bc76 100644 (file)
@@ -1704,6 +1704,74 @@ static void planes_subtest(bool universal, bool dpms)
        }
 }
 
+static void fences_subtest(bool dpms)
+{
+       uint32_t connector_id, crtc_id = 0;
+       drmModeModeInfoPtr mode;
+       struct igt_fb scanout_fb;
+       int rc, i;
+       uint32_t *buf_ptr;
+       uint32_t tiling = false, swizzle;
+
+       disable_all_screens(&ms_data);
+       igt_assert(wait_for_suspended());
+
+       igt_require(find_connector_for_modeset(&ms_data, SCREEN_TYPE_ANY,
+                                              &connector_id, &mode));
+
+       crtc_id = ms_data.res->crtcs[0];
+       igt_assert(crtc_id);
+
+       igt_create_fb(drm_fd, mode->hdisplay, mode->vdisplay,
+                     DRM_FORMAT_XRGB8888, true, &scanout_fb);
+
+       /* Even though we passed "true" as the tiling argument, double-check
+        * that the fb is really tiled. */
+       gem_get_tiling(drm_fd, scanout_fb.gem_handle, &tiling, &swizzle);
+       igt_assert(tiling);
+
+       buf_ptr = gem_mmap__gtt(drm_fd, scanout_fb.gem_handle,
+                               scanout_fb.size, PROT_WRITE | PROT_READ);
+       for (i = 0; i < scanout_fb.size/sizeof(uint32_t); i++)
+               buf_ptr[i] = i;
+
+       rc = drmModeSetCrtc(drm_fd, crtc_id, scanout_fb.fb_id, 0, 0,
+                           &connector_id, 1, mode);
+       igt_assert(rc == 0);
+       igt_assert(wait_for_active());
+
+       if (dpms)
+               disable_all_screens_dpms(&ms_data);
+       else
+               disable_all_screens(&ms_data);
+       igt_assert(wait_for_suspended());
+
+       for (i = 0; i < scanout_fb.size/sizeof(uint32_t); i++)
+               igt_assert_eq(buf_ptr[i], i);
+       igt_assert(wait_for_suspended());
+
+       if (dpms) {
+               drmModeConnectorPtr c = NULL;
+
+               for (i = 0; i < ms_data.res->count_connectors; i++)
+                       if (ms_data.connectors[i]->connector_id == connector_id)
+                               c = ms_data.connectors[i];
+               igt_assert(c);
+
+               kmstest_set_connector_dpms(drm_fd, c, DRM_MODE_DPMS_ON);
+       } else {
+               rc = drmModeSetCrtc(drm_fd, crtc_id, scanout_fb.fb_id, 0, 0,
+                                   &connector_id, 1, mode);
+               igt_assert(rc == 0);
+       }
+       igt_assert(wait_for_active());
+
+       for (i = 0; i < scanout_fb.size/sizeof(uint32_t); i++)
+               igt_assert_eq(buf_ptr[i], i);
+
+       igt_assert(munmap(buf_ptr, scanout_fb.size) == 0);
+}
+
 int rounds = 50;
 bool stay = false;
 
@@ -1808,6 +1876,10 @@ int main(int argc, char *argv[])
                dpms_mode_unset_subtest(SCREEN_TYPE_LPSP);
        igt_subtest("dpms-mode-unset-non-lpsp")
                dpms_mode_unset_subtest(SCREEN_TYPE_NON_LPSP);
+       igt_subtest("fences")
+               fences_subtest(false);
+       igt_subtest("fences-dpms")
+               fences_subtest(true);
 
        /* Modeset stress */
        igt_subtest("modeset-lpsp-stress")