diff mbox

[10/10] kms_drrs: Test DRRS entry and exit

Message ID 1420836965-10068-11-git-send-email-vandana.kannan@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

vandana.kannan@intel.com Jan. 9, 2015, 8:56 p.m. UTC
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 <vandana.kannan@intel.com>
---
 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

Comments

Rodrigo Vivi Jan. 15, 2015, 11:24 p.m. UTC | #1
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.

But one thing I don't know how to cover but it would be good is to
check for flickers...

On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan
<vandana.kannan@intel.com> wrote:
> 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 <vandana.kannan@intel.com>
> ---
>  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
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter Jan. 20, 2015, 9:11 a.m. UTC | #2
On Thu, Jan 15, 2015 at 03:24:04PM -0800, Rodrigo Vivi wrote:
> 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.

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.

> But one thing I don't know how to cover but it would be good is to
> check for flickers...

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

> On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan
> <vandana.kannan@intel.com> wrote:
> > 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 <vandana.kannan@intel.com>
> > ---
> >  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
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> 
> 
> -- 
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ramalingam C Jan. 21, 2015, 12:31 p.m. UTC | #3
hi,

On Tuesday 20 January 2015 02:41 PM, Daniel Vetter wrote:
> On Thu, Jan 15, 2015 at 03:24:04PM -0800, Rodrigo Vivi wrote:
>> 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.
> 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.
working on providing more details from debugfs and parsing the same at igt.
I will submit a patch once it is completed.
>> But one thing I don't know how to cover but it would be good is to
>> check for flickers...
> 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
>
>> On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan
>> <vandana.kannan@intel.com> wrote:
>>> 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 <vandana.kannan@intel.com>
>>> ---
>>>   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
>>> Intel-gfx@lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>>
>>
>> -- 
>> Rodrigo Vivi
>> Blog: http://blog.vivi.eng.br
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--Ram
diff mbox

Patch

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);
+	}
+}