From: Liviu Dudau <liviu.dudau@arm.com> To: Brian Starkey <brian.starkey@arm.com> Cc: Boris Brezillon <boris.brezillon@free-electrons.com>, Intel GFX ML <intel-gfx@lists.freedesktop.org>, IGT GPU Tools <igt-dev@lists.freedesktop.org> Subject: [PATCH i-g-t v5 5/6] lib/igt_kms: Add igt_output_clone_pipe for cloning Date: Tue, 15 Jan 2019 17:47:46 +0000 [thread overview] Message-ID: <20190115174747.3138-6-liviu.dudau@arm.com> (raw) In-Reply-To: <20190115174747.3138-1-liviu.dudau@arm.com> From: Brian Starkey <brian.starkey@arm.com> An output can be added as a clone of any other output(s) attached to a pipe using igt_output_clone_pipe() Signed-off-by: Brian Starkey <brian.starkey@arm.com> --- lib/igt_kms.c | 100 +++++++++++++++++++++++++++++++------------------- lib/igt_kms.h | 5 +++ 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 0bc2996cd..fe51a6c69 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -1694,6 +1694,17 @@ static void igt_display_log_shift(igt_display_t *display, int shift) igt_assert(display->log_shift >= 0); } +static int igt_output_idx(igt_output_t *output) +{ + int i; + + for (i = 0; i < output->display->n_outputs; i++) + if (&output->display->outputs[i] == output) + return i; + + return -1; +} + static void igt_output_refresh(igt_output_t *output) { igt_display_t *display = output->display; @@ -2190,42 +2201,6 @@ void igt_display_fini(igt_display_t *display) display->pipes = NULL; } -static void igt_display_refresh(igt_display_t *display) -{ - igt_output_t *output; - int i; - - unsigned long pipes_in_use = 0; - - /* Check that two outputs aren't trying to use the same pipe */ - for (i = 0; i < display->n_outputs; i++) { - output = &display->outputs[i]; - - if (output->pending_pipe != PIPE_NONE) { - if (pipes_in_use & (1 << output->pending_pipe)) - goto report_dup; - - pipes_in_use |= 1 << output->pending_pipe; - } - - if (output->force_reprobe) - igt_output_refresh(output); - } - - return; - -report_dup: - for (; i > 0; i--) { - igt_output_t *b = &display->outputs[i - 1]; - - igt_assert_f(output->pending_pipe != - b->pending_pipe, - "%s and %s are both trying to use pipe %s\n", - igt_output_name(output), igt_output_name(b), - kmstest_pipe_name(output->pending_pipe)); - } -} - static igt_pipe_t *igt_output_get_driving_pipe(igt_output_t *output) { igt_display_t *display = output->display; @@ -2249,6 +2224,40 @@ static igt_pipe_t *igt_output_get_driving_pipe(igt_output_t *output) return &display->pipes[pipe]; } +static void igt_display_refresh(igt_display_t *display) +{ + igt_output_t *output; + igt_pipe_t *pipe; + int i; + + unsigned long pipes_in_use = 0; + unsigned long pending_crtc_idx_mask; + + /* Check that outputs and pipes agree wrt. cloning */ + for (i = 0; i < display->n_outputs; i++) { + output = &display->outputs[i]; + pending_crtc_idx_mask = 1 << output->pending_pipe; + + pipe = igt_output_get_driving_pipe(output); + if (pipe) { + igt_assert_f(pipe->outputs & (1 << igt_output_idx(output)), + "Output %s not expected to be using pipe %s\n", + igt_output_name(output), + kmstest_pipe_name(pipe->pipe)); + + if (pipes_in_use & pending_crtc_idx_mask) + LOG(display, "Output %s clones pipe %s\n", + igt_output_name(output), + kmstest_pipe_name(pipe->pipe)); + } + + pipes_in_use |= pending_crtc_idx_mask; + + if (output->force_reprobe) + igt_output_refresh(output); + } +} + static igt_plane_t *igt_pipe_get_plane(igt_pipe_t *pipe, int plane_idx) { igt_require_f(plane_idx >= 0 && plane_idx < pipe->n_planes, @@ -3587,6 +3596,7 @@ void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode) output->use_override_mode = !!mode; if (pipe) { + igt_debug("overriding pipe mode in %s way\n", output->display->is_atomic ? "atomic" : "legacy"); if (output->display->is_atomic) igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_MODE_ID, igt_output_get_mode(output), sizeof(*mode)); else @@ -3594,6 +3604,16 @@ void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode) } } +void igt_output_clone_pipe(igt_output_t *output, enum pipe pipe) +{ + igt_display_t *display = output->display; + uint32_t current_clones = display->pipes[pipe].outputs; + + igt_output_set_pipe(output, pipe); + + display->pipes[pipe].outputs |= current_clones; +} + /* * igt_output_set_pipe: * @output: Target output for which the pipe is being set to @@ -3610,11 +3630,15 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe) igt_assert(output->name); - if (output->pending_pipe != PIPE_NONE) + if (output->pending_pipe != PIPE_NONE) { old_pipe = igt_output_get_driving_pipe(output); + old_pipe->outputs &= ~(1 << igt_output_idx(output)); + } - if (pipe != PIPE_NONE) + if (pipe != PIPE_NONE) { pipe_obj = &display->pipes[pipe]; + pipe_obj->outputs = (1 << igt_output_idx(output)); + } LOG(display, "%s: set_pipe(%s)\n", igt_output_name(output), kmstest_pipe_name(pipe)); diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 13d3a9ceb..acb27982b 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -349,6 +349,9 @@ struct igt_pipe { uint32_t crtc_id; int32_t out_fence_fd; + bool out_fence_requested; + + uint32_t outputs; }; typedef struct { @@ -404,6 +407,8 @@ const char *igt_output_name(igt_output_t *output); drmModeModeInfo *igt_output_get_mode(igt_output_t *output); void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode); void igt_output_set_pipe(igt_output_t *output, enum pipe pipe); +void igt_output_clone_pipe(igt_output_t *output, enum pipe pipe); + igt_plane_t *igt_output_get_plane(igt_output_t *output, int plane_idx); igt_plane_t *igt_output_get_plane_type(igt_output_t *output, int plane_type); igt_output_t *igt_output_from_connector(igt_display_t *display, -- 2.20.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
WARNING: multiple messages have this Message-ID (diff)
From: Liviu Dudau <liviu.dudau@arm.com> To: Brian Starkey <brian.starkey@arm.com> Cc: Boris Brezillon <boris.brezillon@free-electrons.com>, Petri Latvala <petri.latvala@intel.com>, Intel GFX ML <intel-gfx@lists.freedesktop.org>, IGT GPU Tools <igt-dev@lists.freedesktop.org>, Daniel Vetter <daniel@ffwll.ch> Subject: [igt-dev] [PATCH i-g-t v5 5/6] lib/igt_kms: Add igt_output_clone_pipe for cloning Date: Tue, 15 Jan 2019 17:47:46 +0000 [thread overview] Message-ID: <20190115174747.3138-6-liviu.dudau@arm.com> (raw) In-Reply-To: <20190115174747.3138-1-liviu.dudau@arm.com> From: Brian Starkey <brian.starkey@arm.com> An output can be added as a clone of any other output(s) attached to a pipe using igt_output_clone_pipe() Signed-off-by: Brian Starkey <brian.starkey@arm.com> --- lib/igt_kms.c | 100 +++++++++++++++++++++++++++++++------------------- lib/igt_kms.h | 5 +++ 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 0bc2996cd..fe51a6c69 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -1694,6 +1694,17 @@ static void igt_display_log_shift(igt_display_t *display, int shift) igt_assert(display->log_shift >= 0); } +static int igt_output_idx(igt_output_t *output) +{ + int i; + + for (i = 0; i < output->display->n_outputs; i++) + if (&output->display->outputs[i] == output) + return i; + + return -1; +} + static void igt_output_refresh(igt_output_t *output) { igt_display_t *display = output->display; @@ -2190,42 +2201,6 @@ void igt_display_fini(igt_display_t *display) display->pipes = NULL; } -static void igt_display_refresh(igt_display_t *display) -{ - igt_output_t *output; - int i; - - unsigned long pipes_in_use = 0; - - /* Check that two outputs aren't trying to use the same pipe */ - for (i = 0; i < display->n_outputs; i++) { - output = &display->outputs[i]; - - if (output->pending_pipe != PIPE_NONE) { - if (pipes_in_use & (1 << output->pending_pipe)) - goto report_dup; - - pipes_in_use |= 1 << output->pending_pipe; - } - - if (output->force_reprobe) - igt_output_refresh(output); - } - - return; - -report_dup: - for (; i > 0; i--) { - igt_output_t *b = &display->outputs[i - 1]; - - igt_assert_f(output->pending_pipe != - b->pending_pipe, - "%s and %s are both trying to use pipe %s\n", - igt_output_name(output), igt_output_name(b), - kmstest_pipe_name(output->pending_pipe)); - } -} - static igt_pipe_t *igt_output_get_driving_pipe(igt_output_t *output) { igt_display_t *display = output->display; @@ -2249,6 +2224,40 @@ static igt_pipe_t *igt_output_get_driving_pipe(igt_output_t *output) return &display->pipes[pipe]; } +static void igt_display_refresh(igt_display_t *display) +{ + igt_output_t *output; + igt_pipe_t *pipe; + int i; + + unsigned long pipes_in_use = 0; + unsigned long pending_crtc_idx_mask; + + /* Check that outputs and pipes agree wrt. cloning */ + for (i = 0; i < display->n_outputs; i++) { + output = &display->outputs[i]; + pending_crtc_idx_mask = 1 << output->pending_pipe; + + pipe = igt_output_get_driving_pipe(output); + if (pipe) { + igt_assert_f(pipe->outputs & (1 << igt_output_idx(output)), + "Output %s not expected to be using pipe %s\n", + igt_output_name(output), + kmstest_pipe_name(pipe->pipe)); + + if (pipes_in_use & pending_crtc_idx_mask) + LOG(display, "Output %s clones pipe %s\n", + igt_output_name(output), + kmstest_pipe_name(pipe->pipe)); + } + + pipes_in_use |= pending_crtc_idx_mask; + + if (output->force_reprobe) + igt_output_refresh(output); + } +} + static igt_plane_t *igt_pipe_get_plane(igt_pipe_t *pipe, int plane_idx) { igt_require_f(plane_idx >= 0 && plane_idx < pipe->n_planes, @@ -3587,6 +3596,7 @@ void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode) output->use_override_mode = !!mode; if (pipe) { + igt_debug("overriding pipe mode in %s way\n", output->display->is_atomic ? "atomic" : "legacy"); if (output->display->is_atomic) igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_MODE_ID, igt_output_get_mode(output), sizeof(*mode)); else @@ -3594,6 +3604,16 @@ void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode) } } +void igt_output_clone_pipe(igt_output_t *output, enum pipe pipe) +{ + igt_display_t *display = output->display; + uint32_t current_clones = display->pipes[pipe].outputs; + + igt_output_set_pipe(output, pipe); + + display->pipes[pipe].outputs |= current_clones; +} + /* * igt_output_set_pipe: * @output: Target output for which the pipe is being set to @@ -3610,11 +3630,15 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe) igt_assert(output->name); - if (output->pending_pipe != PIPE_NONE) + if (output->pending_pipe != PIPE_NONE) { old_pipe = igt_output_get_driving_pipe(output); + old_pipe->outputs &= ~(1 << igt_output_idx(output)); + } - if (pipe != PIPE_NONE) + if (pipe != PIPE_NONE) { pipe_obj = &display->pipes[pipe]; + pipe_obj->outputs = (1 << igt_output_idx(output)); + } LOG(display, "%s: set_pipe(%s)\n", igt_output_name(output), kmstest_pipe_name(pipe)); diff --git a/lib/igt_kms.h b/lib/igt_kms.h index 13d3a9ceb..acb27982b 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -349,6 +349,9 @@ struct igt_pipe { uint32_t crtc_id; int32_t out_fence_fd; + bool out_fence_requested; + + uint32_t outputs; }; typedef struct { @@ -404,6 +407,8 @@ const char *igt_output_name(igt_output_t *output); drmModeModeInfo *igt_output_get_mode(igt_output_t *output); void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode); void igt_output_set_pipe(igt_output_t *output, enum pipe pipe); +void igt_output_clone_pipe(igt_output_t *output, enum pipe pipe); + igt_plane_t *igt_output_get_plane(igt_output_t *output, int plane_idx); igt_plane_t *igt_output_get_plane_type(igt_output_t *output, int plane_type); igt_output_t *igt_output_from_connector(igt_display_t *display, -- 2.20.1 _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev
next prev parent reply other threads:[~2019-01-15 17:47 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-01-15 17:47 [PATCH i-g-t v5 0/6] igt: Add support for testing writeback connectors Liviu Dudau 2019-01-15 17:47 ` [igt-dev] " Liviu Dudau 2019-01-15 17:47 ` [PATCH i-g-t v5 1/6] lib/igt_kms: Add writeback support Liviu Dudau 2019-01-15 17:47 ` [igt-dev] " Liviu Dudau 2019-02-04 13:31 ` Brian Starkey 2019-02-04 13:31 ` [Intel-gfx] " Brian Starkey 2019-03-06 21:30 ` [igt-dev] " Rodrigo Siqueira 2019-03-06 21:30 ` [Intel-gfx] " Rodrigo Siqueira 2019-03-18 10:41 ` Liviu Dudau 2019-03-18 10:41 ` Liviu Dudau 2019-03-18 22:05 ` Rodrigo Siqueira 2019-03-18 22:05 ` Rodrigo Siqueira 2019-03-20 14:46 ` Liviu Dudau 2019-03-20 14:46 ` Liviu Dudau 2019-01-15 17:47 ` [PATCH i-g-t v5 2/6] kms_writeback: Add initial writeback tests Liviu Dudau 2019-01-15 17:47 ` [igt-dev] " Liviu Dudau 2019-01-15 17:47 ` [PATCH i-g-t v5 3/6] lib: Add function to hash a framebuffer Liviu Dudau 2019-01-15 17:47 ` [Intel-gfx] " Liviu Dudau 2019-01-15 18:47 ` Chris Wilson 2019-01-15 18:47 ` [igt-dev] [Intel-gfx] " Chris Wilson 2019-01-16 11:20 ` Liviu Dudau 2019-01-16 11:20 ` [igt-dev] [Intel-gfx] " Liviu Dudau 2019-01-16 11:50 ` Chris Wilson 2019-01-16 11:50 ` [igt-dev] [Intel-gfx] " Chris Wilson 2019-01-16 12:21 ` [PATCH i-g-t v6] " Liviu Dudau 2019-01-16 12:21 ` [igt-dev] " Liviu Dudau 2019-01-15 17:47 ` [PATCH i-g-t v5 4/6] kms_writeback: Add writeback-check-output Liviu Dudau 2019-01-15 17:47 ` [igt-dev] " Liviu Dudau 2019-01-15 17:47 ` Liviu Dudau [this message] 2019-01-15 17:47 ` [igt-dev] [PATCH i-g-t v5 5/6] lib/igt_kms: Add igt_output_clone_pipe for cloning Liviu Dudau 2019-02-04 13:27 ` Brian Starkey 2019-02-04 13:27 ` [igt-dev] " Brian Starkey 2019-01-15 17:47 ` [PATCH i-g-t v5 6/6] kms_writeback: Add tests using a cloned output Liviu Dudau 2019-01-15 17:47 ` [igt-dev] " Liviu Dudau 2019-01-15 19:08 ` [igt-dev] ✓ Fi.CI.BAT: success for igt: Add support for testing writeback connectors (rev3) Patchwork 2019-01-16 0:13 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork 2019-01-16 12:41 ` [igt-dev] ✗ Fi.CI.BAT: failure for igt: Add support for testing writeback connectors (rev4) Patchwork 2019-02-04 13:36 ` [PATCH i-g-t v5 0/6] igt: Add support for testing writeback connectors Brian Starkey 2019-02-04 13:36 ` [igt-dev] " Brian Starkey 2019-03-06 21:42 ` [igt-dev] ✗ Fi.CI.BAT: failure for igt: Add support for testing writeback connectors (rev5) Patchwork
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190115174747.3138-6-liviu.dudau@arm.com \ --to=liviu.dudau@arm.com \ --cc=boris.brezillon@free-electrons.com \ --cc=brian.starkey@arm.com \ --cc=igt-dev@lists.freedesktop.org \ --cc=intel-gfx@lists.freedesktop.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.