<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    hi,<br>
    <br>
    <div class="moz-cite-prefix">On Tuesday 20 January 2015 02:41 PM,
      Daniel Vetter wrote:<br>
    </div>
    <blockquote cite="mid:20150120091131.GF10113@phenom.ffwll.local"
      type="cite">
      <pre wrap="">On Thu, Jan 15, 2015 at 03:24:04PM -0800, Rodrigo Vivi wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">I didn't get how it shows different rates if the i915_drrs_status only
shows if panel supports or not.

Maybe the debugfs file could contain more info for each crtc connect,
crtc info, if panel connected there supports, if it is enabled and
also current freq.. then parse all here properly.
</pre>
      </blockquote>
      <pre wrap="">
Yeah, giving the testcase minimal functional testing by making sure the
kernel goes into low-RR mode when it should would be good. I think with
fbc/psr tests we're more than covered on the functional side for testing
that we don't miss updates.
</pre>
    </blockquote>
    <small>working on providing more details from debugfs and parsing
      the same at igt.<br>
      I will submit a patch once it is completed.</small><br>
    <blockquote cite="mid:20150120091131.GF10113@phenom.ffwll.local"
      type="cite">
      <pre wrap="">
</pre>
      <blockquote type="cite">
        <pre wrap="">But one thing I don't know how to cover but it would be good is to
check for flickers...
</pre>
      </blockquote>
      <pre wrap="">
