[Intel-gfx] [PATCH 10/10] kms_drrs: Test DRRS entry and exit

Rodrigo Vivi rodrigo.vivi at gmail.com
Thu Jan 15 15:24:04 PST 2015


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 at 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 at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br


More information about the Intel-gfx mailing list