I don't think that's possible unfortunately :( We just have to wait for
random bug reports. Also this time around we do respect the various vbt
and panel settings, so hopefully this works better than the old lvds drrs
code we have merged already.
-Daniel

</pre>
      <blockquote type="cite">
        <pre wrap="">On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan
<a class="moz-txt-link-rfc2396E" href="mailto:vandana.kannan@intel.com"><vandana.kannan@intel.com></a> wrote:
</pre>
        <blockquote type="cite">
          <pre wrap="">This test just display a frame on screen, waits for 1 second to enter DRRS
and displays another frame to exit DRRS.
TODO:- Notify the user about which refresh rate was used at different stages.

Signed-off-by: Vandana Kannan <a class="moz-txt-link-rfc2396E" href="mailto:vandana.kannan@intel.com"><vandana.kannan@intel.com></a>
---
 tests/Makefile.sources |   1 +
 tests/kms_drrs.c       | 225 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 226 insertions(+)
 mode change 100644 => 100755 tests/Makefile.sources
 create mode 100644 tests/kms_drrs.c

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
old mode 100644
new mode 100755
index 967dc8f..fbc0977
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -64,6 +64,7 @@ TESTS_progs_M = \
        gem_write_read_ring_switch \
        kms_addfb \
        kms_cursor_crc \
+       kms_drrs \
        kms_fbc_crc \
        kms_flip \
        kms_flip_event_leak \
diff --git a/tests/kms_drrs.c b/tests/kms_drrs.c
new file mode 100644
index 0000000..5a360f3
--- /dev/null
+++ b/tests/kms_drrs.c
@@ -0,0 +1,225 @@
+/*
+ * Copyright © 2013 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "drmtest.h"
+#include "igt_debugfs.h"
+#include "igt_kms.h"
+#include "intel_chipset.h"
+#include "intel_batchbuffer.h"
+#include "ioctl_wrappers.h"
+
+IGT_TEST_DESCRIPTION(
+"Performs write operations and then waits for DRRS to be enabled and then "
+"disturbs the contents of the screen once again to disable DRRS.");
+
+typedef struct {
+       int drm_fd;
+       uint32_t devid;
+       uint32_t handle[2];
+       igt_display_t display;
+       igt_output_t *output;
+       enum pipe pipe;
+       igt_plane_t *primary;
+       struct igt_fb fb[2];
+       uint32_t fb_id[2];
+} data_t;
+
+static bool drrs_enabled(data_t *data)
+{
+       FILE *status;
+       char str[64] = {};
+
+       status = igt_debugfs_fopen("i915_drrs_status", "r");
+       igt_assert(status);
+
+       fread(str, sizeof(str) - 1, 1, status);
+       fclose(status);
+       return strstr(str, "DRRS enabled") != NULL;
+}
+
+static bool prepare_crtc(data_t *data)
+{
+       igt_display_t *display = &data->display;
+       igt_output_t *output = data->output;
+
+       /* select the pipe we want to use */
+       igt_output_set_pipe(output, data->pipe);
+       igt_display_commit(display);
+
+       if (!output->valid) {
+               igt_output_set_pipe(output, PIPE_ANY);
+               igt_display_commit(display);
+               return false;
+       }
+
+       return true;
+}
+
+static bool prepare_test(data_t *data)
+{
+       igt_display_t *display = &data->display;
+       igt_output_t *output = data->output;
+       drmModeModeInfo *mode;
+
+       data->primary = igt_output_get_plane(data->output, IGT_PLANE_PRIMARY);
+       mode = igt_output_get_mode(data->output);
+
+       data->fb_id[0] = igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
+                       DRM_FORMAT_XRGB8888,
+                       I915_TILING_X,
+                       0.0, 0.0, 0.0, &data->fb[0]);
+       igt_assert(data->fb_id[0]);
+       data->fb_id[1] = igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
+                       DRM_FORMAT_XRGB8888,
+                       I915_TILING_X,
+                       0.1, 0.1, 0.1,
+                       &data->fb[1]);
+       igt_assert(data->fb_id[1]);
+
+       data->handle[0] = data->fb[0].gem_handle;
+       data->handle[1] = data->fb[1].gem_handle;
+
+       /* scanout = fb[1] */
+       igt_plane_set_fb(data->primary, &data->fb[1]);
+       igt_display_commit(display);
+       usleep(1000000);
+
+       if (!drrs_enabled(data)) {
+               igt_info("DRRS not enabled\n");
+
+               igt_plane_set_fb(data->primary, NULL);
+               igt_output_set_pipe(output, PIPE_ANY);
+               igt_display_commit(display);
+
+               igt_remove_fb(data->drm_fd, &data->fb[0]);
+               igt_remove_fb(data->drm_fd, &data->fb[1]);
+               return false;
+       }
+
+       igt_wait_for_vblank(data->drm_fd, data->pipe);
+
+       /* scanout = fb[0] */
+       igt_plane_set_fb(data->primary, &data->fb[0]);
+       igt_display_commit(display);
+       usleep(100000);
+
+       igt_wait_for_vblank(data->drm_fd, data->pipe);
+
+       return true;
+}
+
+static void finish_crtc(data_t *data)
+{
+       igt_plane_set_fb(data->primary, NULL);
+       igt_output_set_pipe(data->output, PIPE_ANY);
+       igt_display_commit(&data->display);
+
+       igt_remove_fb(data->drm_fd, &data->fb[0]);
+       igt_remove_fb(data->drm_fd, &data->fb[1]);
+}
+
+static void reset_display(data_t *data)
+{
+       igt_display_t *display = &data->display;
+
+       for_each_connected_output(display, data->output) {
+               if (data->output->valid) {
+                       data->primary =  igt_output_get_plane(data->output,
+                                                       IGT_PLANE_PRIMARY);
+                       igt_plane_set_fb(data->primary, NULL);
+               }
+               igt_output_set_pipe(data->output, PIPE_ANY);
+       }
+}
+
+static void run_test(data_t *data)
+{
+       igt_display_t *display = &data->display;
+       int valid_tests = 0;
+
+       reset_display(data);
+
+       for_each_connected_output(display, data->output) {
+               for_each_pipe(display, data->pipe) {
+                       if (!prepare_crtc(data))
+                               continue;
+
+                       igt_info("Beginning %s on pipe %s, connector %s\n",
+                                       igt_subtest_name(),
+                                       kmstest_pipe_name(data->pipe),
+                                       igt_output_name(data->output));
+
+                       if (!prepare_test(data)) {
+                               igt_info("%s on pipe %s, connector %s: SKIPPED\n",
+                                               igt_subtest_name(),
+                                               kmstest_pipe_name(data->pipe),
+                                               igt_output_name(data->output));
+                               continue;
+                       }
+
+                       valid_tests++;
+
+                       igt_info("%s on pipe %s, connector %s: PASSED\n",
+                                       igt_subtest_name(),
+                                       kmstest_pipe_name(data->pipe),
+                                       igt_output_name(data->output));
+
+                       finish_crtc(data);
+               }
+       }
+
+       igt_require_f(valid_tests, "no valid crtc/connector combinations found\n");
+}
+
+igt_main
+{
+       data_t data = {};
+
+       igt_skip_on_simulation();
+
+       igt_fixture {
+               char buf[64];
+               FILE *status;
+
+               data.drm_fd = drm_open_any_master();
+
+               data.devid = intel_get_drm_devid(data.drm_fd);
+
+               status = igt_debugfs_fopen("i915_drrs_status", "r");
+               igt_require_f(status, "No i915_drrs_status found\n");
+               fread(buf, sizeof(buf), 1, status);
+               fclose(status);
+               buf[sizeof(buf) - 1] = '\0';
+               igt_require_f(!strstr(buf, "disabled"),
+                               "DRRS not supported:check VBT/panel caps\n");
+
+               igt_display_init(&data.display, data.drm_fd);
+       }
+
+       run_test(&data);
+
+       igt_fixture {
+               igt_display_fini(&data.display);
+       }
+}
--
2.0.1

_______________________________________________
Intel-gfx mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Intel-gfx@lists.freedesktop.org">Intel-gfx@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/intel-gfx">http://lists.freedesktop.org/mailman/listinfo/intel-gfx</a>
</pre>
        </blockquote>
        <pre wrap="">


-- 
Rodrigo Vivi
Blog: <a class="moz-txt-link-freetext" href="http://blog.vivi.eng.br">http://blog.vivi.eng.br</a>
_______________________________________________
Intel-gfx mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Intel-gfx@lists.freedesktop.org">Intel-gfx@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/intel-gfx">http://lists.freedesktop.org/mailman/listinfo/intel-gfx</a>
</pre>
      </blockquote>
      <pre wrap="">
</pre>
    </blockquote>
    --Ram<br>
  </body>
</html>